#include "add.h"
#include "mul.h"
+#include "matrix.h"
#include "archive.h"
#include "debugmsg.h"
#include "utils.h"
} else if (is_of_type(c, print_csrc)) {
- if (precedence <= level)
+ if (precedence() <= level)
c.s << "(";
// Print arguments, separated by "+"
// If the coefficient is -1, it is replaced by a single minus sign
if (it->coeff.compare(_num1()) == 0) {
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
} else if (it->coeff.compare(_num_1()) == 0) {
c.s << "-";
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
} else if (ex_to_numeric(it->coeff).numer().compare(_num1()) == 0) {
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
c.s << "/";
- ex_to_numeric(it->coeff).denom().print(c, precedence);
+ ex_to_numeric(it->coeff).denom().print(c, precedence());
} else if (ex_to_numeric(it->coeff).numer().compare(_num_1()) == 0) {
c.s << "-";
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
c.s << "/";
- ex_to_numeric(it->coeff).denom().print(c, precedence);
+ ex_to_numeric(it->coeff).denom().print(c, precedence());
} else {
- it->coeff.bp->print(c, precedence);
+ it->coeff.bp->print(c, precedence());
c.s << "*";
- it->rest.bp->print(c, precedence);
+ it->rest.bp->print(c, precedence());
}
// Separator is "+", except if the following expression would have a leading minus sign
if (!overall_coeff.is_zero()) {
if (overall_coeff.info(info_flags::positive))
c.s << '+';
- overall_coeff.bp->print(c, precedence);
+ overall_coeff.bp->print(c, precedence());
}
- if (precedence <= level)
+ if (precedence() <= level)
c.s << ")";
} else {
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << "{(";
else
if (!is_of_type(c, print_tree))
overall_coeff.print(c, 0);
else
- overall_coeff.print(c, precedence);
+ overall_coeff.print(c, precedence());
first = false;
}
coeff.print(c);
} else {
if (coeff.csgn() == -1)
- (-coeff).print(c, precedence);
+ (-coeff).print(c, precedence());
else
- coeff.print(c, precedence);
+ coeff.print(c, precedence());
}
if (is_of_type(c, print_latex))
c.s << ' ';
else
c.s << '*';
}
- it->rest.print(c, precedence);
+ it->rest.print(c, precedence());
it++;
}
- if (precedence <= level) {
+ if (precedence() <= level) {
if (is_of_type(c, print_latex))
c.s << ")}";
else
return this->hold();
}
+ex add::evalm(void) const
+{
+ // Evaluate children first and add up all matrices. Stop if there's one
+ // term that is not a matrix.
+ epvector *s = new epvector;
+ s->reserve(seq.size());
+
+ bool all_matrices = true;
+ bool first_term = true;
+ matrix sum;
+
+ epvector::const_iterator it = seq.begin(), itend = seq.end();
+ while (it != itend) {
+ const ex &m = recombine_pair_to_ex(*it).evalm();
+ s->push_back(split_ex_to_pair(m));
+ if (is_ex_of_type(m, matrix)) {
+ if (first_term) {
+ sum = ex_to_matrix(m);
+ first_term = false;
+ } else
+ sum = sum.add(ex_to_matrix(m));
+ } else
+ all_matrices = false;
+ it++;
+ }
+
+ if (all_matrices)
+ return sum + overall_coeff;
+ else
+ return (new add(s, overall_coeff))->setflag(status_flags::dynallocated);
+}
+
ex add::simplify_ncmul(const exvector & v) const
{
if (seq.size()==0) {
return (new add(vp,overall_coeff))->setflag(status_flags::expanded | status_flags::dynallocated);
}
-//////////
-// static member variables
-//////////
-
-// protected
-
-unsigned add::precedence = 40;
-
} // namespace GiNaC