Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DeterministicSchedsAchievabilityChecker.cpp
Go to the documentation of this file.
2
12
14
15template<class SparseModelType, typename GeometryValueType>
18 : model(preprocessorResult.preprocessedModel), originalModelInitialState(*preprocessorResult.originalModel.getInitialStates().begin()) {
19 for (auto const& obj : preprocessorResult.objectives) {
20 objectiveHelper.emplace_back(*model, obj);
21 if (!objectiveHelper.back().hasThreshold()) {
22 STORM_LOG_ASSERT(!optimizingObjectiveIndex.has_value(),
23 "Unexpected input: got a (quantitative) achievability query but there are more than one objectives without a threshold.");
24 optimizingObjectiveIndex = objectiveHelper.size() - 1;
25 }
26 }
27 lpChecker = std::make_shared<DeterministicSchedsLpChecker<SparseModelType, GeometryValueType>>(*model, objectiveHelper);
28}
29
30template<class SparseModelType, typename GeometryValueType>
32 using Point = typename std::vector<GeometryValueType>;
33 uint64_t const numObj = objectiveHelper.size();
34 // Create a polytope that contains all the points that would certify achievability of the point induced by the objective threshold
35 std::vector<storm::storage::geometry::Halfspace<GeometryValueType>> thresholdHalfspaces;
36 std::vector<GeometryValueType> objVector;
37 for (uint64_t objIndex = 0; objIndex < numObj; ++objIndex) {
38 auto& obj = objectiveHelper[objIndex];
39 obj.computeLowerUpperBounds(env);
40 if (!optimizingObjectiveIndex.has_value() || *optimizingObjectiveIndex != objIndex) {
41 objVector.assign(numObj, storm::utility::zero<GeometryValueType>());
42 objVector[objIndex] = -storm::utility::one<GeometryValueType>();
43 thresholdHalfspaces.emplace_back(objVector, storm::utility::convertNumber<GeometryValueType, ModelValueType>(-obj.getThreshold()));
44 }
45 }
46 auto thresholdPolytope = storm::storage::geometry::Polytope<GeometryValueType>::create(std::move(thresholdHalfspaces));
47
48 // Set objective weights (none if this is a qualitative achievability query)
49 objVector.assign(numObj, storm::utility::zero<GeometryValueType>());
50 auto eps = objVector;
51 if (optimizingObjectiveIndex.has_value()) {
52 objVector[*optimizingObjectiveIndex] = storm::utility::one<GeometryValueType>();
53 eps[*optimizingObjectiveIndex] = env.modelchecker().multi().getPrecision() * storm::utility::convertNumber<GeometryValueType, uint64_t>(2u);
55 eps[*optimizingObjectiveIndex] *= storm::utility::convertNumber<GeometryValueType, ModelValueType>(
56 objectiveHelper[*optimizingObjectiveIndex].getUpperValueBoundAtState(originalModelInitialState) -
57 objectiveHelper[*optimizingObjectiveIndex].getLowerValueBoundAtState(originalModelInitialState));
58 }
59 STORM_LOG_INFO("Computing quantitative achievability value with precision " << eps[*optimizingObjectiveIndex] << ".");
60 }
61 lpChecker->setCurrentWeightVector(env, objVector);
62
63 // Search achieving point
64 auto achievingPoint = lpChecker->check(env, thresholdPolytope, eps);
65 bool const isAchievable = achievingPoint.has_value();
66 if (isAchievable) {
68 "Found achievable point: " << storm::utility::vector::toString(achievingPoint->first) << " ( approx. "
69 << storm::utility::vector::toString(storm::utility::vector::convertNumericVector<double>(achievingPoint->first))
70 << " ).");
71 if (optimizingObjectiveIndex.has_value()) {
72 using ValueType = typename SparseModelType::ValueType;
73 // Average between obtained lower- and upper bounds
74 auto result =
75 storm::utility::convertNumber<ValueType, GeometryValueType>(achievingPoint->first[*optimizingObjectiveIndex] + achievingPoint->second);
76 result /= storm::utility::convertNumber<ValueType, uint64_t>(2u);
77 if (objectiveHelper[*optimizingObjectiveIndex].minimizing()) {
78 result *= -storm::utility::one<ValueType>();
79 }
80 return std::make_unique<storm::modelchecker::ExplicitQuantitativeCheckResult<ValueType>>(originalModelInitialState, result);
81 }
82 }
83 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(originalModelInitialState, isAchievable);
84}
85
90} // namespace storm::modelchecker::multiobjective
ModelCheckerEnvironment & modelchecker()
MultiObjectiveModelCheckerEnvironment & multi()
DeterministicSchedsAchievabilityChecker(preprocessing::SparseMultiObjectivePreprocessorResult< SparseModelType > &preprocessorResult)
static std::shared_ptr< Polytope< ValueType > > create(std::vector< Halfspace< ValueType > > const &halfspaces)
Creates a polytope from the given halfspaces.
#define STORM_LOG_INFO(message)
Definition logging.h:29
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
std::string toString(std::vector< ValueType > const &vector)
Output vector as string.
Definition vector.h:1298