@ -14,6 +14,8 @@
# include "storm/utility/solver.h"
# include "storm/utility/shortestPaths.h"
# include "storm/parser/ExpressionParser.h"
# include "storm/solver/MathsatSmtSolver.h"
# include "storm/models/symbolic/StandardRewardModel.h"
@ -76,7 +78,7 @@ namespace storm {
addPredicatesEagerly = abstractionSettings . isUseEagerRefinementSet ( ) ;
equivalenceChecker . addConstraints ( abstractor . getAbstractionInformation ( ) . getConstraints ( ) ) ;
if ( storm : : settings : : getModule < storm : : settings : : modules : : A bstractionSettings> ( ) . isAddAllGuardsSet ( ) ) {
if ( a bstractionSettings. isAddAllGuardsSet ( ) ) {
std : : vector < storm : : expressions : : Expression > guards ;
std : : pair < uint64_t , uint64_t > player1Choices = this - > abstractor . get ( ) . getPlayer1ChoiceRange ( ) ;
@ -91,11 +93,34 @@ namespace storm {
this - > abstractor . get ( ) . notifyGuardsArePredicates ( ) ;
addedAllGuardsFlag = true ;
}
if ( abstractionSettings . isInjectRefinementPredicatesSet ( ) ) {
std : : string predicatesString = abstractionSettings . getInjectedRefinementPredicates ( ) ;
std : : vector < std : : string > predicatesAsStrings ;
boost : : split ( predicatesAsStrings , predicatesString , boost : : is_any_of ( " ; " ) ) ;
auto const & expressionManager = abstractor . getAbstractionInformation ( ) . getExpressionManager ( ) ;
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 & predicateString : predicatesAsStrings ) {
storm : : expressions : : Expression predicate = expressionParser . parseFromString ( predicateString ) ;
STORM_LOG_TRACE ( " Adding special (user-provided) refinement predicate " < < predicateString < < " . " ) ;
refinementPredicatesToInject . emplace_back ( predicate ) ;
}
// Finally reverse the list, because we take the predicates from the back.
std : : reverse ( refinementPredicatesToInject . begin ( ) , refinementPredicatesToInject . end ( ) ) ;
}
}
template < storm : : dd : : DdType Type , typename ValueType >
void MenuGameRefiner < Type , ValueType > : : refine ( std : : vector < storm : : expressions : : Expression > const & predicates ) const {
performRefinement ( createGlobalRefinement ( preprocessPredicates ( predicates , RefinementPredicates : : Source : : Manual ) ) ) ;
void MenuGameRefiner < Type , ValueType > : : refine ( std : : vector < storm : : expressions : : Expression > const & predicates , bool allowInjection ) const {
performRefinement ( createGlobalRefinement ( preprocessPredicates ( predicates , RefinementPredicates : : Source : : Manual ) ) , allowInjection ) ;
}
template < storm : : dd : : DdType Type , typename ValueType >
@ -279,10 +304,6 @@ namespace storm {
// Decode both choices to explicit mappings.
std : : map < uint64_t , std : : pair < storm : : storage : : BitVector , ValueType > > lowerChoiceUpdateToSuccessorMapping = abstractionInformation . template decodeChoiceToUpdateSuccessorMapping < ValueType > ( lowerChoice ) ;
std : : map < uint64_t , std : : pair < storm : : storage : : BitVector , ValueType > > upperChoiceUpdateToSuccessorMapping = abstractionInformation . template decodeChoiceToUpdateSuccessorMapping < ValueType > ( upperChoice ) ;
lowerChoice . template toAdd < ValueType > ( ) . exportToDot ( " lower.dot " ) ;
upperChoice . template toAdd < ValueType > ( ) . exportToDot ( " upper.dot " ) ;
STORM_LOG_ASSERT ( lowerChoiceUpdateToSuccessorMapping . size ( ) = = upperChoiceUpdateToSuccessorMapping . size ( ) , " Mismatching sizes after decode ( " < < lowerChoiceUpdateToSuccessorMapping . size ( ) < < " vs. " < < upperChoiceUpdateToSuccessorMapping . size ( ) < < " ). " ) ;
// First, sort updates according to probability mass.
@ -536,7 +557,11 @@ namespace storm {
if ( additionalPredicates . get ( ) . getSource ( ) = = RefinementPredicates : : Source : : Guard ) {
return additionalPredicates . get ( ) ;
} else {
predicates . get ( ) . addPredicates ( additionalPredicates . get ( ) . getPredicates ( ) ) ;
if ( ! predicates ) {
predicates = additionalPredicates ;
} else {
predicates . get ( ) . addPredicates ( additionalPredicates . get ( ) . getPredicates ( ) ) ;
}
}
}
@ -1569,14 +1594,20 @@ namespace storm {
}
template < storm : : dd : : DdType Type , typename ValueType >
void MenuGameRefiner < Type , ValueType > : : performRefinement ( std : : vector < RefinementCommand > const & refinementCommands ) const {
for ( auto const & command : refinementCommands ) {
STORM_LOG_INFO ( " Refining with " < < command . getPredicates ( ) . size ( ) < < " predicates. " ) ;
for ( auto const & predicate : command . getPredicates ( ) ) {
STORM_LOG_INFO ( predicate ) ;
}
if ( ! command . getPredicates ( ) . empty ( ) ) {
abstractor . get ( ) . refine ( command ) ;
void MenuGameRefiner < Type , ValueType > : : performRefinement ( std : : vector < RefinementCommand > const & refinementCommands , bool allowInjection ) const {
if ( ! refinementPredicatesToInject . empty ( ) & & allowInjection ) {
STORM_LOG_INFO ( " Refining with (injected) predicate " < < refinementPredicatesToInject . back ( ) < < " . " ) ;
abstractor . get ( ) . refine ( RefinementCommand ( { refinementPredicatesToInject . back ( ) } ) ) ;
refinementPredicatesToInject . pop_back ( ) ;
} else {
for ( auto const & command : refinementCommands ) {
STORM_LOG_INFO ( " Refining with " < < command . getPredicates ( ) . size ( ) < < " predicates. " ) ;
for ( auto const & predicate : command . getPredicates ( ) ) {
STORM_LOG_INFO ( predicate ) ;
}
if ( ! command . getPredicates ( ) . empty ( ) ) {
abstractor . get ( ) . refine ( command ) ;
}
}
}