21namespace modelchecker {
23template<
typename SparseModelType,
typename ConstantType>
28template<
typename SparseModelType,
typename ConstantType>
31 currentFormula = checkTask.
getFormula().asSharedPointer();
32 currentCheckTask = std::make_unique<storm::modelchecker::CheckTask<storm::logic::Formula, ConstantType>>(
33 checkTask.
substituteFormula(*currentFormula).template convertValueType<ConstantType>());
35 if (currentCheckTask->getFormula().isProbabilityOperatorFormula()) {
36 auto const& probOpFormula = currentCheckTask->getFormula().asProbabilityOperatorFormula();
37 if (probOpFormula.getSubformula().isBoundedUntilFormula()) {
38 specifyBoundedUntilFormula(currentCheckTask->substituteFormula(probOpFormula.getSubformula().asBoundedUntilFormula()));
39 }
else if (probOpFormula.getSubformula().isUntilFormula()) {
40 specifyUntilFormula(env, currentCheckTask->substituteFormula(probOpFormula.getSubformula().asUntilFormula()));
41 }
else if (probOpFormula.getSubformula().isEventuallyFormula()) {
42 specifyReachabilityProbabilityFormula(env, currentCheckTask->substituteFormula(probOpFormula.getSubformula().asEventuallyFormula()));
44 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Parameter lifting is not supported for the given property.");
46 }
else if (currentCheckTask->getFormula().isRewardOperatorFormula()) {
47 auto const& rewOpFormula = currentCheckTask->getFormula().asRewardOperatorFormula();
48 if (rewOpFormula.getSubformula().isEventuallyFormula()) {
49 specifyReachabilityRewardFormula(env, currentCheckTask->substituteFormula(rewOpFormula.getSubformula().asEventuallyFormula()));
50 }
else if (rewOpFormula.getSubformula().isCumulativeRewardFormula()) {
51 specifyCumulativeRewardFormula(currentCheckTask->substituteFormula(rewOpFormula.getSubformula().asCumulativeRewardFormula()));
56template<
typename SparseModelType,
typename ConstantType>
58 return this->parametricModel->getInitialStates().getNumberOfSetBits() == 1;
61template<
typename SparseModelType,
typename ConstantType>
63 STORM_LOG_ASSERT(hasUniqueInitialState(),
"Model does not have a unique initial state.");
64 return *this->parametricModel->getInitialStates().begin();
67template<
typename RegionType>
69 std::map<typename RegionType::VariableType, storm::analysis::MonotonicityKind>
const& monotonicityResult,
71 typename RegionType::Valuation result;
72 for (
auto const& [var, mon] : monotonicityResult) {
74 result.emplace(var, region.getLowerBoundary(var));
76 result.emplace(var,
storm::solver::maximize(dir) ? region.getUpperBoundary(var) : region.getLowerBoundary(var));
78 result.emplace(var,
storm::solver::minimize(dir) ? region.getUpperBoundary(var) : region.getLowerBoundary(var));
84template<
typename SparseModelType,
typename ConstantType>
87 bool sampleVerticesOfRegion) {
88 STORM_LOG_THROW(this->currentCheckTask->isOnlyInitialStatesRelevantSet(), storm::exceptions::NotSupportedException,
89 "Analyzing regions with parameter lifting requires a property where only the value in the initial states is relevant.");
90 STORM_LOG_THROW(this->currentCheckTask->isBoundSet(), storm::exceptions::NotSupportedException,
91 "Analyzing regions with parameter lifting requires a bounded property.");
92 STORM_LOG_THROW(hasUniqueInitialState(), storm::exceptions::NotSupportedException,
93 "Analyzing regions with parameter lifting requires a model with a single initial state.");
104 if (getInstantiationChecker(
false).isWellDefined(center)) {
105 result = getInstantiationChecker(
false).check(env, center)->asExplicitQualitativeCheckResult()[getUniqueInitialState()]
110 if (getInstantiationChecker(
false).isWellDefined(lowerCorner)) {
111 result = getInstantiationChecker(
false).check(env, lowerCorner)->asExplicitQualitativeCheckResult()[getUniqueInitialState()]
123 [[maybe_unused]]
bool const existsViolated =
126 "Invalid state of region analysis.");
128 auto const dirForSat =
129 isLowerBound(this->currentCheckTask->getBound().comparisonType) ? storm::OptimizationDirection::Minimize : storm::OptimizationDirection::Maximize;
131 std::vector<storm::OptimizationDirection> dirsToCheck;
133 dirsToCheck = {dirForSat};
134 }
else if (existsIllDefined) {
140 for (
auto const& dirToCheck : dirsToCheck) {
143 globalMonotonicity.has_value() && globalMonotonicity->isDone() && globalMonotonicity->isAllMonotonicity()) {
146 auto& checker = existsSat ? getInstantiationCheckerSAT(
false) : getInstantiationCheckerVIO(
false);
147 bool const monCheckResult = checker.check(env, valuation)->asExplicitQualitativeCheckResult()[getUniqueInitialState()];
148 if (existsSat == monCheckResult) {
150 STORM_LOG_INFO(
"Region " << region.
region <<
" is " << result <<
", discovered with instantiation checker on " << valuation
151 <<
" and help of monotonicity\n");
159 "This case should only be reached if the initial region result is unknown, but it is " << result <<
".");
161 if (sampleVerticesOfRegion) {
162 result = sampleVertices(env, region.
region, result);
167 auto const checkResult = this->check(env, region, dirToCheck);
169 bool const value = checkResult->asExplicitQualitativeCheckResult()[getUniqueInitialState()];
170 if ((dirToCheck == dirForSat) == value) {
172 }
else if (sampleVerticesOfRegion) {
173 result = sampleVertices(env, region.
region, result);
183template<
typename SparseModelType,
typename ConstantType>
198 auto vertexIt = vertices.begin();
199 while (vertexIt != vertices.end() && !(hasSatPoint && hasViolatedPoint)) {
200 if (getInstantiationChecker(
false).check(env, *vertexIt)->asExplicitQualitativeCheckResult()[getUniqueInitialState()]) {
203 hasViolatedPoint =
true;
209 if (hasViolatedPoint) {
221template<
typename SparseModelType,
typename ConstantType>
224 auto quantitativeResult = computeQuantitativeValues(env, region, dirForParameters);
225 if (quantitativeResult.size() == 0) {
228 auto quantitativeCheckResult = std::make_unique<storm::modelchecker::ExplicitQuantitativeCheckResult<ConstantType>>(std::move(quantitativeResult));
229 if (currentCheckTask->getFormula().hasQuantitativeResult()) {
230 return quantitativeCheckResult;
232 return quantitativeCheckResult->compareAgainstBound(this->currentCheckTask->getFormula().asOperatorFormula().getComparisonType(),
233 this->currentCheckTask->getFormula().asOperatorFormula().template getThresholdAs<ConstantType>());
237template<
typename SparseModelType,
typename ConstantType>
240 STORM_LOG_WARN_COND(this->currentCheckTask->getFormula().hasQuantitativeResult(),
"Computing quantitative bounds for a qualitative formula...");
241 return std::make_unique<ExplicitQuantitativeCheckResult<ConstantType>>(computeQuantitativeValues(env, region, dirForParameters));
244template<
typename SparseModelType,
typename ConstantType>
248 STORM_LOG_THROW(hasUniqueInitialState(), storm::exceptions::NotSupportedException,
249 "Getting a bound at the initial state requires a model with a single initial state.");
250 auto result = computeQuantitativeValues(env, region, dirForParameters).at(getUniqueInitialState());
251 return storm::utility::isInfinity(result) ? storm::utility::infinity<CoefficientType>() : storm::utility::convertNumber<CoefficientType>(result);
254template<
typename SparseModelType,
typename ConstantType>
257 return getInstantiationChecker(quantitative);
260template<
typename SparseModelType,
typename ConstantType>
263 return getInstantiationChecker(quantitative);
266template<
typename SparseModelType,
typename ConstantType>
268 return *parametricModel;
271template<
typename SparseModelType,
typename ConstantType>
273 return *currentCheckTask;
276template<
typename SparseModelType,
typename ConstantType>
279 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Parameter lifting is not supported for the given property.");
282template<
typename SparseModelType,
typename ConstantType>
285 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Parameter lifting is not supported for the given property.");
288template<
typename SparseModelType,
typename ConstantType>
294 specifyUntilFormula(env, currentCheckTask->substituteFormula(*untilFormula));
297template<
typename SparseModelType,
typename ConstantType>
300 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Parameter lifting is not supported for the given property.");
303template<
typename SparseModelType,
typename ConstantType>
306 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Parameter lifting is not supported for the given property.");
309template<
typename SparseModelType,
typename ConstantType>
310std::pair<typename SparseParameterLiftingModelChecker<SparseModelType, ConstantType>::CoefficientType,
320 auto value = getInstantiationChecker(
true).check(env, point)->template asExplicitQuantitativeCheckResult<ConstantType>()[getUniqueInitialState()];
322 return std::make_pair(storm::utility::convertNumber<CoefficientType>(value), std::move(point));
325template<
typename SparseModelType,
typename ConstantType>
328 std::vector<ConstantType>
const& newValues) {
329 if (hasUniqueInitialState()) {
331 auto const& newValue = newValues.at(getUniqueInitialState());
333 storm::utility::isInfinity(newValue) ? storm::utility::infinity<CoefficientType>() : storm::utility::convertNumber<CoefficientType>(newValue);
CheckTask< NewFormulaType, ValueType > substituteFormula(NewFormulaType const &newFormula) const
Copies the check task from the source while replacing the formula with the new one.
FormulaType const & getFormula() const
Retrieves the formula from this task.
Class to efficiently check a formula on a parametric model with different parameter instantiations.
Class to approximately check a formula on a parametric model for all parameter valuations within a re...
virtual RegionResult analyzeRegion(Environment const &env, AnnotatedRegion< ParametricType > ®ion, RegionResultHypothesis const &hypothesis=RegionResultHypothesis::Unknown, bool sampleVerticesOfRegion=false) override
Analyzes the given region by means of Parameter Lifting.
typename RegionModelChecker< ParametricType >::CoefficientType CoefficientType
uint64_t getUniqueInitialState() const
SparseParameterLiftingModelChecker()
virtual void specifyUntilFormula(Environment const &env, CheckTask< storm::logic::UntilFormula, ConstantType > const &checkTask)
virtual void specifyReachabilityRewardFormula(Environment const &env, CheckTask< storm::logic::EventuallyFormula, ConstantType > const &checkTask)
std::unique_ptr< QuantitativeCheckResult< ConstantType > > getBound(Environment const &env, AnnotatedRegion< ParametricType > ®ion, storm::solver::OptimizationDirection const &dirForParameters)
Over-approximates the values within the given region for each state of the considered parametric mode...
virtual void specifyCumulativeRewardFormula(const CheckTask< storm::logic::CumulativeRewardFormula, ConstantType > &checkTask)
virtual storm::modelchecker::SparseInstantiationModelChecker< SparseModelType, ConstantType > & getInstantiationCheckerSAT(bool quantitative)
std::unique_ptr< CheckResult > check(Environment const &env, AnnotatedRegion< ParametricType > ®ion, storm::solver::OptimizationDirection const &dirForParameters)
Checks the specified formula on the given region by applying parameter lifting (Parameter choices are...
RegionResult sampleVertices(Environment const &env, storm::storage::ParameterRegion< ParametricType > const ®ion, RegionResult const &initialResult=RegionResult::Unknown)
Analyzes the 2^#parameters corner points of the given region.
void specifyFormula(Environment const &env, CheckTask< storm::logic::Formula, ParametricType > const &checkTask)
virtual storm::modelchecker::SparseInstantiationModelChecker< SparseModelType, ConstantType > & getInstantiationCheckerVIO(bool quantitative)
bool hasUniqueInitialState() const
virtual CoefficientType getBoundAtInitState(Environment const &env, AnnotatedRegion< ParametricType > ®ion, storm::solver::OptimizationDirection const &dirForParameters) override
Over-approximates the value within the given region.
void updateKnownValueBoundInRegion(AnnotatedRegion< ParametricType > ®ion, storm::solver::OptimizationDirection dir, std::vector< ConstantType > const &newValues)
virtual void specifyReachabilityProbabilityFormula(Environment const &env, CheckTask< storm::logic::EventuallyFormula, ConstantType > const &checkTask)
typename RegionModelChecker< ParametricType >::Valuation Valuation
CheckTask< storm::logic::Formula, ConstantType > const & getCurrentCheckTask() const
virtual std::pair< CoefficientType, Valuation > getAndEvaluateGoodPoint(Environment const &env, AnnotatedRegion< ParametricType > ®ion, storm::solver::OptimizationDirection const &dirForParameters) override
Heuristically finds a point within the region and computes the value at the initial state for that po...
SparseModelType const & getConsideredParametricModel() const
virtual void specifyBoundedUntilFormula(const CheckTask< storm::logic::BoundedUntilFormula, ConstantType > &checkTask)
std::set< VariableType > const & getVariables() const
Valuation getCenterPoint() const
Returns the center point of this region.
Valuation const & getLowerBoundaries() const
CoefficientType getCenter(const std::string varName) const
std::vector< Valuation > getVerticesOfRegion(std::set< VariableType > const &consideredVariables) const
Returns a vector of all possible combinations of lower and upper bounds of the given variables.
#define STORM_LOG_INFO(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_WARN_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
@ Incr
the result is monotonically increasing
@ Decr
the result is monotonically decreasing
@ Constant
the result is constant
RegionResult
The results for a single Parameter Region.
@ CenterSat
the formula is satisfied for the parameter Valuation that corresponds to the center point of the regi...
@ CenterIllDefined
the formula is ill-defined for the parameter Valuation that corresponds to the center point of the re...
@ AllSat
the formula is satisfied for all well-defined parameters in the given region
@ AllViolated
the formula is violated for all well-defined parameters in the given region
@ Unknown
the result is unknown
@ ExistsBoth
the formula is satisfied for some parameters but also violated for others
@ AllIllDefined
the formula is ill-defined for all parameters in the given region
@ CenterViolated
the formula is violated for the parameter Valuation that corresponds to the center point of the regio...
@ ExistsSat
the formula is satisfied for at least one parameter evaluation that lies in the given region
@ ExistsViolated
the formula is violated for at least one parameter evaluation that lies in the given region
@ ExistsIllDefined
the formula is ill-defined for at least one parameter evaluation that lies in the given region
RegionResultHypothesis
hypothesis for the result for a single Parameter Region
auto getOptimalValuationForMonotonicity(RegionType const ®ion, std::map< typename RegionType::VariableType, storm::analysis::MonotonicityKind > const &monotonicityResult, storm::OptimizationDirection dir)
bool constexpr maximize(OptimizationDirection d)
OptimizationDirection constexpr invert(OptimizationDirection d)
bool constexpr minimize(OptimizationDirection d)
bool isInfinity(ValueType const &a)
storm::modelchecker::MonotonicityAnnotation< ParametricType > monotonicityAnnotation
Whether the result is known through monotonicity.
bool resultKnownThroughMonotonicity
The result of the analysis of this region.
storm::modelchecker::RegionResult result
The depth of the refinement tree this region is in.
bool updateValueBound(CoefficientType const &newValue, storm::OptimizationDirection dir)
what is known about this region in terms of monotonicity
Region const region
The subregions of this region.