@ -8,74 +8,51 @@
# include "src/settings/modules/TopologicalValueIterationEquationSolverSettings.h"
# include "src/settings/SettingMemento.h"
# include "src/parser/AutoParser.h"
# include "src/models/sparse/StandardRewardModel.h"
# include "src/parser/FormulaParser.h"
TEST ( DISABLED_TopologicalValueIterationMdpPrctlModelCheckerTest , AsynchronousLeader ) {
std : : shared_ptr < storm : : models : : sparse : : Mdp < double > > mdp = storm : : parser : : AutoParser : : parseModel ( STORM_CPP_BASE_PATH " /examples/mdp/asynchronous_leader/leader7.tra " , STORM_CPP_BASE_PATH " /examples/mdp/asynchronous_leader/leader7.lab " , " " , STORM_CPP_BASE_PATH " /examples/mdp/asynchronous_leader/leader7.trans.rew " ) - > as < storm : : models : : sparse : : Mdp < double > > ( ) ;
// A parser that we use for conveniently constructing the formulas.
storm : : parser : : FormulaParser parser ;
ASSERT_EQ ( mdp - > getNumberOfStates ( ) , 2095783ull ) ;
ASSERT_EQ ( mdp - > getNumberOfTransitions ( ) , 7714385ull ) ;
storm : : modelchecker : : SparseMdpPrctlModelChecker < double > mc ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : TopologicalMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
auto eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( apFormula ) ;
auto probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = mc . check ( * probFormula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] - 1.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( apFormula ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
result = mc . check ( * probFormula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] - 1.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : TopologicalMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
auto boundedEventuallyFormula = std : : make_shared < storm : : logic : : BoundedUntilFormula > ( std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) , apFormula , 25 ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , boundedEventuallyFormula ) ;
result = mc . check ( * probFormula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] - 0.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
boundedEventuallyFormula = std : : make_shared < storm : : logic : : BoundedUntilFormula > ( std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) , apFormula , 25 ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , boundedEventuallyFormula ) ;
result = mc . check ( * probFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " Pmin=? [F \" elected \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = checker . check ( * formula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] - 0.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
ASSERT_NEAR ( 1.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
auto reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( apFormula ) ;
auto rewardFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F \" elected \" ] " ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 1.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
result = mc . check ( * rewardFormula ) ;
formula = parser . parseFromString ( " Pmin=? [F<=25 \" elected \" ] " ) ;
result = checker . check ( * formula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] - 6.172433512 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
rewardFormula . reset ( ) ;
ASSERT_NEAR ( 0.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( apFormula ) ;
rewardFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F<=25 \" elected \" ] " ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 0.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
result = mc . check ( * rewardFormula ) ;
formula = parser . parseFromString ( " Rmin=? [F \" elected \" ] " ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 6.172433512 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] - 6.1724344 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
rewardFormula . reset ( ) ;
formula = parser . parseFromString ( " Rmax=? [F \" elected \" ] " ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 6.1724344 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 0 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
}
TEST ( DISABLED_TopologicalValueIterationMdpPrctlModelCheckerTest , Consensus ) {
@ -84,96 +61,52 @@ TEST(DISABLED_TopologicalValueIterationMdpPrctlModelCheckerTest, Consensus) {
std : : shared_ptr < storm : : models : : sparse : : Mdp < double > > mdp = storm : : parser : : AutoParser : : parseModel ( STORM_CPP_BASE_PATH " /examples/mdp/consensus/coin4_6.tra " , STORM_CPP_BASE_PATH " /examples/mdp/consensus/coin4_6.lab " , STORM_CPP_BASE_PATH " /examples/mdp/consensus/coin4_6.steps.state.rew " , " " ) - > as < storm : : models : : sparse : : Mdp < double > > ( ) ;
// A parser that we use for conveniently constructing the formulas.
storm : : parser : : FormulaParser parser ;
ASSERT_EQ ( mdp - > getNumberOfStates ( ) , 63616ull ) ;
ASSERT_EQ ( mdp - > getNumberOfTransitions ( ) , 213472ull ) ;
storm : : modelchecker : : SparseMdpPrctlModelChecker < double > mc ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : TopologicalMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : TopologicalMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
auto eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( apFormula ) ;
auto probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " Pmin=? [F \" finished \" ] " ) ;
auto result = mc . check ( * probF ormula) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = checker . check ( * formula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 1.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
ASSERT_NEAR ( 1.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
auto apFormula2 = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " all_coins_equal_0 " ) ;
auto andFormula = std : : make_shared < storm : : logic : : BinaryBooleanStateFormula > ( storm : : logic : : BinaryBooleanStateFormula : : OperatorType : : And , apFormula , apFormula2 ) ;
eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( andFormula ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmin=? [F \" finished \" & \" all_coins_equal_0 \" ] " ) ;
result = mc . check ( * probFormula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 0.4374282832 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
apFormula2 = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " all_coins_equal_1 " ) ;
andFormula = std : : make_shared < storm : : logic : : BinaryBooleanStateFormula > ( storm : : logic : : BinaryBooleanStateFormula : : OperatorType : : And , apFormula , apFormula2 ) ;
eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( andFormula ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 0.4374282832 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
result = mc . check ( * probFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F \" finished \" & \" all_coins_equal_1 \" ] " ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 0.5293286369 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 0.5293286369 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
apFormula2 = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " agree " ) ;
auto notFormula = std : : make_shared < storm : : logic : : UnaryBooleanStateFormula > ( storm : : logic : : UnaryBooleanStateFormula : : OperatorType : : Not , apFormula2 ) ;
andFormula = std : : make_shared < storm : : logic : : BinaryBooleanStateFormula > ( storm : : logic : : BinaryBooleanStateFormula : : OperatorType : : And , apFormula , notFormula ) ;
eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( andFormula ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
result = mc . check ( * probFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F \" finished \" & ! \" agree \" ] " ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 0.10414097 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 0.10414097 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
auto boundedEventuallyFormula = std : : make_shared < storm : : logic : : BoundedUntilFormula > ( std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) , apFormula , 50ull ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
result = mc . check ( * probFormula ) ;
formula = parser . parseFromString ( " Pmin=? [F<=50 \" finished \" ] " ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 0.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 0.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
boundedEventuallyFormula = std : : make_shared < storm : : logic : : BoundedUntilFormula > ( std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) , apFormula , 50ull ) ;
probFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F<=50 \" finished \" ] " ) ;
result = mc . check ( * probFormula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 0.0 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
auto reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( apFormula ) ;
auto rewardFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , reachabilityRewardFormula ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 0.0 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
result = mc . check ( * rewardFormula ) ;
formula = parser . parseFromString ( " Rmin=? [F \" finished \" ] " ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 1725.593313 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 1725.593313 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
apFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " finished " ) ;
reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( apFormula ) ;
rewardFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , reachabilityRewardFormula ) ;
result = mc . check ( * rewardFormula ) ;
ASSERT_LT ( std : : abs ( result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] - 2183.142422 ) ,
storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
probFormula . reset ( ) ;
formula = parser . parseFromString ( " Rmax=? [F \" finished \" \" ] " ) ;
result = checker . check ( * formula ) ;
ASSERT_NEAR ( 2183.142422 , result - > asExplicitQuantitativeCheckResult < double > ( ) [ 31168 ] , storm : : settings : : topologicalValueIterationEquationSolverSettings ( ) . getPrecision ( ) ) ;
}