std::string Expr::dump()

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();
}