X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fadd.cpp;h=821649d245b7e443f7de479fd05a2d7d079bd2ee;hp=c14c1587481ae6c0806ceecd078138ab4f3a928d;hb=aaaa74e1033fdd659b4420835b348c72f5fab536;hpb=2862087ce55d944c1ac5d37283944b2b37507fd2 diff --git a/ginac/add.cpp b/ginac/add.cpp index c14c1587..821649d2 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's sums of expressions. */ /* - * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2002 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 @@ -27,7 +27,6 @@ #include "mul.h" #include "matrix.h" #include "archive.h" -#include "debugmsg.h" #include "utils.h" namespace GiNaC { @@ -35,12 +34,11 @@ namespace GiNaC { GINAC_IMPLEMENT_REGISTERED_CLASS(add, expairseq) ////////// -// default constructor, destructor, copy constructor assignment operator and helpers +// default ctor, dtor, copy ctor, assignment operator and helpers ////////// add::add() { - debugmsg("add default constructor",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_add; } @@ -55,34 +53,30 @@ DEFAULT_DESTROY(add) add::add(const ex & lh, const ex & rh) { - debugmsg("add constructor from ex,ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_add; - overall_coeff = _ex0(); + overall_coeff = _ex0; construct_from_2_ex(lh,rh); GINAC_ASSERT(is_canonical()); } add::add(const exvector & v) { - debugmsg("add constructor from exvector",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_add; - overall_coeff = _ex0(); + overall_coeff = _ex0; construct_from_exvector(v); GINAC_ASSERT(is_canonical()); } add::add(const epvector & v) { - debugmsg("add constructor from epvector",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_add; - overall_coeff = _ex0(); + overall_coeff = _ex0; construct_from_epvector(v); GINAC_ASSERT(is_canonical()); } add::add(const epvector & v, const ex & oc) { - debugmsg("add constructor from epvector,ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_add; overall_coeff = oc; construct_from_epvector(v); @@ -91,7 +85,6 @@ add::add(const epvector & v, const ex & oc) add::add(epvector * vp, const ex & oc) { - debugmsg("add constructor from epvector *,ex",LOGLEVEL_CONSTRUCT); tinfo_key = TINFO_add; GINAC_ASSERT(vp!=0); overall_coeff = oc; @@ -114,8 +107,6 @@ DEFAULT_ARCHIVING(add) void add::print(const print_context & c, unsigned level) const { - debugmsg("add print", LOGLEVEL_PRINT); - if (is_a(c)) { inherited::print(c, level); @@ -130,16 +121,16 @@ void add::print(const print_context & c, unsigned level) const while (it != itend) { // If the coefficient is -1, it is replaced by a single minus sign - if (it->coeff.compare(_num1()) == 0) { + if (it->coeff.is_equal(_ex1)) { it->rest.print(c, precedence()); - } else if (it->coeff.compare(_num_1()) == 0) { + } else if (it->coeff.is_equal(_ex_1)) { c.s << "-"; it->rest.print(c, precedence()); - } else if (ex_to(it->coeff).numer().compare(_num1()) == 0) { + } else if (ex_to(it->coeff).numer().is_equal(_num1)) { it->rest.print(c, precedence()); c.s << "/"; ex_to(it->coeff).denom().print(c, precedence()); - } else if (ex_to(it->coeff).numer().compare(_num_1()) == 0) { + } else if (ex_to(it->coeff).numer().is_equal(_num_1)) { c.s << "-"; it->rest.print(c, precedence()); c.s << "/"; @@ -152,7 +143,7 @@ void add::print(const print_context & c, unsigned level) const // Separator is "+", except if the following expression would have a leading minus sign ++it; - if (it != itend && !(it->coeff.compare(_num0()) < 0 || (it->coeff.compare(_num1()) == 0 && is_exactly_a(it->rest) && it->rest.compare(_num0()) < 0))) + if (it != itend && !(it->coeff.info(info_flags::negative) || (it->coeff.is_equal(_num1) && is_exactly_a(it->rest) && it->rest.info(info_flags::negative)))) c.s << "+"; } @@ -161,10 +152,20 @@ void add::print(const print_context & c, unsigned level) const c.s << '+'; overall_coeff.print(c, precedence()); } - + if (precedence() <= level) c.s << ")"; + } else if (is_a(c)) { + + c.s << class_name() << '('; + op(0).print(c); + for (unsigned i=1; isetflag(status_flags::dynallocated); + return (new add(coeffseq, n==0 ? overall_coeff : _ex0))->setflag(status_flags::dynallocated); } /** Perform automatic term rewriting rules in this class. In the following @@ -316,8 +317,6 @@ ex add::coeff(const ex & s, int n) const * @param level cut-off in recursive evaluation */ ex add::eval(int level) const { - debugmsg("add eval",LOGLEVEL_MEMBER_FUNCTION); - epvector *evaled_seqp = evalchildren(level); if (evaled_seqp) { // do more evaluation later @@ -328,10 +327,10 @@ ex add::eval(int level) const #ifdef DO_GINAC_ASSERT epvector::const_iterator i = seq.begin(), end = seq.end(); while (i != end) { - GINAC_ASSERT(!is_ex_exactly_of_type(i->rest,add)); + GINAC_ASSERT(!is_exactly_a(i->rest)); if (is_ex_exactly_of_type(i->rest,numeric)) dbgprint(); - GINAC_ASSERT(!is_ex_exactly_of_type(i->rest,numeric)); + GINAC_ASSERT(!is_exactly_a(i->rest)); ++i; } #endif // def DO_GINAC_ASSERT @@ -378,7 +377,7 @@ ex add::evalm(void) const sum = sum.add(ex_to(m)); } else all_matrices = false; - it++; + ++it; } if (all_matrices) { @@ -413,7 +412,7 @@ ex add::derivative(const symbol & y) const s->push_back(combine_ex_with_coeff_to_pair(i->rest.diff(y), i->coeff)); ++i; } - return (new add(s, _ex0()))->setflag(status_flags::dynallocated); + return (new add(s, _ex0))->setflag(status_flags::dynallocated); } int add::compare_same_type(const basic & other) const @@ -456,39 +455,39 @@ expair add::split_ex_to_pair(const ex & e) const { if (is_ex_exactly_of_type(e,mul)) { const mul &mulref(ex_to(e)); - ex numfactor = mulref.overall_coeff; + const ex &numfactor = mulref.overall_coeff; mul *mulcopyp = new mul(mulref); - mulcopyp->overall_coeff = _ex1(); + mulcopyp->overall_coeff = _ex1; mulcopyp->clearflag(status_flags::evaluated); mulcopyp->clearflag(status_flags::hash_calculated); mulcopyp->setflag(status_flags::dynallocated); return expair(*mulcopyp,numfactor); } - return expair(e,_ex1()); + return expair(e,_ex1); } expair add::combine_ex_with_coeff_to_pair(const ex & e, const ex & c) const { - GINAC_ASSERT(is_ex_exactly_of_type(c, numeric)); + GINAC_ASSERT(is_exactly_a(c)); if (is_ex_exactly_of_type(e, mul)) { const mul &mulref(ex_to(e)); - ex numfactor = mulref.overall_coeff; + const ex &numfactor = mulref.overall_coeff; mul *mulcopyp = new mul(mulref); - mulcopyp->overall_coeff = _ex1(); + mulcopyp->overall_coeff = _ex1; mulcopyp->clearflag(status_flags::evaluated); mulcopyp->clearflag(status_flags::hash_calculated); mulcopyp->setflag(status_flags::dynallocated); - if (are_ex_trivially_equal(c, _ex1())) + if (are_ex_trivially_equal(c, _ex1)) return expair(*mulcopyp, numfactor); - else if (are_ex_trivially_equal(numfactor, _ex1())) + else if (are_ex_trivially_equal(numfactor, _ex1)) return expair(*mulcopyp, c); else return expair(*mulcopyp, ex_to(numfactor).mul_dyn(ex_to(c))); } else if (is_ex_exactly_of_type(e, numeric)) { - if (are_ex_trivially_equal(c, _ex1())) - return expair(e, _ex1()); - return expair(ex_to(e).mul_dyn(ex_to(c)), _ex1()); + if (are_ex_trivially_equal(c, _ex1)) + return expair(e, _ex1); + return expair(ex_to(e).mul_dyn(ex_to(c)), _ex1); } return expair(e, c); } @@ -496,12 +495,12 @@ expair add::combine_ex_with_coeff_to_pair(const ex & e, expair add::combine_pair_with_coeff_to_pair(const expair & p, const ex & c) const { - GINAC_ASSERT(is_ex_exactly_of_type(p.coeff,numeric)); - GINAC_ASSERT(is_ex_exactly_of_type(c,numeric)); + GINAC_ASSERT(is_exactly_a(p.coeff)); + GINAC_ASSERT(is_exactly_a(c)); if (is_ex_exactly_of_type(p.rest,numeric)) { - GINAC_ASSERT(ex_to(p.coeff).is_equal(_num1())); // should be normalized - return expair(ex_to(p.rest).mul_dyn(ex_to(c)),_ex1()); + GINAC_ASSERT(ex_to(p.coeff).is_equal(_num1)); // should be normalized + return expair(ex_to(p.rest).mul_dyn(ex_to(c)),_ex1); } return expair(p.rest,ex_to(p.coeff).mul_dyn(ex_to(c))); @@ -509,10 +508,10 @@ expair add::combine_pair_with_coeff_to_pair(const expair & p, ex add::recombine_pair_to_ex(const expair & p) const { - if (ex_to(p.coeff).is_equal(_num1())) + if (ex_to(p.coeff).is_equal(_num1)) return p.rest; else - return p.rest*p.coeff; + return (new mul(p.rest,p.coeff))->setflag(status_flags::dynallocated); } ex add::expand(unsigned options) const