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 uint64_t
const numObj = objectiveHelper.size();
34 std::vector<storm::storage::geometry::Halfspace<GeometryValueType>> thresholdHalfspaces;
35 std::vector<GeometryValueType> objVector;
36 for (uint64_t objIndex = 0; objIndex < numObj; ++objIndex) {
37 auto& obj = objectiveHelper[objIndex];
38 obj.computeLowerUpperBounds(env);
39 if (!optimizingObjectiveIndex.has_value() || *optimizingObjectiveIndex != objIndex) {
40 objVector.assign(numObj, storm::utility::zero<GeometryValueType>());
41 objVector[objIndex] = -storm::utility::one<GeometryValueType>();
42 thresholdHalfspaces.emplace_back(objVector, storm::utility::convertNumber<GeometryValueType, ModelValueType>(-obj.getThreshold()));
48 objVector.assign(numObj, storm::utility::zero<GeometryValueType>());
50 if (optimizingObjectiveIndex.has_value()) {
51 objVector[*optimizingObjectiveIndex] = storm::utility::one<GeometryValueType>();
54 eps[*optimizingObjectiveIndex] *= storm::utility::convertNumber<GeometryValueType, ModelValueType>(
55 objectiveHelper[*optimizingObjectiveIndex].getUpperValueBoundAtState(originalModelInitialState) -
56 objectiveHelper[*optimizingObjectiveIndex].getLowerValueBoundAtState(originalModelInitialState));
58 STORM_LOG_INFO(
"Computing quantitative achievability value with precision " << eps[*optimizingObjectiveIndex] <<
".");
60 lpChecker->setCurrentWeightVector(env, objVector);
63 auto achievingPoint = lpChecker->check(env, thresholdPolytope, eps);
64 bool const isAchievable = achievingPoint.has_value();
70 if (optimizingObjectiveIndex.has_value()) {
71 using ValueType =
typename SparseModelType::ValueType;
74 storm::utility::convertNumber<ValueType, GeometryValueType>(achievingPoint->first[*optimizingObjectiveIndex] + achievingPoint->second);
75 result /= storm::utility::convertNumber<ValueType, uint64_t>(2u);
76 if (objectiveHelper[*optimizingObjectiveIndex].minimizing()) {
77 result *= -storm::utility::one<ValueType>();
79 return std::make_unique<storm::modelchecker::ExplicitQuantitativeCheckResult<ValueType>>(originalModelInitialState, result);
82 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(originalModelInitialState, isAchievable);