in src/core/symbolic.cpp [486:549]
std::string Expr::dump(bool short_form) const {
std::stringstream ss;
if (type_ == Expr::Type::value) {
ss << value();
} else if (type_ == Expr::Type::symbol) {
ss << symbol().name();
if (!short_form) {
ss << "[id:" << symbol().id() << "]";
}
} else if (op_ == Op::size) {
ASSERT(args().size() == 1);
ss << "|" << args().at(0).dump(short_form) << "|";
} else if (op_ == Op::max) {
ASSERT(args().size() == 2);
ss << "max(" << args().at(0).dump(short_form) << ", "
<< args().at(1).dump(short_form) << ")";
} else if (op_ == Op::negate) {
ASSERT(args().size() == 1);
auto arg = args().at(0);
ss << "-";
if (arg.type() == Expr::Type::function) {
ss << "(" << args().at(0).dump(short_form) << ")";
} else {
ss << args().at(0).dump(short_form);
}
} else if (op_ == Op::reciprocal) {
ASSERT(args().size() == 1);
ss << args().at(0).dump(short_form) << "^-1";
} else {
ASSERT(args().size() == 2);
auto lhs = args().at(0);
auto rhs = args().at(1);
if (lhs.op() == Op::constant || lhs.args().size() == 1) {
ss << lhs.dump(short_form);
} else {
ss << "(" << lhs.dump(short_form) << ")";
}
// we pretty print addition of negatives
if (op_ == Op::add) {
if (rhs.op() == Op::negate) {
ss << "-";
rhs = rhs.args().at(0);
} else if (rhs.type() == Type::value && rhs.value() < 0) {
ss << "-";
rhs = Expr(-rhs.value());
} else {
ss << "+";
}
} else if (op_ == Op::multiply) {
ss << "*";
} else if (op_ == Op::divide) {
ss << "/";
} else {
ASSERT(0) << "can't print this op id " << (int)op_;
}
if (rhs.op() == Op::constant || rhs.args().size() == 1) {
ss << rhs.dump(short_form);
} else {
ss << "(" << rhs.dump(short_form) << ")";
}
}
return ss.str();
}