@ -837,6 +837,9 @@ namespace storm {
}
}
void printModelCheckingProperty ( storm : : jani : : Property const & property ) {
void printModelCheckingProperty ( storm : : jani : : Property const & property ) {
if ( property . isShieldingProperty ( ) ) {
STORM_PRINT ( std : : endl < < " Creating " < < * ( property . getShieldingExpression ( ) ) < < " for ... " ) ;
}
STORM_PRINT ( std : : endl < < " Model checking property \" " < < property . getName ( ) < < " \" : " < < * property . getRawFormula ( ) < < " ... " < < std : : endl ) ;
STORM_PRINT ( std : : endl < < " Model checking property \" " < < property . getName ( ) < < " \" : " < < * property . getRawFormula ( ) < < " ... " < < std : : endl ) ;
}
}
@ -862,7 +865,7 @@ namespace storm {
} ;
} ;
template < typename ValueType >
template < typename ValueType >
void verifyProperties ( SymbolicInput const & input , std : : function < std : : unique_ptr < storm : : modelchecker : : CheckResult > ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) > const & verificationCallback , std : : function < void ( std : : unique_ptr < storm : : modelchecker : : CheckResult > const & ) > const & postprocessingCallback = PostprocessingIdentity ( ) ) {
void verifyProperties ( SymbolicInput const & input , std : : function < std : : unique_ptr < storm : : modelchecker : : CheckResult > ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldExpression ) > const & verificationCallback , std : : function < void ( std : : unique_ptr < storm : : modelchecker : : CheckResult > const & ) > const & postprocessingCallback = PostprocessingIdentity ( ) ) {
auto transformationSettings = storm : : settings : : getModule < storm : : settings : : modules : : TransformationSettings > ( ) ;
auto transformationSettings = storm : : settings : : getModule < storm : : settings : : modules : : TransformationSettings > ( ) ;
auto const & properties = input . preprocessedProperties ? input . preprocessedProperties . get ( ) : input . properties ;
auto const & properties = input . preprocessedProperties ? input . preprocessedProperties . get ( ) : input . properties ;
for ( auto const & property : properties ) {
for ( auto const & property : properties ) {
@ -880,13 +883,15 @@ namespace storm {
auto propertyFormula = storm : : api : : checkAndTransformContinuousToDiscreteTimeFormula < ValueType > ( * property . getRawFormula ( ) ) ;
auto propertyFormula = storm : : api : : checkAndTransformContinuousToDiscreteTimeFormula < ValueType > ( * property . getRawFormula ( ) ) ;
auto filterFormula = storm : : api : : checkAndTransformContinuousToDiscreteTimeFormula < ValueType > ( * property . getFilter ( ) . getStatesFormula ( ) ) ;
auto filterFormula = storm : : api : : checkAndTransformContinuousToDiscreteTimeFormula < ValueType > ( * property . getFilter ( ) . getStatesFormula ( ) ) ;
if ( propertyFormula & & filterFormula ) {
if ( propertyFormula & & filterFormula ) {
result = verificationCallback ( propertyFormula , filterFormula ) ;
STORM_LOG_WARN_COND ( ! property . isShieldingProperty ( ) , " The creation of shields for continuous time models is currently not supported. " ) ;
result = verificationCallback ( propertyFormula , filterFormula , nullptr ) ;
} else {
} else {
ignored = true ;
ignored = true ;
}
}
} else {
} else {
result = verificationCallback ( property . getRawFormula ( ) ,
result = verificationCallback ( property . getRawFormula ( ) ,
property . getFilter ( ) . getStatesFormula ( ) ) ;
property . getFilter ( ) . getStatesFormula ( ) ,
property . getShieldingExpression ( ) ) ;
}
}
} catch ( storm : : exceptions : : BaseException const & ex ) {
} catch ( storm : : exceptions : : BaseException const & ex ) {
STORM_LOG_WARN ( " Cannot handle property: " < < ex . what ( ) ) ;
STORM_LOG_WARN ( " Cannot handle property: " < < ex . what ( ) ) ;
@ -975,7 +980,7 @@ namespace storm {
storm : : settings : : modules : : AbstractionSettings const & abstractionSettings = storm : : settings : : getModule < storm : : settings : : modules : : AbstractionSettings > ( ) ;
storm : : settings : : modules : : AbstractionSettings const & abstractionSettings = storm : : settings : : getModule < storm : : settings : : modules : : AbstractionSettings > ( ) ;
storm : : api : : AbstractionRefinementOptions options ( parseConstraints ( input . model - > getManager ( ) , abstractionSettings . getConstraintString ( ) ) , parseInjectedRefinementPredicates ( input . model - > getManager ( ) , abstractionSettings . getInjectedRefinementPredicates ( ) ) ) ;
storm : : api : : AbstractionRefinementOptions options ( parseConstraints ( input . model - > getManager ( ) , abstractionSettings . getConstraintString ( ) ) , parseInjectedRefinementPredicates ( input . model - > getManager ( ) , abstractionSettings . getInjectedRefinementPredicates ( ) ) ) ;
verifyProperties < ValueType > ( input , [ & input , & options , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
verifyProperties < ValueType > ( input , [ & input , & options , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldExpression ) {
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Abstraction-refinement can only filter initial states. " ) ;
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Abstraction-refinement can only filter initial states. " ) ;
return storm : : api : : verifyWithAbstractionRefinementEngine < DdType , ValueType > ( mpi . env , input . model . get ( ) , storm : : api : : createTask < ValueType > ( formula , true ) , options ) ;
return storm : : api : : verifyWithAbstractionRefinementEngine < DdType , ValueType > ( mpi . env , input . model . get ( ) , storm : : api : : createTask < ValueType > ( formula , true ) , options ) ;
} ) ;
} ) ;
@ -985,7 +990,7 @@ namespace storm {
void verifyWithExplorationEngine ( SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
void verifyWithExplorationEngine ( SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
STORM_LOG_ASSERT ( input . model , " Expected symbolic model description. " ) ;
STORM_LOG_ASSERT ( input . model , " Expected symbolic model description. " ) ;
STORM_LOG_THROW ( ( std : : is_same < ValueType , double > : : value ) , storm : : exceptions : : NotSupportedException , " Exploration does not support other data-types than floating points. " ) ;
STORM_LOG_THROW ( ( std : : is_same < ValueType , double > : : value ) , storm : : exceptions : : NotSupportedException , " Exploration does not support other data-types than floating points. " ) ;
verifyProperties < ValueType > ( input , [ & input , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
verifyProperties < ValueType > ( input , [ & input , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldExpression ) {
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Exploration can only filter initial states. " ) ;
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Exploration can only filter initial states. " ) ;
return storm : : api : : verifyWithExplorationEngine < ValueType > ( mpi . env , input . model . get ( ) , storm : : api : : createTask < ValueType > ( formula , true ) ) ;
return storm : : api : : verifyWithExplorationEngine < ValueType > ( mpi . env , input . model . get ( ) , storm : : api : : createTask < ValueType > ( formula , true ) ) ;
} ) ;
} ) ;
@ -995,9 +1000,14 @@ namespace storm {
void verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
void verifyWithSparseEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
auto sparseModel = model - > as < storm : : models : : sparse : : Model < ValueType > > ( ) ;
auto sparseModel = model - > as < storm : : models : : sparse : : Model < ValueType > > ( ) ;
auto const & ioSettings = storm : : settings : : getModule < storm : : settings : : modules : : IOSettings > ( ) ;
auto const & ioSettings = storm : : settings : : getModule < storm : : settings : : modules : : IOSettings > ( ) ;
auto verificationCallback = [ & sparseModel , & ioSettings , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
auto verificationCallback = [ & sparseModel , & ioSettings , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldingExpression ) {
bool filterForInitialStates = states - > isInitialFormula ( ) ;
bool filterForInitialStates = states - > isInitialFormula ( ) ;
std : : cout < < " verificationCallback shieldingExpression: " < < * shieldingExpression < < " " ;
auto task = storm : : api : : createTask < ValueType > ( formula , filterForInitialStates ) ;
auto task = storm : : api : : createTask < ValueType > ( formula , filterForInitialStates ) ;
if ( shieldingExpression ) {
task . setShieldingExpression ( shieldingExpression ) ;
}
std : : cout < < " isShieldingTask ? " < < task . isShieldingTask ( ) < < std : : endl ;
if ( ioSettings . isExportSchedulerSet ( ) ) {
if ( ioSettings . isExportSchedulerSet ( ) ) {
task . setProduceSchedulers ( true ) ;
task . setProduceSchedulers ( true ) ;
}
}
@ -1060,7 +1070,7 @@ namespace storm {
template < storm : : dd : : DdType DdType , typename ValueType >
template < storm : : dd : : DdType DdType , typename ValueType >
void verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
void verifyWithHybridEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
verifyProperties < ValueType > ( input , [ & model , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
verifyProperties < ValueType > ( input , [ & model , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldExpression ) {
bool filterForInitialStates = states - > isInitialFormula ( ) ;
bool filterForInitialStates = states - > isInitialFormula ( ) ;
auto task = storm : : api : : createTask < ValueType > ( formula , filterForInitialStates ) ;
auto task = storm : : api : : createTask < ValueType > ( formula , filterForInitialStates ) ;
@ -1082,7 +1092,7 @@ namespace storm {
template < storm : : dd : : DdType DdType , typename ValueType >
template < storm : : dd : : DdType DdType , typename ValueType >
void verifyWithDdEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
void verifyWithDdEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
verifyProperties < ValueType > ( input , [ & model , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
verifyProperties < ValueType > ( input , [ & model , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldExpression ) {
bool filterForInitialStates = states - > isInitialFormula ( ) ;
bool filterForInitialStates = states - > isInitialFormula ( ) ;
auto task = storm : : api : : createTask < ValueType > ( formula , filterForInitialStates ) ;
auto task = storm : : api : : createTask < ValueType > ( formula , filterForInitialStates ) ;
@ -1104,7 +1114,7 @@ namespace storm {
template < storm : : dd : : DdType DdType , typename ValueType >
template < storm : : dd : : DdType DdType , typename ValueType >
void verifyWithAbstractionRefinementEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
void verifyWithAbstractionRefinementEngine ( std : : shared_ptr < storm : : models : : ModelBase > const & model , SymbolicInput const & input , ModelProcessingInformation const & mpi ) {
verifyProperties < ValueType > ( input , [ & model , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
verifyProperties < ValueType > ( input , [ & model , & mpi ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states , std : : shared_ptr < storm : : logic : : ShieldExpression const > const & shieldExpression ) {
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Abstraction-refinement can only filter initial states. " ) ;
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Abstraction-refinement can only filter initial states. " ) ;
auto symbolicModel = model - > as < storm : : models : : symbolic : : Model < DdType , ValueType > > ( ) ;
auto symbolicModel = model - > as < storm : : models : : symbolic : : Model < DdType , ValueType > > ( ) ;
return storm : : api : : verifyWithAbstractionRefinementEngine < DdType , ValueType > ( mpi . env , symbolicModel , storm : : api : : createTask < ValueType > ( formula , true ) ) ;
return storm : : api : : verifyWithAbstractionRefinementEngine < DdType , ValueType > ( mpi . env , symbolicModel , storm : : api : : createTask < ValueType > ( formula , true ) ) ;