@ -255,131 +255,5 @@ namespace storm { 
			
		
	
		
			
				
					            return  result ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        template < typename  ParametricType >  
			
		
	
		
			
				
					        std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithParameterLifting ( std : : shared_ptr < storm : : models : : sparse : : Model < ParametricType > > ,  std : : shared_ptr < storm : : logic : : Formula  const >  const & )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Parameter-lifting is unavailable for this data-type. " ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					        template < >  
			
		
	
		
			
				
					        inline  std : : unique_ptr < storm : : modelchecker : : CheckResult >  verifyWithParameterLifting ( std : : shared_ptr < storm : : models : : sparse : : Model < storm : : RationalFunction > >  markovModel ,  std : : shared_ptr < storm : : logic : : Formula  const >  const &  formula )  {  
			
		
	
		
			
				
					            STORM_LOG_THROW ( false ,  storm : : exceptions : : NotImplementedException ,  " Parameter-lifting is currently unavailable from the API. " ) ;  
			
		
	
		
			
				
					/ /                 storm : : utility : : Stopwatch  parameterLiftingStopWatch ( true ) ;  
			
		
	
		
			
				
					/ /                 std : : shared_ptr < storm : : logic : : Formula  const >  consideredFormula  =  formula ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 STORM_LOG_WARN_COND ( storm : : utility : : parameterlifting : : validateParameterLiftingSound ( markovModel ,  formula ) ,  " Could not validate whether parameter lifting is sound on the input model and the formula  "  < <  * formula ) ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 if  ( markovModel - > isOfType ( storm : : models : : ModelType : : Ctmc )  | |  markovModel - > isOfType ( storm : : models : : ModelType : : MarkovAutomaton ) )  {  
			
		
	
		
			
				
					/ /                     STORM_PRINT_AND_LOG ( " Transforming continuous model to discrete model... " ) ;  
			
		
	
		
			
				
					/ /                     storm : : transformer : : transformContinuousToDiscreteModelInPlace ( markovModel ,  consideredFormula ) ;  
			
		
	
		
			
				
					/ /                     STORM_PRINT_AND_LOG ( "  done! "  < <  std : : endl ) ;  
			
		
	
		
			
				
					/ /                     markovModel - > printModelInformationToStream ( std : : cout ) ;  
			
		
	
		
			
				
					/ /                 }  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 auto  modelParameters  =  storm : : models : : sparse : : getProbabilityParameters ( * markovModel ) ;  
			
		
	
		
			
				
					/ /                 auto  rewParameters  =  storm : : models : : sparse : : getRewardParameters ( * markovModel ) ;  
			
		
	
		
			
				
					/ /                 modelParameters . insert ( rewParameters . begin ( ) ,  rewParameters . end ( ) ) ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 STORM_LOG_THROW ( storm : : settings : : getModule < storm : : settings : : modules : : ParametricSettings > ( ) . isParameterSpaceSet ( ) ,  storm : : exceptions : : InvalidSettingsException ,  " Invoked Parameter lifting but no parameter space was defined. " ) ;  
			
		
	
		
			
				
					/ /                 auto  parameterSpaceAsString  =  storm : : settings : : getModule < storm : : settings : : modules : : ParametricSettings > ( ) . getParameterSpace ( ) ;  
			
		
	
		
			
				
					/ /                 auto  parameterSpace  =  storm : : storage : : ParameterRegion < storm : : RationalFunction > : : parseRegion ( parameterSpaceAsString ,  modelParameters ) ;  
			
		
	
		
			
				
					/ /                 auto  refinementThreshold  =  storm : : utility : : convertNumber < typename  storm : : storage : : ParameterRegion < storm : : RationalFunction > : : CoefficientType > ( storm : : settings : : getModule < storm : : settings : : modules : : ParametricSettings > ( ) . getRefinementThreshold ( ) ) ;  
			
		
	
		
			
				
					/ /                 std : : vector < std : : pair < storm : : storage : : ParameterRegion < storm : : RationalFunction > ,  storm : : modelchecker : : parametric : : RegionCheckResult > >  result ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 STORM_PRINT_AND_LOG ( " Performing parameter lifting for property  "  < <  * consideredFormula  < <  "  with parameter space  "  < <  parameterSpace . toString ( true )  < <  "  and refinement threshold  "  < <  storm : : utility : : convertNumber < double > ( refinementThreshold )  < <  "  ... "  < <  std : : endl ) ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 storm : : modelchecker : : CheckTask < storm : : logic : : Formula ,  storm : : RationalFunction >  task ( * consideredFormula ,  true ) ;  
			
		
	
		
			
				
					/ /                 std : : string  resultVisualization ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 if  ( markovModel - > isOfType ( storm : : models : : ModelType : : Dtmc ) )  {  
			
		
	
		
			
				
					/ /                     if  ( storm : : settings : : getModule < storm : : settings : : modules : : GeneralSettings > ( ) . isExactSet ( ) )  {  
			
		
	
		
			
				
					/ /                         storm : : modelchecker : : parametric : : SparseDtmcRegionChecker  < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > ,  storm : : RationalNumber >  regionChecker ( * markovModel - > template  as < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > > ( ) ) ;  
			
		
	
		
			
				
					/ /                         regionChecker . specifyFormula ( task ) ;  
			
		
	
		
			
				
					/ /                         result  =  regionChecker . performRegionRefinement ( parameterSpace ,  refinementThreshold ) ;  
			
		
	
		
			
				
					/ /                         parameterLiftingStopWatch . stop ( ) ;  
			
		
	
		
			
				
					/ /                         if  ( modelParameters . size ( )  = =  2 )  {  
			
		
	
		
			
				
					/ /                             resultVisualization  =  regionChecker . visualizeResult ( result ,  parameterSpace ,  * modelParameters . begin ( ) ,  * ( modelParameters . rbegin ( ) ) ) ;  
			
		
	
		
			
				
					/ /                         }  
			
		
	
		
			
				
					/ /                     }  else  {  
			
		
	
		
			
				
					/ /                         storm : : modelchecker : : parametric : : SparseDtmcRegionChecker  < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > ,  double ,  storm : : RationalNumber >  regionChecker ( * markovModel - > template  as < storm : : models : : sparse : : Dtmc < storm : : RationalFunction > > ( ) ) ;  
			
		
	
		
			
				
					/ /                         regionChecker . specifyFormula ( task ) ;  
			
		
	
		
			
				
					/ /                         result  =  regionChecker . performRegionRefinement ( parameterSpace ,  refinementThreshold ) ;  
			
		
	
		
			
				
					/ /                         parameterLiftingStopWatch . stop ( ) ;  
			
		
	
		
			
				
					/ /                         if  ( modelParameters . size ( )  = =  2 )  {  
			
		
	
		
			
				
					/ /                             resultVisualization  =  regionChecker . visualizeResult ( result ,  parameterSpace ,  * modelParameters . begin ( ) ,  * ( modelParameters . rbegin ( ) ) ) ;  
			
		
	
		
			
				
					/ /                         }  
			
		
	
		
			
				
					/ /                     }  
			
		
	
		
			
				
					/ /                 }  else  if  ( markovModel - > isOfType ( storm : : models : : ModelType : : Mdp ) )  {  
			
		
	
		
			
				
					/ /                     if  ( storm : : settings : : getModule < storm : : settings : : modules : : GeneralSettings > ( ) . isExactSet ( ) )  {  
			
		
	
		
			
				
					/ /                         storm : : modelchecker : : parametric : : SparseMdpRegionChecker < storm : : models : : sparse : : Mdp < storm : : RationalFunction > ,  storm : : RationalNumber >  regionChecker ( * markovModel - > template  as < storm : : models : : sparse : : Mdp < storm : : RationalFunction > > ( ) ) ;  
			
		
	
		
			
				
					/ /                         regionChecker . specifyFormula ( task ) ;  
			
		
	
		
			
				
					/ /                         result  =  regionChecker . performRegionRefinement ( parameterSpace ,  refinementThreshold ) ;  
			
		
	
		
			
				
					/ /                         parameterLiftingStopWatch . stop ( ) ;  
			
		
	
		
			
				
					/ /                         if  ( modelParameters . size ( )  = =  2 )  {  
			
		
	
		
			
				
					/ /                             resultVisualization  =  regionChecker . visualizeResult ( result ,  parameterSpace ,  * modelParameters . begin ( ) ,  * ( modelParameters . rbegin ( ) ) ) ;  
			
		
	
		
			
				
					/ /                         }  
			
		
	
		
			
				
					/ /                     }  else  {  
			
		
	
		
			
				
					/ /                         storm : : modelchecker : : parametric : : SparseMdpRegionChecker < storm : : models : : sparse : : Mdp < storm : : RationalFunction > ,  double ,  storm : : RationalNumber >  regionChecker ( * markovModel - > template  as < storm : : models : : sparse : : Mdp < storm : : RationalFunction > > ( ) ) ;  
			
		
	
		
			
				
					/ /                         regionChecker . specifyFormula ( task ) ;  
			
		
	
		
			
				
					/ /                         result  =  regionChecker . performRegionRefinement ( parameterSpace ,  refinementThreshold ) ;  
			
		
	
		
			
				
					/ /                         parameterLiftingStopWatch . stop ( ) ;  
			
		
	
		
			
				
					/ /                         if  ( modelParameters . size ( )  = =  2 )  {  
			
		
	
		
			
				
					/ /                             resultVisualization  =  regionChecker . visualizeResult ( result ,  parameterSpace ,  * modelParameters . begin ( ) ,  * ( modelParameters . rbegin ( ) ) ) ;  
			
		
	
		
			
				
					/ /                         }  
			
		
	
		
			
				
					/ /                     }  
			
		
	
		
			
				
					/ /                 }  else  {  
			
		
	
		
			
				
					/ /                     STORM_LOG_THROW ( false ,  storm : : exceptions : : InvalidSettingsException ,  " Unable to perform parameterLifting on the provided model type. " ) ;  
			
		
	
		
			
				
					/ /                 }  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 auto  satArea  =  storm : : utility : : zero < typename  storm : : storage : : ParameterRegion < storm : : RationalFunction > : : CoefficientType > ( ) ;  
			
		
	
		
			
				
					/ /                 auto  unsatArea  =  storm : : utility : : zero < typename  storm : : storage : : ParameterRegion < storm : : RationalFunction > : : CoefficientType > ( ) ;  
			
		
	
		
			
				
					/ /                 uint_fast64_t  numOfSatRegions  =  0 ;  
			
		
	
		
			
				
					/ /                 uint_fast64_t  numOfUnsatRegions  =  0 ;  
			
		
	
		
			
				
					/ /                 for  ( auto  const &  res  :  result )  {  
			
		
	
		
			
				
					/ /                     switch  ( res . second )  {  
			
		
	
		
			
				
					/ /                         case  storm : : modelchecker : : parametric : : RegionCheckResult : : AllSat :  
			
		
	
		
			
				
					/ /                             satArea  + =  res . first . area ( ) ;  
			
		
	
		
			
				
					/ /                             + + numOfSatRegions ;  
			
		
	
		
			
				
					/ /                             break ;  
			
		
	
		
			
				
					/ /                         case  storm : : modelchecker : : parametric : : RegionCheckResult : : AllViolated :  
			
		
	
		
			
				
					/ /                             unsatArea  + =  res . first . area ( ) ;  
			
		
	
		
			
				
					/ /                             + + numOfUnsatRegions ;  
			
		
	
		
			
				
					/ /                             break ;  
			
		
	
		
			
				
					/ /                         default :  
			
		
	
		
			
				
					/ /                             STORM_LOG_ERROR ( " Unexpected result for region  "  < <  res . first . toString ( true )  < <  "  :  "  < <  res . second  < <  " . " ) ;  
			
		
	
		
			
				
					/ /                             break ;  
			
		
	
		
			
				
					/ /                     }  
			
		
	
		
			
				
					/ /                 }  
			
		
	
		
			
				
					/ /                 typename  storm : : storage : : ParameterRegion < storm : : RationalFunction > : : CoefficientType  satAreaFraction  =  satArea  /  parameterSpace . area ( ) ;  
			
		
	
		
			
				
					/ /                 typename  storm : : storage : : ParameterRegion < storm : : RationalFunction > : : CoefficientType  unsatAreaFraction  =  unsatArea  /  parameterSpace . area ( ) ;  
			
		
	
		
			
				
					/ /                 STORM_PRINT_AND_LOG ( " Done! Found  "  < <  numOfSatRegions  < <  "  safe regions and  "  
			
		
	
		
			
				
					/ /                                     < <  numOfUnsatRegions  < <  "  unsafe regions. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					/ /                 STORM_PRINT_AND_LOG ( storm : : utility : : convertNumber < double > ( satAreaFraction )  *  100  < <  " % of the parameter space is safe, and  "  
			
		
	
		
			
				
					/ /                                     < <  storm : : utility : : convertNumber < double > ( unsatAreaFraction )  *  100  < <  " % of the parameter space is unsafe. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					/ /                 STORM_PRINT_AND_LOG ( " Model checking with parameter lifting took  "  < <  parameterLiftingStopWatch  < <  "  seconds. "  < <  std : : endl ) ;  
			
		
	
		
			
				
					/ /                 STORM_PRINT_AND_LOG ( resultVisualization ) ;  
			
		
	
		
			
				
					/ /                  
			
		
	
		
			
				
					/ /                 if  ( storm : : settings : : getModule < storm : : settings : : modules : : ParametricSettings > ( ) . exportResultToFile ( ) )  {  
			
		
	
		
			
				
					/ /                     std : : string  path  =  storm : : settings : : getModule < storm : : settings : : modules : : ParametricSettings > ( ) . exportResultPath ( ) ;  
			
		
	
		
			
				
					/ /                     STORM_PRINT_AND_LOG ( " Exporting result to path  "  < <  path  < <  " . "  < <  std : : endl ) ;  
			
		
	
		
			
				
					/ /                     std : : ofstream  filestream ;  
			
		
	
		
			
				
					/ /                     storm : : utility : : openFile ( path ,  filestream ) ;  
			
		
	
		
			
				
					/ /                      
			
		
	
		
			
				
					/ /                     for  ( auto  const &  res  :  result )  {  
			
		
	
		
			
				
					/ /                         switch  ( res . second )  {  
			
		
	
		
			
				
					/ /                             case  storm : : modelchecker : : parametric : : RegionCheckResult : : AllSat :  
			
		
	
		
			
				
					/ /                                 filestream  < <  " safe:  "  < <  res . first . toString ( true )  < <  std : : endl ;  
			
		
	
		
			
				
					/ /                                 break ;  
			
		
	
		
			
				
					/ /                             case  storm : : modelchecker : : parametric : : RegionCheckResult : : AllViolated :  
			
		
	
		
			
				
					/ /                                 filestream  < <  " unsafe:  "  < <  res . first . toString ( true )  < <  std : : endl ;  
			
		
	
		
			
				
					/ /                                 break ;  
			
		
	
		
			
				
					/ /                             default :  
			
		
	
		
			
				
					/ /                                 break ;  
			
		
	
		
			
				
					/ /                         }  
			
		
	
		
			
				
					/ /                     }  
			
		
	
		
			
				
					/ /                 }  
			
		
	
		
			
				
					/ /             }  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}