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