@ -553,12 +553,72 @@ namespace storm {
}
}
std : : vector < storm : : expressions : : Expression > parseConstraints ( storm : : expressions : : ExpressionManager const & expressionManager , std : : string const & constraintsString ) {
std : : vector < storm : : expressions : : Expression > constraints ;
std : : vector < std : : string > constraintsAsStrings ;
boost : : split ( constraintsAsStrings , constraintsString , boost : : is_any_of ( " , " ) ) ;
storm : : parser : : ExpressionParser expressionParser ( expressionManager ) ;
std : : unordered_map < std : : string , storm : : expressions : : Expression > variableMapping ;
for ( auto const & variableTypePair : expressionManager ) {
variableMapping [ variableTypePair . first . getName ( ) ] = variableTypePair . first ;
}
expressionParser . setIdentifierMapping ( variableMapping ) ;
for ( auto const & constraintString : constraintsAsStrings ) {
storm : : expressions : : Expression constraint = expressionParser . parseFromString ( constraintString ) ;
STORM_LOG_TRACE ( " Adding special (user-provided) constraint " < < constraint < < " . " ) ;
constraints . emplace_back ( constraint ) ;
}
return constraints ;
}
std : : vector < std : : vector < storm : : expressions : : Expression > > parseInjectedRefinementPredicates ( storm : : expressions : : ExpressionManager const & expressionManager , std : : string const & refinementPredicatesString ) {
std : : vector < std : : vector < storm : : expressions : : Expression > > injectedRefinementPredicates ;
storm : : parser : : ExpressionParser expressionParser ( expressionManager ) ;
std : : unordered_map < std : : string , storm : : expressions : : Expression > variableMapping ;
for ( auto const & variableTypePair : expressionManager ) {
variableMapping [ variableTypePair . first . getName ( ) ] = variableTypePair . first ;
}
expressionParser . setIdentifierMapping ( variableMapping ) ;
std : : vector < std : : string > predicateGroupsAsStrings ;
boost : : split ( predicateGroupsAsStrings , refinementPredicatesString , boost : : is_any_of ( " ; " ) ) ;
for ( auto const & predicateGroupString : predicateGroupsAsStrings ) {
std : : vector < std : : string > predicatesAsStrings ;
boost : : split ( predicatesAsStrings , predicateGroupString , boost : : is_any_of ( " : " ) ) ;
injectedRefinementPredicates . emplace_back ( ) ;
for ( auto const & predicateString : predicatesAsStrings ) {
storm : : expressions : : Expression predicate = expressionParser . parseFromString ( predicateString ) ;
STORM_LOG_TRACE ( " Adding special (user-provided) refinement predicate " < < predicateString < < " . " ) ;
injectedRefinementPredicates . back ( ) . emplace_back ( predicate ) ;
}
STORM_LOG_THROW ( ! injectedRefinementPredicates . back ( ) . empty ( ) , storm : : exceptions : : InvalidArgumentException , " Expecting non-empty list of predicates to inject for each (mentioned) refinement step. " ) ;
/ / Finally reverse the list , because we take the predicates from the back .
std : : reverse ( injectedRefinementPredicates . back ( ) . begin ( ) , injectedRefinementPredicates . back ( ) . end ( ) ) ;
}
/ / Finally reverse the list , because we take the predicates from the back .
std : : reverse ( injectedRefinementPredicates . begin ( ) , injectedRefinementPredicates . end ( ) ) ;
return injectedRefinementPredicates ;
}
template < storm : : dd : : DdType DdType , typename ValueType >
void verifyWithAbstractionRefinementEngine ( SymbolicInput const & input ) {
STORM_LOG_ASSERT ( input . model , " Expected symbolic model description. " ) ;
verifyProperties < ValueType > ( input , [ & input ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
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 ( ) ) ) ;
verifyProperties < ValueType > ( input , [ & input , & options ] ( std : : shared_ptr < storm : : logic : : Formula const > const & formula , std : : shared_ptr < storm : : logic : : Formula const > const & states ) {
STORM_LOG_THROW ( states - > isInitialFormula ( ) , storm : : exceptions : : NotSupportedException , " Abstraction-refinement can only filter initial states. " ) ;
return storm : : api : : verifyWithAbstractionRefinementEngine < DdType , ValueType > ( input . model . get ( ) , storm : : api : : createTask < ValueType > ( formula , true ) ) ;
return storm : : api : : verifyWithAbstractionRefinementEngine < DdType , ValueType > ( input . model . get ( ) , storm : : api : : createTask < ValueType > ( formula , true ) , options ) ;
} ) ;
}