* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <iostream>
#include <stdexcept>
-#include <algorithm>
#include "idx.h"
#include "symbol.h"
#include "print.h"
#include "archive.h"
#include "utils.h"
-#include "debugmsg.h"
namespace GiNaC {
GINAC_IMPLEMENT_REGISTERED_CLASS(spinidx, varidx)
//////////
-// default constructor, destructor, copy constructor assignment operator and helpers
+// default ctor, dtor, copy ctor, assignment operator and helpers
//////////
-idx::idx() : inherited(TINFO_idx)
-{
- debugmsg("idx default constructor", LOGLEVEL_CONSTRUCT);
-}
+idx::idx() : inherited(TINFO_idx) {}
varidx::varidx() : covariant(false)
{
- debugmsg("varidx default constructor", LOGLEVEL_CONSTRUCT);
tinfo_key = TINFO_varidx;
}
spinidx::spinidx() : dotted(false)
{
- debugmsg("spinidx default constructor", LOGLEVEL_CONSTRUCT);
tinfo_key = TINFO_spinidx;
}
idx::idx(const ex & v, const ex & d) : inherited(TINFO_idx), value(v), dim(d)
{
- debugmsg("idx constructor from ex,ex", LOGLEVEL_CONSTRUCT);
if (is_dim_numeric())
if (!dim.info(info_flags::posint))
throw(std::invalid_argument("dimension of space must be a positive integer"));
varidx::varidx(const ex & v, const ex & d, bool cov) : inherited(v, d), covariant(cov)
{
- debugmsg("varidx constructor from ex,ex,bool", LOGLEVEL_CONSTRUCT);
tinfo_key = TINFO_varidx;
}
spinidx::spinidx(const ex & v, const ex & d, bool cov, bool dot) : inherited(v, d, cov), dotted(dot)
{
- debugmsg("spinidx constructor from ex,ex,bool,bool", LOGLEVEL_CONSTRUCT);
tinfo_key = TINFO_spinidx;
}
idx::idx(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
{
- debugmsg("idx constructor from archive_node", LOGLEVEL_CONSTRUCT);
n.find_ex("value", value, sym_lst);
n.find_ex("dim", dim, sym_lst);
}
varidx::varidx(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
{
- debugmsg("varidx constructor from archive_node", LOGLEVEL_CONSTRUCT);
n.find_bool("covariant", covariant);
}
spinidx::spinidx(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
{
- debugmsg("spinidx constructor from archive_node", LOGLEVEL_CONSTRUCT);
n.find_bool("dotted", dotted);
}
DEFAULT_UNARCHIVE(spinidx)
//////////
-// functions overriding virtual functions from bases classes
+// functions overriding virtual functions from base classes
//////////
void idx::print(const print_context & c, unsigned level) const
{
- debugmsg("idx print", LOGLEVEL_PRINT);
-
if (is_of_type(c, print_tree)) {
c.s << std::string(level, ' ') << class_name()
} else {
- if (!is_of_type(c, print_latex))
+ if (is_a<print_latex>(c))
+ c.s << "_{";
+ else
c.s << ".";
bool need_parens = !(is_ex_exactly_of_type(value, numeric) || is_ex_of_type(value, symbol));
if (need_parens)
value.print(c);
if (need_parens)
c.s << ")";
+ if (is_a<print_latex>(c))
+ c.s << "}";
}
}
void varidx::print(const print_context & c, unsigned level) const
{
- debugmsg("varidx print", LOGLEVEL_PRINT);
-
if (is_of_type(c, print_tree)) {
c.s << std::string(level, ' ') << class_name()
dim.print(c, level + delta_indent);
} else {
-
- if (!is_of_type(c, print_latex)) {
+ if (is_a<print_latex>(c)) {
+ if (covariant)
+ c.s << "_{";
+ else
+ c.s << "^{";
+ } else {
if (covariant)
c.s << ".";
else
value.print(c);
if (need_parens)
c.s << ")";
+ if (is_a<print_latex>(c))
+ c.s << "}";
}
}
void spinidx::print(const print_context & c, unsigned level) const
{
- debugmsg("spinidx print", LOGLEVEL_PRINT);
-
if (is_of_type(c, print_tree)) {
c.s << std::string(level, ' ') << class_name()
} else {
bool is_tex = is_of_type(c, print_latex);
- if (!is_tex) {
+ if (is_tex) {
+ if (covariant)
+ c.s << "_{";
+ else
+ c.s << "^{";
+ } else {
if (covariant)
c.s << ".";
else
c.s << ")";
if (is_tex && dotted)
c.s << "}";
+ if (is_tex)
+ c.s << "}";
}
}
* must be such that dummy indices lie next to each other. */
int idx::compare_same_type(const basic & other) const
{
- GINAC_ASSERT(is_of_type(other, idx));
+ GINAC_ASSERT(is_a<idx>(other));
const idx &o = static_cast<const idx &>(other);
int cmpval = value.compare(o.value);
return dim.compare(o.dim);
}
+bool idx::match_same_type(const basic & other) const
+{
+ GINAC_ASSERT(is_a<idx>(other));
+ const idx &o = static_cast<const idx &>(other);
+
+ return dim.is_equal(o.dim);
+}
+
int varidx::compare_same_type(const basic & other) const
{
- GINAC_ASSERT(is_of_type(other, varidx));
+ GINAC_ASSERT(is_a<varidx>(other));
const varidx &o = static_cast<const varidx &>(other);
int cmpval = inherited::compare_same_type(other);
return 0;
}
+bool varidx::match_same_type(const basic & other) const
+{
+ GINAC_ASSERT(is_a<varidx>(other));
+ const varidx &o = static_cast<const varidx &>(other);
+
+ if (covariant != o.covariant)
+ return false;
+ return inherited::match_same_type(other);
+}
+
int spinidx::compare_same_type(const basic & other) const
{
- GINAC_ASSERT(is_of_type(other, spinidx));
+ GINAC_ASSERT(is_a<spinidx>(other));
const spinidx &o = static_cast<const spinidx &>(other);
// Check dottedness first so dummy indices will end up next to each other
return 0;
}
-/** By default, basic::evalf would evaluate the index value but we don't want
- * a.1 to become a.(1.0). */
-ex idx::evalf(int level) const
+bool spinidx::match_same_type(const basic & other) const
{
- return *this;
-}
-
-bool idx::match(const ex & pattern, lst & repl_lst) const
-{
- if (!is_ex_of_type(pattern, idx))
- return false;
- const idx &o = ex_to<idx>(pattern);
- if (!dim.is_equal(o.dim))
- return false;
- return value.match(o.value, repl_lst);
-}
+ GINAC_ASSERT(is_a<spinidx>(other));
+ const spinidx &o = static_cast<const spinidx &>(other);
-bool varidx::match(const ex & pattern, lst & repl_lst) const
-{
- if (!is_ex_of_type(pattern, varidx))
- return false;
- const varidx &o = ex_to<varidx>(pattern);
- if (covariant != o.covariant)
+ if (dotted != o.dotted)
return false;
- return inherited::match(pattern, repl_lst);
+ return inherited::match_same_type(other);
}
-bool spinidx::match(const ex & pattern, lst & repl_lst) const
+/** By default, basic::evalf would evaluate the index value but we don't want
+ * a.1 to become a.(1.0). */
+ex idx::evalf(int level) const
{
- if (!is_ex_of_type(pattern, spinidx))
- return false;
- const spinidx &o = ex_to<spinidx>(pattern);
- if (dotted != o.dotted)
- return false;
- return inherited::match(pattern, repl_lst);
+ return *this;
}
ex idx::subs(const lst & ls, const lst & lr, bool no_pattern) const
// First look for index substitutions
for (unsigned i=0; i<ls.nops(); i++) {
- if (is_equal(*(ls.op(i)).bp)) {
+ if (is_equal(ex_to<basic>(ls.op(i)))) {
// Substitution index->index
if (is_ex_of_type(lr.op(i), idx))
* @see ex::diff */
ex idx::derivative(const symbol & s) const
{
- return _ex0();
+ return _ex0;
}
//////////