24 changed files with 415 additions and 127 deletions
			
			
		- 
					160src/storm/modelchecker/parametric/ParameterLifting.cpp
 - 
					33src/storm/modelchecker/parametric/ParameterLifting.h
 - 
					1src/storm/modelchecker/parametric/SparseDtmcInstantiationModelChecker.cpp
 - 
					61src/storm/modelchecker/parametric/SparseDtmcParameterLifting.cpp
 - 
					27src/storm/modelchecker/parametric/SparseDtmcParameterLifting.h
 - 
					25src/storm/modelchecker/parametric/SparseDtmcParameterLiftingModelChecker.cpp
 - 
					3src/storm/modelchecker/parametric/SparseDtmcParameterLiftingModelChecker.h
 - 
					3src/storm/modelchecker/parametric/SparseInstantiationModelChecker.cpp
 - 
					1src/storm/modelchecker/parametric/SparseMdpInstantiationModelChecker.cpp
 - 
					62src/storm/modelchecker/parametric/SparseMdpParameterLifting.cpp
 - 
					28src/storm/modelchecker/parametric/SparseMdpParameterLifting.h
 - 
					20src/storm/modelchecker/parametric/SparseMdpParameterLiftingModelChecker.cpp
 - 
					4src/storm/modelchecker/parametric/SparseMdpParameterLiftingModelChecker.h
 - 
					2src/storm/modelchecker/parametric/SparseParameterLiftingModelChecker.cpp
 - 
					1src/storm/models/sparse/StochasticTwoPlayerGame.cpp
 - 
					6src/storm/settings/modules/ParametricSettings.cpp
 - 
					6src/storm/settings/modules/ParametricSettings.h
 - 
					1src/storm/solver/GameSolver.cpp
 - 
					1src/storm/transformer/ParameterLifter.cpp
 - 
					6src/storm/utility/ModelInstantiator.cpp
 - 
					6src/storm/utility/constants.cpp
 - 
					47src/storm/utility/storm.h
 - 
					20src/test/modelchecker/SparseDtmcParameterLiftingTest.cpp
 - 
					18src/test/modelchecker/SparseMdpParameterLiftingTest.cpp
 
@ -0,0 +1,61 @@ | 
				
			|||
#include "storm/modelchecker/parametric/SparseDtmcParameterLifting.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/adapters/CarlAdapter.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/modelchecker/parametric/SparseDtmcParameterLiftingModelChecker.h"
 | 
				
			|||
#include "storm/modelchecker/parametric/SparseDtmcInstantiationModelChecker.h"
 | 
				
			|||
#include "storm/transformer/SparseParametricDtmcSimplifier.h"
 | 
				
			|||
#include "storm/models/sparse/StandardRewardModel.h"
 | 
				
			|||
#include "storm/models/sparse/Dtmc.h"
 | 
				
			|||
#include "SparseMdpParameterLifting.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace modelchecker { | 
				
			|||
        namespace parametric { | 
				
			|||
 | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            SparseDtmcParameterLifting<SparseModelType, ConstantType>::SparseDtmcParameterLifting(SparseModelType const& parametricModel) : ParameterLifting<SparseModelType, ConstantType>(parametricModel) { | 
				
			|||
                // Intentionally left empty
 | 
				
			|||
            } | 
				
			|||
     | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            void SparseDtmcParameterLifting<SparseModelType, ConstantType>::simplifyParametricModel(CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) { | 
				
			|||
                storm::transformer::SparseParametricDtmcSimplifier<SparseModelType> simplifier(this->parametricModel); | 
				
			|||
                if(simplifier.simplify(checkTask.getFormula())) { | 
				
			|||
                    this->simplifiedModel = simplifier.getSimplifiedModel(); | 
				
			|||
                    this->currentFormula = simplifier.getSimplifiedFormula(); | 
				
			|||
                } else { | 
				
			|||
                    this->simplifiedModel = nullptr; | 
				
			|||
                    this->currentFormula = checkTask.getFormula().asSharedPointer(); | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
             | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            void SparseDtmcParameterLifting<SparseModelType, ConstantType>::initializeUnderlyingCheckers() { | 
				
			|||
                if (this->settings.applyExactValidation) { | 
				
			|||
                    STORM_LOG_WARN_COND((std::is_same<ConstantType, typename ParameterLifting<SparseModelType, ConstantType>::CoefficientType>::value) , "Exact validation is not necessarry if the original computation is already exact"); | 
				
			|||
                    this->exactParameterLiftingChecker = std::make_unique<SparseDtmcParameterLiftingModelChecker<SparseModelType, typename ParameterLifting<SparseModelType, ConstantType>::CoefficientType>>(this->getConsideredParametricModel()); | 
				
			|||
                } | 
				
			|||
                this->parameterLiftingChecker = std::make_unique<SparseDtmcParameterLiftingModelChecker<SparseModelType, ConstantType>>(this->getConsideredParametricModel()); | 
				
			|||
                this->instantiationChecker = std::make_unique<SparseDtmcInstantiationModelChecker<SparseModelType, ConstantType>>(this->getConsideredParametricModel()); | 
				
			|||
            } | 
				
			|||
     | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            void SparseDtmcParameterLifting<SparseModelType, ConstantType>::applyHintsToExactChecker() { | 
				
			|||
                auto dtmcPLChecker = dynamic_cast<storm::modelchecker::parametric::SparseDtmcParameterLiftingModelChecker<SparseModelType, ConstantType>*>(this->parameterLiftingChecker.get()); | 
				
			|||
                STORM_LOG_ASSERT(dtmcPLChecker, "Underlying Parameter lifting checker has unexpected type"); | 
				
			|||
                auto exactDtmcPLChecker = dynamic_cast<storm::modelchecker::parametric::SparseDtmcParameterLiftingModelChecker<SparseModelType, typename ParameterLifting<SparseModelType, ConstantType>::CoefficientType>*>(this->exactParameterLiftingChecker.get()); | 
				
			|||
                STORM_LOG_ASSERT(exactDtmcPLChecker, "Underlying exact parameter lifting checker has unexpected type"); | 
				
			|||
                exactDtmcPLChecker->getCurrentMaxScheduler() = dtmcPLChecker->getCurrentMaxScheduler(); | 
				
			|||
                exactDtmcPLChecker->getCurrentMinScheduler() = dtmcPLChecker->getCurrentMinScheduler(); | 
				
			|||
            } | 
				
			|||
             | 
				
			|||
        | 
				
			|||
#ifdef STORM_HAVE_CARL
 | 
				
			|||
            template class SparseDtmcParameterLifting<storm::models::sparse::Dtmc<storm::RationalFunction>, double>; | 
				
			|||
            template class SparseDtmcParameterLifting<storm::models::sparse::Dtmc<storm::RationalFunction>, storm::RationalNumber>; | 
				
			|||
#endif
 | 
				
			|||
        } // namespace parametric
 | 
				
			|||
    } //namespace modelchecker
 | 
				
			|||
} //namespace storm
 | 
				
			|||
 | 
				
			|||
@ -0,0 +1,27 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
#include <memory> | 
				
			|||
 | 
				
			|||
#include "storm/modelchecker/parametric/ParameterLifting.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace modelchecker{ | 
				
			|||
        namespace parametric{ | 
				
			|||
             | 
				
			|||
 | 
				
			|||
            template<typename SparseModelType, typename ConstantType> | 
				
			|||
            class SparseDtmcParameterLifting : public ParameterLifting<SparseModelType, ConstantType> { | 
				
			|||
 | 
				
			|||
            public: | 
				
			|||
                SparseDtmcParameterLifting(SparseModelType const& parametricModel); | 
				
			|||
                 | 
				
			|||
            protected: | 
				
			|||
                virtual void simplifyParametricModel(CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) override; | 
				
			|||
                virtual void initializeUnderlyingCheckers() override; | 
				
			|||
                virtual void applyHintsToExactChecker() override; | 
				
			|||
                 | 
				
			|||
            }; | 
				
			|||
     | 
				
			|||
        } //namespace parametric | 
				
			|||
    } //namespace modelchecker | 
				
			|||
} //namespace storm | 
				
			|||
@ -0,0 +1,62 @@ | 
				
			|||
#include "storm/modelchecker/parametric/SparseMdpParameterLifting.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/adapters/CarlAdapter.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/modelchecker/parametric/SparseMdpParameterLiftingModelChecker.h"
 | 
				
			|||
#include "storm/modelchecker/parametric/SparseMdpInstantiationModelChecker.h"
 | 
				
			|||
#include "storm/transformer/SparseParametricMdpSimplifier.h"
 | 
				
			|||
#include "storm/models/sparse/StandardRewardModel.h"
 | 
				
			|||
#include "storm/models/sparse/Mdp.h"
 | 
				
			|||
#include "SparseMdpParameterLifting.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace modelchecker { | 
				
			|||
        namespace parametric { | 
				
			|||
 | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            SparseMdpParameterLifting<SparseModelType, ConstantType>::SparseMdpParameterLifting(SparseModelType const& parametricModel) : ParameterLifting<SparseModelType, ConstantType>(parametricModel) { | 
				
			|||
                // Intentionally left empty
 | 
				
			|||
            } | 
				
			|||
     | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            void SparseMdpParameterLifting<SparseModelType, ConstantType>::simplifyParametricModel(CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) { | 
				
			|||
                storm::transformer::SparseParametricMdpSimplifier<SparseModelType> simplifier(this->parametricModel); | 
				
			|||
                if(simplifier.simplify(checkTask.getFormula())) { | 
				
			|||
                    this->simplifiedModel = simplifier.getSimplifiedModel(); | 
				
			|||
                    this->currentFormula = simplifier.getSimplifiedFormula(); | 
				
			|||
                } else { | 
				
			|||
                    this->simplifiedModel = nullptr; | 
				
			|||
                    this->currentFormula = checkTask.getFormula().asSharedPointer(); | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
             | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            void SparseMdpParameterLifting<SparseModelType, ConstantType>::initializeUnderlyingCheckers() { | 
				
			|||
                if (this->settings.applyExactValidation) { | 
				
			|||
                    STORM_LOG_WARN_COND((std::is_same<ConstantType, typename ParameterLifting<SparseModelType, ConstantType>::CoefficientType>::value), "Exact validation is not necessarry if the original computation is already exact"); | 
				
			|||
                    this->exactParameterLiftingChecker = std::make_unique<SparseMdpParameterLiftingModelChecker<SparseModelType, typename ParameterLifting<SparseModelType, ConstantType>::CoefficientType>>(this->getConsideredParametricModel()); | 
				
			|||
                } | 
				
			|||
                this->parameterLiftingChecker = std::make_unique<SparseMdpParameterLiftingModelChecker<SparseModelType, ConstantType>>(this->getConsideredParametricModel()); | 
				
			|||
                this->instantiationChecker = std::make_unique<SparseMdpInstantiationModelChecker<SparseModelType, ConstantType>>(this->getConsideredParametricModel()); | 
				
			|||
            } | 
				
			|||
     | 
				
			|||
            template <typename SparseModelType, typename ConstantType> | 
				
			|||
            void SparseMdpParameterLifting<SparseModelType, ConstantType>::applyHintsToExactChecker() { | 
				
			|||
                auto MdpPLChecker = dynamic_cast<storm::modelchecker::parametric::SparseMdpParameterLiftingModelChecker<SparseModelType, ConstantType>*>(this->parameterLiftingChecker.get()); | 
				
			|||
                STORM_LOG_ASSERT(MdpPLChecker, "Underlying Parameter lifting checker has unexpected type"); | 
				
			|||
                auto exactMdpPLChecker = dynamic_cast<storm::modelchecker::parametric::SparseMdpParameterLiftingModelChecker<SparseModelType, typename ParameterLifting<SparseModelType, ConstantType>::CoefficientType>*>(this->exactParameterLiftingChecker.get()); | 
				
			|||
                STORM_LOG_ASSERT(exactMdpPLChecker, "Underlying exact parameter lifting checker has unexpected type"); | 
				
			|||
                exactMdpPLChecker->getCurrentMaxScheduler() = MdpPLChecker->getCurrentMaxScheduler(); | 
				
			|||
                exactMdpPLChecker->getCurrentMinScheduler() = MdpPLChecker->getCurrentMinScheduler(); | 
				
			|||
                exactMdpPLChecker->getCurrentPlayer1Scheduler() = MdpPLChecker->getCurrentPlayer1Scheduler(); | 
				
			|||
            } | 
				
			|||
             | 
				
			|||
        | 
				
			|||
#ifdef STORM_HAVE_CARL
 | 
				
			|||
            template class SparseMdpParameterLifting<storm::models::sparse::Mdp<storm::RationalFunction>, double>; | 
				
			|||
            template class SparseMdpParameterLifting<storm::models::sparse::Mdp<storm::RationalFunction>, storm::RationalNumber>; | 
				
			|||
#endif
 | 
				
			|||
        } // namespace parametric
 | 
				
			|||
    } //namespace modelchecker
 | 
				
			|||
} //namespace storm
 | 
				
			|||
 | 
				
			|||
@ -0,0 +1,28 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
#include <memory> | 
				
			|||
 | 
				
			|||
#include "storm/modelchecker/parametric/ParameterLifting.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace modelchecker{ | 
				
			|||
        namespace parametric{ | 
				
			|||
             | 
				
			|||
 | 
				
			|||
            template<typename SparseModelType, typename ConstantType> | 
				
			|||
            class SparseMdpParameterLifting : public ParameterLifting<SparseModelType, ConstantType> { | 
				
			|||
                 | 
				
			|||
            public: | 
				
			|||
                SparseMdpParameterLifting(SparseModelType const& parametricModel); | 
				
			|||
                 | 
				
			|||
            protected: | 
				
			|||
 | 
				
			|||
                virtual void initializeUnderlyingCheckers() override; | 
				
			|||
                virtual void simplifyParametricModel(CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) override; | 
				
			|||
                virtual void applyHintsToExactChecker() override; | 
				
			|||
                 | 
				
			|||
            }; | 
				
			|||
     | 
				
			|||
        } //namespace parametric | 
				
			|||
    } //namespace modelchecker | 
				
			|||
} //namespace storm | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue