X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fexpairseq.cpp;h=7c6e5223653889730407aa0fd5a246417cc06f6d;hp=39f7931f585b3e9c43a3d3d407b7664aa0a2e4bc;hb=bb0f99d6298fccb8cf1421fa0c7463c647f543a7;hpb=b573b0146341709649f373e0fc5c0d440877ebaf diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index 39f7931f..7c6e5223 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -3,7 +3,7 @@ * Implementation of sequences of expression pairs. */ /* - * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2011 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 @@ -20,12 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include -#include -#include -#include -#include - #include "expairseq.h" #include "lst.h" #include "add.h" @@ -36,11 +30,17 @@ #include "archive.h" #include "operators.h" #include "utils.h" +#include "hash_seed.h" #include "indexed.h" +#include #if EXPAIRSEQ_USE_HASHTAB #include #endif // EXPAIRSEQ_USE_HASHTAB +#include +#include +#include +#include namespace GiNaC { @@ -69,9 +69,9 @@ public: // public -expairseq::expairseq() : inherited(&expairseq::tinfo_static) +expairseq::expairseq() #if EXPAIRSEQ_USE_HASHTAB - , hashtabsize(0) + : hashtabsize(0) #endif // EXPAIRSEQ_USE_HASHTAB {} @@ -108,20 +108,20 @@ void expairseq::copy(const expairseq &other) // other constructors ////////// -expairseq::expairseq(const ex &lh, const ex &rh) : inherited(&expairseq::tinfo_static) +expairseq::expairseq(const ex &lh, const ex &rh) { construct_from_2_ex(lh,rh); GINAC_ASSERT(is_canonical()); } -expairseq::expairseq(const exvector &v) : inherited(&expairseq::tinfo_static) +expairseq::expairseq(const exvector &v) { construct_from_exvector(v); GINAC_ASSERT(is_canonical()); } expairseq::expairseq(const epvector &v, const ex &oc, bool do_index_renaming) - : inherited(&expairseq::tinfo_static), overall_coeff(oc) + : overall_coeff(oc) { GINAC_ASSERT(is_a(oc)); construct_from_epvector(v, do_index_renaming); @@ -129,7 +129,7 @@ expairseq::expairseq(const epvector &v, const ex &oc, bool do_index_renaming) } expairseq::expairseq(std::auto_ptr vp, const ex &oc, bool do_index_renaming) - : inherited(&expairseq::tinfo_static), overall_coeff(oc) + : overall_coeff(oc) { GINAC_ASSERT(vp.get()!=0); GINAC_ASSERT(is_a(oc)); @@ -141,11 +141,9 @@ expairseq::expairseq(std::auto_ptr vp, const ex &oc, bool do_index_ren // archiving ////////// -expairseq::expairseq(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) -#if EXPAIRSEQ_USE_HASHTAB - , hashtabsize(0) -#endif +void expairseq::read_archive(const archive_node &n, lst &sym_lst) { + inherited::read_archive(n, sym_lst); archive_node::archive_node_cit first = n.find_first("rest"); archive_node::archive_node_cit last = n.find_last("coeff"); ++last; @@ -177,7 +175,6 @@ void expairseq::archive(archive_node &n) const n.add_ex("overall_coeff", overall_coeff); } -DEFAULT_UNARCHIVE(expairseq) ////////// // functions overriding virtual functions from base classes @@ -374,23 +371,10 @@ ex expairseq::conjugate() const return *this; } ex result = thisexpairseq(newepv ? *newepv : seq, x); - if (newepv) { - delete newepv; - } + delete newepv; return result; } -bool expairseq::is_polynomial(const ex & var) const -{ - if (!is_exactly_a(*this) && !is_exactly_a(*this)) - return basic::is_polynomial(var); - for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) { - if (!(i->rest).is_polynomial(var)) - return false; - } - return true; -} - bool expairseq::match(const ex & pattern, exmap & repl_lst) const { // This differs from basic::match() because we want "a+b+c+d" to @@ -469,7 +453,7 @@ ex expairseq::subs(const exmap & m, unsigned options) const { std::auto_ptr vp = subschildren(m, options); if (vp.get()) - return ex_to(thisexpairseq(vp, overall_coeff, true)); + return ex_to(thisexpairseq(vp, overall_coeff, (options & subs_options::no_index_renaming) == 0)); else if ((options & subs_options::algebraic) && is_exactly_a(*this)) return static_cast(this)->algebraic_subs_mul(m, options); else @@ -615,8 +599,7 @@ unsigned expairseq::return_type() const unsigned expairseq::calchash() const { - const void* this_tinfo = (const void*)typeid(*this).name(); - unsigned v = golden_ratio_hash((p_int)this_tinfo); + unsigned v = make_hash_seed(typeid(*this)); epvector::const_iterator i = seq.begin(); const epvector::const_iterator end = seq.end(); while (i != end) { @@ -890,7 +873,7 @@ void expairseq::construct_from_2_ex(const ex &lh, const ex &rh) } void expairseq::construct_from_2_expairseq(const expairseq &s1, - const expairseq &s2) + const expairseq &s2) { combine_overall_coeff(s1.overall_coeff); combine_overall_coeff(s2.overall_coeff); @@ -945,7 +928,7 @@ void expairseq::construct_from_2_expairseq(const expairseq &s1, } void expairseq::construct_from_expairseq_ex(const expairseq &s, - const ex &e) + const ex &e) { combine_overall_coeff(s.overall_coeff); if (is_exactly_a(e)) { @@ -1010,7 +993,7 @@ void expairseq::construct_from_exvector(const exvector &v) { // simplifications: +(a,+(b,c),d) -> +(a,b,c,d) (associativity) // +(d,b,c,a) -> +(a,b,c,d) (canonicalization) - // +(...,x,*(x,c1),*(x,c2)) -> +(...,*(x,1+c1+c2)) (c1, c2 numeric()) + // +(...,x,*(x,c1),*(x,c2)) -> +(...,*(x,1+c1+c2)) (c1, c2 numeric) // (same for (+,*) -> (*,^) make_flat(v); @@ -1026,8 +1009,8 @@ void expairseq::construct_from_epvector(const epvector &v, bool do_index_renamin { // simplifications: +(a,+(b,c),d) -> +(a,b,c,d) (associativity) // +(d,b,c,a) -> +(a,b,c,d) (canonicalization) - // +(...,x,*(x,c1),*(x,c2)) -> +(...,*(x,1+c1+c2)) (c1, c2 numeric()) - // (same for (+,*) -> (*,^) + // +(...,x,*(x,c1),*(x,c2)) -> +(...,*(x,1+c1+c2)) (c1, c2 numeric) + // same for (+,*) -> (*,^) make_flat(v, do_index_renaming); #if EXPAIRSEQ_USE_HASHTAB @@ -1449,7 +1432,7 @@ bool expairseq::has_coeff_0() const } void expairseq::add_numerics_to_hashtab(epvector::iterator first_numeric, - epvector::const_iterator last_non_zero) + epvector::const_iterator last_non_zero) { if (first_numeric == seq.end()) return; // no numerics