X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;ds=sidebyside;f=ginac%2Fpseries.cpp;h=224d28dcb06661729085129945283a1e5e644078;hb=b4be7b0f30fbb6178cf4ee83e1b3952e084bd8ca;hp=bdf17d16c2b19f84dfd9ba2cebef81fb2f7ab874;hpb=dbd9c306a74f1cb258c0d15a346b973b39deaad2;p=ginac.git diff --git a/ginac/pseries.cpp b/ginac/pseries.cpp index bdf17d16..224d28dc 100644 --- a/ginac/pseries.cpp +++ b/ginac/pseries.cpp @@ -31,8 +31,8 @@ #include "mul.h" #include "power.h" #include "relational.h" +#include "operators.h" #include "symbol.h" -#include "print.h" #include "archive.h" #include "utils.h" @@ -42,21 +42,11 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(pseries, basic) /* - * Default ctor, dtor, copy ctor, assignment operator and helpers + * Default constructor */ pseries::pseries() : inherited(TINFO_pseries) { } -void pseries::copy(const pseries &other) -{ - inherited::copy(other); - seq = other.seq; - var = other.var; - point = other.point; -} - -DEFAULT_DESTROY(pseries) - /* * Other ctors @@ -84,7 +74,7 @@ pseries::pseries(const ex &rel_, const epvector &ops_) : basic(TINFO_pseries), s * Archiving */ -pseries::pseries(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst) +pseries::pseries(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) { for (unsigned int i=0; true; ++i) { ex rest; @@ -125,8 +115,8 @@ void pseries::print(const print_context & c, unsigned level) const << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec << std::endl; unsigned delta_indent = static_cast(c).delta_indent; - unsigned num = seq.size(); - for (unsigned i=0; i= seq.size()) + if (i >= seq.size()) throw (std::out_of_range("op() out of range")); - return seq[i].rest * power(var - point, seq[i].coeff); -} -ex &pseries::let_op(int i) -{ - throw (std::logic_error("let_op not defined for pseries")); + return seq[i].rest * power(var - point, seq[i].coeff); } /** Return degree of highest power of the series. This is usually the exponent @@ -409,13 +395,13 @@ ex pseries::evalf(int level) const return (new pseries(relational(var,point), new_seq))->setflag(status_flags::dynallocated | status_flags::evaluated); } -ex pseries::subs(const lst & ls, const lst & lr, bool no_pattern) const +ex pseries::subs(const exmap & m, unsigned options) const { // If expansion variable is being substituted, convert the series to a // polynomial and do the substitution there because the result might // no longer be a power series - if (ls.has(var)) - return convert_to_poly(true).subs(ls, lr, no_pattern); + if (m.find(var) != m.end()) + return convert_to_poly(true).subs(m, options); // Otherwise construct a new series with substituted coefficients and // expansion point @@ -423,10 +409,10 @@ ex pseries::subs(const lst & ls, const lst & lr, bool no_pattern) const newseq.reserve(seq.size()); epvector::const_iterator it = seq.begin(), itend = seq.end(); while (it != itend) { - newseq.push_back(expair(it->rest.subs(ls, lr, no_pattern), it->coeff)); + newseq.push_back(expair(it->rest.subs(m, options), it->coeff)); ++it; } - return (new pseries(relational(var,point.subs(ls, lr, no_pattern)), newseq))->setflag(status_flags::dynallocated); + return (new pseries(relational(var,point.subs(m, options)), newseq))->setflag(status_flags::dynallocated); } /** Implementation of ex::expand() for a power series. It expands all the @@ -499,7 +485,7 @@ ex pseries::convert_to_poly(bool no_order) const return e; } -bool pseries::is_terminating(void) const +bool pseries::is_terminating() const { return seq.empty() || !is_order_function((seq.end()-1)->rest); } @@ -516,7 +502,7 @@ ex basic::series(const relational & r, int order, unsigned options) const epvector seq; numeric fac = 1; ex deriv = *this; - ex coeff = deriv.subs(r); + ex coeff = deriv.subs(r, subs_options::no_pattern); const symbol &s = ex_to(r.lhs()); if (!coeff.is_zero()) @@ -532,7 +518,7 @@ ex basic::series(const relational & r, int order, unsigned options) const if (deriv.is_zero()) // Series terminates return pseries(r, seq); - coeff = deriv.subs(r); + coeff = deriv.subs(r, subs_options::no_pattern); if (!coeff.is_zero()) seq.push_back(expair(fac.inverse() * coeff, n)); } @@ -874,7 +860,7 @@ ex power::series(const relational & r, int order, unsigned options) const // Basis is not a series, may there be a singularity? bool must_expand_basis = false; try { - basis.subs(r); + basis.subs(r, subs_options::no_pattern); } catch (pole_error) { must_expand_basis = true; } @@ -884,7 +870,7 @@ ex power::series(const relational & r, int order, unsigned options) const return basic::series(r, order, options); // Is the expression of type 0^something? - if (!must_expand_basis && !basis.subs(r).is_zero()) + if (!must_expand_basis && !basis.subs(r, subs_options::no_pattern).is_zero()) return basic::series(r, order, options); // Singularity encountered, is the basis equal to (var - point)? @@ -943,11 +929,10 @@ ex pseries::series(const relational & r, int order, unsigned options) const * @return an expression holding a pseries object */ ex ex::series(const ex & r, int order, unsigned options) const { - GINAC_ASSERT(bp!=0); ex e; relational rel_; - if (is_exactly_a(r)) + if (is_a(r)) rel_ = ex_to(r); else if (is_a(r)) rel_ = relational(r,_ex0);