@ -195,7 +195,7 @@ TEST(SparseMdpPrctlModelCheckerTest, AsynchronousLeader) { 
			
		
	
		
			
				
						EXPECT_NEAR ( 4.285689611 ,  quantitativeResult6 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					TEST ( SparseMdpPrctlModelCheckerTest ,  LRA )  {  
			
		
	
		
			
				
					TEST ( SparseMdpPrctlModelCheckerTest ,  LRA_SingleMec  )  {  
			
		
	
		
			
				
						storm : : storage : : SparseMatrixBuilder < double >  matrixBuilder ;  
			
		
	
		
			
				
						std : : shared_ptr < storm : : models : : sparse : : Mdp < double > >  mdp ;  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -216,10 +216,314 @@ TEST(SparseMdpPrctlModelCheckerTest, LRA) { 
			
		
	
		
			
				
							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  =  checker . check ( * lraFormula ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
							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 ( ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							lraFormula  =  std : : make_shared < storm : : logic : : LongRunAverageOperatorFormula > ( storm : : logic : : OptimalityType : : Minimize ,  labelFormula ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult2  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( .5 ,  quantitativeResult2 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( .5 ,  quantitativeResult2 [ 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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							mdp . reset ( new  storm : : models : : sparse : : Mdp < double > ( transitionMatrix ,  ap ,  boost : : none ,  boost : : none ,  boost : : none ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							storm : : modelchecker : : SparseMdpPrctlModelChecker < 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 ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult2  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( .5 ,  quantitativeResult2 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( .5 ,  quantitativeResult2 [ 1 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							matrixBuilder  =  storm : : storage : : SparseMatrixBuilder < double > ( 4 ,  3 ,  4 ,  true ,  true ,  3 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 0 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 0 ,  1 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 1 ,  0 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 2 ,  2 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 3 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 3 ,  0 ,  1 ) ;  
			
		
	
		
			
				
							storm : : storage : : SparseMatrix < double >  transitionMatrix  =  matrixBuilder . build ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							storm : : models : : sparse : : StateLabeling  ap ( 3 ) ;  
			
		
	
		
			
				
							ap . addLabel ( " a " ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " a " ,  2 ) ;  
			
		
	
		
			
				
							ap . addLabel ( " b " ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " b " ,  0 ) ;  
			
		
	
		
			
				
							ap . addLabel ( " c " ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " c " ,  0 ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " c " ,  2 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							mdp . reset ( new  storm : : models : : sparse : : Mdp < double > ( transitionMatrix ,  ap ,  boost : : none ,  boost : : none ,  boost : : none ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							storm : : modelchecker : : SparseMdpPrctlModelChecker < 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 ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult6  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( 0.5 ,  quantitativeResult6 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 0.5 ,  quantitativeResult6 [ 1 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 0.5 ,  quantitativeResult6 [ 2 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					TEST ( SparseMdpPrctlModelCheckerTest ,  LRA )  {  
			
		
	
		
			
				
						storm : : storage : : SparseMatrixBuilder < double >  matrixBuilder ;  
			
		
	
		
			
				
						std : : shared_ptr < storm : : models : : sparse : : Mdp < double > >  mdp ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							matrixBuilder  =  storm : : storage : : SparseMatrixBuilder < double > ( 4 ,  3 ,  4 ,  true ,  true ,  3 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 0 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 0 ,  1 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 1 ,  1 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 2 ,  2 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 3 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 3 ,  2 ,  1 ) ;  
			
		
	
		
			
				
							storm : : storage : : SparseMatrix < double >  transitionMatrix  =  matrixBuilder . build ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							storm : : models : : sparse : : StateLabeling  ap ( 3 ) ;  
			
		
	
		
			
				
							ap . addLabel ( " a " ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " a " ,  0 ) ;  
			
		
	
		
			
				
							ap . addLabel ( " b " ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " b " ,  1 ) ;  
			
		
	
		
			
				
							ap . addLabel ( " c " ) ;  
			
		
	
		
			
				
							ap . addLabelToState ( " c " ,  2 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							mdp . reset ( new  storm : : models : : sparse : : Mdp < double > ( transitionMatrix ,  ap ,  boost : : none ,  boost : : none ,  boost : : none ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							storm : : modelchecker : : SparseMdpPrctlModelChecker < 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 ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult6  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( 0.0 ,  quantitativeResult6 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 0.0 ,  quantitativeResult6 [ 1 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 1.0 ,  quantitativeResult6 [ 2 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							matrixBuilder  =  storm : : storage : : SparseMatrixBuilder < double > ( 22 ,  15 ,  28 ,  true ,  true ,  15 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 0 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 0 ,  1 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 1 ,  0 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 2 ,  2 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 3 ,  4 ,  0.7 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 3 ,  6 ,  0.3 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 4 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 4 ,  0 ,  1 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 5 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 5 ,  4 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 6 ,  5 ,  0.8 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 6 ,  9 ,  0.2 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 7 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 7 ,  3 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 8 ,  5 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 9 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 9 ,  3 ,  1 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 10 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 10 ,  7 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 11 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 11 ,  6 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 12 ,  8 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 13 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 13 ,  6 ,  1 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 14 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 14 ,  10 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 15 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 15 ,  9 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 16 ,  11 ,  1 ) ;  
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 17 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 17 ,  9 ,  1 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 18 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 18 ,  5 ,  0.4 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 18 ,  8 ,  0.3 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 18 ,  11 ,  0.3 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 19 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 19 ,  7 ,  0.7 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 19 ,  12 ,  0.3 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							matrixBuilder . newRowGroup ( 20 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 20 ,  12 ,  0.1 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 20 ,  13 ,  0.9 ) ;  
			
		
	
		
			
				
							matrixBuilder . addNextValue ( 21 ,  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 : : Mdp < double > ( transitionMatrix ,  ap ,  boost : : none ,  boost : : none ,  boost : : none ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							storm : : modelchecker : : SparseMdpPrctlModelChecker < 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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( .5 ,  quantitativeResult [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( .5 ,  quantitativeResult [ 1 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							std : : unique_ptr < storm : : modelchecker : : CheckResult >  result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult1  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( 37. / 60. ,  quantitativeResult1 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 2. / 3. ,  quantitativeResult1 [ 3 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 0.5 ,  quantitativeResult1 [ 6 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 1. / 3. ,  quantitativeResult1 [ 9 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 31. / 60. ,  quantitativeResult1 [ 12 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							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 ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							result  =  std : : move ( checker . check ( * lraFormula ) ) ;  
			
		
	
		
			
				
							storm : : modelchecker : : ExplicitQuantitativeCheckResult < double > &  quantitativeResult2  =  result - > asExplicitQuantitativeCheckResult < double > ( ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							EXPECT_NEAR ( 1. / 3. ,  quantitativeResult2 [ 0 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 0.4 ,  quantitativeResult2 [ 3 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 1. / 3. ,  quantitativeResult2 [ 6 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 0.0 ,  quantitativeResult2 [ 9 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( .26 ,  quantitativeResult2 [ 12 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( 467. / 1500. ,  quantitativeResult2 [ 13 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
							EXPECT_NEAR ( .26 ,  quantitativeResult2 [ 14 ] ,  storm : : settings : : nativeEquationSolverSettings ( ) . getPrecision ( ) ) ;  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					}