@ -44,7 +44,7 @@ namespace storm {
SparseMdpPrctlModelChecker < SparseMdpModelType > : : SparseMdpPrctlModelChecker ( SparseMdpModelType const & model ) : SparsePropositionalModelChecker < SparseMdpModelType > ( model ) {
// Intentionally left empty.
}
template < typename SparseMdpModelType >
bool SparseMdpPrctlModelChecker < SparseMdpModelType > : : canHandleStatic ( CheckTask < storm : : logic : : Formula , ValueType > const & checkTask , bool * requiresSingleInitialState ) {
storm : : logic : : Formula const & formula = checkTask . getFormula ( ) ;
@ -61,7 +61,7 @@ namespace storm {
}
return false ;
}
template < typename SparseMdpModelType >
bool SparseMdpPrctlModelChecker < SparseMdpModelType > : : canHandle ( CheckTask < storm : : logic : : Formula , ValueType > const & checkTask ) const {
bool requiresSingleInitialState = false ;
@ -71,7 +71,7 @@ namespace storm {
return false ;
}
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeBoundedUntilProbabilities ( Environment const & env , CheckTask < storm : : logic : : BoundedUntilFormula , ValueType > const & checkTask ) {
storm : : logic : : BoundedUntilFormula const & pathFormula = checkTask . getFormula ( ) ;
@ -117,7 +117,6 @@ namespace storm {
std : : unique_ptr < CheckResult > subResultPointer = this - > check ( env , pathFormula . getSubformula ( ) ) ;
ExplicitQualitativeCheckResult const & subResult = subResultPointer - > asExplicitQualitativeCheckResult ( ) ;
auto ret = storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeNextProbabilities ( env , storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) , checkTask ) , checkTask . getOptimizationDirection ( ) , this - > getModel ( ) . getTransitionMatrix ( ) , subResult . getTruthValuesVector ( ) ) ;
STORM_LOG_DEBUG ( ret . values ) ;
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , std : : move ( ret . choiceValues ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , std : : move ( ret . maybeStates ) , storm : : storage : : BitVector ( ret . maybeStates . size ( ) , true ) ) ;
@ -126,7 +125,7 @@ namespace storm {
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeUntilProbabilities ( Environment const & env , CheckTask < storm : : logic : : UntilFormula , ValueType > const & checkTask ) {
storm : : logic : : UntilFormula const & pathFormula = checkTask . getFormula ( ) ;
@ -136,7 +135,6 @@ namespace storm {
ExplicitQualitativeCheckResult const & leftResult = leftResultPointer - > asExplicitQualitativeCheckResult ( ) ;
ExplicitQualitativeCheckResult const & rightResult = rightResultPointer - > asExplicitQualitativeCheckResult ( ) ;
auto ret = storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeUntilProbabilities ( env , storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) , checkTask ) , this - > getModel ( ) . getTransitionMatrix ( ) , this - > getModel ( ) . getBackwardTransitions ( ) , leftResult . getTruthValuesVector ( ) , rightResult . getTruthValuesVector ( ) , checkTask . isQualitativeSet ( ) , checkTask . isProduceSchedulersSet ( ) , checkTask . getHint ( ) ) ;
STORM_LOG_DEBUG ( ret . values ) ;
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , std : : move ( ret . choiceValues ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , std : : move ( ret . maybeStates ) , storm : : storage : : BitVector ( ret . maybeStates . size ( ) , true ) ) ;
@ -145,7 +143,7 @@ namespace storm {
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeGloballyProbabilities ( Environment const & env , CheckTask < storm : : logic : : GloballyFormula , ValueType > const & checkTask ) {
storm : : logic : : GloballyFormula const & pathFormula = checkTask . getFormula ( ) ;
@ -153,17 +151,15 @@ namespace storm {
std : : unique_ptr < CheckResult > subResultPointer = this - > check ( env , pathFormula . getSubformula ( ) ) ;
ExplicitQualitativeCheckResult const & subResult = subResultPointer - > asExplicitQualitativeCheckResult ( ) ;
auto ret = storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeGloballyProbabilities ( env , storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) , checkTask ) , this - > getModel ( ) . getTransitionMatrix ( ) , this - > getModel ( ) . getBackwardTransitions ( ) , subResult . getTruthValuesVector ( ) , checkTask . isQualitativeSet ( ) , checkTask . isProduceSchedulersSet ( ) ) ;
STORM_LOG_DEBUG ( ret . values ) ;
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
STORM_LOG_DEBUG ( ret . choiceValues ) ;
tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , std : : move ( ret . choiceValues ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , subResult . getTruthValuesVector ( ) , storm : : storage : : BitVector ( ret . maybeStates . size ( ) , true ) ) ;
} else if ( checkTask . isProduceSchedulersSet ( ) & & ret . scheduler ) {
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeConditionalProbabilities ( Environment const & env , CheckTask < storm : : logic : : ConditionalFormula , ValueType > const & checkTask ) {
storm : : logic : : ConditionalFormula const & conditionalFormula = checkTask . getFormula ( ) ;
@ -179,7 +175,7 @@ namespace storm {
return storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeConditionalProbabilities ( env , storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) , checkTask ) , this - > getModel ( ) . getTransitionMatrix ( ) , this - > getModel ( ) . getBackwardTransitions ( ) , leftResult . getTruthValuesVector ( ) , rightResult . getTruthValuesVector ( ) ) ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeCumulativeRewards ( Environment const & env , storm : : logic : : RewardMeasureType , CheckTask < storm : : logic : : CumulativeRewardFormula , ValueType > const & checkTask ) {
storm : : logic : : CumulativeRewardFormula const & rewardPathFormula = checkTask . getFormula ( ) ;
@ -203,7 +199,7 @@ namespace storm {
return std : : unique_ptr < CheckResult > ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;
}
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeInstantaneousRewards ( Environment const & env , storm : : logic : : RewardMeasureType , CheckTask < storm : : logic : : InstantaneousRewardFormula , ValueType > const & checkTask ) {
storm : : logic : : InstantaneousRewardFormula const & rewardPathFormula = checkTask . getFormula ( ) ;
@ -212,7 +208,7 @@ namespace storm {
std : : vector < ValueType > numericResult = storm : : modelchecker : : helper : : SparseMdpPrctlHelper < ValueType > : : computeInstantaneousRewards ( env , storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) , checkTask ) , this - > getModel ( ) . getTransitionMatrix ( ) , checkTask . isRewardModelSet ( ) ? this - > getModel ( ) . getRewardModel ( checkTask . getRewardModel ( ) ) : this - > getModel ( ) . getRewardModel ( " " ) , rewardPathFormula . getBound < uint64_t > ( ) ) ;
return std : : unique_ptr < CheckResult > ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeReachabilityRewards ( Environment const & env , storm : : logic : : RewardMeasureType , CheckTask < storm : : logic : : EventuallyFormula , ValueType > const & checkTask ) {
storm : : logic : : EventuallyFormula const & eventuallyFormula = checkTask . getFormula ( ) ;
@ -227,7 +223,7 @@ namespace storm {
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeReachabilityTimes ( Environment const & env , storm : : logic : : RewardMeasureType , CheckTask < storm : : logic : : EventuallyFormula , ValueType > const & checkTask ) {
storm : : logic : : EventuallyFormula const & eventuallyFormula = checkTask . getFormula ( ) ;
@ -241,7 +237,7 @@ namespace storm {
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeTotalRewards ( Environment const & env , storm : : logic : : RewardMeasureType , CheckTask < storm : : logic : : TotalRewardFormula , ValueType > const & checkTask ) {
STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) , storm : : exceptions : : InvalidPropertyException , " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;
@ -260,18 +256,18 @@ namespace storm {
STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) , storm : : exceptions : : InvalidPropertyException , " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;
std : : unique_ptr < CheckResult > subResultPointer = this - > check ( env , stateFormula ) ;
ExplicitQualitativeCheckResult const & subResult = subResultPointer - > asExplicitQualitativeCheckResult ( ) ;
storm : : modelchecker : : helper : : SparseNondeterministicInfiniteHorizonHelper < ValueType > helper ( this - > getModel ( ) . getTransitionMatrix ( ) ) ;
storm : : modelchecker : : helper : : setInformationFromCheckTaskNondeterministic ( helper , checkTask , this - > getModel ( ) ) ;
auto values = helper . computeLongRunAverageProbabilities ( env , subResult . getTruthValuesVector ( ) ) ;
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( values ) ) ) ;
if ( checkTask . isProduceSchedulersSet ( ) ) {
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : make_unique < storm : : storage : : Scheduler < ValueType > > ( helper . extractScheduler ( ) ) ) ;
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeLongRunAverageRewards ( Environment const & env , storm : : logic : : RewardMeasureType rewardMeasureType , CheckTask < storm : : logic : : LongRunAverageRewardFormula , ValueType > const & checkTask ) {
STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) , storm : : exceptions : : InvalidPropertyException , " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;
@ -285,12 +281,12 @@ namespace storm {
}
return result ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : checkMultiObjectiveFormula ( Environment const & env , CheckTask < storm : : logic : : MultiObjectiveFormula , ValueType > const & checkTask ) {
return multiobjective : : performMultiObjectiveModelChecking ( env , this - > getModel ( ) , checkTask . getFormula ( ) ) ;
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : checkQuantileFormula ( Environment const & env , CheckTask < storm : : logic : : QuantileFormula , ValueType > const & checkTask ) {
STORM_LOG_THROW ( checkTask . isOnlyInitialStatesRelevantSet ( ) , storm : : exceptions : : InvalidOperationException , " Computing quantiles is only supported for the initial states of a model. " ) ;
@ -299,14 +295,14 @@ namespace storm {
helper : : rewardbounded : : QuantileHelper < SparseMdpModelType > qHelper ( this - > getModel ( ) , checkTask . getFormula ( ) ) ;
auto res = qHelper . computeQuantile ( env ) ;
if ( res . size ( ) = = 1 & & res . front ( ) . size ( ) = = 1 ) {
return std : : unique_ptr < CheckResult > ( new ExplicitQuantitativeCheckResult < ValueType > ( initialState , std : : move ( res . front ( ) . front ( ) ) ) ) ;
} else {
return std : : unique_ptr < CheckResult > ( new ExplicitParetoCurveCheckResult < ValueType > ( initialState , std : : move ( res ) ) ) ;
}
}
template class SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > ;
# ifdef STORM_HAVE_CARL