#include #include "storm/storage/expressions/ExprtkExpressionEvaluator.h" #include "storm/storage/expressions/ExpressionManager.h" #include "storm/adapters/RationalFunctionAdapter.h" #include "storm/utility/macros.h" #include "storm/exceptions/UnexpectedException.h" namespace storm { namespace expressions { template ExprtkExpressionEvaluatorBase::ExprtkExpressionEvaluatorBase(storm::expressions::ExpressionManager const& manager) : ExpressionEvaluatorBase(manager), parser(std::make_unique>()), symbolTable(std::make_unique>()), booleanValues(manager.getNumberOfBooleanVariables()), integerValues(manager.getNumberOfIntegerVariables()), rationalValues(manager.getNumberOfRationalVariables()) { for (auto const& variableTypePair : manager) { if (variableTypePair.second.isBooleanType()) { symbolTable->add_variable("v" + std::to_string(variableTypePair.first.getIndex()), this->booleanValues[variableTypePair.first.getOffset()]); } else if (variableTypePair.second.isIntegerType()) { symbolTable->add_variable("v" + std::to_string(variableTypePair.first.getIndex()), this->integerValues[variableTypePair.first.getOffset()]); } else if (variableTypePair.second.isRationalType()) { symbolTable->add_variable("v" + std::to_string(variableTypePair.first.getIndex()), this->rationalValues[variableTypePair.first.getOffset()]); } } } template bool ExprtkExpressionEvaluatorBase::asBool(Expression const& expression) const { auto const& compiledExpression = getCompiledExpression(expression); return compiledExpression.value() == ValueType(1); } template int_fast64_t ExprtkExpressionEvaluatorBase::asInt(Expression const& expression) const { auto const& compiledExpression = getCompiledExpression(expression); return static_cast(compiledExpression.value()); } template typename ExprtkExpressionEvaluatorBase::CompiledExpressionType const& ExprtkExpressionEvaluatorBase::getCompiledExpression(storm::expressions::Expression const& expression) const { if (!expression.hasCompiledExpression() || !expression.getCompiledExpression().isExprtkCompiledExpression()) { CompiledExpressionType compiledExpression; compiledExpression.register_symbol_table(*symbolTable); bool parsingOk = parser->compile(ToExprtkStringVisitor().toString(expression), compiledExpression); STORM_LOG_THROW(parsingOk, storm::exceptions::UnexpectedException, "Expression was not properly parsed by ExprTk: " << expression << ". (Returned error: " << parser->error() << ")"); expression.setCompiledExpression(std::make_shared(compiledExpression)); } return expression.getCompiledExpression().asExprtkCompiledExpression().getCompiledExpression(); } template void ExprtkExpressionEvaluatorBase::setBooleanValue(storm::expressions::Variable const& variable, bool value) { this->booleanValues[variable.getOffset()] = static_cast(value); } template void ExprtkExpressionEvaluatorBase::setIntegerValue(storm::expressions::Variable const& variable, int_fast64_t value) { this->integerValues[variable.getOffset()] = static_cast(value); } template void ExprtkExpressionEvaluatorBase::setRationalValue(storm::expressions::Variable const& variable, double value) { this->rationalValues[variable.getOffset()] = static_cast(value); } ExprtkExpressionEvaluator::ExprtkExpressionEvaluator(storm::expressions::ExpressionManager const& manager) : ExprtkExpressionEvaluatorBase(manager) { // Intentionally left empty. } double ExprtkExpressionEvaluator::asRational(Expression const& expression) const { auto const& compiledExpression = getCompiledExpression(expression); return static_cast(compiledExpression.value()); } template class ExprtkExpressionEvaluatorBase; #ifdef STORM_HAVE_CARL template class ExprtkExpressionEvaluatorBase; template class ExprtkExpressionEvaluatorBase; #endif } }