MinMaxLinearEquationSolver: Added a flag 'hasNoEndComponent' that is true if the system is known to have no end components. This decides if policy iteration does require a valid initial scheduler.
Renamed the 'hasNoEndComponents' solver requirement to 'hasUniqueSolution' as this is the actual thing we require for, e.g. sound value iteration.
// The solution of the min-max equation system will always be unique (assuming graph-preserving instantiations, every induced DTMC has the same graph structure).
STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+req.getEnabledRequirementsAsString()+" not checked.");
// The solution of the min-max equation system will always be unique (assuming graph-preserving instantiations, every induced DTMC has the same graph structure).
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+req.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.validInitialScheduler(),storm::exceptions::UncheckedRequirementException,"The underlying solver requires a unique solution and an initial valid scheduler. This is currently not supported for expected reward properties.");
// eliminate the end components with reward 0.
// Note that this may also compute the oneStepTargetProbabilities if upper bounds are required.
// If the solver still requires no end-components, we have to eliminate them later.
if(requirements.noEndComponents()){
if(requirements.uniqueSolution()){
STORM_LOG_ASSERT(!result.hasUniqueSolution(),"The solver requires to eliminate the end components although the solution is already assumed to be unique.");
STORM_LOG_DEBUG("Scheduling EC elimination, because the solver requires it.");
STORM_LOG_DEBUG("Scheduling EC elimination, because the solver requires a unique solution.");
result.eliminateEndComponents=true;
// If end components have been eliminated we can assume a unique solution.
result.uniqueSolution=true;
requirements.clearNoEndComponents();
requirements.clearUniqueSolution();
// If we compute until probabilities, we can even assume the absence of end components.
// Note that in the case of minimizing expected rewards there might still be end components in which reward is collected.
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!requirements.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+requirements.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+req.getEnabledRequirementsAsString()+" not checked.");
STORM_LOG_THROW(!req.hasEnabledCriticalRequirement(),storm::exceptions::UncheckedRequirementException,"Solver requirements "+req.getEnabledRequirementsAsString()+" not checked.");
xxxxxxxxxx