STORM_LOG_DEBUG("Abstraction in iteration "<<iterations<<" has "<<game.getNumberOfStates()<<" (player 1) states, "<<game.getNumberOfTransitions()<<" transitions, "<<game.getBottomStates().getNonZeroCount()<<" bottom states (computed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(abstractionEnd-abstractionStart).count()<<"ms).");
// (2) Prepare transition matrix BDD and target state BDD for later use.
STORM_LOG_THROW(initialStates.getNonZeroCount()==1||checkTask.isBoundSet(),storm::exceptions::InvalidPropertyException,"Game-based abstraction refinement requires a bound on the formula for model with "<<initialStates.getNonZeroCount()<<" initial states.");
STORM_LOG_DEBUG("Qualitative computation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeEnd-qualitativeStart).count()<<"ms.");
// (4) compute the states for which we have to determine quantitative information.
STORM_LOG_DEBUG("Qualitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeRefinementEnd-qualitativeRefinementStart).count()<<"ms.");
STORM_LOG_DEBUG("Obtained quantitative bounds ["<<quantitativeResult.min.getInitialStatesRange().first<<", "<<quantitativeResult.max.getInitialStatesRange().second<<"] on the actual value for the initial states in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeEnd-quantitativeStart).count()<<"ms.");
// (9) Check whether the lower and upper bounds are close enough to terminate with an answer.
// Make sure that all strategies are still valid strategies.
STORM_LOG_ASSERT(quantitativeResult.min.getPlayer1Strategy().isZero()||quantitativeResult.min.getPlayer1Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer1Variables()).getMax()<=1,"Player 1 strategy for min is illegal.");
STORM_LOG_ASSERT(quantitativeResult.max.getPlayer1Strategy().isZero()||quantitativeResult.max.getPlayer1Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer1Variables()).getMax()<=1,"Player 1 strategy for max is illegal.");
STORM_LOG_ASSERT(quantitativeResult.min.getPlayer2Strategy().isZero()||quantitativeResult.min.getPlayer2Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer2Variables()).getMax()<=1,"Player 2 strategy for min is illegal.");
STORM_LOG_ASSERT(quantitativeResult.max.getPlayer2Strategy().isZero()||quantitativeResult.max.getPlayer2Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer2Variables()).getMax()<=1,"Player 2 strategy for max is illegal.");
STORM_LOG_DEBUG("Quantitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeRefinementEnd-quantitativeRefinementStart).count()<<"ms.");
STORM_LOG_DEBUG("Iteration "<<iterations<<" took "<<std::chrono::duration_cast<std::chrono::milliseconds>(iterationEnd-iterationStart).count()<<"ms.");
STORM_LOG_DEBUG("Qualitative computation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeEnd-qualitativeStart).count()<<"ms.");
// (2) compute the states for which we have to determine quantitative information.
STORM_LOG_DEBUG("Qualitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeRefinementEnd-qualitativeRefinementStart).count()<<"ms.");
STORM_LOG_DEBUG("Obtained quantitative bounds ["<<quantitativeResult.min.getInitialStatesRange().first<<", "<<quantitativeResult.max.getInitialStatesRange().second<<"] on the actual value for the initial states in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeEnd-quantitativeStart).count()<<"ms.");
// (9) Check whether the lower and upper bounds are close enough to terminate with an answer.
// Make sure that all strategies are still valid strategies.
STORM_LOG_ASSERT(quantitativeResult.min.getPlayer1Strategy().isZero()||quantitativeResult.min.getPlayer1Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer1Variables()).getMax()<=1,"Player 1 strategy for min is illegal.");
STORM_LOG_ASSERT(quantitativeResult.max.getPlayer1Strategy().isZero()||quantitativeResult.max.getPlayer1Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer1Variables()).getMax()<=1,"Player 1 strategy for max is illegal.");
STORM_LOG_ASSERT(quantitativeResult.min.getPlayer2Strategy().isZero()||quantitativeResult.min.getPlayer2Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer2Variables()).getMax()<=1,"Player 2 strategy for min is illegal.");
STORM_LOG_ASSERT(quantitativeResult.max.getPlayer2Strategy().isZero()||quantitativeResult.max.getPlayer2Strategy().templatetoAdd<ValueType>().sumAbstract(game.getPlayer2Variables()).getMax()<=1,"Player 2 strategy for max is illegal.");
STORM_LOG_DEBUG("Quantitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeRefinementEnd-quantitativeRefinementStart).count()<<"ms.");
}
// Return null to indicate no result has been found yet.
STORM_LOG_DEBUG("Qualitative computation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeEnd-qualitativeStart).count()<<"ms.");
this->addOption(storm::settings::OptionBuilder(moduleName,solveModeOptionName,true,"Sets how the abstractions are solved.")
.addArgument(storm::settings::ArgumentBuilder::createStringArgument("mode","The mode to use.").addValidatorString(ArgumentValidatorFactory::createMultipleChoiceValidator(solveModes))