* No real implementation yet, to be done. */
/*
- * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2000 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 "ncmul.h"
#include "numeric.h"
#include "relational.h"
+#include "archive.h"
#include "debugmsg.h"
+#include "utils.h"
+#ifndef NO_NAMESPACE_GINAC
namespace GiNaC {
+#endif // ndef NO_NAMESPACE_GINAC
+
+GINAC_IMPLEMENT_REGISTERED_CLASS(color, indexed)
//////////
// default constructor, destructor, copy constructor assignment operator and helpers
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) {
// 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;
}
void color::destroy(bool call_parent)
{
if (call_parent) {
- indexed::destroy(call_parent);
+ inherited::destroy(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_label<MAX_REPRESENTATION_LABELS);
GINAC_ASSERT(all_of_type_coloridx());
}
-color::color(color_types const t, ex const & i1, unsigned const rl)
- : indexed(i1), type(t), representation_label(rl)
+color::color(color_types const t, const ex & i1, unsigned rl)
+ : inherited(i1), type(t), representation_label(rl)
{
debugmsg("color constructor from color_types,ex,unsigned",LOGLEVEL_CONSTRUCT);
GINAC_ASSERT(representation_label<MAX_REPRESENTATION_LABELS);
GINAC_ASSERT(all_of_type_coloridx());
}
-color::color(color_types const t, ex const & i1, ex const & i2, unsigned const rl)
- : indexed(i1,i2), type(t), representation_label(rl)
+color::color(color_types const t, const ex & i1, const ex & i2, unsigned rl)
+ : inherited(i1,i2), type(t), representation_label(rl)
{
debugmsg("color constructor from color_types,ex,ex,unsigned",LOGLEVEL_CONSTRUCT);
GINAC_ASSERT(representation_label<MAX_REPRESENTATION_LABELS);
GINAC_ASSERT(all_of_type_coloridx());
}
-color::color(color_types const t, ex const & i1, ex const & i2, ex const & i3,
- unsigned const rl) : indexed(i1,i2,i3), type(t), representation_label(rl)
+color::color(color_types const t, const ex & i1, const ex & i2, const ex & i3,
+ unsigned rl) : inherited(i1,i2,i3), type(t), representation_label(rl)
{
debugmsg("color constructor from color_types,ex,ex,ex,unsigned",LOGLEVEL_CONSTRUCT);
GINAC_ASSERT(representation_label<MAX_REPRESENTATION_LABELS);
GINAC_ASSERT(all_of_type_coloridx());
}
-color::color(color_types const t, exvector const & iv, unsigned const rl)
- : indexed(iv), type(t), representation_label(rl)
+color::color(color_types const t, const exvector & iv, unsigned rl)
+ : inherited(iv), type(t), representation_label(rl)
{
debugmsg("color constructor from color_types,exvector,unsigned",LOGLEVEL_CONSTRUCT);
GINAC_ASSERT(representation_label<MAX_REPRESENTATION_LABELS);
GINAC_ASSERT(all_of_type_coloridx());
}
-color::color(color_types const t, exvector * ivp, unsigned const rl)
- : indexed(ivp), type(t), representation_label(rl)
+color::color(color_types const t, exvector * ivp, unsigned rl)
+ : inherited(ivp), type(t), representation_label(rl)
{
debugmsg("color constructor from color_types,exvector *,unsigned",LOGLEVEL_CONSTRUCT);
GINAC_ASSERT(representation_label<MAX_REPRESENTATION_LABELS);
GINAC_ASSERT(all_of_type_coloridx());
}
+//////////
+// archiving
+//////////
+
+/** Construct object from archive_node. */
+color::color(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
+{
+ debugmsg("color constructor from archive_node", LOGLEVEL_CONSTRUCT);
+ unsigned int ty;
+ if (!(n.find_unsigned("type", ty)))
+ throw (std::runtime_error("unknown color type in archive"));
+ type = (color_types)ty;
+ if (!(n.find_unsigned("representation", representation_label)))
+ throw (std::runtime_error("unknown color representation label in archive"));
+}
+
+/** Unarchive the object. */
+ex color::unarchive(const archive_node &n, const lst &sym_lst)
+{
+ return (new color(n, sym_lst))->setflag(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
//////////
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)))
int sig=canonicalize_indices(iv,antisymmetric);
if (sig!=INT_MAX) {
// something has changed while sorting indices, more evaluations later
- if (sig==0) return exZERO();
+ if (sig==0) return _ex0();
return ex(sig)*color(type,iv,representation_label);
}
}
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))) {
// check for delta8_{a,b} where a and b are numeric indices, replace by 0 or 1
if ((!idx1.is_symbolic())&&(!idx2.is_symbolic())) {
if ((idx1.get_value()!=idx2.get_value())) {
- return exONE();
+ return _ex1();
} else {
- return exZERO();
+ return _ex0();
}
}
}
// 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 exZERO();
+ return _ex0();
} else if (idx2.is_equal_same_type(idx3) && idx2.is_symbolic()) {
- return exZERO();
+ return _ex0();
}
// check for three numeric indices
GINAC_ASSERT(idx2.get_value()<=idx3.get_value());
if (CMPINDICES(1,4,6)||CMPINDICES(1,5,7)||CMPINDICES(2,5,6)||
CMPINDICES(3,4,4)||CMPINDICES(3,5,5)) {
- return exHALF();
+ return _ex1_2();
} else if (CMPINDICES(2,4,7)||CMPINDICES(3,6,6)||CMPINDICES(3,7,7)) {
- return -exHALF();
+ return -_ex1_2();
} else if (CMPINDICES(1,1,8)||CMPINDICES(2,2,8)||CMPINDICES(3,3,8)) {
return 1/sqrt(numeric(3));
} else if (CMPINDICES(8,8,8)) {
} else if (CMPINDICES(4,4,8)||CMPINDICES(5,5,8)||CMPINDICES(6,6,8)||CMPINDICES(7,7,8)) {
return -1/(2*sqrt(numeric(3)));
}
- return exZERO();
+ return _ex0();
}
}
break;
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())) {
GINAC_ASSERT(idx1.get_value()<=idx2.get_value());
GINAC_ASSERT(idx2.get_value()<=idx3.get_value());
if (CMPINDICES(1,2,3)) {
- return exONE();
+ return _ex1();
} else if (CMPINDICES(1,4,7)||CMPINDICES(2,4,6)||
CMPINDICES(2,5,7)||CMPINDICES(3,4,5)) {
- return exHALF();
+ return _ex1_2();
} else if (CMPINDICES(1,5,6)||CMPINDICES(3,6,7)) {
- return -exHALF();
+ return -_ex1_2();
} else if (CMPINDICES(4,5,8)||CMPINDICES(6,7,8)) {
return sqrt(numeric(3))/2;
} else if (CMPINDICES(8,8,8)) {
} else if (CMPINDICES(4,4,8)||CMPINDICES(5,5,8)||CMPINDICES(6,6,8)||CMPINDICES(7,7,8)) {
return -1/(2*sqrt(numeric(3)));
}
- return exZERO();
+ return _ex0();
}
break;
}
// 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<const color *>(&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<const color *>(&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 <iostream>
-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),...
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
} else {
// a contracted index should occur exactly twice
GINAC_ASSERT(replacements==2);
- *it=exONE();
+ *it=_ex1();
something_changed=true;
}
}
} else {
// a contracted index should occur exactly twice
GINAC_ASSERT(replacements==2);
- *it=exONE();
+ *it=_ex1();
something_changed=true;
}
}
exvector delta8vec;
exvector fvec;
exvector dvec;
- vector<exvector> Tvecs;
+ exvectorvector Tvecs;
Tvecs.resize(MAX_REPRESENTATION_LABELS);
- vector<exvector> ONEvecs;
+ exvectorvector ONEvecs;
ONEvecs.resize(MAX_REPRESENTATION_LABELS);
exvector unknownvec;
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 exZERO();
+ if (iv_intersect.size()>=2) return _ex0();
}
}
}
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) {
*it1=numeric(40)/numeric(3);
- *it2=exONE();
+ *it2=_ex1();
} else {
int sig1, sig2; // unimportant, since symmetric
ex idx1=permute_free_index_to_front(col1.seq,iv_intersect,false,&sig1);
ex idx2=permute_free_index_to_front(col2.seq,iv_intersect,false,&sig2);
*it1=numeric(5)/numeric(3)*color(color_delta8,idx1,idx2);
- *it2=exONE();
+ *it2=_ex1();
}
return nonsimplified_ncmul(recombine_color_string(
delta8vec,fvec,dvec,Tvecs,ONEvecs,unknownvec));
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) {
*it1=numeric(24);
- *it2=exONE();
+ *it2=_ex1();
} else {
int sig1, sig2;
ex idx1=permute_free_index_to_front(col1.seq,iv_intersect,true,&sig1);
ex idx2=permute_free_index_to_front(col2.seq,iv_intersect,true,&sig2);
*it1=numeric(sig1*sig2*5)/numeric(3)*color(color_delta8,idx1,idx2);
- *it2=exONE();
+ *it2=_ex1();
}
return nonsimplified_ncmul(recombine_color_string(
delta8vec,fvec,dvec,Tvecs,ONEvecs,unknownvec));
// 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
// 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;
ONEvecs,unknownvec));
}
-ex color::thisexprseq(exvector const & v) const
+ex color::thisexprseq(const exvector & v) const
{
return color(type,v,representation_label);
}
//////////
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,
- vector<exvector> & Tvecs,
- vector<exvector> & ONEvecs,
+ exvectorvector & Tvecs,
+ exvectorvector & ONEvecs,
exvector & unknownvec)
{
// if not all elements are of type color, put all Ts in unknownvec to
}
exvector recombine_color_string(exvector & delta8vec, exvector & fvec,
- exvector & dvec, vector<exvector> & Tvecs,
- vector<exvector> & ONEvecs, exvector & unknownvec)
+ exvector & dvec, exvectorvector & Tvecs,
+ exvectorvector & ONEvecs, exvector & unknownvec)
{
unsigned sz=delta8vec.size()+fvec.size()+dvec.size()+unknownvec.size();
for (unsigned rl=0; rl<MAX_REPRESENTATION_LABELS; ++rl) {
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);
} else if (v.size()==1) {
GINAC_ASSERT(is_ex_exactly_of_type(*(v.begin()),color));
- return exZERO();
+ return _ex0();
}
exvector v1=v;
ex last_element=v1.back();
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
*/
}
-ex color_trace(exvector const & v, unsigned const rl)
+ex color_trace(const exvector & v, unsigned rl)
{
GINAC_ASSERT(rl<MAX_REPRESENTATION_LABELS);
exvector delta8vec;
exvector fvec;
exvector dvec;
- vector<exvector> Tvecs;
+ exvectorvector Tvecs;
Tvecs.resize(MAX_REPRESENTATION_LABELS);
- vector<exvector> ONEvecs;
+ exvectorvector ONEvecs;
ONEvecs.resize(MAX_REPRESENTATION_LABELS);
exvector unknownvec;
return nonsimplified_ncmul(v_rest);
}
-ex simplify_pure_color_string(ex const & e)
+ex simplify_pure_color_string(const ex & e)
{
GINAC_ASSERT(is_ex_exactly_of_type(e,ncmul));
exvector delta8vec;
exvector fvec;
exvector dvec;
- vector<exvector> Tvecs;
+ exvectorvector Tvecs;
Tvecs.resize(MAX_REPRESENTATION_LABELS);
- vector<exvector> ONEvecs;
+ exvectorvector ONEvecs;
ONEvecs.resize(MAX_REPRESENTATION_LABELS);
exvector unknownvec;
GINAC_ASSERT(is_ex_exactly_of_type(t2,color)&&
(ex_to_color(t2).type==color::color_T)&&
(ex_to_color(t2).seq.size()==1));
- coloridx const & idx1=ex_to_coloridx(ex_to_color(t1).seq[0]);
- coloridx const & idx2=ex_to_coloridx(ex_to_color(t2).seq[0]);
+ const coloridx & idx1=ex_to_coloridx(ex_to_color(t1).seq[0]);
+ const coloridx & idx2=ex_to_coloridx(ex_to_color(t2).seq[0]);
if (idx1.is_equal(idx2) && idx1.is_symbolic()) {
exvector S;
for (unsigned k=i+1; k<j; ++k) {
S.push_back(Tvecs[rl][k]);
}
- t1=exONE();
- t2=exONE();
+ t1=_ex1();
+ t2=_ex1();
ex term1=numeric(-1)/numeric(6)*nonsimplified_ncmul(recombine_color_string(
delta8vec,fvec,dvec,Tvecs,ONEvecs,unknownvec));
for (unsigned k=i+1; k<j; ++k) {
- S.push_back(exONE());
+ S.push_back(_ex1());
}
t1=color_trace_of_one_representation_label(S);
ex term2=numeric(1)/numeric(2)*nonsimplified_ncmul(recombine_color_string(
return e;
}
-ex simplify_color(ex const & e)
+ex simplify_color(const ex & e)
{
// all simplification is done on expanded objects
ex e_expanded=e.expand();
// simplification of sum=sum of simplifications
if (is_ex_exactly_of_type(e_expanded,add)) {
- ex sum=exZERO();
- for (int i=0; i<e_expanded.nops(); ++i) {
+ ex sum=_ex0();
+ for (unsigned i=0; i<e_expanded.nops(); ++i)
sum += simplify_color(e_expanded.op(i));
- }
+
return sum;
}
// simplification of commutative product=commutative product of simplifications
if (is_ex_exactly_of_type(e_expanded,mul)) {
- ex prod=exONE();
- for (int i=0; i<e_expanded.nops(); ++i) {
+ ex prod=_ex1();
+ for (unsigned i=0; i<e_expanded.nops(); ++i)
prod *= simplify_color(e_expanded.op(i));
- }
+
return prod;
}
// simplification of noncommutative product: test if everything is color
if (is_ex_exactly_of_type(e_expanded,ncmul)) {
bool all_color=true;
- for (int i=0; i<e_expanded.nops(); ++i) {
+ for (unsigned i=0; i<e_expanded.nops(); ++i) {
if (!is_ex_exactly_of_type(e_expanded.op(i),color)) {
all_color=false;
break;
return e_expanded;
}
-ex brute_force_sum_color_indices(ex const & e)
+ex brute_force_sum_color_indices(const ex & e)
{
exvector iv_all=e.get_indices();
exvector iv_double;
counter[l]=1;
}
- ex sum=exZERO();
+ ex sum=_ex0();
while (1) {
ex term=e;
return sum;
}
-void append_exvector_to_exvector(exvector & dest, exvector const & source)
+void append_exvector_to_exvector(exvector & dest, const exvector & source)
{
for (exvector::const_iterator cit=source.begin(); cit!=source.end(); ++cit) {
dest.push_back(*cit);
}
}
+#ifndef NO_NAMESPACE_GINAC
} // namespace GiNaC
+#endif // ndef NO_NAMESPACE_GINAC
+