X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fadd.cpp;h=511f3b3d23da1cb12ced5edc485b17175e660ee6;hp=3a7a9126db69f03209f2bb90bafcd8f1574acf3e;hb=66917580f3e523feb4e492f38912735b3ce0dc97;hpb=896ad35db238cf5665ca8d519799fa759045b298 diff --git a/ginac/add.cpp b/ginac/add.cpp index 3a7a9126..511f3b3d 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-2003 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 @@ -25,8 +25,9 @@ #include "add.h" #include "mul.h" -#include "matrix.h" #include "archive.h" +#include "operators.h" +#include "matrix.h" #include "utils.h" namespace GiNaC { @@ -34,7 +35,7 @@ namespace GiNaC { GINAC_IMPLEMENT_REGISTERED_CLASS(add, expairseq) ////////// -// default ctor, dtor, copy ctor, assignment operator and helpers +// default constructor ////////// add::add() @@ -42,9 +43,6 @@ add::add() tinfo_key = TINFO_add; } -DEFAULT_COPY(add) -DEFAULT_DESTROY(add) - ////////// // other constructors ////////// @@ -121,16 +119,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 << "/"; @@ -141,14 +139,17 @@ void add::print(const print_context & c, unsigned level) const it->rest.print(c, precedence()); } - // Separator is "+", except if the following expression would have a leading minus sign + // Separator is "+", except if the following expression would have a leading minus sign or the sign is sitting in parenthesis (as in a ctor) ++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 + && (is_a(c) || !it->coeff.info(info_flags::real) // sign inside ctor arguments + || !(it->coeff.info(info_flags::negative) || (it->coeff.is_equal(_num1) && is_exactly_a(it->rest) && it->rest.info(info_flags::negative))))) c.s << "+"; } if (!overall_coeff.is_zero()) { - if (overall_coeff.info(info_flags::positive)) + if (overall_coeff.info(info_flags::positive) + || is_a(c) || !overall_coeff.info(info_flags::real)) // sign inside ctor argument c.s << '+'; overall_coeff.print(c, precedence()); } @@ -160,7 +161,7 @@ void add::print(const print_context & c, unsigned level) const c.s << class_name() << '('; op(0).print(c); - for (unsigned i=1; i c - * - +(x;1) -> x + * - +(x;0) -> x * * @param level cut-off in recursive evaluation */ ex add::eval(int level) const @@ -328,7 +329,7 @@ ex add::eval(int level) const epvector::const_iterator i = seq.begin(), end = seq.end(); while (i != end) { GINAC_ASSERT(!is_exactly_a(i->rest)); - if (is_ex_exactly_of_type(i->rest,numeric)) + if (is_exactly_a(i->rest)) dbgprint(); GINAC_ASSERT(!is_exactly_a(i->rest)); ++i; @@ -354,7 +355,7 @@ ex add::eval(int level) const return this->hold(); } -ex add::evalm(void) const +ex add::evalm() const { // Evaluate children first and add up all matrices. Stop if there's one // term that is not a matrix. @@ -369,7 +370,7 @@ ex add::evalm(void) const while (it != itend) { const ex &m = recombine_pair_to_ex(*it).evalm(); s->push_back(split_ex_to_pair(m)); - if (is_ex_of_type(m, matrix)) { + if (is_a(m)) { if (first_term) { sum = ex_to(m); first_term = false; @@ -387,12 +388,12 @@ ex add::evalm(void) const return (new add(s, overall_coeff))->setflag(status_flags::dynallocated); } -ex add::simplify_ncmul(const exvector & v) const +ex add::eval_ncmul(const exvector & v) const { if (seq.empty()) - return inherited::simplify_ncmul(v); + return inherited::eval_ncmul(v); else - return seq.begin()->rest.simplify_ncmul(v); + return seq.begin()->rest.eval_ncmul(v); } // protected @@ -420,12 +421,7 @@ int add::compare_same_type(const basic & other) const return inherited::compare_same_type(other); } -bool add::is_equal_same_type(const basic & other) const -{ - return inherited::is_equal_same_type(other); -} - -unsigned add::return_type(void) const +unsigned add::return_type() const { if (seq.empty()) return return_types::commutative; @@ -433,7 +429,7 @@ unsigned add::return_type(void) const return seq.begin()->rest.return_type(); } -unsigned add::return_type_tinfo(void) const +unsigned add::return_type_tinfo() const { if (seq.empty()) return tinfo_key; @@ -453,7 +449,7 @@ ex add::thisexpairseq(epvector * vp, const ex & oc) const expair add::split_ex_to_pair(const ex & e) const { - if (is_ex_exactly_of_type(e,mul)) { + if (is_exactly_a(e)) { const mul &mulref(ex_to(e)); const ex &numfactor = mulref.overall_coeff; mul *mulcopyp = new mul(mulref); @@ -470,7 +466,7 @@ expair add::combine_ex_with_coeff_to_pair(const ex & e, const ex & c) const { GINAC_ASSERT(is_exactly_a(c)); - if (is_ex_exactly_of_type(e, mul)) { + if (is_exactly_a(e)) { const mul &mulref(ex_to(e)); const ex &numfactor = mulref.overall_coeff; mul *mulcopyp = new mul(mulref); @@ -478,14 +474,14 @@ expair add::combine_ex_with_coeff_to_pair(const ex & e, mulcopyp->clearflag(status_flags::evaluated); mulcopyp->clearflag(status_flags::hash_calculated); mulcopyp->setflag(status_flags::dynallocated); - if (are_ex_trivially_equal(c, _ex1)) + if (c.is_equal(_ex1)) return expair(*mulcopyp, numfactor); - else if (are_ex_trivially_equal(numfactor, _ex1)) + else if (numfactor.is_equal(_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)) + } else if (is_exactly_a(e)) { + if (c.is_equal(_ex1)) return expair(e, _ex1); return expair(ex_to(e).mul_dyn(ex_to(c)), _ex1); } @@ -498,7 +494,7 @@ expair add::combine_pair_with_coeff_to_pair(const expair & p, GINAC_ASSERT(is_exactly_a(p.coeff)); GINAC_ASSERT(is_exactly_a(c)); - if (is_ex_exactly_of_type(p.rest,numeric)) { + if (is_exactly_a(p.rest)) { GINAC_ASSERT(ex_to(p.coeff).is_equal(_num1)); // should be normalized return expair(ex_to(p.rest).mul_dyn(ex_to(c)),_ex1); } @@ -521,7 +517,7 @@ ex add::expand(unsigned options) const // the terms have not changed, so it is safe to declare this expanded return (options == 0) ? setflag(status_flags::expanded) : *this; } - + return (new add(vp, overall_coeff))->setflag(status_flags::dynallocated | (options == 0 ? status_flags::expanded : 0)); }