@ -127,3 +127,148 @@ TEST(SparseDtmcPrctlModelCheckerTest, SynchronousLeader) {
EXPECT_NEAR ( 1.0448979589010925 , quantitativeResult3 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
}
TEST ( SparseDtmcPrctlModelCheckerTest , LRA_SingleBscc ) {
storm : : storage : : SparseMatrixBuilder < double > matrixBuilder ;
std : : shared_ptr < storm : : models : : sparse : : Dtmc < double > > dtmc ;
{
matrixBuilder = storm : : storage : : SparseMatrixBuilder < double > ( 2 , 2 , 2 ) ;
matrixBuilder . addNextValue ( 0 , 1 , 1. ) ;
matrixBuilder . addNextValue ( 1 , 0 , 1. ) ;
storm : : storage : : SparseMatrix < double > transitionMatrix = matrixBuilder . build ( ) ;
storm : : models : : sparse : : StateLabeling ap ( 2 ) ;
ap . addLabel ( " a " ) ;
ap . addLabelToState ( " a " , 1 ) ;
dtmc . reset ( new storm : : models : : sparse : : Dtmc < double > ( transitionMatrix , ap , boost : : none , boost : : none , boost : : none ) ) ;
storm : : modelchecker : : SparseDtmcPrctlModelChecker < double > checker ( * dtmc , std : : unique_ptr < storm : : utility : : solver : : LinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( labelFormula ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraFormula ) ) ;
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 ( ) ) ;
}
{
matrixBuilder = storm : : storage : : SparseMatrixBuilder < double > ( 2 , 2 , 4 ) ;
matrixBuilder . addNextValue ( 0 , 0 , .5 ) ;
matrixBuilder . addNextValue ( 0 , 1 , .5 ) ;
matrixBuilder . addNextValue ( 1 , 0 , .5 ) ;
matrixBuilder . addNextValue ( 1 , 1 , .5 ) ;
storm : : storage : : SparseMatrix < double > transitionMatrix = matrixBuilder . build ( ) ;
storm : : models : : sparse : : StateLabeling ap ( 2 ) ;
ap . addLabel ( " a " ) ;
ap . addLabelToState ( " a " , 1 ) ;
dtmc . reset ( new storm : : models : : sparse : : Dtmc < double > ( transitionMatrix , ap , boost : : none , boost : : none , boost : : none ) ) ;
storm : : modelchecker : : SparseDtmcPrctlModelChecker < double > checker ( * dtmc , std : : unique_ptr < storm : : utility : : solver : : LinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( labelFormula ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraFormula ) ) ;
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 ( ) ) ;
}
{
matrixBuilder = storm : : storage : : SparseMatrixBuilder < double > ( 3 , 3 , 3 ) ;
matrixBuilder . addNextValue ( 0 , 1 , 1 ) ;
matrixBuilder . addNextValue ( 1 , 2 , 1 ) ;
matrixBuilder . addNextValue ( 2 , 0 , 1 ) ;
storm : : storage : : SparseMatrix < double > transitionMatrix = matrixBuilder . build ( ) ;
storm : : models : : sparse : : StateLabeling ap ( 3 ) ;
ap . addLabel ( " a " ) ;
ap . addLabelToState ( " a " , 2 ) ;
dtmc . reset ( new storm : : models : : sparse : : Dtmc < double > ( transitionMatrix , ap , boost : : none , boost : : none , boost : : none ) ) ;
storm : : modelchecker : : SparseDtmcPrctlModelChecker < double > checker ( * dtmc , std : : unique_ptr < storm : : utility : : solver : : LinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( labelFormula ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraFormula ) ) ;
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 ( ) ) ;
}
}
TEST ( SparseDtmcPrctlModelCheckerTest , LRA ) {
storm : : storage : : SparseMatrixBuilder < double > matrixBuilder ;
std : : shared_ptr < storm : : models : : sparse : : Dtmc < double > > mdp ;
{
matrixBuilder = storm : : storage : : SparseMatrixBuilder < double > ( 15 , 15 , 20 , true ) ;
matrixBuilder . addNextValue ( 0 , 1 , 1 ) ;
matrixBuilder . addNextValue ( 1 , 4 , 0.7 ) ;
matrixBuilder . addNextValue ( 1 , 6 , 0.3 ) ;
matrixBuilder . addNextValue ( 2 , 0 , 1 ) ;
matrixBuilder . addNextValue ( 3 , 5 , 0.8 ) ;
matrixBuilder . addNextValue ( 3 , 9 , 0.2 ) ;
matrixBuilder . addNextValue ( 4 , 3 , 1 ) ;
matrixBuilder . addNextValue ( 5 , 3 , 1 ) ;
matrixBuilder . addNextValue ( 6 , 7 , 1 ) ;
matrixBuilder . addNextValue ( 7 , 8 , 1 ) ;
matrixBuilder . addNextValue ( 8 , 6 , 1 ) ;
matrixBuilder . addNextValue ( 9 , 10 , 1 ) ;
matrixBuilder . addNextValue ( 10 , 9 , 1 ) ;
matrixBuilder . addNextValue ( 11 , 9 , 1 ) ;
matrixBuilder . addNextValue ( 12 , 5 , 0.4 ) ;
matrixBuilder . addNextValue ( 12 , 8 , 0.3 ) ;
matrixBuilder . addNextValue ( 12 , 11 , 0.3 ) ;
matrixBuilder . addNextValue ( 13 , 7 , 0.7 ) ;
matrixBuilder . addNextValue ( 13 , 12 , 0.3 ) ;
matrixBuilder . addNextValue ( 14 , 12 , 1 ) ;
storm : : storage : : SparseMatrix < double > transitionMatrix = matrixBuilder . build ( ) ;
storm : : models : : sparse : : StateLabeling ap ( 15 ) ;
ap . addLabel ( " a " ) ;
ap . addLabelToState ( " a " , 1 ) ;
ap . addLabelToState ( " a " , 4 ) ;
ap . addLabelToState ( " a " , 5 ) ;
ap . addLabelToState ( " a " , 7 ) ;
ap . addLabelToState ( " a " , 11 ) ;
ap . addLabelToState ( " a " , 13 ) ;
ap . addLabelToState ( " a " , 14 ) ;
mdp . reset ( new storm : : models : : sparse : : Dtmc < double > ( transitionMatrix , ap , boost : : none , boost : : none , boost : : none ) ) ;
storm : : modelchecker : : SparseDtmcPrctlModelChecker < double > checker ( * mdp , std : : unique_ptr < storm : : utility : : solver : : LinearEquationSolverFactory < double > > ( new storm : : utility : : solver : : NativeLinearEquationSolverFactory < double > ( ) ) ) ;
auto labelFormula = std : : make_shared < storm : : logic : : AtomicLabelFormula > ( " a " ) ;
auto lraFormula = std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( labelFormula ) ;
std : : unique_ptr < storm : : modelchecker : : CheckResult > result = std : : move ( checker . check ( * lraFormula ) ) ;
storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > & quantitativeResult1 = result - > asExplicitQuantitativeCheckResult < double > ( ) ;
EXPECT_NEAR ( 0.3 / 3. , quantitativeResult1 [ 0 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult1 [ 3 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 1. / 3. , quantitativeResult1 [ 6 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.0 , quantitativeResult1 [ 9 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.3 / 3. , quantitativeResult1 [ 12 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( .79 / 3. , quantitativeResult1 [ 13 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
EXPECT_NEAR ( 0.3 / 3. , quantitativeResult1 [ 14 ] , storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;
}
}