/** @file lorentzidx.cpp
*
- * Implementation of GiNaC's lorentz indices. */
+ * Implementation of GiNaC's Lorentz indices. */
/*
- * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <stdexcept>
#include "lorentzidx.h"
+#include "lst.h"
+#include "symbol.h"
+#include "archive.h"
#include "utils.h"
#include "debugmsg.h"
-#ifndef NO_GINAC_NAMESPACE
namespace GiNaC {
-#endif // ndef NO_GINAC_NAMESPACE
+
+GINAC_IMPLEMENT_REGISTERED_CLASS(lorentzidx, idx)
//////////
// default constructor, destructor, copy constructor assignment operator and helpers
lorentzidx::lorentzidx() : orthogonal_only(false), dim_parallel_space(0)
{
- debugmsg("lorentzidx default constructor",LOGLEVEL_CONSTRUCT);
- // serial is incremented in idx::idx()
- name="mu"+ToString(serial);
- tinfo_key=TINFO_lorentzidx;
+ debugmsg("lorentzidx default constructor",LOGLEVEL_CONSTRUCT);
+ // serial is incremented in idx::idx()
+ name = "mu" + ToString(serial);
+ tinfo_key = TINFO_lorentzidx;
}
-lorentzidx::~lorentzidx()
+// protected
+
+void lorentzidx::copy(const lorentzidx & other)
{
- debugmsg("lorentzidx destructor",LOGLEVEL_DESTRUCT);
- destroy(0);
+ inherited::copy(other);
+ orthogonal_only=other.orthogonal_only;
+ dim_parallel_space=other.dim_parallel_space;
}
-lorentzidx::lorentzidx(lorentzidx const & other)
+void lorentzidx::destroy(bool call_parent)
{
- debugmsg("lorentzidx copy constructor",LOGLEVEL_CONSTRUCT);
- copy(other);
+ if (call_parent) inherited::destroy(call_parent);
}
-lorentzidx const & lorentzidx::operator=(lorentzidx const & other)
+//////////
+// other constructors
+//////////
+
+// public
+
+/** Construct symbolic Lorentz index, using an automatically generated unique name.
+ *
+ * @param cov Index is covariant (contravariant otherwise)
+ * @param oonly Index only lives in orthogonal space
+ * @param dimp Dimension of parallel space
+ * @return newly constructed index */
+lorentzidx::lorentzidx(bool cov, bool oonly, unsigned dimp)
+ : idx(cov), orthogonal_only(oonly), dim_parallel_space(dimp)
{
- debugmsg("lorentzidx operator=",LOGLEVEL_ASSIGNMENT);
- if (this != &other) {
- destroy(1);
- copy(other);
- }
- return *this;
+ debugmsg("lorentzidx constructor from bool,bool,unsigned",LOGLEVEL_CONSTRUCT);
+ // serial is incremented in idx::idx(bool)
+ if (oonly) {
+ name="muorth"+ToString(serial);
+ } else {
+ name="mu"+ToString(serial);
+ }
+ tinfo_key=TINFO_lorentzidx;
}
-// protected
+/** Construct symbolic Lorentz index with specified name.
+ *
+ * @param n Symbolic index name
+ * @param cov Index is covariant (contravariant otherwise)
+ * @param oonly Index only lives in orthogonal space
+ * @param dimp Dimension of parallel space
+ * @return newly constructed index */
+lorentzidx::lorentzidx(const std::string & n, bool cov, bool oonly, unsigned dimp)
+ : idx(n,cov), orthogonal_only(oonly), dim_parallel_space(dimp)
+{
+ debugmsg("lorentzidx constructor from string,bool,bool,unsigned",
+ LOGLEVEL_CONSTRUCT);
+ tinfo_key=TINFO_lorentzidx;
+}
-void lorentzidx::copy(lorentzidx const & other)
+/** Construct symbolic Lorentz index with specified name.
+ *
+ * @param n Symbolic index name
+ * @param cov Index is covariant (contravariant otherwise)
+ * @param oonly Index only lives in orthogonal space
+ * @param dimp Dimension of parallel space
+ * @return newly constructed index */
+lorentzidx::lorentzidx(const char * n, bool cov, bool oonly, unsigned dimp)
+ : idx(n,cov), orthogonal_only(oonly), dim_parallel_space(dimp)
{
- idx::copy(other);
- orthogonal_only=other.orthogonal_only;
- dim_parallel_space=other.dim_parallel_space;
+ debugmsg("lorentzidx constructor from char*,bool,bool,unsigned",
+ LOGLEVEL_CONSTRUCT);
+ tinfo_key=TINFO_lorentzidx;
}
-void lorentzidx::destroy(bool call_parent)
+/** Construct numeric Lorentz index with specified value.
+ *
+ * @param v Numeric index value
+ * @param cov Index is covariant (contravariant otherwise)
+ * @return newly constructed index */
+lorentzidx::lorentzidx(unsigned v, bool cov)
+ : idx(v,cov), orthogonal_only(false), dim_parallel_space(0)
{
- if (call_parent) idx::destroy(call_parent);
+ debugmsg("lorentzidx constructor from unsigned,bool",LOGLEVEL_CONSTRUCT);
+ tinfo_key=TINFO_lorentzidx;
}
//////////
-// other constructors
+// archiving
//////////
-// public
-
-lorentzidx::lorentzidx(bool cov, bool oonly, unsigned dimp) :
- idx(cov), orthogonal_only(oonly), dim_parallel_space(dimp)
+/** Construct object from archive_node. */
+lorentzidx::lorentzidx(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
{
- debugmsg("lorentzidx constructor from bool",LOGLEVEL_CONSTRUCT);
- // serial is incremented in idx::idx(bool)
- if (oonly) {
- name="muorth"+ToString(serial);
- } else {
- name="mu"+ToString(serial);
- }
- tinfo_key=TINFO_lorentzidx;
+ debugmsg("lorentzidx constructor from archive_node", LOGLEVEL_CONSTRUCT);
+ n.find_bool("orthogonal_only", orthogonal_only);
+ n.find_unsigned("pdim", dim_parallel_space);
}
-lorentzidx::lorentzidx(string const & n, bool cov, bool oonly, unsigned dimp)
- : idx(n,cov), orthogonal_only(oonly), dim_parallel_space(dimp)
+/** Unarchive the object. */
+ex lorentzidx::unarchive(const archive_node &n, const lst &sym_lst)
{
- debugmsg("lorentzidx constructor from string,bool,bool,unsigned",
- LOGLEVEL_CONSTRUCT);
- tinfo_key=TINFO_lorentzidx;
+ ex s = (new lorentzidx(n, sym_lst))->setflag(status_flags::dynallocated);
+
+ if (ex_to_lorentzidx(s).symbolic) {
+ // If lorentzidx is in sym_lst, return the existing lorentzidx
+ for (unsigned i=0; i<sym_lst.nops(); i++) {
+ if (is_ex_of_type(sym_lst.op(i), lorentzidx) && (ex_to_lorentzidx(sym_lst.op(i)).name == ex_to_lorentzidx(s).name))
+ return sym_lst.op(i);
+ }
+ }
+ return s;
}
-lorentzidx::lorentzidx(char const * n, bool cov, bool oonly, unsigned dimp)
- : idx(n,cov), orthogonal_only(oonly), dim_parallel_space(dimp)
+/** Archive the object. */
+void lorentzidx::archive(archive_node &n) const
{
- debugmsg("lorentzidx constructor from char*,bool,bool,unsigned",
- LOGLEVEL_CONSTRUCT);
- tinfo_key=TINFO_lorentzidx;
-}
-
-lorentzidx::lorentzidx(unsigned const v, bool cov) : idx(v,cov),
- orthogonal_only(false), dim_parallel_space(0)
-{
- debugmsg("lorentzidx constructor from unsigned,bool",LOGLEVEL_CONSTRUCT);
- tinfo_key=TINFO_lorentzidx;
+ inherited::archive(n);
+ n.add_bool("orthogonal_only", orthogonal_only);
+ n.add_unsigned("pdim", dim_parallel_space);
}
//////////
// public
-basic * lorentzidx::duplicate() const
+void lorentzidx::printraw(std::ostream & os) const
{
- debugmsg("lorentzidx duplicate",LOGLEVEL_DUPLICATE);
- return new lorentzidx(*this);
+ debugmsg("lorentzidx printraw",LOGLEVEL_PRINT);
+
+ os << "lorentzidx(";
+
+ if (symbolic) {
+ os << "symbolic,name=" << name;
+ } else {
+ os << "non symbolic,value=" << value;
+ }
+
+ if (covariant) {
+ os << ",covariant";
+ } else {
+ os << ",contravariant";
+ }
+
+ if (orthogonal_only) {
+ os << ",only orthogonal components at " << dim_parallel_space
+ << " parallel dimensions";
+ } else {
+ os << ",parallel and orthogonal components";
+ }
+
+ os << ",serial=" << serial;
+ os << ",hash=" << hashvalue << ",flags=" << flags;
+ os << ")";
}
-void lorentzidx::printraw(ostream & os) const
+void lorentzidx::printtree(std::ostream & os, unsigned indent) const
{
- debugmsg("lorentzidx printraw",LOGLEVEL_PRINT);
-
- os << "lorentzidx(";
-
- if (symbolic) {
- os << "symbolic,name=" << name;
- } else {
- os << "non symbolic,value=" << value;
- }
-
- if (covariant) {
- os << ",covariant";
- } else {
- os << ",contravariant";
- }
-
- if (orthogonal_only) {
- os << ",only orthogonal components at " << dim_parallel_space
- << " parallel dimensions";
- } else {
- os << ",parallel and orthogonal components";
- }
-
- os << ",serial=" << serial;
- os << ",hash=" << hashvalue << ",flags=" << flags;
- os << ")";
+ debugmsg("lorentzidx printtree",LOGLEVEL_PRINT);
+
+ os << std::string(indent,' ') << "lorentzidx: ";
+
+ if (symbolic) {
+ os << "symbolic,name=" << name;
+ } else {
+ os << "non symbolic,value=" << value;
+ }
+
+ if (covariant) {
+ os << ",covariant";
+ } else {
+ os << ",contravariant";
+ }
+
+ if (orthogonal_only) {
+ os << ",only orthogonal components at " << dim_parallel_space
+ << " parallel dimensions";
+ } else {
+ os << ",parallel and orthogonal components";
+ }
+
+ os << ", serial=" << serial
+ << ", hash=" << hashvalue
+ << " (0x" << std::hex << hashvalue << std::dec << ")"
+ << ", flags=" << flags << std::endl;
}
-void lorentzidx::printtree(ostream & os, unsigned indent) const
+void lorentzidx::print(std::ostream & os, unsigned upper_precedence) const
{
- debugmsg("lorentzidx printtree",LOGLEVEL_PRINT);
-
- os << string(indent,' ') << "lorentzidx: ";
-
- if (symbolic) {
- os << "symbolic,name=" << name;
- } else {
- os << "non symbolic,value=" << value;
- }
-
- if (covariant) {
- os << ",covariant";
- } else {
- os << ",contravariant";
- }
-
- if (orthogonal_only) {
- os << ",only orthogonal components at " << dim_parallel_space
- << " parallel dimensions";
- } else {
- os << ",parallel and orthogonal components";
- }
-
- os << ", serial=" << serial
- << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
- << ", flags=" << flags << endl;
+ debugmsg("lorentzidx print",LOGLEVEL_PRINT);
+
+ if (covariant) {
+ os << "_";
+ } else {
+ os << "~";
+ }
+ if (symbolic) {
+ os << name;
+ } else {
+ os << value;
+ }
}
-void lorentzidx::print(ostream & os, unsigned upper_precedence) const
+bool lorentzidx::info(unsigned inf) const
{
- debugmsg("lorentzidx print",LOGLEVEL_PRINT);
-
- if (covariant) {
- os << "_";
- } else {
- os << "~";
- }
- if (symbolic) {
- os << name;
- } else {
- os << value;
- }
+ if (inf==info_flags::lorentzidx) return true;
+ return inherited::info(inf);
}
-bool lorentzidx::info(unsigned inf) const
+int lorentzidx::compare_same_type(const basic & other) const
{
- if (inf==info_flags::lorentzidx) return true;
- return idx::info(inf);
+ GINAC_ASSERT(is_of_type(other, lorentzidx));
+ const lorentzidx &o = static_cast<const lorentzidx &>(other);
+
+ if (orthogonal_only != o.orthogonal_only)
+ return orthogonal_only ? -1 : 1;
+ if (dim_parallel_space != o.dim_parallel_space)
+ return dim_parallel_space < o.dim_parallel_space ? -1 : 1;
+ return inherited::compare_same_type(other);
}
-//////////
-// new virtual functions which can be overridden by derived classes
-//////////
-
-// none
-
//////////
// non-virtual functions in this class
//////////
// public
+/** Create anonymous contravariant copy of a symbolic Lorentz index. */
lorentzidx lorentzidx::create_anonymous_representative(void) const
{
- GINAC_ASSERT(is_symbolic());
- lorentzidx i_copy(*this);
- i_copy.serial=0;
- i_copy.name="anonymous_representative";
- i_copy.covariant=false;
- i_copy.clearflag(status_flags::dynallocated|
- status_flags::hash_calculated);
- return i_copy;
+ GINAC_ASSERT(is_symbolic());
+ lorentzidx i_copy(*this);
+ i_copy.serial=0;
+ i_copy.name="anonymous_representative";
+ i_copy.covariant=false;
+ i_copy.clearflag(status_flags::dynallocated |
+ status_flags::hash_calculated);
+ return i_copy;
}
//////////
-// static member variables
+// global functions
//////////
-// none
-
-//////////
-// global constants
-//////////
-
-const lorentzidx some_lorentzidx;
-type_info const & typeid_lorentzidx=typeid(some_lorentzidx);
+/** Return the global symbol that represents the dimension D of spacetime. */
+ex Dim(void)
+{
+ static symbol *d = new symbol("dim");
+ return *d;
+}
-#ifndef NO_GINAC_NAMESPACE
} // namespace GiNaC
-#endif // ndef NO_GINAC_NAMESPACE