72 lines
3.1 KiB

#include "src/storage/expressions/VariableExpression.h"
#include "src/utility/macros.h"
#include "src/exceptions/InvalidTypeException.h"
namespace storm {
namespace expressions {
VariableExpression::VariableExpression(Variable const& variable) : BaseExpression(variable.getManager(), variable.getType()), variable(variable) {
// Intentionally left empty.
}
std::string const& VariableExpression::getVariableName() const {
return variable.getName();
}
Variable const& VariableExpression::getVariable() const {
return variable;
}
bool VariableExpression::evaluateAsBool(Valuation const* valuation) const {
STORM_LOG_ASSERT(valuation != nullptr, "Evaluating expressions with unknowns without valuation.");
STORM_LOG_THROW(this->hasBooleanType(), storm::exceptions::InvalidTypeException, "Cannot evaluate expression as boolean: return type is not a boolean.");
return valuation->getBooleanValue(this->getVariable());
}
int_fast64_t VariableExpression::evaluateAsInt(Valuation const* valuation) const {
STORM_LOG_ASSERT(valuation != nullptr, "Evaluating expressions with unknowns without valuation.");
STORM_LOG_THROW(this->hasIntegerType(), storm::exceptions::InvalidTypeException, "Cannot evaluate expression as integer: return type is not an integer.");
return valuation->getIntegerValue(this->getVariable());
}
double VariableExpression::evaluateAsDouble(Valuation const* valuation) const {
STORM_LOG_ASSERT(valuation != nullptr, "Evaluating expressions with unknowns without valuation.");
STORM_LOG_THROW(this->hasNumericalType(), storm::exceptions::InvalidTypeException, "Cannot evaluate expression as double: return type is not a double.");
if (this->getType().isIntegerType()) {
return static_cast<double>(valuation->getIntegerValue(this->getVariable()));
} else {
return valuation->getRationalValue(this->getVariable());
}
}
std::string const& VariableExpression::getIdentifier() const {
return this->getVariableName();
}
bool VariableExpression::containsVariables() const {
return true;
}
bool VariableExpression::isVariable() const {
return true;
}
void VariableExpression::gatherVariables(std::set<storm::expressions::Variable>& variables) const {
variables.insert(this->getVariable());
}
std::shared_ptr<BaseExpression const> VariableExpression::simplify() const {
return this->shared_from_this();
}
boost::any VariableExpression::accept(ExpressionVisitor& visitor) const {
return visitor.visit(*this);
}
void VariableExpression::printToStream(std::ostream& stream) const {
stream << this->getVariableName();
}
}
}