6 changed files with 317 additions and 0 deletions
			
			
		- 
					67src/storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.cpp
- 
					31src/storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.h
- 
					71src/storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.cpp
- 
					31src/storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.h
- 
					73src/storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.cpp
- 
					44src/storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h
| @ -0,0 +1,67 @@ | |||
| #include "storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.h"
 | |||
| #include "storm-pars/transformer/SparseParametricDtmcSimplifier.h"
 | |||
| 
 | |||
| #include "storm/models/sparse/Dtmc.h"
 | |||
| #include "storm/utility/macros.h"
 | |||
| 
 | |||
| #include "storm/exceptions/UnexpectedException.h"
 | |||
| 
 | |||
| namespace storm { | |||
|     namespace modelchecker { | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::ValidatingSparseDtmcParameterLiftingModelChecker() { | |||
|             // Intentionally left empty
 | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         void ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) { | |||
|             STORM_LOG_ASSERT(this->canHandle(parametricModel, checkTask), "specified model and formula can not be handled by this."); | |||
|          | |||
|             auto dtmc = parametricModel->template as<SparseModelType>(); | |||
|             auto simplifier = storm::transformer::SparseParametricDtmcSimplifier<SparseModelType>(*dtmc); | |||
| 
 | |||
|             if (!simplifier.simplify(checkTask.getFormula())) { | |||
|                 STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Simplifying the model was not successfull."); | |||
|             } | |||
|              | |||
|             auto simplifiedTask = checkTask.substituteFormula(*simplifier.getSimplifiedFormula()); | |||
|              | |||
|             impreciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); | |||
|             preciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() { | |||
|             return impreciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() const { | |||
|             return impreciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() { | |||
|             return preciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() const { | |||
|             return preciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         void ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::applyHintsToPreciseChecker() { | |||
|          | |||
|             if (impreciseChecker.getCurrentMaxScheduler()) { | |||
|                 preciseChecker.getCurrentMaxScheduler() = impreciseChecker.getCurrentMaxScheduler()->template toValueType<PreciseType>(); | |||
|             } | |||
|             if (impreciseChecker.getCurrentMinScheduler()) { | |||
|                 preciseChecker.getCurrentMinScheduler() = impreciseChecker.getCurrentMinScheduler()->template toValueType<PreciseType>(); | |||
|             } | |||
|         } | |||
|          | |||
|         template class ValidatingSparseDtmcParameterLiftingModelChecker<storm::models::sparse::Dtmc<storm::RationalFunction>, double, storm::RationalNumber>; | |||
|     } | |||
| } | |||
| @ -0,0 +1,31 @@ | |||
| #pragma once | |||
| 
 | |||
| #include "storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h" | |||
| #include "storm-pars/modelchecker/region/SparseDtmcParameterLiftingModelChecker.h" | |||
| 
 | |||
| namespace storm { | |||
|     namespace modelchecker { | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         class ValidatingSparseDtmcParameterLiftingModelChecker : public ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType> { | |||
|         public: | |||
|             ValidatingSparseDtmcParameterLiftingModelChecker(); | |||
|             virtual ~ValidatingSparseDtmcParameterLiftingModelChecker() = default; | |||
|              | |||
|             virtual void specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) override; | |||
| 
 | |||
|         protected: | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& getImpreciseChecker() override; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& getImpreciseChecker() const override; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& getPreciseChecker() override; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& getPreciseChecker() const override; | |||
|              | |||
|             virtual void applyHintsToPreciseChecker() override ; | |||
| 
 | |||
|         private: | |||
|             SparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType> impreciseChecker; | |||
|             SparseDtmcParameterLiftingModelChecker<SparseModelType, PreciseType> preciseChecker; | |||
|              | |||
|         }; | |||
|     } | |||
| } | |||
| @ -0,0 +1,71 @@ | |||
| #include "storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.h"
 | |||
| #include "storm-pars/transformer/SparseParametricMdpSimplifier.h"
 | |||
| 
 | |||
| #include "storm/models/sparse/Mdp.h"
 | |||
| #include "storm/utility/macros.h"
 | |||
| 
 | |||
| #include "storm/exceptions/UnexpectedException.h"
 | |||
| 
 | |||
| namespace storm { | |||
|     namespace modelchecker { | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::ValidatingSparseMdpParameterLiftingModelChecker() { | |||
|             // Intentionally left empty
 | |||
|         } | |||
|          | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         void ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) { | |||
|             STORM_LOG_ASSERT(this->canHandle(parametricModel, checkTask), "specified model and formula can not be handled by this."); | |||
|          | |||
|             auto mdp = parametricModel->template as<SparseModelType>(); | |||
|             auto simplifier = storm::transformer::SparseParametricMdpSimplifier<SparseModelType>(*mdp); | |||
| 
 | |||
|             if (!simplifier.simplify(checkTask.getFormula())) { | |||
|                 STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Simplifying the model was not successfull."); | |||
|             } | |||
|              | |||
|             auto simplifiedTask = checkTask.substituteFormula(*simplifier.getSimplifiedFormula()); | |||
|              | |||
|             impreciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); | |||
|             preciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() { | |||
|             return impreciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() const { | |||
|             return impreciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() { | |||
|             return preciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() const { | |||
|             return preciseChecker; | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         void ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::applyHintsToPreciseChecker() { | |||
|          | |||
|             if (impreciseChecker.getCurrentMaxScheduler()) { | |||
|                 preciseChecker.getCurrentMaxScheduler() = impreciseChecker.getCurrentMaxScheduler()->template toValueType<PreciseType>(); | |||
|             } | |||
|             if (impreciseChecker.getCurrentMinScheduler()) { | |||
|                 preciseChecker.getCurrentMinScheduler() = impreciseChecker.getCurrentMinScheduler()->template toValueType<PreciseType>(); | |||
|             } | |||
|             if (impreciseChecker.getCurrentPlayer1Scheduler()) { | |||
|                 preciseChecker.getCurrentPlayer1Scheduler() = impreciseChecker.getCurrentPlayer1Scheduler()->template toValueType<PreciseType>(); | |||
|             } | |||
|         } | |||
|              | |||
|         template class ValidatingSparseMdpParameterLiftingModelChecker<storm::models::sparse::Mdp<storm::RationalFunction>, double, storm::RationalNumber>; | |||
|     } | |||
| } | |||
| @ -0,0 +1,31 @@ | |||
| #pragma once | |||
| 
 | |||
| #include "storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h" | |||
| #include "storm-pars/modelchecker/region/SparseMdpParameterLiftingModelChecker.h" | |||
| 
 | |||
| namespace storm { | |||
|     namespace modelchecker { | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         class ValidatingSparseMdpParameterLiftingModelChecker : public ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType> { | |||
|         public: | |||
|             ValidatingSparseMdpParameterLiftingModelChecker(); | |||
|             virtual ~ValidatingSparseMdpParameterLiftingModelChecker() = default; | |||
|              | |||
|             virtual void specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) override; | |||
| 
 | |||
|         protected: | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& getImpreciseChecker() override; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& getImpreciseChecker() const override; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& getPreciseChecker() override; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& getPreciseChecker() const override; | |||
|              | |||
|             virtual void applyHintsToPreciseChecker() override ; | |||
| 
 | |||
|         private: | |||
|             SparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType> impreciseChecker; | |||
|             SparseMdpParameterLiftingModelChecker<SparseModelType, PreciseType> preciseChecker; | |||
|              | |||
|         }; | |||
|     } | |||
| } | |||
| @ -0,0 +1,73 @@ | |||
| #include "storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h"
 | |||
| 
 | |||
| #include "storm/adapters/RationalFunctionAdapter.h"
 | |||
| #include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h"
 | |||
| #include "storm/settings/SettingsManager.h"
 | |||
| #include "storm/settings/modules/CoreSettings.h"
 | |||
| #include "storm/models/sparse/Dtmc.h"
 | |||
| #include "storm/models/sparse/Mdp.h"
 | |||
| 
 | |||
| namespace storm { | |||
|     namespace modelchecker { | |||
|         | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::ValidatingSparseParameterLiftingModelChecker() : numOfWrongRegions(0) { | |||
|             // Intentionally left empty
 | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::~ValidatingSparseParameterLiftingModelChecker() { | |||
|             if (storm::settings::getModule<storm::settings::modules::CoreSettings>().isShowStatisticsSet()) { | |||
|                 STORM_PRINT_AND_LOG("Validating Parameter Lifting Model Checker detected " << numOfWrongRegions << " regions where the imprecise method was wrong."); | |||
|             } | |||
|         } | |||
|          | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         bool ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::canHandle(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) const { | |||
|             return getImpreciseChecker().canHandle(parametricModel, checkTask) && getPreciseChecker().canHandle(parametricModel, checkTask); | |||
|         }; | |||
|   | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         RegionResult ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::analyzeRegion(storm::storage::ParameterRegion<typename SparseModelType::ValueType> const& region, RegionResult const& initialResult, bool sampleVerticesOfRegion) { | |||
|          | |||
|             RegionResult currentResult = getImpreciseChecker().analyzeRegion(region, initialResult); | |||
|              | |||
|             if (currentResult == RegionResult::AllSat || currentResult == RegionResult::AllViolated) { | |||
|                 applyHintsToPreciseChecker(); | |||
|                  | |||
|                 storm::solver::OptimizationDirection parameterOptDir = getPreciseChecker().getCurrentCheckTask().getOptimizationDirection(); | |||
|                 if (currentResult == RegionResult::AllViolated) { | |||
|                     parameterOptDir = storm::solver::invert(parameterOptDir); | |||
|                 } | |||
|                  | |||
|                 bool preciseResult = getPreciseChecker().check(region, parameterOptDir)->asExplicitQualitativeCheckResult()[*getPreciseChecker().getConsideredParametricModel().getInitialStates().begin()]; | |||
|                 bool preciseResultAgrees = preciseResult == (currentResult == RegionResult::AllSat); | |||
|                  | |||
|                 if (!preciseResultAgrees) { | |||
|                     // Imprecise result is wrong!
 | |||
|                     currentResult = RegionResult::Unknown; | |||
|                     ++numOfWrongRegions; | |||
|                      | |||
|                     // Check the other direction
 | |||
|                     parameterOptDir = storm::solver::invert(parameterOptDir); | |||
|                     preciseResult = getPreciseChecker().check(region, parameterOptDir)->asExplicitQualitativeCheckResult()[*getPreciseChecker().getConsideredParametricModel().getInitialStates().begin()]; | |||
|                     if (preciseResult && parameterOptDir == getPreciseChecker().getCurrentCheckTask().getOptimizationDirection()) { | |||
|                         currentResult = RegionResult::AllSat; | |||
|                     } else if (!preciseResult && parameterOptDir == storm::solver::invert(getPreciseChecker().getCurrentCheckTask().getOptimizationDirection())) { | |||
|                         currentResult = RegionResult::AllViolated; | |||
|                     } | |||
|                 } | |||
|             } | |||
|              | |||
|             if (sampleVerticesOfRegion && currentResult != RegionResult::AllSat && currentResult != RegionResult::AllViolated) { | |||
|                 currentResult = getPreciseChecker().sampleVertices(region, currentResult); | |||
|             } | |||
|      | |||
|             return currentResult; | |||
|         } | |||
| 
 | |||
|         template class ValidatingSparseParameterLiftingModelChecker<storm::models::sparse::Dtmc<storm::RationalFunction>, double, storm::RationalNumber>; | |||
|         template class ValidatingSparseParameterLiftingModelChecker<storm::models::sparse::Mdp<storm::RationalFunction>, double, storm::RationalNumber>; | |||
| 
 | |||
|     } | |||
| } | |||
| @ -0,0 +1,44 @@ | |||
| #pragma once | |||
| 
 | |||
| #include "storm-pars/modelchecker/region/RegionModelChecker.h" | |||
| #include "storm-pars/modelchecker/region/SparseParameterLiftingModelChecker.h" | |||
| #include "storm-pars/storage/ParameterRegion.h" | |||
| #include "storm/utility/NumberTraits.h" | |||
| 
 | |||
| namespace storm { | |||
|     namespace modelchecker { | |||
|              | |||
|         template <typename SparseModelType, typename ImpreciseType, typename PreciseType> | |||
|         class ValidatingSparseParameterLiftingModelChecker : public RegionModelChecker<typename SparseModelType::ValueType> { | |||
|             static_assert(storm::NumberTraits<PreciseType>::IsExact, "Specified type for exact computations is not exact."); | |||
| 
 | |||
|         public: | |||
|             ValidatingSparseParameterLiftingModelChecker(); | |||
|             virtual ~ValidatingSparseParameterLiftingModelChecker(); | |||
|              | |||
|             virtual bool canHandle(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) const override; | |||
| 
 | |||
|             /*! | |||
|              * Analyzes the given region by means of parameter lifting. | |||
|              * We first apply unsound solution methods (standard value iteratio with doubles) and then validate the obtained result | |||
|              * by means of exact and soud methods. | |||
|              */ | |||
|             virtual RegionResult analyzeRegion(storm::storage::ParameterRegion<typename SparseModelType::ValueType> const& region, RegionResult const& initialResult = RegionResult::Unknown, bool sampleVerticesOfRegion = false) override; | |||
| 
 | |||
|         protected: | |||
|              | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& getImpreciseChecker() = 0; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& getImpreciseChecker() const = 0; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& getPreciseChecker() = 0; | |||
|             virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& getPreciseChecker() const = 0; | |||
|              | |||
|             virtual void applyHintsToPreciseChecker() = 0; | |||
| 
 | |||
|         private: | |||
|              | |||
|             // Information for statistics | |||
|             uint_fast64_t numOfWrongRegions; | |||
|              | |||
|         }; | |||
|     } | |||
| } | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue