STORM_LOG_THROW(false,storm::exceptions::InvalidArgumentException,"The given formula '"<<formula<<"' is invalid.");
STORM_LOG_THROW(false,storm::exceptions::InvalidArgumentException,"The given formula '"<<formula<<"' is invalid.");
}
}
@ -311,6 +313,11 @@ namespace storm {
STORM_LOG_THROW(false,storm::exceptions::NotImplementedException,"This model checker ("<<getClassName()<<") does not support the formula: "<<checkTask.getFormula()<<".");
STORM_LOG_THROW(false,storm::exceptions::NotImplementedException,"This model checker ("<<getClassName()<<") does not support the formula: "<<checkTask.getFormula()<<".");
STORM_LOG_THROW(false,storm::exceptions::NotImplementedException,"This model checker ("<<getClassName()<<") does not support the formula: "<<checkTask.getFormula()<<".");
// Check whether we consider a multi-objective formula
// Check whether we consider a multi-objective formula
// For multi-objective model checking, each initial state requires an individual scheduler (in contrast to single-objective model checking). Let's exclude multiple initial states.
// For multi-objective model checking, each initial state requires an individual scheduler (in contrast to single-objective model checking). Let's exclude multiple initial states.
STORM_LOG_THROW(checkTask.isOnlyInitialStatesRelevantSet(),storm::exceptions::InvalidOperationException,"Computing quantiles is only supported for models with a single initial states.");
STORM_LOG_THROW(this->getModel().getInitialStates().getNumberOfSetBits()==1,storm::exceptions::InvalidOperationException,"Quantiles not supported on models with multiple initial states.");
// for simplicity we do not allow intervals or unbounded formulas.
// for simplicity we do not allow intervals or unbounded formulas.
// TODO: Quantiles: allow unbounded formulas
STORM_LOG_THROW(subformula.hasLowerBound(dim)!=dimension.isUpperBounded,storm::exceptions::NotSupportedException,"Bounded until formulas are only supported by this method if they consider either an upper bound or a lower bound. Got "<<subformula<<" instead.");
STORM_LOG_THROW(subformula.hasLowerBound(dim)!=dimension.isUpperBounded,storm::exceptions::NotSupportedException,"Bounded until formulas are only supported by this method if they consider either an upper bound or a lower bound. Got "<<subformula<<" instead.");
// lower bounded until formulas with non-trivial left hand side are excluded as this would require some additional effort (in particular the ProductModel::transformMemoryState method).
// lower bounded until formulas with non-trivial left hand side are excluded as this would require some additional effort (in particular the ProductModel::transformMemoryState method).
STORM_LOG_THROW(dimension.isUpperBounded||subformula.getLeftSubformula(dim).isTrueFormula(),storm::exceptions::NotSupportedException,"Lower bounded until formulas are only supported by this method if the left subformula is 'true'. Got "<<subformula<<" instead.");
STORM_LOG_THROW(dimension.isUpperBounded||subformula.getLeftSubformula(dim).isTrueFormula(),storm::exceptions::NotSupportedException,"Lower bounded until formulas are only supported by this method if the left subformula is 'true'. Got "<<subformula<<" instead.");
STORM_LOG_THROW(dimensions[dim].isUpperBounded||isStrict||!storm::utility::isZero(discretizedBound),storm::exceptions::NotSupportedException,"Lower bounds need to be either strict or greater than zero.");
STORM_LOG_THROW(dimensions[dim].isUpperBounded||isStrict||!storm::utility::isZero(discretizedBound),storm::exceptions::NotSupportedException,"Lower bounds need to be either strict or greater than zero.");
STORM_LOG_THROW(epochManager.isValidDimensionValue(dimensionValue),storm::exceptions::NotSupportedException,"The bound "<<bound<<" is too high for the considered number of dimensions.");
STORM_LOG_THROW(epochManager.isValidDimensionValue(dimensionValue),storm::exceptions::NotSupportedException,"The bound "<<bound<<" is too high for the considered number of dimensions.");
out<<"Underapproximation of achievable values: "<<underApproximation->toString()<<std::endl;
out<<"Overapproximation of achievable values: "<<overApproximation->toString()<<std::endl;
out<<points.size()<<" pareto optimal points found (Note that these points are safe, i.e., contained in the underapproximation, but there is no guarantee for optimality):"<<std::endl;
if(hasUnderApproximation()){
out<<"Underapproximation of achievable values: "<<underApproximation->toString()<<std::endl;
}
if(hasOverApproximation()){
out<<"Overapproximation of achievable values: "<<overApproximation->toString()<<std::endl;