11namespace expressions {
14template<
typename RationalFunctionType>
15ToRationalFunctionVisitor<RationalFunctionType>::ToRationalFunctionVisitor(ExpressionEvaluatorBase<RationalFunctionType>
const& evaluator)
20template<
typename RationalFunctionType>
21RationalFunctionType ToRationalFunctionVisitor<RationalFunctionType>::toRationalFunction(Expression
const& expression) {
22 return boost::any_cast<RationalFunctionType>(expression.accept(*
this, boost::none));
25template<
typename RationalFunctionType>
26boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(IfThenElseExpression
const& expression, boost::any
const& data) {
27 bool conditionValue = evaluator.asBool(expression.getCondition());
29 return expression.getThenExpression()->accept(*
this, data);
31 return expression.getElseExpression()->accept(*
this, data);
35template<
typename RationalFunctionType>
36boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(BinaryBooleanFunctionExpression
const&, boost::any
const&) {
37 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Expression cannot be translated into a rational function.");
40template<
typename RationalFunctionType>
41boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(BinaryNumericalFunctionExpression
const& expression, boost::any
const& data) {
42 RationalFunctionType firstOperandAsRationalFunction = boost::any_cast<RationalFunctionType>(expression.getFirstOperand()->accept(*
this, data));
43 RationalFunctionType secondOperandAsRationalFunction = boost::any_cast<RationalFunctionType>(expression.getSecondOperand()->accept(*
this, data));
44 switch (expression.getOperatorType()) {
45 case BinaryNumericalFunctionExpression::OperatorType::Plus:
46 return firstOperandAsRationalFunction + secondOperandAsRationalFunction;
47 case BinaryNumericalFunctionExpression::OperatorType::Minus:
48 return firstOperandAsRationalFunction - secondOperandAsRationalFunction;
49 case BinaryNumericalFunctionExpression::OperatorType::Times:
50 return firstOperandAsRationalFunction * secondOperandAsRationalFunction;
51 case BinaryNumericalFunctionExpression::OperatorType::Divide:
52 return firstOperandAsRationalFunction / secondOperandAsRationalFunction;
53 case BinaryNumericalFunctionExpression::OperatorType::Power: {
55 "Exponent of power operator must be an integer but is " << secondOperandAsRationalFunction <<
".");
56 auto exponentAsInteger = storm::utility::convertNumber<carl::sint>(secondOperandAsRationalFunction);
60 STORM_LOG_ASSERT(
false,
"Illegal operator type " << expression.getOperator() <<
" in expression" << expression <<
".");
67template<
typename RationalFunctionType>
68boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(BinaryRelationExpression
const&, boost::any
const&) {
69 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Expression cannot be translated into a rational function.");
72template<
typename RationalFunctionType>
73boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(VariableExpression
const& expression, boost::any
const&) {
74 auto valueIt = valueMapping.find(expression.getVariable());
75 if (valueIt != valueMapping.end()) {
76 return valueIt->second;
79 auto variablePair = variableToVariableMap.find(expression.getVariable());
80 if (variablePair != variableToVariableMap.end()) {
81 return convertVariableToPolynomial(variablePair->second);
84 variableToVariableMap.emplace(expression.getVariable(), carlVariable);
85 return convertVariableToPolynomial(carlVariable);
89template<
typename RationalFunctionType>
90boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(UnaryBooleanFunctionExpression
const&, boost::any
const&) {
91 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Expression cannot be translated into a rational function.");
94template<
typename RationalFunctionType>
95boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(UnaryNumericalFunctionExpression
const& expression, boost::any
const& data) {
96 RationalFunctionType operandAsRationalFunction = boost::any_cast<RationalFunctionType>(expression.getOperand()->accept(*
this, data));
97 switch (expression.getOperatorType()) {
98 case UnaryNumericalFunctionExpression::OperatorType::Minus:
99 return -operandAsRationalFunction;
101 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Expression cannot be translated into a rational function.");
106template<
typename RationalFunctionType>
107boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(BooleanLiteralExpression
const&, boost::any
const&) {
108 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Expression cannot be translated into a rational function.");
111template<
typename RationalFunctionType>
112boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(IntegerLiteralExpression
const& expression, boost::any
const&) {
113 return RationalFunctionType(storm::utility::convertNumber<storm::RationalFunction>(expression.getValue()));
116template<
typename RationalFunctionType>
117boost::any ToRationalFunctionVisitor<RationalFunctionType>::visit(RationalLiteralExpression
const& expression, boost::any
const&) {
118 return storm::utility::convertNumber<storm::RationalFunction>(expression.getValue());
121template<
typename RationalFunctionType>
122void ToRationalFunctionVisitor<RationalFunctionType>::setMapping(
storm::expressions::Variable const& variable, RationalFunctionType
const& value) {
123 valueMapping[variable] = value;
126template class ToRationalFunctionVisitor<storm::RationalFunction>;
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
bool isInteger(ValueType const &number)
ValueType pow(ValueType const &value, int_fast64_t exponent)
carl::Cache< carl::PolynomialFactorizationPair< RawPolynomial > > RawPolynomialCache
RationalFunctionVariable createRFVariable(std::string const &name)
carl::Variable RationalFunctionVariable