X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fcolor.cpp;h=8a793844ed289d7871aa1e1db453aa4a80f81762;hp=d45a1210a0740c46bdca26600a03d7be19310800;hb=dbb36db8d02b2c25af6bbfff8135112637936e1f;hpb=15d4b353c85f8815a95d97ab977c9ca48e155574 diff --git a/ginac/color.cpp b/ginac/color.cpp index d45a1210..8a793844 100644 --- a/ginac/color.cpp +++ b/ginac/color.cpp @@ -33,6 +33,7 @@ #include "ncmul.h" #include "numeric.h" #include "relational.h" +#include "archive.h" #include "debugmsg.h" #include "utils.h" @@ -40,6 +41,8 @@ namespace GiNaC { #endif // ndef NO_GINAC_NAMESPACE +GINAC_IMPLEMENT_REGISTERED_CLASS(color, indexed) + ////////// // default constructor, destructor, copy constructor assignment operator and helpers ////////// @@ -58,13 +61,13 @@ color::~color() destroy(0); } -color::color(color const & other) +color::color(const color & other) { debugmsg("color copy constructor",LOGLEVEL_CONSTRUCT); copy (other); } -color const & color::operator=(color const & other) +const color & color::operator=(const color & other) { debugmsg("color operator=",LOGLEVEL_ASSIGNMENT); if (this != &other) { @@ -76,9 +79,9 @@ color const & color::operator=(color const & other) // protected -void color::copy(color const & other) +void color::copy(const color & other) { - indexed::copy(other); + inherited::copy(other); type=other.type; representation_label=other.representation_label; } @@ -86,7 +89,7 @@ void color::copy(color const & other) void color::destroy(bool call_parent) { if (call_parent) { - indexed::destroy(call_parent); + inherited::destroy(call_parent); } } @@ -96,7 +99,7 @@ void color::destroy(bool call_parent) // protected -color::color(color_types const t, unsigned const rl) : type(t), representation_label(rl) +color::color(color_types const t, unsigned rl) : type(t), representation_label(rl) { debugmsg("color constructor from color_types,unsigned",LOGLEVEL_CONSTRUCT); GINAC_ASSERT(representation_labelsetflag(status_flags::dynallocated); +} + +/** Archive the object. */ +void color::archive(archive_node &n) const +{ + inherited::archive(n); + n.add_unsigned("type", type); + n.add_unsigned("representation", representation_label); +} + ////////// // functions overriding virtual functions from bases classes ////////// @@ -222,7 +255,7 @@ void color::printcsrc(ostream & os, unsigned type, unsigned upper_precedence) co bool color::info(unsigned inf) const { - return indexed::info(inf); + return inherited::info(inf); } #define CMPINDICES(A,B,C) ((idx1.get_value()==(A))&&(idx2.get_value()==(B))&&(idx3.get_value()==(C))) @@ -257,8 +290,8 @@ ex color::eval(int level) const case color_delta8: { GINAC_ASSERT(seq.size()==2); - coloridx const & idx1=ex_to_coloridx(seq[0]); - coloridx const & idx2=ex_to_coloridx(seq[1]); + const coloridx & idx1=ex_to_coloridx(seq[0]); + const coloridx & idx2=ex_to_coloridx(seq[1]); // check for delta8_{a,a} where a is a symbolic index, replace by 8 if ((idx1.is_symbolic())&&(idx1.is_equal_same_type(idx2))) { @@ -279,9 +312,9 @@ ex color::eval(int level) const // check for d_{a,a,c} (=0) when a is symbolic { GINAC_ASSERT(seq.size()==3); - coloridx const & idx1=ex_to_coloridx(seq[0]); - coloridx const & idx2=ex_to_coloridx(seq[1]); - coloridx const & idx3=ex_to_coloridx(seq[2]); + const coloridx & idx1=ex_to_coloridx(seq[0]); + const coloridx & idx2=ex_to_coloridx(seq[1]); + const coloridx & idx3=ex_to_coloridx(seq[2]); if (idx1.is_equal_same_type(idx2) && idx1.is_symbolic()) { return _ex0(); @@ -312,9 +345,9 @@ ex color::eval(int level) const case color_f: { GINAC_ASSERT(seq.size()==3); - coloridx const & idx1=ex_to_coloridx(seq[0]); - coloridx const & idx2=ex_to_coloridx(seq[1]); - coloridx const & idx3=ex_to_coloridx(seq[2]); + const coloridx & idx1=ex_to_coloridx(seq[0]); + const coloridx & idx2=ex_to_coloridx(seq[1]); + const coloridx & idx3=ex_to_coloridx(seq[2]); // check for three numeric indices if (!(idx1.is_symbolic()||idx2.is_symbolic()||idx3.is_symbolic())) { @@ -348,31 +381,31 @@ ex color::eval(int level) const // protected -int color::compare_same_type(basic const & other) const +int color::compare_same_type(const basic & other) const { GINAC_ASSERT(other.tinfo() == TINFO_color); const color *o = static_cast(&other); if (type==o->type) { if (representation_label==o->representation_label) { - return indexed::compare_same_type(other); + return inherited::compare_same_type(other); } return representation_label < o->representation_label ? -1 : 1; } return type < o->type ? -1 : 1; } -bool color::is_equal_same_type(basic const & other) const +bool color::is_equal_same_type(const basic & other) const { GINAC_ASSERT(other.tinfo() == TINFO_color); const color *o = static_cast(&other); if (type!=o->type) return false; if (representation_label!=o->representation_label) return false; - return indexed::is_equal_same_type(other); + return inherited::is_equal_same_type(other); } #include -ex color::simplify_ncmul(exvector const & v) const +ex color::simplify_ncmul(const exvector & v) const { // simplifications: contract delta8_{a,b} where possible // sort delta8,f,d,T(rl=0),T(rl=1),...,ONE(rl=0),ONE(rl=1),... @@ -390,8 +423,8 @@ ex color::simplify_ncmul(exvector const & v) const if (is_ex_exactly_of_type(*it,color) && (ex_to_color(*it).type==color_delta8)) { color & d8=ex_to_nonconst_color(*it); GINAC_ASSERT(d8.seq.size()==2); - coloridx const & first_idx=ex_to_coloridx(d8.seq[0]); - coloridx const & second_idx=ex_to_coloridx(d8.seq[1]); + const coloridx & first_idx=ex_to_coloridx(d8.seq[0]); + const coloridx & second_idx=ex_to_coloridx(d8.seq[1]); // delta8_{a,a} should have been contracted in color::eval() GINAC_ASSERT((!first_idx.is_equal(second_idx))||(!first_idx.is_symbolic())); ex saved_delta8=*it; // save to restore it later @@ -455,8 +488,8 @@ ex color::simplify_ncmul(exvector const & v) const for (exvector::iterator it2=fvec.begin(); it2!=fvec.end(); ++it2) { GINAC_ASSERT(is_ex_exactly_of_type(*it1,color)); GINAC_ASSERT(is_ex_exactly_of_type(*it2,color)); - color const & col1=ex_to_color(*it1); - color const & col2=ex_to_color(*it2); + const color & col1=ex_to_color(*it1); + const color & col2=ex_to_color(*it2); exvector iv_intersect=idx_intersect(col1.seq,col2.seq); if (iv_intersect.size()>=2) return _ex0(); } @@ -469,8 +502,8 @@ ex color::simplify_ncmul(exvector const & v) const for (exvector::iterator it2=it1+1; it2!=dvec.end(); ++it2) { GINAC_ASSERT(is_ex_exactly_of_type(*it1,color)); GINAC_ASSERT(is_ex_exactly_of_type(*it2,color)); - color const & col1=ex_to_color(*it1); - color const & col2=ex_to_color(*it2); + const color & col1=ex_to_color(*it1); + const color & col2=ex_to_color(*it2); exvector iv_intersect=idx_intersect(col1.seq,col2.seq); if (iv_intersect.size()>=2) { if (iv_intersect.size()==3) { @@ -496,8 +529,8 @@ ex color::simplify_ncmul(exvector const & v) const for (exvector::iterator it2=it1+1; it2!=fvec.end(); ++it2) { GINAC_ASSERT(is_ex_exactly_of_type(*it1,color)); GINAC_ASSERT(is_ex_exactly_of_type(*it2,color)); - color const & col1=ex_to_color(*it1); - color const & col2=ex_to_color(*it2); + const color & col1=ex_to_color(*it1); + const color & col2=ex_to_color(*it2); exvector iv_intersect=idx_intersect(col1.seq,col2.seq); if (iv_intersect.size()>=2) { if (iv_intersect.size()==3) { @@ -531,7 +564,7 @@ ex color::simplify_ncmul(exvector const & v) const // d_{a,b,c} T_b T_c = 5/6 T_a for (exvector::iterator it2=dvec.begin(); it2!=dvec.end(); ++it2) { GINAC_ASSERT(is_ex_exactly_of_type(*it2,color)&&ex_to_color(*it2).type==color_d); - color const & dref=ex_to_color(*it2); + const color & dref=ex_to_color(*it2); exvector iv_intersect=idx_intersect(dref.seq,iv); if (iv_intersect.size()==2) { int sig; // unimportant, since symmetric @@ -547,7 +580,7 @@ ex color::simplify_ncmul(exvector const & v) const // f_{a,b,c} T_b T_c = 3/2 I T_a for (exvector::iterator it2=fvec.begin(); it2!=fvec.end(); ++it2) { GINAC_ASSERT(is_ex_exactly_of_type(*it2,color)&&ex_to_color(*it2).type==color_f); - color const & fref=ex_to_color(*it2); + const color & fref=ex_to_color(*it2); exvector iv_intersect=idx_intersect(fref.seq,iv); if (iv_intersect.size()==2) { int sig; @@ -579,7 +612,7 @@ ex color::simplify_ncmul(exvector const & v) const ONEvecs,unknownvec)); } -ex color::thisexprseq(exvector const & v) const +ex color::thisexprseq(const exvector & v) const { return color(type,v,representation_label); } @@ -619,43 +652,43 @@ bool color::all_of_type_coloridx(void) const ////////// const color some_color; -type_info const & typeid_color=typeid(some_color); +const type_info & typeid_color=typeid(some_color); ////////// // friend functions ////////// -color color_ONE(unsigned const rl) +color color_ONE(unsigned rl) { return color(color::color_ONE,rl); } -color color_T(ex const & a, unsigned const rl) +color color_T(const ex & a, unsigned rl) { return color(color::color_T,a,rl); } -color color_f(ex const & a, ex const & b, ex const & c) +color color_f(const ex & a, const ex & b, const ex & c) { return color(color::color_f,a,b,c); } -color color_d(ex const & a, ex const & b, ex const & c) +color color_d(const ex & a, const ex & b, const ex & c) { return color(color::color_d,a,b,c); } -ex color_h(ex const & a, ex const & b, ex const & c) +ex color_h(const ex & a, const ex & b, const ex & c) { return color(color::color_d,a,b,c)+I*color(color::color_f,a,b,c); } -color color_delta8(ex const & a, ex const & b) +color color_delta8(const ex & a, const ex & b) { return color(color::color_delta8,a,b); } -void split_color_string_in_parts(exvector const & v, exvector & delta8vec, +void split_color_string_in_parts(const exvector & v, exvector & delta8vec, exvector & fvec, exvector & dvec, exvectorvector & Tvecs, exvectorvector & ONEvecs, @@ -727,7 +760,7 @@ exvector recombine_color_string(exvector & delta8vec, exvector & fvec, return v; } -ex color_trace_of_one_representation_label(exvector const & v) +ex color_trace_of_one_representation_label(const exvector & v) { if (v.size()==0) { return numeric(COLOR_THREE); @@ -746,8 +779,8 @@ ex color_trace_of_one_representation_label(exvector const & v) v1.pop_back(); exvector v2=v1; - ex const & last_index=ex_to_color(last_element).seq[0]; - ex const & next_to_last_index=ex_to_color(next_to_last_element).seq[0]; + const ex & last_index=ex_to_color(last_element).seq[0]; + const ex & next_to_last_index=ex_to_color(next_to_last_element).seq[0]; ex summation_index=coloridx(); v2.push_back(color_T(summation_index)); // don't care about the representation_label @@ -768,7 +801,7 @@ ex color_trace_of_one_representation_label(exvector const & v) */ } -ex color_trace(exvector const & v, unsigned const rl) +ex color_trace(const exvector & v, unsigned rl) { GINAC_ASSERT(rl