STORM_LOG_WARN_COND(!model.hasUndefinedConstants(),"Model contains undefined constants. Game-based abstraction can treat such models, but you should make sure that you did not simply forget to define these constants. In particular, it may be necessary to constrain the values of the undefined constants.");
STORM_LOG_WARN_COND(!model.hasUndefinedConstants(),"Model contains undefined constants. Game-based abstraction can treat such models, but you should make sure that you did not simply forget to define these constants. In particular, it may be necessary to constrain the values of the undefined constants.");
STORM_LOG_DEBUG("Abstraction in iteration "<<iterations<<" has "<<game.getNumberOfStates()<<" player 1 states, "<<game.getNumberOfPlayer2States()<<" player 2 states, "<<game.getNumberOfTransitions()<<" transitions, "<<game.getBottomStates().getNonZeroCount()<<" bottom states (computed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(abstractionEnd-abstractionStart).count()<<"ms).");
STORM_LOG_INFO("Abstraction in iteration "<<iterations<<" has "<<game.getNumberOfStates()<<" player 1 states, "<<game.getNumberOfPlayer2States()<<" player 2 states, "<<game.getNumberOfTransitions()<<" transitions, "<<game.getBottomStates().getNonZeroCount()<<" bottom states (computed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(abstractionEnd-abstractionStart).count()<<"ms).");
// (2) Prepare initial, constraint and target state BDDs for later use.
// (2) Prepare initial, constraint and target state BDDs for later use.
STORM_LOG_DEBUG("Iteration "<<iterations<<" took "<<std::chrono::duration_cast<std::chrono::milliseconds>(iterationEnd-iterationStart).count()<<"ms.");
STORM_LOG_INFO("Iteration "<<iterations<<" took "<<std::chrono::duration_cast<std::chrono::milliseconds>(iterationEnd-iterationStart).count()<<"ms.");
}
}
// If this point is reached, we have given up on abstraction.
// If this point is reached, we have given up on abstraction.
STORM_LOG_DEBUG("Qualitative computation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeEnd-qualitativeStart).count()<<"ms.");
STORM_LOG_INFO("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.
// (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_INFO("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.");
STORM_LOG_INFO("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.
// (9) Check whether the lower and upper bounds are close enough to terminate with an answer.
STORM_LOG_DEBUG("Quantitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeRefinementEnd-quantitativeRefinementStart).count()<<"ms.");
STORM_LOG_INFO("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.
// Return null to indicate no result has been found yet.
STORM_LOG_DEBUG("Translation to explicit representation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(translationEnd-translationStart).count()<<"ms.");
STORM_LOG_INFO("Translation to explicit representation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(translationEnd-translationStart).count()<<"ms.");
STORM_LOG_DEBUG("Qualitative computation completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeEnd-qualitativeStart).count()<<"ms.");
STORM_LOG_INFO("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.
// (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_INFO("Qualitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(qualitativeRefinementEnd-qualitativeRefinementStart).count()<<"ms.");
STORM_LOG_DEBUG("Obtained quantitative bounds ["<<quantitativeResult.getMin().getRange(initialStates).first<<", "<<quantitativeResult.getMax().getRange(initialStates).second<<"] on the actual value for the initial states in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeEnd-quantitativeStart).count()<<"ms.");
STORM_LOG_INFO("Obtained quantitative bounds ["<<quantitativeResult.getMin().getRange(initialStates).first<<", "<<quantitativeResult.getMax().getRange(initialStates).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.
// (9) Check whether the lower and upper bounds are close enough to terminate with an answer.
STORM_LOG_DEBUG("Quantitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeRefinementEnd-quantitativeRefinementStart).count()<<"ms.");
STORM_LOG_INFO("Quantitative refinement completed in "<<std::chrono::duration_cast<std::chrono::milliseconds>(quantitativeRefinementEnd-quantitativeRefinementStart).count()<<"ms.");