STORM_LOG_THROW(mdp.getNumberOfChoices()==labelSets.size(),storm::exceptions::InvalidArgumentException,"The given number of labels does not match the number of choices.");
std::cout<<std::endl<<"Computed minimal command set of size "<<usedCommandSet.size()<<" in "<<std::chrono::duration_cast<std::chrono::milliseconds>(endTime-startTime).count()<<"ms."<<std::endl;
std::cout<<std::endl<<"Computed minimal command set of size "<<commandSet.size()<<" in "<<std::chrono::duration_cast<std::chrono::milliseconds>(endTime-startTime).count()<<"ms."<<std::endl;
STORM_LOG_THROW(this->canHandle(checkTask),storm::exceptions::InvalidArgumentException,"The model checker is not able to check the formula '"<<formula<<"'.");
STORM_LOG_THROW(stateFormula.getLeftSubformula().isStateFormula()&&stateFormula.getRightSubformula().isStateFormula(),storm::exceptions::InvalidArgumentException,"The given formula is invalid.");
STORM_LOG_THROW(result->isQuantitative(),storm::exceptions::InvalidOperationException,"Unable to perform comparison operation on non-quantitative result.");
STORM_LOG_THROW(result->isQuantitative(),storm::exceptions::InvalidOperationException,"Unable to perform comparison operation on non-quantitative result.");
STORM_LOG_THROW(result->isQuantitative(),storm::exceptions::InvalidOperationException,"Unable to perform comparison operation on non-quantitative result.");
STORM_LOG_THROW(result->isQuantitative(),storm::exceptions::InvalidOperationException,"Unable to perform comparison operation on non-quantitative result.");
STORM_LOG_THROW(!rewardPathFormula.isStepBounded(),storm::exceptions::NotImplementedException,"Currently step-bounded properties on CTMCs are not supported.");
STORM_LOG_THROW(!rewardPathFormula.isStepBounded(),storm::exceptions::NotImplementedException,"Currently step-bounded properties on CTMCs are not supported.");
STORM_LOG_THROW(!rewardPathFormula.isStepBounded(),storm::exceptions::NotImplementedException,"Currently step-bounded properties on CTMCs are not supported.");
STORM_LOG_THROW(!rewardPathFormula.isStepBounded(),storm::exceptions::NotImplementedException,"Currently step-bounded properties on CTMCs are not supported.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(pathFormula.getLeftSubformula().isTrueFormula(),storm::exceptions::NotImplementedException,"Only bounded properties of the form 'true U[t1, t2] phi' are currently supported.");
STORM_LOG_THROW(this->getModel().isClosed(),storm::exceptions::InvalidPropertyException,"Unable to compute time-bounded reachability probabilities in non-closed Markov automaton.");
STORM_LOG_THROW(!pathFormula.getTimeBoundReference().isStepBound(),storm::exceptions::NotImplementedException,"Currently step-bounded properties on MAs are not supported.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(this->getModel().isClosed(),storm::exceptions::InvalidPropertyException,"Unable to compute reachability rewards in non-closed Markov automaton.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(this->getModel().isClosed(),storm::exceptions::InvalidPropertyException,"Unable to compute long-run average in non-closed Markov automaton.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(this->getModel().isClosed(),storm::exceptions::InvalidPropertyException,"Unable to compute long run average rewards in non-closed Markov automaton.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(this->getModel().isClosed(),storm::exceptions::InvalidPropertyException,"Unable to compute expected times in non-closed Markov automaton.");
STORM_LOG_THROW(false,storm::exceptions::InvalidOperationException,"Computing bounded reachability probabilities is unsupported for this value type.");
// Compute the expected total rewards for the probabilistic states
solver->solveEquations(dir,x,b);
solver->solveEquations(env,dir,x,b);
// now compute the values for the markovian states. We also keep track of the maximal and minimal difference between two values (for convergence checking)
STORM_LOG_THROW(!pathFormula.hasLowerBound()&&pathFormula.hasUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have single upper time bound.");
STORM_LOG_THROW(pathFormula.hasIntegerUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have discrete upper time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(!pathFormula.hasLowerBound()&&pathFormula.hasUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have single upper time bound.");
STORM_LOG_THROW(pathFormula.hasIntegerUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have discrete upper time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(rewardPathFormula.hasIntegerBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have a discrete time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(rewardPathFormula.hasIntegerBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have a discrete time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(!pathFormula.hasLowerBound()&&pathFormula.hasUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have single upper time bound.");
STORM_LOG_THROW(pathFormula.hasIntegerUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have discrete upper time bound.");
STORM_LOG_THROW(conditionalFormula.getSubformula().isEventuallyFormula(),storm::exceptions::InvalidPropertyException,"Illegal conditional probability formula.");
STORM_LOG_THROW(conditionalFormula.getConditionFormula().isEventuallyFormula(),storm::exceptions::InvalidPropertyException,"Illegal conditional probability formula.");
STORM_LOG_THROW(conditionalFormula.getSubformula().isReachabilityRewardFormula(),storm::exceptions::InvalidPropertyException,"Illegal conditional probability formula.");
STORM_LOG_THROW(conditionalFormula.getConditionFormula().isEventuallyFormula(),storm::exceptions::InvalidPropertyException,"Illegal conditional probability formula.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(!pathFormula.hasLowerBound()&&pathFormula.hasUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have single upper time bound.");
STORM_LOG_THROW(pathFormula.hasIntegerUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have discrete upper time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(this->getModel().getInitialStates().getNumberOfSetBits()==1,storm::exceptions::InvalidPropertyException,"Cannot compute conditional probabilities on MDPs with more than one initial state.");
STORM_LOG_THROW(conditionalFormula.getSubformula().isEventuallyFormula(),storm::exceptions::InvalidPropertyException,"Illegal conditional probability formula.");
STORM_LOG_THROW(conditionalFormula.getConditionFormula().isEventuallyFormula(),storm::exceptions::InvalidPropertyException,"Illegal conditional probability formula.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(rewardPathFormula.hasIntegerBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have a discrete time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(rewardPathFormula.hasIntegerBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have a discrete time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(!pathFormula.hasLowerBound()&&pathFormula.hasUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have single upper time bound.");
STORM_LOG_THROW(pathFormula.hasIntegerUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have discrete upper time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidArgumentException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidArgumentException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(!pathFormula.hasLowerBound()&&pathFormula.hasUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have single upper time bound.");
STORM_LOG_THROW(pathFormula.hasIntegerUpperBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have discrete upper time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidArgumentException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(rewardPathFormula.hasIntegerBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have a discrete time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidArgumentException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(rewardPathFormula.hasIntegerBound(),storm::exceptions::InvalidPropertyException,"Formula needs to have a discrete time bound.");
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(),storm::exceptions::InvalidPropertyException,"Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model.");
STORM_LOG_THROW(!qualitative||!produceScheduler,storm::exceptions::InvalidSettingsException,"Cannot produce scheduler when performing qualitative model checking only.");
STORM_LOG_INFO("Selecting 'Policy iteration' as the solution technique to guarantee exact results. If you want to override this, please explicitly specify a different method.");
method=MinMaxMethod::PolicyIteration;
}else{
STORM_LOG_WARN("The selected solution method does not guarantee exact results.");
}
}
STORM_LOG_THROW(method==MinMaxMethod::ValueIteration||method==MinMaxMethod::PolicyIteration||method==MinMaxMethod::RationalSearch,storm::exceptions::InvalidEnvironmentException,"This solver does not support the selected method.");
STORM_LOG_THROW(env.solver().minMax().getMethod==MinMaxMethod::LinearProgramming,storm::exceptions::InvalidEnvironmentException,"This min max solver does not support the selected technique.")
STORM_LOG_THROW(env.solver().minMax().getMethod==MinMaxMethod::LinearProgramming,storm::exceptions::InvalidEnvironmentException,"This min max solver does not support the selected technique.")
STORM_LOG_ASSERT(this->lpSolverFactory,"Lp solver factory not initialized.");
STORM_LOG_ASSERT(this->linearEquationSolverFactory,"Linear equation solver factory not initialized.");
STORM_LOG_THROW(newMethod==MinMaxMethodSelection::LinearProgramming,storm::exceptions::InvalidOperationException,"The factory can only create linear programming based MinMax solvers.");
STORM_LOG_THROW(newMethod==MinMaxMethod::LinearProgramming,storm::exceptions::InvalidOperationException,"The factory can only create linear programming based MinMax solvers.");
STORM_LOG_WARN_COND_DEBUG(this->isRequirementsCheckedSet(),"The requirements of the solver have not been marked as checked. Please provide the appropriate check or mark the requirements as checked (if applicable).");
STORM_LOG_INFO("Selecting policy iteration as the solution method to guarantee exact results. If you want to override this, please explicitly specify a different method.");
STORM_LOG_WARN_COND(!(std::is_same<ValueType,storm::RationalNumber>::value)||(newMethod==MinMaxMethod::PolicyIteration||newMethod==MinMaxMethod::RationalSearch),"The selected solution method does not guarantee exact results. Consider using policy iteration.");
STORM_LOG_INFO("Selecting 'rational search' as the solution technique to guarantee exact results. If you want to override this, please explicitly specify a different method.");
STORM_LOG_INFO("Selecting 'rational search' as the solution technique to guarantee exact results. If you want to override this, please explicitly specify a different method.");
method=MinMaxMethod::RationalSearch;
}else{
STORM_LOG_WARN("The selected solution method does not guarantee exact results.");
}
}
STORM_LOG_THROW(method==MinMaxMethod::ValueIteration||method==MinMaxMethod::PolicyIteration||method==MinMaxMethod::RationalSearch,storm::exceptions::InvalidEnvironmentException,"This solver does not support the selected method.");
STORM_LOG_WARN_COND_DEBUG(this->isRequirementsCheckedSet(),"The requirements of the solver have not been marked as checked. Please provide the appropriate check or mark the requirements as checked (if applicable).");
STORM_LOG_TRACE("Completed "<<valueIterationInvocations<<" value iteration invocations, the last one with precision "<<precision<<" completed in "<<viResult.iterations<<" iterations.");
xxxxxxxxxx