+ return (new pseries(relational(var,point), std::move(new_seq)))->setflag(status_flags::dynallocated | status_flags::evaluated);
+}
+
+ex pseries::conjugate() const
+{
+ if(!var.info(info_flags::real))
+ return conjugate_function(*this).hold();
+
+ std::unique_ptr<epvector> newseq(conjugateepvector(seq));
+ ex newpoint = point.conjugate();
+
+ if (!newseq && are_ex_trivially_equal(point, newpoint)) {
+ return *this;
+ }
+
+ return (new pseries(var==newpoint, newseq ? std::move(*newseq) : seq))->setflag(status_flags::dynallocated);
+}
+
+ex pseries::real_part() const
+{
+ if(!var.info(info_flags::real))
+ return real_part_function(*this).hold();
+ ex newpoint = point.real_part();
+ if(newpoint != point)
+ return real_part_function(*this).hold();
+
+ epvector v;
+ v.reserve(seq.size());
+ for (auto & it : seq)
+ v.push_back(expair((it.rest).real_part(), it.coeff));
+ return (new pseries(var==point, std::move(v)))->setflag(status_flags::dynallocated);
+}
+
+ex pseries::imag_part() const
+{
+ if(!var.info(info_flags::real))
+ return imag_part_function(*this).hold();
+ ex newpoint = point.real_part();
+ if(newpoint != point)
+ return imag_part_function(*this).hold();
+
+ epvector v;
+ v.reserve(seq.size());
+ for (auto & it : seq)
+ v.push_back(expair((it.rest).imag_part(), it.coeff));
+ return (new pseries(var==point, std::move(v)))->setflag(status_flags::dynallocated);
+}
+
+ex pseries::eval_integ() const
+{
+ std::unique_ptr<epvector> newseq(nullptr);
+ for (auto i=seq.begin(); i!=seq.end(); ++i) {
+ if (newseq) {
+ newseq->push_back(expair(i->rest.eval_integ(), i->coeff));
+ continue;
+ }
+ ex newterm = i->rest.eval_integ();
+ if (!are_ex_trivially_equal(newterm, i->rest)) {
+ newseq.reset(new epvector);
+ newseq->reserve(seq.size());
+ for (auto j=seq.begin(); j!=i; ++j)
+ newseq->push_back(*j);
+ newseq->push_back(expair(newterm, i->coeff));
+ }
+ }
+
+ ex newpoint = point.eval_integ();
+ if (newseq || !are_ex_trivially_equal(newpoint, point))
+ return (new pseries(var==newpoint, std::move(*newseq)))
+ ->setflag(status_flags::dynallocated);
+ return *this;
+}
+
+ex pseries::evalm() const
+{
+ // evalm each coefficient
+ epvector newseq;
+ bool something_changed = false;
+ for (auto i=seq.begin(); i!=seq.end(); ++i) {
+ if (something_changed) {
+ ex newcoeff = i->rest.evalm();
+ if (!newcoeff.is_zero())
+ newseq.push_back(expair(newcoeff, i->coeff));
+ }
+ else {
+ ex newcoeff = i->rest.evalm();
+ if (!are_ex_trivially_equal(newcoeff, i->rest)) {
+ something_changed = true;
+ newseq.reserve(seq.size());
+ std::copy(seq.begin(), i, std::back_inserter<epvector>(newseq));
+ if (!newcoeff.is_zero())
+ newseq.push_back(expair(newcoeff, i->coeff));
+ }
+ }
+ }
+ if (something_changed)
+ return (new pseries(var==point, std::move(newseq)))->setflag(status_flags::dynallocated);
+ else
+ return *this;