#include "pseries.h"
#include "add.h"
-#include "inifcns.h"
+#include "inifcns.h" // for Order function
#include "lst.h"
#include "mul.h"
#include "power.h"
{
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
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:
}
// 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 << '*';
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 << '}';
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 {
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 {
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;
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
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
}
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) {
}
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) {
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;
}
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;
}
}
// 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);
}
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;
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