this->addOption(storm::settings::OptionBuilder(moduleName,janiInputOptionName,false,"Parses the model given in the JANI format.")
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","The name of the file from which to read the JANI input.").addValidatorString(ArgumentValidatorFactory::createExistingFileValidator()).build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,janiPropertyOptionName,false,"Specifies the properties from the jani model (given by --"+janiInputOptionName+") to be checked.").setShortName(janiPropertyOptionShortName)
this->addOption(storm::settings::OptionBuilder(moduleName,janiPropertyOptionName,false,"Specifies the properties from the jani model (given by --"+janiInputOptionName+") to be checked.").setShortName(janiPropertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of properties to be checked").setDefaultValueString("").build()).build());
STORM_LOG_THROW((strictBound&&maximalReachabilityProbability[i]>=propertyThreshold[i])||(!strictBound&&maximalReachabilityProbability[i]>propertyThreshold[i]),storm::exceptions::InvalidArgumentException,"Given probability threshold "<<propertyThreshold[i]<<" can not be "<<(strictBound?"achieved":"exceeded")<<" in model with maximal reachability probability of "<<maximalReachabilityProbability[i]<<".");
std::cout<<std::endl<<"Maximal property value in model is "<<maximalReachabilityProbability[i]<<"."<<std::endl<<std::endl;
std::cout<<std::endl<<"Maximal property value in model is "<<maximalReachabilityProbability[i]<<"."<<std::endl<<std::endl;
STORM_LOG_THROW(positionOfFirstRelation!=std::string::npos,storm::exceptions::InvalidArgumentException,"When parsing the region"<<parameterBoundariesString<<" I could not find a '<=' after the first number");
STORM_LOG_THROW(positionOfFirstRelation!=std::string::npos,storm::exceptions::InvalidArgumentException,"When parsing the region"<<parameterBoundariesString<<" I could not find a '<=' after the first number");
STORM_LOG_THROW(positionOfSecondRelation!=std::string::npos,storm::exceptions::InvalidArgumentException,"When parsing the region"<<parameterBoundariesString<<" I could not find a '<=' after the parameter");
STORM_LOG_THROW(positionOfSecondRelation!=std::string::npos,storm::exceptions::InvalidArgumentException,"When parsing the region"<<parameterBoundariesString<<" I could not find a '<=' after the parameter");
STORM_LOG_THROW(propertyStructure.count("exp")==1,storm::exceptions::InvalidJaniException,"Expecting operand for operator "<<opstring<<" in "<<scope.description);
STORM_LOG_THROW(propertyStructure.count("exp")==1,storm::exceptions::InvalidJaniException,"Expecting operand for operator "<<opstring<<" in "<<scope.description);
return{parseFormula(model,propertyStructure.at("exp"),formulaContext,scope.refine("Operand of operator "+opstring))};
STORM_LOG_THROW(propertyStructure.count("left")==1,storm::exceptions::InvalidJaniException,"Expecting left operand for operator "<<opstring<<" in "<<scope.description);
STORM_LOG_THROW(propertyStructure.count("right")==1,storm::exceptions::InvalidJaniException,"Expecting right operand for operator "<<opstring<<" in "<<scope.description);
STORM_LOG_THROW(propertyStructure.count("left")==1,storm::exceptions::InvalidJaniException,"Expecting left operand for operator "<<opstring<<" in "<<scope.description);
STORM_LOG_THROW(propertyStructure.count("right")==1,storm::exceptions::InvalidJaniException,"Expecting right operand for operator "<<opstring<<" in "<<scope.description);
return{parseFormula(model,propertyStructure.at("left"),formulaContext,scope.refine("Operand of operator "+opstring)),parseFormula(model,propertyStructure.at("right"),formulaContext,scope.refine("Operand of operator "+opstring))};
}
@ -325,7 +325,7 @@ namespace storm {
STORM_LOG_THROW(false,storm::exceptions::NotImplementedException,"Forall and Exists are currently not supported in "<<scope.description);
}elseif(opString=="Emin"||opString=="Emax"){
STORM_LOG_WARN_COND(model.getJaniVersion()==1,"Model not compliant: Contains Emin/Emax property in "<<scope.description<<".");
STORM_LOG_THROW(propertyStructure.count("exp")==1,storm::exceptions::InvalidJaniException,"Expecting reward-expression for operator "<<opString<<" in "<<scope.description);
STORM_LOG_THROW(propertyStructure.count("exp")==1,storm::exceptions::InvalidJaniException,"Expecting reward-expression for operator "<<opString<<" in "<<scope.description);
STORM_LOG_THROW(rewExpr.hasNumericalType(),storm::exceptions::InvalidJaniException,"Reward expression '"<<rewExpr<<"' does not have numerical type in "<<scope.description);
STORM_LOG_THROW(rbStructure.count("exp")==1,storm::exceptions::InvalidJaniException,"Expecting reward-expression for operator "<<opString<<" in "<<scope.description);
STORM_LOG_THROW(rbStructure.count("exp")==1,storm::exceptions::InvalidJaniException,"Expecting reward-expression for operator "<<opString<<" in "<<scope.description);
storm::expressions::ExpressionrewInstRewardModelExpression=parseExpression(rbStructure.at("exp"),scope.refine("Reward expression at reward-bounds"));
STORM_LOG_THROW(rewInstRewardModelExpression.hasNumericalType(),storm::exceptions::InvalidJaniException,"Reward expression '"<<rewInstRewardModelExpression<<"' does not have numerical type in "<<scope.description);
STORM_LOG_THROW(valueCount<2,storm::exceptions::InvalidJaniException,"Value for constant '"+name+"' (scope: "+scope.description+") must be given at most once.");
STORM_LOG_THROW(valueCount<2,storm::exceptions::InvalidJaniException,"Value for constant '"+name+"' (scope: "+scope.description+") must be given at most once.");
if(valueCount==1){
// Read initial value before; that makes creation later on a bit easier, and has as an additional benefit that we do not need to check whether the variable occurs also on the assignment.
definingExpression=parseExpression(constantStructure.at("value"),scope.refine("Value of constant "+name));
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported type 'clock' for variable '"<<variableName<<"' (scope: "<<scope.description<<")");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported type 'clock' for variable '"<<variableName<<"' (scope: "<<scope.description<<").");
}elseif(typeStructure=="continuous"){
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported type 'continuous' for variable ''"<<variableName<<"' (scope: "<<scope.description<<")");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported type 'continuous' for variable ''"<<variableName<<"' (scope: "<<scope.description<<").");
}else{
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported type "<<typeStructure.dump()<<" for variable '"<<variableName<<"' (scope: "<<scope.description<<")");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported type "<<typeStructure.dump()<<" for variable '"<<variableName<<"' (scope: "<<scope.description<<").");
}
}elseif(typeStructure.is_object()){
STORM_LOG_THROW(typeStructure.count("kind")==1,storm::exceptions::InvalidJaniException,"For complex type as in variable "<<variableName<<"(scope: "<<scope.description<<") kind must be given");
STORM_LOG_THROW(typeStructure.count("kind")==1,storm::exceptions::InvalidJaniException,"For complex type as in variable "<<variableName<<"(scope: "<<scope.description<<") kind must be given");
std::stringkind=getString(typeStructure.at("kind"),"kind for complex type as in variable "+variableName+"(scope: "+scope.description+") ");
if(kind=="bounded"){
STORM_LOG_THROW(typeStructure.count("lower-bound")+typeStructure.count("upper-bound")>0,storm::exceptions::InvalidJaniException,"For bounded type as in variable "<<variableName<<"(scope: "<<scope.description<<") lower-bound or upper-bound must be given");
@ -726,7 +726,7 @@ namespace storm {
STORM_LOG_THROW(!lowerboundExpr.isInitialized()||lowerboundExpr.hasIntegerType(),storm::exceptions::InvalidJaniException,"Lower bound for bounded integer variable "<<variableName<<"(scope: "<<scope.description<<") must be integer-typed");
STORM_LOG_THROW(!upperboundExpr.isInitialized()||upperboundExpr.hasIntegerType(),storm::exceptions::InvalidJaniException,"Upper bound for bounded integer variable "<<variableName<<"(scope: "<<scope.description<<") must be integer-typed");
STORM_LOG_THROW(lowerboundExpr.evaluateAsInt()<=upperboundExpr.evaluateAsInt(),storm::exceptions::InvalidJaniException,"Lower bound must not be larger than upper bound for bounded integer variable "<<variableName<<"(scope: "<<scope.description<<")");
STORM_LOG_THROW(lowerboundExpr.evaluateAsInt()<=upperboundExpr.evaluateAsInt(),storm::exceptions::InvalidJaniException,"Lower bound must not be larger than upper bound for bounded integer variable "<<variableName<<"(scope: "<<scope.description<<").");
STORM_LOG_THROW(!lowerboundExpr.isInitialized()||lowerboundExpr.hasNumericalType(),storm::exceptions::InvalidJaniException,"Lower bound for bounded real variable "<<variableName<<"(scope: "<<scope.description<<") must be numeric");
STORM_LOG_THROW(!upperboundExpr.isInitialized()||upperboundExpr.hasNumericalType(),storm::exceptions::InvalidJaniException,"Upper bound for bounded real variable "<<variableName<<"(scope: "<<scope.description<<") must be numeric");
STORM_LOG_THROW(lowerboundExpr.evaluateAsRational()<=upperboundExpr.evaluateAsRational(),storm::exceptions::InvalidJaniException,"Lower bound must not be larger than upper bound for bounded integer variable "<<variableName<<"(scope: "<<scope.description<<")");
STORM_LOG_THROW(lowerboundExpr.evaluateAsRational()<=upperboundExpr.evaluateAsRational(),storm::exceptions::InvalidJaniException,"Lower bound must not be larger than upper bound for bounded integer variable "<<variableName<<"(scope: "<<scope.description<<").");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported base "<<basictype<<" for bounded variable "<<variableName<<"(scope: "<<scope.description<<")");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported base "<<basictype<<" for bounded variable "<<variableName<<"(scope: "<<scope.description<<").");
}
}elseif(kind=="array"){
STORM_LOG_THROW(typeStructure.count("base")==1,storm::exceptions::InvalidJaniException,"For array type as in variable "<<variableName<<"(scope: "<<scope.description<<") base must be given");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported kind "<<kind<<" for complex type of variable "<<variableName<<"(scope: "<<scope.description<<")");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unsupported kind "<<kind<<" for complex type of variable "<<variableName<<"(scope: "<<scope.description<<").");
}
}
}
@ -767,7 +767,7 @@ namespace storm {
STORM_LOG_THROW(functionDefinitionStructure.count("parameters")==1,storm::exceptions::InvalidJaniException,"Function definition '"+functionName+"' (scope: "+scope.description+") must have exactly one list of parameters.");
STORM_LOG_THROW(parameterStructure.count("name")==1,storm::exceptions::InvalidJaniException,"Parameter declaration of parameter "+std::to_string(parameters.size())+" of Function definition '"+functionName+"' (scope: "+scope.description+") must have a name");
std::stringparameterName=getString(parameterStructure.at("name"),"parameter-name of parameter "+std::to_string(parameters.size())+" of Function definition '"+functionName+"' (scope: "+scope.description+")");
std::stringparameterName=getString(parameterStructure.at("name"),"parameter-name of parameter "+std::to_string(parameters.size())+" of Function definition '"+functionName+"' (scope: "+scope.description+").");
ParsedTypeparameterType;
STORM_LOG_THROW(parameterStructure.count("type")==1,storm::exceptions::InvalidJaniException,"Parameter declaration of parameter "+std::to_string(parameters.size())+" of Function definition '"+functionName+"' (scope: "+scope.description+") must have exactly one type.");
parseType(parameterType,parameterStructure.at("type"),parameterName,scope.refine("parameter declaration of parameter "+std::to_string(parameters.size())+" of function definition "+functionName));
@ -797,9 +797,9 @@ namespace storm {
std::stringexprManagerName=namePrefix+name;
booltransientVar=defaultVariableTransient;// Default value for variables.
STORM_LOG_THROW(tvarcount<=1,storm::exceptions::InvalidJaniException,"Multiple definitions of transient not allowed in variable '"+name+"' (scope: "+scope.description+")");
STORM_LOG_THROW(tvarcount<=1,storm::exceptions::InvalidJaniException,"Multiple definitions of transient not allowed in variable '"+name+"' (scope: "+scope.description+").");
if(tvarcount==1){
transientVar=getBoolean(variableStructure.at("transient"),"transient-attribute in variable '"+name+"' (scope: "+scope.description+")");
transientVar=getBoolean(variableStructure.at("transient"),"transient-attribute in variable '"+name+"' (scope: "+scope.description+").");
}
STORM_LOG_THROW(variableStructure.count("type")==1,storm::exceptions::InvalidJaniException,"Variable '"+name+"' (scope: "+scope.description+") must have a (single) type-declaration.");
STORM_LOG_THROW(initvalcount==1,storm::exceptions::InvalidJaniException,"Initial value must be given once for transient variable '"+name+"' (scope: "+scope.description+") "+name+"' (scope: "+scope.description+")");
STORM_LOG_THROW(initvalcount==1,storm::exceptions::InvalidJaniException,"Initial value must be given once for transient variable '"+name+"' (scope: "+scope.description+") "+name+"' (scope: "+scope.description+").");
}else{
STORM_LOG_THROW(initvalcount<=1,storm::exceptions::InvalidJaniException,"Initial value can be given at most one for variable "+name+"' (scope: "+scope.description+")");
STORM_LOG_THROW(initvalcount<=1,storm::exceptions::InvalidJaniException,"Initial value can be given at most one for variable "+name+"' (scope: "+scope.description+").");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unknown type description, "<<variableStructure.at("type").dump()<<" for variable '"<<name<<"' (scope: "<<scope.description<<")");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unknown type description, "<<variableStructure.at("type").dump()<<" for variable '"<<name<<"' (scope: "<<scope.description<<").");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Distributions are not supported by storm expressions, cannot import "<<expressionStructure.dump()<<" in "<<scope.description<<".");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Distributions are not supported by storm expressions, cannot import "<<expressionStructure.dump()<<" in "<<scope.description<<".");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unknown operator "<<opstring<<" in "<<scope.description<<".");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"Unknown operator "<<opstring<<" in "<<scope.description<<".");
}
}
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"No supported operator declaration found for complex expressions as "<<expressionStructure.dump()<<" in "<<scope.description<<".");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"No supported operator declaration found for complex expressions as "<<expressionStructure.dump()<<" in "<<scope.description<<".");
}
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"No supported expression found at "<<expressionStructure.dump()<<" in "<<scope.description<<".");
STORM_LOG_THROW(false,storm::exceptions::InvalidJaniException,"No supported expression found at "<<expressionStructure.dump()<<" in "<<scope.description<<".");
// Silly warning suppression.
returnstorm::expressions::Expression();
@ -1391,7 +1391,7 @@ namespace storm {
STORM_LOG_THROW(transientValueEntry.count("ref")==1,storm::exceptions::InvalidJaniException,"Transient values in location "<<locName<<" need exactly one ref that is assigned to");
STORM_LOG_THROW(transientValueEntry.count("value")==1,storm::exceptions::InvalidJaniException,"Transient values in location "<<locName<<" need exactly one assigned value");
storm::jani::LValuelValue=parseLValue(transientValueEntry.at("ref"),scope.refine("LHS of assignment in location "+locName));
STORM_LOG_THROW(lValue.isTransient(),storm::exceptions::InvalidJaniException,"Assigned non-transient variable "<<lValue<<" in location "+locName+" (automaton: '"+name+"')");
STORM_LOG_THROW(lValue.isTransient(),storm::exceptions::InvalidJaniException,"Assigned non-transient variable "<<lValue<<" in location "+locName+" (automaton: '"+name+"').");
storm::expressions::Expressionrhs=parseExpression(transientValueEntry.at("value"),scope.refine("Assignment of lValue in location "+locName));
transientAssignments.emplace_back(lValue,rhs);
}
@ -1439,7 +1439,7 @@ namespace storm {
STORM_LOG_THROW(edgeEntry.count("guard")<=1,storm::exceptions::InvalidJaniException,"Guard can be given at most once in edge from '"<<sourceLoc<<"' in automaton '"<<name<<"'");
STORM_LOG_THROW(edgeEntry.at("guard").count("exp")==1,storm::exceptions::InvalidJaniException,"Guard in edge from '"+sourceLoc+"' in automaton '"+name+"' must have one expression");
STORM_LOG_THROW(edgeEntry.at("guard").count("exp")==1,storm::exceptions::InvalidJaniException,"Guard in edge from '"+sourceLoc+"' in automaton '"+name+"' must have one expression");
guardExpr=parseExpression(edgeEntry.at("guard").at("exp"),scope.refine("guard expression in edge from '"+sourceLoc));
STORM_LOG_THROW(guardExpr.hasBooleanType(),storm::exceptions::InvalidJaniException,"Guard "<<guardExpr<<" does not have Boolean type.");
}
@ -1448,13 +1448,13 @@ namespace storm {
// edge assignments
if(edgeEntry.count("assignments")>0){
STORM_LOG_THROW(edgeEntry.count("assignments")==1,storm::exceptions::InvalidJaniException,"Multiple edge assignments in edge from '"+sourceLoc+"' in automaton '"+name+"'.");
STORM_LOG_THROW(edgeEntry.count("assignments")==1,storm::exceptions::InvalidJaniException,"Multiple edge assignments in edge from '"+sourceLoc+"' in automaton '"+name+"'.");
STORM_LOG_THROW(assignmentEntry.count("ref")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' in automaton '"<<name<<"'must have one ref field");
STORM_LOG_THROW(assignmentEntry.count("ref")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' in automaton '"<<name<<"'must have one ref field");
storm::jani::LValuelValue=parseLValue(assignmentEntry.at("ref"),scope.refine("Assignment variable in edge from '"+sourceLoc+"' in automaton '"+name+"'"));
// value
STORM_LOG_THROW(assignmentEntry.count("value")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' in automaton '"<<name<<"' must have one value field");
STORM_LOG_THROW(assignmentEntry.count("value")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' in automaton '"<<name<<"' must have one value field");
storm::expressions::ExpressionassignmentExpr=parseExpression(assignmentEntry.at("value"),scope.refine("assignment in edge from '"+sourceLoc+"' in automaton '"+name+"'"));
// TODO check types
// index
@ -1482,7 +1482,7 @@ namespace storm {
probExpr=expressionManager->rational(1.0);
}else{
STORM_LOG_THROW(destEntry.at("probability").count("exp")==1,storm::exceptions::InvalidJaniException,"Destination in edge from '"<<sourceLoc<<"' to '"<<targetLoc<<"' in automaton '"<<name<<"' must have a probability expression.");
probExpr=parseExpression(destEntry.at("probability").at("exp"),scope.refine("probability expression in edge from '"+sourceLoc+"' to '"+targetLoc+"' in automaton '"+name+"'"));
probExpr=parseExpression(destEntry.at("probability").at("exp"),scope.refine("probability expression in edge from '"+sourceLoc+"' to '"+targetLoc+"' in automaton '"+name+"'"));
}
assert(probExpr.isInitialized());
STORM_LOG_THROW(probExpr.hasNumericalType(),storm::exceptions::InvalidJaniException,"Probability expression "<<probExpr<<" does not have a numerical type.");
STORM_LOG_THROW(assignmentEntry.count("ref")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' to '"<<targetLoc<<"' in automaton '"<<name<<"' must have one ref field");
STORM_LOG_THROW(assignmentEntry.count("ref")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' to '"<<targetLoc<<"' in automaton '"<<name<<"' must have one ref field");
storm::jani::LValuelValue=parseLValue(assignmentEntry.at("ref"),scope.refine("Assignment variable in edge from '"+sourceLoc+"' to '"+targetLoc+"' in automaton '"+name+"'"));
// value
STORM_LOG_THROW(assignmentEntry.count("value")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' to '"<<targetLoc<<"' in automaton '"<<name<<"' must have one value field");
STORM_LOG_THROW(assignmentEntry.count("value")==1,storm::exceptions::InvalidJaniException,"Assignment in edge from '"<<sourceLoc<<"' to '"<<targetLoc<<"' in automaton '"<<name<<"' must have one value field");
storm::expressions::ExpressionassignmentExpr=parseExpression(assignmentEntry.at("value"),scope.refine("assignment in edge from '"+sourceLoc+"' to '"+targetLoc+"' in automaton '"+name+"'"));
STORM_LOG_THROW(preprocessorResult.rewardFinitenessType==SparseMultiObjectivePreprocessorResult<SparseMdpModelType>::RewardFinitenessType::AllFinite,storm::exceptions::NotSupportedException,"There is a scheduler that yields infinite reward for one objective. This is not supported.");
STORM_LOG_THROW(preprocessorResult.rewardFinitenessType==SparseMultiObjectivePreprocessorResult<SparseMdpModelType>::RewardFinitenessType::AllFinite,storm::exceptions::NotSupportedException,"There is a scheduler that yields infinite reward for one objective. This is not supported.");
STORM_LOG_THROW(preprocessorResult.preprocessedModel->getInitialStates().getNumberOfSetBits()==1,storm::exceptions::NotSupportedException,"The model has multiple initial states.");
// Update the objective bounds with what the reward unfolding can compute
STORM_LOG_THROW(SingleObjectiveMode,storm::exceptions::NotSupportedException,"Letting lower bounds approach infinity is only supported in single objective mode.");// It most likely also works with multiple objectives with the same shape. However, we haven't checked this yet.
STORM_LOG_THROW(objectives.front().formula->isProbabilityOperatorFormula(),storm::exceptions::NotSupportedException,"Letting lower bounds approach infinity is only supported for probability operator formulas");
STORM_LOG_THROW(probabilityOperatorFormula.getSubformula().isBoundedUntilFormula(),storm::exceptions::NotSupportedException,"Letting lower bounds approach infinity is only supported for bounded until probabilities.");
STORM_LOG_THROW(probabilityOperatorFormula.getSubformula().isBoundedUntilFormula(),storm::exceptions::NotSupportedException,"Letting lower bounds approach infinity is only supported for bounded until probabilities.");
STORM_LOG_THROW(!model.isNondeterministicModel()||(probabilityOperatorFormula.hasOptimalityType()&&storm::solver::maximize(probabilityOperatorFormula.getOptimalityType())),storm::exceptions::NotSupportedException,"Letting lower bounds approach infinity is only supported for maximizing bounded until probabilities.");
STORM_LOG_THROW(upperBoundedDimensions.empty()||!probabilityOperatorFormula.getSubformula().asBoundedUntilFormula().hasMultiDimensionalSubformulas(),storm::exceptions::NotSupportedException,"Letting lower bounds approach infinity is only supported if the formula has either only lower bounds or if it has a single goal state.");// This would fail because the upper bounded dimension(s) might be satisfied already. One should erase epoch steps in the epoch model (after applying the goal-unfolding).
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("filename","The file from which to read the choice labels.").addValidatorString(ArgumentValidatorFactory::createExistingFileValidator()).build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,constantsOptionName,false,"Specifies the constant replacements to use in symbolic models. Note that this requires the model to be given as an symbolic model (i.e., via --"+prismInputOptionName+" or --"+janiInputOptionName+").").setShortName(constantsOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of constants and their value, e.g. a=1,b=2,c=3.").setDefaultValueString("").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,janiPropertyOptionName,false,"Specifies the properties from the jani model (given by --"+janiInputOptionName+") to be checked.").setShortName(janiPropertyOptionShortName)
this->addOption(storm::settings::OptionBuilder(moduleName,janiPropertyOptionName,false,"Specifies the properties from the jani model (given by --"+janiInputOptionName+") to be checked.").setShortName(janiPropertyOptionShortName)
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("values","A comma separated list of properties to be checked").setDefaultValueString("").build()).build());
this->addOption(storm::settings::OptionBuilder(moduleName,qvbsInputOptionName,false,"Selects a model from the Quantitative Verification Benchmark Set.").setShortName(qvbsInputOptionShortName)
STORM_LOG_THROW(false,storm::exceptions::NotSupportedException,"Unable to determine array size: Size of ConstructorArrayExpression '"<<expression<<"' still contains the "<<variables<<".");
STORM_LOG_THROW(false,storm::exceptions::NotSupportedException,"Unable to determine array size: Size of ConstructorArrayExpression '"<<expression<<"' still contains the "<<variables<<".");