X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fncmul.cpp;h=5dce23f41fe5df2a27834798e33024f1c08a9fcd;hp=560f7151c26a069835bb2bb08ee0d5284436598b;hb=955cb185a85535ab328ffedbfccdc508ce80fa91;hpb=6b3768e8c544739ae53321539cb4d1e3112ded1b diff --git a/ginac/ncmul.cpp b/ginac/ncmul.cpp index 560f7151..5dce23f4 100644 --- a/ginac/ncmul.cpp +++ b/ginac/ncmul.cpp @@ -2,11 +2,38 @@ * * Implementation of GiNaC's non-commutative products of expressions. */ +/* + * GiNaC Copyright (C) 1999 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include #include -#include "ginac.h" +#include "ncmul.h" +#include "ex.h" +#include "add.h" +#include "mul.h" +#include "debugmsg.h" +#include "utils.h" + +#ifndef NO_GINAC_NAMESPACE +namespace GiNaC { +#endif // ndef NO_GINAC_NAMESPACE ////////// // default constructor, destructor, copy constructor assignment operator and helpers @@ -17,7 +44,7 @@ ncmul::ncmul() { debugmsg("ncmul default constructor",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::~ncmul() @@ -64,28 +91,28 @@ ncmul::ncmul(ex const & lh, ex const & rh) : exprseq(lh,rh) { debugmsg("ncmul constructor from ex,ex",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::ncmul(ex const & f1, ex const & f2, ex const & f3) : exprseq(f1,f2,f3) { debugmsg("ncmul constructor from 3 ex",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::ncmul(ex const & f1, ex const & f2, ex const & f3, ex const & f4) : exprseq(f1,f2,f3,f4) { debugmsg("ncmul constructor from 4 ex",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::ncmul(ex const & f1, ex const & f2, ex const & f3, ex const & f4, ex const & f5) : exprseq(f1,f2,f3,f4,f5) { debugmsg("ncmul constructor from 5 ex",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::ncmul(ex const & f1, ex const & f2, ex const & f3, @@ -93,19 +120,19 @@ ncmul::ncmul(ex const & f1, ex const & f2, ex const & f3, exprseq(f1,f2,f3,f4,f5,f6) { debugmsg("ncmul constructor from 6 ex",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::ncmul(exvector const & v, bool discardable) : exprseq(v,discardable) { debugmsg("ncmul constructor from exvector,bool",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ncmul::ncmul(exvector * vp) : exprseq(vp) { debugmsg("ncmul constructor from exvector *",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_NCMUL; + tinfo_key = TINFO_ncmul; } ////////// @@ -120,6 +147,39 @@ basic * ncmul::duplicate() const return new ncmul(*this); } +void ncmul::print(ostream & os, unsigned upper_precedence) const +{ + debugmsg("ncmul print",LOGLEVEL_PRINT); + printseq(os,'(','%',')',precedence,upper_precedence); +} + +void ncmul::printraw(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 << ")"; +} + +void ncmul::printcsrc(ostream & os, 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 << ")"; +} + bool ncmul::info(unsigned inf) const { throw(std::logic_error("which flags have to be implemented in ncmul::info()?")); @@ -174,7 +234,7 @@ ex ncmul::expand(unsigned options) const exvector term; term=expanded_seq; for (l=0; lsetflag(status_flags::dynallocated); - return exZERO(); + return _ex0(); } unsigned ncmul::count_factors(ex const & e) const @@ -315,7 +375,7 @@ ex ncmul::eval(int level) const if (assocseq.size()==1) return *(seq.begin()); // ncmul() -> 1 - if (assocseq.size()==0) return exONE(); + if (assocseq.size()==0) return _ex1(); // determine return types unsignedvector rettypes; @@ -340,7 +400,7 @@ ex ncmul::eval(int level) const } ++i; } - ASSERT(count_commutative+count_noncommutative+count_noncommutative_composite==assocseq.size()); + GINAC_ASSERT(count_commutative+count_noncommutative+count_noncommutative_composite==assocseq.size()); // ncmul(...,c1,...,c2,...) -> // *(c1,c2,ncmul(...)) (pull out commutative elements) @@ -367,7 +427,7 @@ ex ncmul::eval(int level) const if (count_noncommutative_composite==0) { // there are neither commutative nor noncommutative_composite // elements in assocseq - ASSERT(count_commutative==0); + GINAC_ASSERT(count_commutative==0); exvectorvector evv; unsignedvector rttinfos; @@ -392,15 +452,15 @@ ex ncmul::eval(int level) const } } -#ifdef DOASSERT - ASSERT(evv.size()==rttinfos.size()); - ASSERT(evv.size()>0); +#ifdef DO_GINAC_ASSERT + GINAC_ASSERT(evv.size()==rttinfos.size()); + GINAC_ASSERT(evv.size()>0); unsigned s=0; for (i=0; i