@ -153,9 +153,35 @@ int main(const int argc, const char** argv) {
std : : shared_ptr < storm : : models : : Dtmc < storm : : RationalFunction > > dtmc = model - > as < storm : : models : : Dtmc < storm : : RationalFunction > > ( ) ;
std : : shared_ptr < storm : : models : : Dtmc < storm : : RationalFunction > > dtmc = model - > as < storm : : models : : Dtmc < storm : : RationalFunction > > ( ) ;
STORM_LOG_THROW ( storm : : settings : : generalSettings ( ) . isPctlPropertySet ( ) , storm : : exceptions : : InvalidSettingsException , " Unable to perform model checking without a property. " ) ;
std : : shared_ptr < storm : : properties : : prctl : : PrctlFilter < double > > filterFormula = storm : : parser : : PrctlParser : : parsePrctlFormula ( storm : : settings : : generalSettings ( ) . getPctlProperty ( ) ) ;
// Perform bisimulation minimization if requested.
// Perform bisimulation minimization if requested.
if ( storm : : settings : : generalSettings ( ) . isBisimulationSet ( ) ) {
if ( storm : : settings : : generalSettings ( ) . isBisimulationSet ( ) ) {
storm : : storage : : DeterministicModelStrongBisimulationDecomposition < storm : : RationalFunction > bisimulationDecomposition ( * dtmc , true ) ;
// The first thing we need to do is to make sure the formula is of the correct form and - if so - extract
// the bitvector representation of the atomic propositions.
std : : shared_ptr < storm : : properties : : prctl : : Until < double > > untilFormula = std : : dynamic_pointer_cast < storm : : properties : : prctl : : Until < double > > ( filterFormula - > getChild ( ) ) ;
std : : shared_ptr < storm : : properties : : prctl : : AbstractStateFormula < double > > phiStateFormula ;
std : : shared_ptr < storm : : properties : : prctl : : AbstractStateFormula < double > > psiStateFormula ;
if ( untilFormula . get ( ) ! = nullptr ) {
phiStateFormula = untilFormula - > getLeft ( ) ;
psiStateFormula = untilFormula - > getRight ( ) ;
} else {
std : : shared_ptr < storm : : properties : : prctl : : Eventually < double > > eventuallyFormula = std : : dynamic_pointer_cast < storm : : properties : : prctl : : Eventually < double > > ( filterFormula - > getChild ( ) ) ;
STORM_LOG_THROW ( eventuallyFormula . get ( ) ! = nullptr , storm : : exceptions : : InvalidPropertyException , " Illegal formula " < < * untilFormula < < " for parametric model checking. Note that only unbounded reachability properties are admitted. " ) ;
phiStateFormula = std : : shared_ptr < storm : : properties : : prctl : : Ap < double > > ( new storm : : properties : : prctl : : Ap < double > ( " true " ) ) ;
psiStateFormula = eventuallyFormula - > getChild ( ) ;
}
// Now we need to make sure the formulas defining the phi and psi states are just labels.
std : : shared_ptr < storm : : properties : : prctl : : Ap < double > > phiStateFormulaApFormula = std : : dynamic_pointer_cast < storm : : properties : : prctl : : Ap < double > > ( phiStateFormula ) ;
std : : shared_ptr < storm : : properties : : prctl : : Ap < double > > psiStateFormulaApFormula = std : : dynamic_pointer_cast < storm : : properties : : prctl : : Ap < double > > ( psiStateFormula ) ;
STORM_LOG_THROW ( phiStateFormulaApFormula . get ( ) ! = nullptr , storm : : exceptions : : InvalidPropertyException , " Illegal formula " < < * phiStateFormula < < " for parametric model checking. Note that only atomic propositions are admitted in that position. " ) ;
STORM_LOG_THROW ( psiStateFormulaApFormula . get ( ) ! = nullptr , storm : : exceptions : : InvalidPropertyException , " Illegal formula " < < * psiStateFormula < < " for parametric model checking. Note that only atomic propositions are admitted in that position. " ) ;
storm : : storage : : DeterministicModelStrongBisimulationDecomposition < storm : : RationalFunction > bisimulationDecomposition ( * dtmc , phiStateFormulaApFormula - > getAp ( ) , psiStateFormulaApFormula - > getAp ( ) , false , true ) ;
dtmc = bisimulationDecomposition . getQuotient ( ) - > as < storm : : models : : Dtmc < storm : : RationalFunction > > ( ) ;
dtmc = bisimulationDecomposition . getQuotient ( ) - > as < storm : : models : : Dtmc < storm : : RationalFunction > > ( ) ;
dtmc - > printModelInformationToStream ( std : : cout ) ;
dtmc - > printModelInformationToStream ( std : : cout ) ;
@ -165,9 +191,6 @@ int main(const int argc, const char** argv) {
storm : : modelchecker : : reachability : : CollectConstraints < storm : : RationalFunction > constraintCollector ;
storm : : modelchecker : : reachability : : CollectConstraints < storm : : RationalFunction > constraintCollector ;
constraintCollector ( * dtmc ) ;
constraintCollector ( * dtmc ) ;
STORM_LOG_THROW ( storm : : settings : : generalSettings ( ) . isPctlPropertySet ( ) , storm : : exceptions : : InvalidSettingsException , " Unable to perform model checking without a property. " ) ;
std : : shared_ptr < storm : : properties : : prctl : : PrctlFilter < double > > filterFormula = storm : : parser : : PrctlParser : : parsePrctlFormula ( storm : : settings : : generalSettings ( ) . getPctlProperty ( ) ) ;
storm : : modelchecker : : reachability : : SparseSccModelChecker < storm : : RationalFunction > modelchecker ;
storm : : modelchecker : : reachability : : SparseSccModelChecker < storm : : RationalFunction > modelchecker ;
storm : : RationalFunction valueFunction = modelchecker . computeReachabilityProbability ( * dtmc , filterFormula ) ;
storm : : RationalFunction valueFunction = modelchecker . computeReachabilityProbability ( * dtmc , filterFormula ) ;