@ -45,7 +45,7 @@ namespace storm {
template < typename SparseMdpModelType >
bool SparseMdpPrctlModelChecker < SparseMdpModelType > : : canHandleStatic ( CheckTask < storm : : logic : : Formula , ValueType > const & checkTask , bool * requiresSingleInitialState ) {
storm : : logic : : Formula const & formula = checkTask . getFormula ( ) ;
if ( formula . isInFragment ( storm : : logic : : prctlstar ( ) . setLongRunAverageRewardFormulasAllowed ( true ) . setLongRunAverageProbabilitiesAllowed ( true ) . setConditionalProbabilityFormulasAllowed ( true ) . setOnlyEventuallyFormuluasInConditionalFormulasAllowed ( true ) . setTotalRewardFormulasAllowed ( true ) . setRewardBoundedUntilFormulasAllowed ( true ) . setRewardBoundedCumulativeRewardFormulasAllowed ( true ) . setMultiDimensionalBoundedUntilFormulasAllowed ( true ) . setMultiDimensionalCumulativeRewardFormulasAllowed ( true ) . setTimeOperatorsAllowed ( true ) . setReachbilityTimeFormulasAllowed ( true ) . setRewardAccumulationAllowed ( true ) ) ) {
if ( formula . isInFragment ( storm : : logic : : prctlstar ( ) . setLongRunAverageRewardFormulasAllowed ( true ) . setLongRunAverageProbabilitiesAllowed ( true ) . setConditionalProbabilityFormulasAllowed ( true ) . setOnlyEventuallyFormuluasInConditionalFormulasAllowed ( true ) . setTotalRewardFormulasAllowed ( true ) . setRewardBoundedUntilFormulasAllowed ( true ) . setRewardBoundedCumulativeRewardFormulasAllowed ( true ) . setMultiDimensionalBoundedUntilFormulasAllowed ( true ) . setBoundedGloballyFormulasAllowed ( true ) . set MultiDimensionalCumulativeRewardFormulasAllowed ( true ) . setTimeOperatorsAllowed ( true ) . setReachbilityTimeFormulasAllowed ( true ) . setRewardAccumulationAllowed ( true ) ) ) {
return true ;
} else if ( checkTask . isOnlyInitialStatesRelevantSet ( ) ) {
auto multiObjectiveFragment = storm : : logic : : multiObjective ( ) . setCumulativeRewardFormulasAllowed ( true ) . setTimeBoundedCumulativeRewardFormulasAllowed ( true ) . setStepBoundedCumulativeRewardFormulasAllowed ( true ) . setRewardBoundedCumulativeRewardFormulasAllowed ( true ) . setTimeBoundedUntilFormulasAllowed ( true ) . setStepBoundedUntilFormulasAllowed ( true ) . setRewardBoundedUntilFormulasAllowed ( true ) . setMultiDimensionalBoundedUntilFormulasAllowed ( true ) . setMultiDimensionalCumulativeRewardFormulasAllowed ( true ) . setRewardAccumulationAllowed ( true ) ;
@ -69,6 +69,34 @@ namespace storm {
}
}
template < typename SparseMdpModelType >
std : : unique_ptr < CheckResult > SparseMdpPrctlModelChecker < SparseMdpModelType > : : computeBoundedGloballyProbabilities ( Environment const & env , CheckTask < storm : : logic : : BoundedGloballyFormula , ValueType > const & checkTask ) {
storm : : logic : : BoundedGloballyFormula const & pathFormula = checkTask . getFormula ( ) ;
STORM_LOG_THROW ( checkTask . isOptimizationDirectionSet ( ) , storm : : exceptions : : InvalidPropertyException , " Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model. " ) ;
STORM_LOG_THROW ( pathFormula . hasUpperBound ( ) , storm : : exceptions : : InvalidPropertyException , " Formula needs to have (a single) upper step bound. " ) ;
STORM_LOG_THROW ( pathFormula . hasIntegerLowerBound ( ) , storm : : exceptions : : InvalidPropertyException , " Formula lower step bound must be discrete/integral. " ) ;
STORM_LOG_THROW ( pathFormula . hasIntegerUpperBound ( ) , storm : : exceptions : : InvalidPropertyException , " Formula needs to have discrete upper time bound. " ) ;
std : : unique_ptr < CheckResult > subResultPointer = this - > check ( env , pathFormula . getSubformula ( ) ) ;
ExplicitQualitativeCheckResult const & subResult = subResultPointer - > asExplicitQualitativeCheckResult ( ) ;
storm : : modelchecker : : helper : : SparseNondeterministicStepBoundedHorizonHelper < ValueType > helper ;
std : : vector < ValueType > numericResult ;
//This works only with empty vectors, no nullptr
storm : : storage : : BitVector resultMaybeStates ;
std : : vector < ValueType > choiceValues ;
storm : : storage : : BitVector allStatesBv = storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) , true ) ;
numericResult = helper . compute ( env , storm : : solver : : SolveGoal < ValueType > ( this - > getModel ( ) , checkTask ) , this - > getModel ( ) . getTransitionMatrix ( ) , this - > getModel ( ) . getBackwardTransitions ( ) , allStatesBv , ~ subResult . getTruthValuesVector ( ) , pathFormula . getNonStrictLowerBound < uint64_t > ( ) , pathFormula . getNonStrictUpperBound < uint64_t > ( ) , resultMaybeStates , choiceValues , checkTask . getHint ( ) ) ;
// flip directions TODO
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
auto shield = tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , std : : move ( choiceValues ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , std : : move ( resultMaybeStates ) , storm : : storage : : BitVector ( resultMaybeStates . size ( ) , true ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
return result ;
}
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 ( ) ;
@ -103,9 +131,9 @@ namespace storm {
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( numericResult ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
auto shield = tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , std : : move ( choiceValues ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , std : : move ( resultMaybeStates ) , storm : : storage : : BitVector ( resultMaybeStates . size ( ) , true ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
return result ;
}
}
@ -120,7 +148,7 @@ namespace storm {
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
auto shield = 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 ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
if ( checkTask . isProduceSchedulersSet ( ) & & ret . scheduler ) {
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;
@ -139,10 +167,10 @@ namespace storm {
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 ( ) ) ;
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
auto shield = tempest : : shields : : createShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , std : : move ( ret . choiceValues ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) , true ) , storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) , true ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
if ( checkTask . isProduceSchedulersSet ( ) & & ret . scheduler ) {
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;
}
@ -160,9 +188,9 @@ namespace storm {
std : : unique_ptr < CheckResult > result ( new ExplicitQuantitativeCheckResult < ValueType > ( std : : move ( ret . values ) ) ) ;
if ( checkTask . isShieldingTask ( ) ) {
auto shield = 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 ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
}
if ( checkTask . isProduceSchedulersSet ( ) & & ret . scheduler ) {
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : move ( ret . scheduler ) ) ;
}
@ -313,7 +341,7 @@ namespace storm {
if ( checkTask . isShieldingTask ( ) ) {
storm : : storage : : BitVector allStatesBv = storm : : storage : : BitVector ( this - > getModel ( ) . getTransitionMatrix ( ) . getRowGroupCount ( ) , true ) ;
auto shield = tempest : : shields : : createQuantitativeShield < ValueType > ( std : : make_shared < storm : : models : : sparse : : Mdp < ValueType > > ( this - > getModel ( ) ) , helper . getChoiceValues ( ) , checkTask . getShieldingExpression ( ) , checkTask . getOptimizationDirection ( ) , allStatesBv , allStatesBv ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setShield ( std : : move ( shield ) ) ;
} else if ( checkTask . isProduceSchedulersSet ( ) ) {
result - > asExplicitQuantitativeCheckResult < ValueType > ( ) . setScheduler ( std : : make_unique < storm : : storage : : Scheduler < ValueType > > ( helper . extractScheduler ( ) ) ) ;
}
@ -326,7 +354,7 @@ namespace storm {
auto rewardModel = storm : : utility : : createFilteredRewardModel ( this - > getModel ( ) , checkTask ) ;
storm : : modelchecker : : helper : : SparseNondeterministicInfiniteHorizonHelper < ValueType > helper ( this - > getModel ( ) . getTransitionMatrix ( ) ) ;
storm : : modelchecker : : helper : : setInformationFromCheckTaskNondeterministic ( helper , checkTask , this - > getModel ( ) ) ;
auto values = helper . computeLongRunAverageRewards ( env , rewardModel . get ( ) ) ;
auto values = helper . computeLongRunAverageRewards ( env , rewardModel . get ( ) ) ;
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 ( ) ) ) ;