]> www.ginac.de Git - ginac.git/blobdiff - ginac/pseries.cpp
documentation update
[ginac.git] / ginac / pseries.cpp
index 9d04f6a996346d42e5d60dd603702105a9b9867b..37f295894077d96ca7552b7f3c639ee48f2004ed 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "pseries.h"
 #include "add.h"
-#include "inifcns.h"
+#include "inifcns.h" // for Order function
 #include "lst.h"
 #include "mul.h"
 #include "power.h"
@@ -126,7 +126,7 @@ void pseries::print(const print_context & c, unsigned level) const
 {
        debugmsg("pseries print", LOGLEVEL_PRINT);
 
-       if (is_of_type(c, print_tree)) {
+       if (is_a<print_tree>(c)) {
 
                c.s << std::string(level, ' ') << class_name()
                    << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec
@@ -145,8 +145,8 @@ void pseries::print(const print_context & c, unsigned level) const
                if (precedence() <= level)
                        c.s << "(";
                
-               std::string par_open = is_of_type(c, print_latex) ? "{(" : "(";
-               std::string par_close = is_of_type(c, print_latex) ? ")}" : ")";
+               std::string par_open = is_a<print_latex>(c) ? "{(" : "(";
+               std::string par_close = is_a<print_latex>(c) ? ")}" : ")";
                
                // objects of type pseries must not have any zero entries, so the
                // trivial (zero) pseries needs a special treatment here:
@@ -168,7 +168,7 @@ void pseries::print(const print_context & c, unsigned level) const
                                }
                                // print 'coeff', something like (x-1)^42
                                if (!i->coeff.is_zero()) {
-                                       if (is_of_type(c, print_latex))
+                                       if (is_a<print_latex>(c))
                                                c.s << ' ';
                                        else
                                                c.s << '*';
@@ -185,7 +185,7 @@ void pseries::print(const print_context & c, unsigned level) const
                                                        i->coeff.print(c);
                                                        c.s << par_close;
                                                } else {
-                                                       if (is_of_type(c, print_latex)) {
+                                                       if (is_a<print_latex>(c)) {
                                                                c.s << '{';
                                                                i->coeff.print(c);
                                                                c.s << '}';
@@ -263,7 +263,7 @@ int pseries::degree(const ex &s) const
        if (var.is_equal(s)) {
                // Return last exponent
                if (seq.size())
-                       return ex_to_numeric((*(seq.end() - 1)).coeff).to_int();
+                       return ex_to<numeric>((*(seq.end() - 1)).coeff).to_int();
                else
                        return 0;
        } else {
@@ -291,7 +291,7 @@ int pseries::ldegree(const ex &s) const
        if (var.is_equal(s)) {
                // Return first exponent
                if (seq.size())
-                       return ex_to_numeric((*(seq.begin())).coeff).to_int();
+                       return ex_to<numeric>((*(seq.begin())).coeff).to_int();
                else
                        return 0;
        } else {
@@ -328,7 +328,7 @@ ex pseries::coeff(const ex &s, int n) const
                while (lo <= hi) {
                        int mid = (lo + hi) / 2;
                        GINAC_ASSERT(is_ex_exactly_of_type(seq[mid].coeff, numeric));
-                       int cmp = ex_to_numeric(seq[mid].coeff).compare(looking_for);
+                       int cmp = ex_to<numeric>(seq[mid].coeff).compare(looking_for);
                        switch (cmp) {
                                case -1:
                                        lo = mid + 1;
@@ -393,13 +393,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) const
+ex pseries::subs(const lst & ls, const lst & lr, bool no_pattern) 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);
+               return convert_to_poly(true).subs(ls, lr, no_pattern);
        
        // Otherwise construct a new series with substituted coefficients and
        // expansion point
@@ -407,10 +407,10 @@ ex pseries::subs(const lst & ls, const lst & lr) 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), it->coeff));
+               newseq.push_back(expair(it->rest.subs(ls, lr, no_pattern), it->coeff));
                ++it;
        }
-       return (new pseries(relational(var,point.subs(ls, lr)), newseq))->setflag(status_flags::dynallocated);
+       return (new pseries(relational(var,point.subs(ls, lr, no_pattern)), newseq))->setflag(status_flags::dynallocated);
 }
 
 /** Implementation of ex::expand() for a power series.  It expands all the
@@ -566,7 +566,7 @@ ex pseries::add_series(const pseries &other) const
                        }
                        break;
                } else
-                       pow_a = ex_to_numeric((*a).coeff).to_int();
+                       pow_a = ex_to<numeric>((*a).coeff).to_int();
                
                // If b is empty, fill up with elements from a and stop
                if (b == b_end) {
@@ -576,7 +576,7 @@ ex pseries::add_series(const pseries &other) const
                        }
                        break;
                } else
-                       pow_b = ex_to_numeric((*b).coeff).to_int();
+                       pow_b = ex_to<numeric>((*b).coeff).to_int();
                
                // a and b are non-empty, compare powers
                if (pow_a < pow_b) {
@@ -629,10 +629,10 @@ ex add::series(const relational & r, int order, unsigned options) const
                else
                        op = it->rest.series(r, order, options);
                if (!it->coeff.is_equal(_ex1()))
-                       op = ex_to_pseries(op).mul_const(ex_to_numeric(it->coeff));
+                       op = ex_to<pseries>(op).mul_const(ex_to<numeric>(it->coeff));
                
                // Series addition
-               acc = ex_to_pseries(acc).add_series(ex_to_pseries(op));
+               acc = ex_to<pseries>(acc).add_series(ex_to<pseries>(op));
        }
        return acc;
 }
@@ -731,15 +731,15 @@ ex mul::series(const relational & r, int order, unsigned options) const
                if (op.info(info_flags::numeric)) {
                        // series * const (special case, faster)
                        ex f = power(op, it->coeff);
-                       acc = ex_to_pseries(acc).mul_const(ex_to_numeric(f));
+                       acc = ex_to<pseries>(acc).mul_const(ex_to<numeric>(f));
                        continue;
                } else if (!is_ex_exactly_of_type(op, pseries))
                        op = op.series(r, order, options);
                if (!it->coeff.is_equal(_ex1()))
-                       op = ex_to_pseries(op).power_const(ex_to_numeric(it->coeff), order);
+                       op = ex_to<pseries>(op).power_const(ex_to<numeric>(it->coeff), order);
 
                // Series multiplication
-               acc = ex_to_pseries(acc).mul_series(ex_to_pseries(op));
+               acc = ex_to<pseries>(acc).mul_series(ex_to<pseries>(op));
        }
        return acc;
 }
@@ -862,7 +862,7 @@ ex power::series(const relational & r, int order, unsigned options) const
        }
        
        // Power e
-       return ex_to_pseries(e).power_const(ex_to_numeric(exponent), order);
+       return ex_to<pseries>(e).power_const(ex_to<numeric>(exponent), order);
 }
 
 
@@ -880,7 +880,7 @@ ex pseries::series(const relational & r, int order, unsigned options) const
                        epvector new_seq;
                        epvector::const_iterator it = seq.begin(), itend = seq.end();
                        while (it != itend) {
-                               int o = ex_to_numeric(it->coeff).to_int();
+                               int o = ex_to<numeric>(it->coeff).to_int();
                                if (o >= order) {
                                        new_seq.push_back(expair(Order(_ex1()), o));
                                        break;
@@ -911,7 +911,7 @@ ex ex::series(const ex & r, int order, unsigned options) const
        relational rel_;
        
        if (is_ex_exactly_of_type(r,relational))
-               rel_ = ex_to_relational(r);
+               rel_ = ex_to<relational>(r);
        else if (is_ex_exactly_of_type(r,symbol))
                rel_ = relational(r,_ex0());
        else