@ -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 ;
/ / }
/ / }
/ / }
/ / }
}
}
}