@ -1,6 +1,7 @@
# include "gtest/gtest.h"
# include "storm-config.h"
# include "src/parser/FormulaParser.h"
# include "src/logic/Formulas.h"
# include "src/utility/solver.h"
# include "src/modelchecker/prctl/SparseMdpPrctlModelChecker.h"
@ -13,6 +14,9 @@
TEST ( SparseMdpPrctlModelCheckerTest , Dice ) {
std : : shared_ptr < storm : : models : : sparse : : Model < double > > abstractModel = storm : : parser : : AutoParser : : parseModel ( STORM_CPP_BASE_PATH " /examples/mdp/two_dice/two_dice.tra " , STORM_CPP_BASE_PATH " /examples/mdp/two_dice/two_dice.lab " , " " , STORM_CPP_BASE_PATH " /examples/mdp/two_dice/two_dice.flip.trans.rew " ) ;
// A parser that we use for conveniently constructing the formulas.
storm : : parser : : FormulaParser parser ;
ASSERT_EQ ( abstractModel - > getType ( ) , storm : : models : : ModelType : : Mdp ) ;
std : : shared_ptr < storm : : models : : sparse : : Mdp < double > > mdp = abstractModel - > as < storm : : models : : sparse : : Mdp < double > > ( ) ;
@ -22,66 +26,58 @@ TEST(SparseMdpPrctlModelCheckerTest, Dice) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " two " ) ;
auto eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( labelFormula ) ;
auto minProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " Pmin=? [F \" two \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = checker . check ( * minProbabilityOperatorF ormula) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0277777612209320068 , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
auto maxProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
result = checker . check ( * maxProbabilityOperatorF ormula) ;
formula = parser . parseFromString ( " Pmax=? [F \" two \" ] " ) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0277777612209320068 , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " three " ) ;
eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( labelFormula ) ;
minProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmin=? [F \" three \" ] " ) ;
result = checker . check ( * minProbabilityOperatorF ormula) ;
result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult3 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0555555224418640136 , quantitativeResult3 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
maxProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F \" three \" ] " ) ;
result = checker . check ( * maxProbabilityOperatorF ormula) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult4 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0555555224418640136 , quantitativeResult4 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " four " ) ;
eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( labelFormula ) ;
minProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmin=? [F \" four \" ] " ) ;
result = checker . check ( * minProbabilityOperatorF ormula) ;
result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult5 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.083333283662796020508 , quantitativeResult5 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
maxProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F \" four \" ] " ) ;
result = checker . check ( * maxProbabilityOperatorF ormula) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult6 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.083333283662796020508 , quantitativeResult6 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " done " ) ;
auto reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( labelFormula ) ;
auto minRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmin=? [F \" done \" ] " ) ;
result = checker . check ( * minRewardOperatorF ormula) ;
result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult7 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 7.333329499 , quantitativeResult7 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
auto maxRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmax=? [F \" done \" ] " ) ;
result = checker . check ( * maxRewardOperatorF ormula) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult8 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 7.333329499 , quantitativeResult8 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -94,18 +90,16 @@ TEST(SparseMdpPrctlModelCheckerTest, Dice) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > stateRewardModelChecker ( * stateRewardMdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " done " ) ;
reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( labelFormula ) ;
minRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmin=? [F \" done \" ] " ) ;
result = stateRewardModelChecker . check ( * minRewardOperatorF ormula) ;
result = stateRewardModelChecker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult9 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 7.333329499 , quantitativeResult9 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
maxRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmax=? [F \" done \" ] " ) ;
result = stateRewardModelChecker . check ( * maxRewardOperatorF ormula) ;
result = stateRewardModelChecker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult10 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 7.333329499 , quantitativeResult10 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -118,18 +112,16 @@ TEST(SparseMdpPrctlModelCheckerTest, Dice) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > stateAndTransitionRewardModelChecker ( * stateAndTransitionRewardMdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " done " ) ;
reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( labelFormula ) ;
minRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmin=? [F \" done \" ] " ) ;
result = stateAndTransitionRewardModelChecker . check ( * minRewardOperatorF ormula) ;
result = stateAndTransitionRewardModelChecker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult11 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 14.666658998 , quantitativeResult11 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
maxRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmax=? [F \" done \" ] " ) ;
result = stateAndTransitionRewardModelChecker . check ( * maxRewardOperatorF ormula) ;
result = stateAndTransitionRewardModelChecker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult12 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 14.666658998 , quantitativeResult12 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -138,6 +130,9 @@ TEST(SparseMdpPrctlModelCheckerTest, Dice) {
TEST ( SparseMdpPrctlModelCheckerTest , AsynchronousLeader ) {
std : : shared_ptr < storm : : models : : sparse : : Model < double > > abstractModel = storm : : parser : : AutoParser : : parseModel ( STORM_CPP_BASE_PATH " /examples/mdp/asynchronous_leader/leader4.tra " , STORM_CPP_BASE_PATH " /examples/mdp/asynchronous_leader/leader4.lab " , " " , STORM_CPP_BASE_PATH " /examples/mdp/asynchronous_leader/leader4.trans.rew " ) ;
// A parser that we use for conveniently constructing the formulas.
storm : : parser : : FormulaParser parser ;
ASSERT_EQ ( storm : : models : : ModelType : : Mdp , abstractModel - > getType ( ) ) ;
std : : shared_ptr < storm : : models : : sparse : : Mdp < double > > mdp = abstractModel - > as < storm : : models : : sparse : : Mdp < double > > ( ) ;
@ -147,51 +142,44 @@ TEST(SparseMdpPrctlModelCheckerTest, AsynchronousLeader) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
auto eventuallyFormula = std : : make_shared < storm : : logic : : EventuallyFormula > ( labelFormula ) ;
auto minProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , eventuallyFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " Pmin=? [F \" elected \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = checker . check ( * minProbabilityOperatorF ormula) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 1 , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
auto maxProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , eventuallyFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F \" elected \" ] " ) ;
result = checker . check ( * maxProbabilityOperatorF ormula) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 1 , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
auto trueFormula = std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) ;
auto boundedUntilFormula = std : : make_shared < storm : : logic : : BoundedUntilFormula > ( trueFormula , labelFormula , 25 ) ;
minProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , boundedUntilFormula ) ;
formula = parser . parseFromString ( " Pmin=? [F<=25 \" elected \" ] " ) ;
result = checker . check ( * minProbabilityOperatorF ormula) ;
result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult3 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0625 , quantitativeResult3 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
maxProbabilityOperatorFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , boundedUntilFormula ) ;
formula = parser . parseFromString ( " Pmax=? [F<=25 \" elected \" ] " ) ;
result = checker . check ( * maxProbabilityOperatorF ormula) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult4 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0625 , quantitativeResult4 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " elected " ) ;
auto reachabilityRewardFormula = std : : make_shared < storm : : logic : : ReachabilityRewardFormula > ( labelFormula ) ;
auto minRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmin=? [F \" elected \" ] " ) ;
result = checker . check ( * minRewardOperatorF ormula) ;
result = checker . check ( * formula ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult5 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 4.285689611 , quantitativeResult5 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
auto maxRewardOperatorFormula = std : : make_shared < storm : : logic : : RewardOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , reachabilityRewardFormula ) ;
formula = parser . parseFromString ( " Rmax=? [F \" elected \" ] " ) ;
result = checker . check ( * maxRewardOperatorF ormula) ;
result = checker . check ( * f ormula) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult6 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 4.285689611 , quantitativeResult6 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -200,7 +188,10 @@ TEST(SparseMdpPrctlModelCheckerTest, AsynchronousLeader) {
TEST ( SparseMdpPrctlModelCheckerTest , LRA_SingleMec ) {
storm : : storage : : SparseMatrixBuilder < double > matrixBuilder ;
std : : shared_ptr < storm : : models : : sparse : : Mdp < double > > mdp ;
// A parser that we use for conveniently constructing the formulas.
storm : : parser : : FormulaParser parser ;
{
matrixBuilder = storm : : storage : : SparseMatrixBuilder < double > ( 2 , 2 , 2 ) ;
matrixBuilder . addNextValue ( 0 , 1 , 1. ) ;
@ -215,18 +206,17 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA_SingleMec) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " LRAmax=? [ \" a \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraF ormula) ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( .5 , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( .5 , quantitativeResult1 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" a \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( .5 , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -248,18 +238,17 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA_SingleMec) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " LRAmax=? [ \" a \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraF ormula) ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( .5 , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( .5 , quantitativeResult1 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" a \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( .5 , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -290,57 +279,54 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA_SingleMec) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " LRAmax=? [ \" a \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraF ormula) ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult1 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult1 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" a \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult2 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult2 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " b " ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmax=? [ \" b \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult3 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.5 , quantitativeResult3 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.5 , quantitativeResult3 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.5 , quantitativeResult3 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" b \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult4 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult4 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult4 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult4 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " c " ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmax=? [ \" c \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult5 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 2. / 3. , quantitativeResult5 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 2. / 3. , quantitativeResult5 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 2. / 3. , quantitativeResult5 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" c \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult6 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.5 , quantitativeResult6 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -353,6 +339,9 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA) {
storm : : storage : : SparseMatrixBuilder < double > matrixBuilder ;
std : : shared_ptr < storm : : models : : sparse : : Mdp < double > > mdp ;
// A parser that we use for conveniently constructing the formulas.
storm : : parser : : FormulaParser parser ;
{
matrixBuilder = storm : : storage : : SparseMatrixBuilder < double > ( 4 , 3 , 4 , true , true , 3 ) ;
matrixBuilder . newRowGroup ( 0 ) ;
@ -376,57 +365,54 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraFormula ) ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " LRAmax=? [ \" a \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * formula ) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult1 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult1 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" a \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult2 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult2 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " b " ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmax=? [ \" b \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult3 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 1.0 , quantitativeResult3 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1.0 , quantitativeResult3 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult3 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" b \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult4 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult4 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult4 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult4 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " c " ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmax=? [ \" c \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult5 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 1.0 , quantitativeResult5 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1.0 , quantitativeResult5 [ 1 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1.0 , quantitativeResult5 [ 2 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" c \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult6 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult6 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -501,10 +487,9 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA) {
storm : : modelchecker : : SparseMdpPrctlModelChecker < storm : : models : : sparse : : Mdp < double > > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : MinMaxLinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeMinMaxLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Maximize , labelFormula ) ;
std : : shared_ptr < storm : : logic : : Formula > formula = parser . parseFromString ( " LRAmax=? [ \" a \" ] " ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraF ormula) ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 37. / 60. , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
@ -515,9 +500,9 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA) {
EXPECT_NEAR ( 101. / 200. , quantitativeResult1 [ 13 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 31. / 60. , quantitativeResult1 [ 14 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize , labelFormula ) ;
formula = parser . parseFromString ( " LRAmin=? [ \" a \" ] " ) ;
result = std : : move ( checker . check ( * lraF ormula) ) ;
result = std : : move ( checker . check ( * f ormula) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult2 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.3 / 3. , quantitativeResult2 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;