@ -20,9 +20,8 @@
# include "storm/utility/Stopwatch.h"
# include "storm/exceptions/InvalidStateException.h"
# include "storm/exceptions/InvalidPropertyException.h"
# include "storm/exceptions/InvalidOperationException.h"
# include "storm/exceptions/NotSupportedException.h"
namespace storm {
namespace modelchecker {
@ -77,67 +76,73 @@ namespace storm {
}
/* template<storm::dd::DdType DdType, class ValueType>
std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment const & env , storm : : models : : symbolic : : MarkovAutomaton < DdType , ValueType > const & model , storm : : dd : : Add < DdType , ValueType > const & rateMatrix , storm : : dd : : Add < DdType , ValueType > const & exitRateVector , storm : : dd : : Bdd < DdType > const & psiStates ) {
template < storm : : dd : : DdType DdType , class ValueType >
std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < DdType , ValueType > const & model , storm : : dd : : Add < DdType , ValueType > const & transitionMatrix , storm : : dd : : Bdd < DdType > const & markovianStates , storm : : dd : : Add < DdType , ValueType > const & exitRateVector , storm : : dd : : Bdd < DdType > const & psiStates ) {
// Convert this query to an instance for the sparse engine.
storm : : utility : : Stopwatch conversionWatch ( true ) ;
// Create ODD for the translation.
storm : : dd : : Odd odd = model . getReachableStates ( ) . createOdd ( ) ;
storm : : storage : : SparseMatrix < ValueType > explicitRateMatrix = rateMatrix . toMatrix ( odd , odd ) ;
storm : : storage : : SparseMatrix < ValueType > explicitTransitionMatrix = transitionMatrix . toMatrix ( model . getNondeterminismVariables ( ) , odd , odd ) ;
std : : vector < ValueType > explicitExitRateVector = exitRateVector . toVector ( odd ) ;
conversionWatch . stop ( ) ;
STORM_LOG_INFO ( " Converting symbolic matrix/vector to explicit representation done in " < < conversionWatch . getTimeInMilliseconds ( ) < < " ms. " ) ;
std : : vector < ValueType > r esult = storm : : modelchecker : : helper : : SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( env , storm : : solver : : SolveGoal < ValueType > ( ) , explicitRateMatrix , psi States. toVector ( odd ) , & explicitExitRateVector ) ;
return std : : unique_ptr < CheckResult > ( new HybridQuantitativeCheckResult < DdType , ValueType > ( model . getReachableStates ( ) , model . getManager ( ) . getBddZero ( ) , model . getManager ( ) . template getAddZero < ValueType > ( ) , model . getReachableStates ( ) , std : : move ( odd ) , std : : move ( result ) ) ) ;
STORM_LOG_INFO ( " Converting symbolic matrix to explicit representation done in " < < conversionWatch . getTimeInMilliseconds ( ) < < " ms. " ) ;
auto explicitR esult = storm : : modelchecker : : helper : : SparseMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( env , dir , explicitTransitionMatrix , explicitTransitionMatrix . transpose ( true ) , explicitExitRateVector , markovian States. toVector ( odd ) , psiStates . toVector ( odd ) ) ;
return std : : unique_ptr < CheckResult > ( new HybridQuantitativeCheckResult < DdType , ValueType > ( model . getReachableStates ( ) , model . getManager ( ) . getBddZero ( ) , model . getManager ( ) . template getAddZero < ValueType > ( ) , model . getReachableStates ( ) , std : : move ( odd ) , std : : move ( explicitResult ) ) ) ;
}
template < storm : : dd : : DdType DdType , class ValueType >
std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , storm : : models : : symbolic : : MarkovAutomaton < DdType , ValueType > const & model , storm : : dd : : Add < DdType , ValueType > const & rateMatrix , storm : : dd : : Add < DdType , ValueType > const & exitRateVector , typename storm : : models : : symbolic : : Model < DdType , ValueType > : : RewardModelType const & rewardModel ) {
STORM_LOG_THROW ( ! rewardModel . empty ( ) , storm : : exceptions : : InvalidPropertyException , " Missing reward model for formula. Skipping formula. " ) ;
storm : : dd : : Add < DdType , ValueType > probabilityMatrix = computeProbabilityMatrix ( rateMatrix , exitRateVector ) ;
std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < DdType , ValueType > const & model , storm : : dd : : Add < DdType , ValueType > const & transitionMatrix , storm : : dd : : Bdd < DdType > const & markovianStates , storm : : dd : : Add < DdType , ValueType > const & exitRateVector , typename storm : : models : : symbolic : : Model < DdType , ValueType > : : RewardModelType const & rewardModel ) {
// Convert this query to an instance for the sparse engine.
storm : : utility : : Stopwatch conversionWatch ( true ) ;
// Create ODD for the translation.
storm : : dd : : Odd odd = model . getReachableStates ( ) . createOdd ( ) ;
storm : : storage : : SparseMatrix < ValueType > explicitRateMatrix = rateMatrix . toMatrix ( odd , odd ) ;
std : : vector < ValueType > explicitExitRateVector = exitRateVector . toVector ( odd ) ;
storm : : storage : : SparseMatrix < ValueType > explicitTransitionMatrix ;
boost : : optional < std : : vector < ValueType > > optionalStateRewards , optionalStateActionRewards ;
if ( rewardModel . hasStateRewards ( ) ) {
optionalStateRewards = rewardModel . getStateRewardVector ( ) . toVector ( odd ) ;
}
if ( rewardModel . hasStateActionRewards ( ) ) {
auto matrixRewards = transitionMatrix . toMatrixVector ( rewardModel . getStateActionRewardVector ( ) , model . getNondeterminismVariables ( ) , odd , odd ) ;
explicitTransitionMatrix = std : : move ( matrixRewards . first ) ;
optionalStateActionRewards = std : : move ( matrixRewards . second ) ;
} else {
explicitTransitionMatrix = transitionMatrix . toMatrix ( model . getNondeterminismVariables ( ) , odd , odd ) ;
}
STORM_LOG_THROW ( ! rewardModel . hasTransitionRewards ( ) , storm : : exceptions : : NotSupportedException , " Transition rewards are not supported in this engine. " ) ;
storm : : models : : sparse : : StandardRewardModel < ValueType > explicitRewardModel ( optionalStateRewards , optionalStateActionRewards ) ;
conversionWatch . stop ( ) ;
STORM_LOG_INFO ( " Converting symbolic matrix/vector to explicit representation done in " < < conversionWatch . getTimeInMilliseconds ( ) < < " ms. " ) ;
std : : vector < ValueType > result = storm : : modelchecker : : helper : : SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( env , storm : : solver : : SolveGoal < ValueType > ( ) , explicitRateMatrix , rewardModel . getTotalRewardVector ( probabilityMatrix , model . getColumnVariables ( ) , exitRateVector , true ) . toVector ( odd ) , & explicitExitRateVector ) ;
STORM_LOG_INFO ( " Converting symbolic matrix to explicit representation done in " < < conversionWatch . getTimeInMilliseconds ( ) < < " ms. " ) ;
auto explicitResult = storm : : modelchecker : : helper : : SparseMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( env , dir , explicitTransitionMatrix , explicitTransitionMatrix . transpose ( true ) , explicitExitRateVector , markovianStates . toVector ( odd ) , explicitRewardModel ) ;
return std : : unique_ptr < CheckResult > ( new HybridQuantitativeCheckResult < DdType , ValueType > ( model . getReachableStates ( ) , model . getManager ( ) . getBddZero ( ) , model . getManager ( ) . template getAddZero < ValueType > ( ) , model . getReachableStates ( ) , std : : move ( odd ) , std : : move ( explicitResult ) ) ) ;
return std : : unique_ptr < CheckResult > ( new HybridQuantitativeCheckResult < DdType , ValueType > ( model . getReachableStates ( ) , model . getManager ( ) . getBddZero ( ) , model . getManager ( ) . template getAddZero < ValueType > ( ) , model . getReachableStates ( ) , std : : move ( odd ) , std : : move ( result ) ) ) ;
}
*/
// Explicit instantiations.
// Cudd, double.
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeReachabilityRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : CUDD , double > : : RewardModelType const & rewardModel , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & targetStates , bool qualitative ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & psiStates , bool qualitative , double lowerBound , double upperBound ) ;
/*
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment const & env , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & rateMatrix , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & psiStates ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & rateMatrix , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : CUDD , double > : : RewardModelType const & rewardModel ) ;
*/
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & psiStates ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : CUDD , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : CUDD > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : CUDD , double > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : CUDD , double > : : RewardModelType const & rewardModel ) ;
// Sylvan, double.
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeReachabilityRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan , double > : : RewardModelType const & rewardModel , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & targetStates , bool qualitative ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & psiStates , bool qualitative , double lowerBound , double upperBound ) ;
/* template std::unique_ptr<CheckResult> HybridMarkovAutomatonCslHelper::computeLongRunAverageProbabilities(Environment const& env, storm::models::symbolic::MarkovAutomaton<storm::dd::DdType::Sylvan, double> const& model, storm::dd::Add<storm::dd::DdType::Sylvan, double> const& rateMatrix, storm::dd::Add<storm::dd::DdType::Sylvan, double> const& exitRateVector, storm::dd::Bdd<storm::dd::DdType::Sylvan> const& psiStates);
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & rateMatrix , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan , double > : : RewardModelType const & rewardModel ) ;
*/
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & psiStates ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , double > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , double > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan , double > : : RewardModelType const & rewardModel ) ;
// Sylvan, rational number.
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeReachabilityRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > : : RewardModelType const & rewardModel , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & targetStates , bool qualitative ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeBoundedUntilProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & psiStates , bool qualitative , double lowerBound , double upperBound ) ;
/* template std::unique_ptr<CheckResult> HybridMarkovAutomatonCslHelper::computeLongRunAverageProbabilities(Environment const& env, storm::models::symbolic::MarkovAutomaton<storm::dd::DdType::Sylvan, storm::RationalNumber> const& model, storm::dd::Add<storm::dd::DdType::Sylvan, storm::RationalNumber> const& rateMatrix, storm::dd::Add<storm::dd::DdType::Sylvan, storm::RationalNumber> const& exitRateVector, storm::dd::Bdd<storm::dd::DdType::Sylvan> const& psiStates);
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & rateMatrix , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > : : RewardModelType const & rewardModel ) ;
*/
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageProbabilities ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & exitRateVector , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & psiStates ) ;
template std : : unique_ptr < CheckResult > HybridMarkovAutomatonCslHelper : : computeLongRunAverageRewards ( Environment const & env , OptimizationDirection dir , storm : : models : : symbolic : : MarkovAutomaton < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & model , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & transitionMatrix , storm : : dd : : Bdd < storm : : dd : : DdType : : Sylvan > const & markovianStates , storm : : dd : : Add < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > const & exitRateVector , typename storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan , storm : : RationalNumber > : : RewardModelType const & rewardModel ) ;
}
}