19 std::string
const& constantDefinitionString) {
20 std::map<storm::expressions::Variable, storm::expressions::Expression> constantDefinitions;
21 std::set<storm::expressions::Variable> definedConstants;
23 if (!constantDefinitionString.empty()) {
26 std::vector<std::string> definitions;
27 boost::split(definitions, constantDefinitionString, boost::is_any_of(
","));
28 for (
auto& definition : definitions) {
29 boost::trim(definition);
32 std::size_t positionOfAssignmentOperator = definition.find(
'=');
33 STORM_LOG_THROW(positionOfAssignmentOperator != std::string::npos, storm::exceptions::WrongFormatException,
34 "Illegal constant definition string: syntax error.");
37 std::string constantName = definition.substr(0, positionOfAssignmentOperator);
38 boost::trim(constantName);
39 std::string value = definition.substr(positionOfAssignmentOperator + 1);
43 if (manager.hasVariable(constantName)) {
45 auto const& variable = manager.getVariable(constantName);
46 STORM_LOG_THROW(definedConstants.find(variable) == definedConstants.end(), storm::exceptions::WrongFormatException,
47 "Illegally trying to define constant '" << constantName <<
"' twice.");
48 definedConstants.insert(variable);
50 if (manager.hasVariable(value)) {
51 auto const& valueVariable = manager.getVariable(value);
53 variable.getType() == valueVariable.getType(), storm::exceptions::WrongFormatException,
54 "Illegally trying to define constant '" << constantName <<
"' by constant '" << valueVariable.getName() <<
" of different type.");
55 constantDefinitions[variable] = valueVariable.getExpression();
56 }
else if (variable.hasBooleanType()) {
57 if (value ==
"true") {
58 constantDefinitions[variable] = manager.boolean(
true);
59 }
else if (value ==
"false") {
60 constantDefinitions[variable] = manager.boolean(
false);
62 throw storm::exceptions::WrongFormatException() <<
"Illegal value for boolean constant: " << value <<
".";
64 }
else if (variable.hasIntegerType()) {
65 int_fast64_t integerValue = std::stoll(value);
66 constantDefinitions[variable] = manager.integer(integerValue);
67 }
else if (variable.hasRationalType()) {
69 storm::RationalNumber rationalValue = storm::utility::convertNumber<storm::RationalNumber>(value);
70 constantDefinitions[variable] = manager.rational(rationalValue);
71 }
catch (std::exception& e) {
73 "Illegal constant definition string '" << constantName <<
"=" << value <<
"': " << e.what());
78 "Illegal constant definition string: unknown undefined constant '" << constantName <<
"'.");
83 return constantDefinitions;