X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fncmul.cpp;h=8a0cc1220311d5eb7c0070fb76dd552e1ba28813;hp=86b76e718aa85f250247185968043655789779c6;hb=5a819981450798bd5702ed4352c48adf51ee4ab3;hpb=e5362a33f72613b324b3714524a8c2e5f7b7f46f diff --git a/ginac/ncmul.cpp b/ginac/ncmul.cpp index 86b76e71..8a0cc122 100644 --- a/ginac/ncmul.cpp +++ b/ginac/ncmul.cpp @@ -28,13 +28,12 @@ #include "ex.h" #include "add.h" #include "mul.h" +#include "print.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(ncmul, exprseq) @@ -42,25 +41,14 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(ncmul, exprseq) // default constructor, destructor, copy constructor assignment operator and helpers ////////// -// public - ncmul::ncmul() { debugmsg("ncmul default constructor",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_ncmul; } -// protected - -void ncmul::copy(const ncmul & other) -{ - inherited::copy(other); -} - -void ncmul::destroy(bool call_parent) -{ - if (call_parent) inherited::destroy(call_parent); -} +DEFAULT_COPY(ncmul) +DEFAULT_DESTROY(ncmul) ////////// // other constructors @@ -117,24 +105,7 @@ ncmul::ncmul(exvector * vp) : inherited(vp) // archiving ////////// -/** Construct object from archive_node. */ -ncmul::ncmul(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) -{ - debugmsg("ncmul constructor from archive_node", LOGLEVEL_CONSTRUCT); -} - -/** Unarchive the object. */ -ex ncmul::unarchive(const archive_node &n, const lst &sym_lst) -{ - return (new ncmul(n, sym_lst))->setflag(status_flags::dynallocated); -} - -/** Archive the object. */ -void ncmul::archive(archive_node &n) const -{ - inherited::archive(n); -} - +DEFAULT_ARCHIVING(ncmul) ////////// // functions overriding virtual functions from bases classes @@ -142,42 +113,28 @@ void ncmul::archive(archive_node &n) const // public -basic * ncmul::duplicate() const +void ncmul::print(const print_context & c, unsigned level) const { - debugmsg("ncmul duplicate",LOGLEVEL_ASSIGNMENT); - return new ncmul(*this); -} + debugmsg("ncmul print", LOGLEVEL_PRINT); -void ncmul::print(std::ostream & os, unsigned upper_precedence) const -{ - debugmsg("ncmul print",LOGLEVEL_PRINT); - printseq(os,'(','%',')',precedence,upper_precedence); -} + if (is_of_type(c, print_tree)) { -void ncmul::printraw(std::ostream & os) const -{ - debugmsg("ncmul printraw",LOGLEVEL_PRINT); - os << "%("; - for (exvector::const_iterator it=seq.begin(); it!=seq.end(); ++it) { - (*it).bp->printraw(os); - os << ","; - } - os << ",hash=" << hashvalue << ",flags=" << flags; - os << ")"; -} + inherited::print(c, level); -void ncmul::printcsrc(std::ostream & os, unsigned type, unsigned upper_precedence) const -{ - debugmsg("ncmul print csrc",LOGLEVEL_PRINT); - exvector::const_iterator it; - exvector::const_iterator itend = seq.end()-1; - os << "ncmul("; - for (it=seq.begin(); it!=itend; ++it) { - (*it).bp->printcsrc(os,precedence); - os << ","; - } - (*it).bp->printcsrc(os,precedence); - os << ")"; + } else if (is_of_type(c, print_csrc)) { + + c.s << "ncmul("; + exvector::const_iterator it = seq.begin(), itend = seq.end()-1; + while (it != itend) { + it->print(c, precedence()); + c.s << ","; + it++; + } + it->print(c, precedence()); + c.s << ")"; + + } else + printseq(c, '(', '*', ')', precedence(), level); } bool ncmul::info(unsigned inf) const @@ -254,7 +211,7 @@ ex ncmul::expand(unsigned options) const status_flags::expanded); } -int ncmul::degree(const symbol & s) const +int ncmul::degree(const ex & s) const { int deg_sum=0; for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { @@ -263,7 +220,7 @@ int ncmul::degree(const symbol & s) const return deg_sum; } -int ncmul::ldegree(const symbol & s) const +int ncmul::ldegree(const ex & s) const { int deg_sum=0; for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { @@ -272,7 +229,7 @@ int ncmul::ldegree(const symbol & s) const return deg_sum; } -ex ncmul::coeff(const symbol & s, int n) const +ex ncmul::coeff(const ex & s, int n) const { exvector coeffseq; coeffseq.reserve(seq.size()); @@ -344,7 +301,7 @@ ex ncmul::eval(int level) const // *(c1,c2,ncmul(...)) (pull out commutative elements) // ncmul(x1,y1,x2,y2) -> *(ncmul(x1,x2),ncmul(y1,y2)) // (collect elements of same type) - // ncmul(x1,x2,x3,...) -> x::eval_ncmul(x1,x2,x3,...) + // ncmul(x1,x2,x3,...) -> x::simplify_ncmul(x1,x2,x3,...) // the following rule would be nice, but produces a recursion, // which must be trapped by introducing a flag that the sub-ncmuls() // are already evaluated (maybe later...) @@ -352,7 +309,7 @@ ex ncmul::eval(int level) const // ncmul(ncmul(x1,x2,...),X,ncmul(y1,y2,...) // (X noncommutative_composite) - if ((level==1)&&(flags & status_flags::evaluated)) { + if ((level==1) && (flags & status_flags::evaluated)) { return *this; } @@ -361,16 +318,14 @@ ex ncmul::eval(int level) const // ncmul(...,*(x1,x2),...,ncmul(x3,x4),...) -> // ncmul(...,x1,x2,...,x3,x4,...) (associativity) unsigned factors=0; - for (exvector::const_iterator cit=evaledseq.begin(); cit!=evaledseq.end(); ++cit) { + for (exvector::const_iterator cit=evaledseq.begin(); cit!=evaledseq.end(); ++cit) factors += count_factors(*cit); - } - + exvector assocseq; assocseq.reserve(factors); - for (exvector::const_iterator cit=evaledseq.begin(); cit!=evaledseq.end(); ++cit) { + for (exvector::const_iterator cit=evaledseq.begin(); cit!=evaledseq.end(); ++cit) append_factors(assocseq,*cit); - } - + // ncmul(x) -> x if (assocseq.size()==1) return *(seq.begin()); @@ -410,11 +365,10 @@ ex ncmul::eval(int level) const exvector noncommutativeseq; noncommutativeseq.reserve(assocseq.size()-count_commutative); for (i=0; isetflag(status_flags::dynallocated)); return (new mul(commutativeseq))->setflag(status_flags::dynallocated); @@ -462,16 +416,15 @@ ex ncmul::eval(int level) const #endif // def DO_GINAC_ASSERT // if all elements are of same type, simplify the string - if (evv.size()==1) { + if (evv.size()==1) return evv[0][0].simplify_ncmul(evv[0]); - } exvector splitseq; splitseq.reserve(evv.size()); for (i=0; isetflag(status_flags::dynallocated)); } - + return (new mul(splitseq))->setflag(status_flags::dynallocated); } @@ -479,25 +432,6 @@ ex ncmul::eval(int level) const status_flags::evaluated); } -exvector ncmul::get_indices(void) const -{ - // return union of indices of factors - exvector iv; - for (exvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { - exvector subiv=(*cit).get_indices(); - iv.reserve(iv.size()+subiv.size()); - for (exvector::const_iterator cit2=subiv.begin(); cit2!=subiv.end(); ++cit2) { - iv.push_back(*cit2); - } - } - return iv; -} - -ex ncmul::subs(const lst & ls, const lst & lr) const -{ - return ncmul(subschildren(ls, lr)); -} - ex ncmul::thisexprseq(const exvector & v) const { return (new ncmul(v))->setflag(status_flags::dynallocated); @@ -596,14 +530,6 @@ const exvector & ncmul::get_factors(void) const return seq; } -////////// -// static member variables -////////// - -// protected - -unsigned ncmul::precedence=50; - ////////// // friend functions ////////// @@ -624,6 +550,4 @@ ex simplified_ncmul(const exvector & v) status_flags::evaluated); } -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC