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()) {
23 "Unexpected input: got a (quantitative) achievability query but there are more than one objectives without a threshold.");
24 optimizingObjectiveIndex = objectiveHelper.size() - 1;
27 lpChecker = std::make_shared<DeterministicSchedsLpChecker<SparseModelType, GeometryValueType>>(*model, objectiveHelper);
32 using Point =
typename std::vector<GeometryValueType>;
33 uint64_t
const numObj = objectiveHelper.size();
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()));
49 objVector.assign(numObj, storm::utility::zero<GeometryValueType>());
51 if (optimizingObjectiveIndex.has_value()) {
52 objVector[*optimizingObjectiveIndex] = storm::utility::one<GeometryValueType>();
55 eps[*optimizingObjectiveIndex] *= storm::utility::convertNumber<GeometryValueType, ModelValueType>(
56 objectiveHelper[*optimizingObjectiveIndex].getUpperValueBoundAtState(originalModelInitialState) -
57 objectiveHelper[*optimizingObjectiveIndex].getLowerValueBoundAtState(originalModelInitialState));
59 STORM_LOG_INFO(
"Computing quantitative achievability value with precision " << eps[*optimizingObjectiveIndex] <<
".");
61 lpChecker->setCurrentWeightVector(env, objVector);
64 auto achievingPoint = lpChecker->check(env, thresholdPolytope, eps);
65 bool const isAchievable = achievingPoint.has_value();
71 if (optimizingObjectiveIndex.has_value()) {
72 using ValueType =
typename SparseModelType::ValueType;
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>();
80 return std::make_unique<storm::modelchecker::ExplicitQuantitativeCheckResult<ValueType>>(originalModelInitialState, result);
83 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(originalModelInitialState, isAchievable);