@ -138,13 +138,20 @@ namespace storm {
LOG_THROW ( this - > lastResult = = SmtSolver : : CheckResult : : SAT , storm : : exceptions : : InvalidStateException , " Requested Model but last check result was not SAT. " ) ;
z3 : : model m = this - > m_solver . get_model ( ) ;
return this - > z3ModelToStorm ( this - > m_solver . get_model ( ) ) ;
# else
LOG_THROW ( false , storm : : exceptions : : NotImplementedException , " StoRM is compiled without Z3 support. " ) ;
# endif
}
storm : : expressions : : SimpleValuation Z3SmtSolver : : z3ModelToStorm ( z3 : : model m ) {
# ifdef STORM_HAVE_Z3
storm : : expressions : : SimpleValuation stormModel ;
for ( unsigned i = 0 ; i < m . num_consts ( ) ; + + i ) {
z3 : : func_decl var_i = m . get_const_decl ( i ) ;
storm : : expressions : : Expression var_i_interp = this - > m_adapter . translateExpression ( m . get_const_interp ( var_i ) ) ;
switch ( var_i_interp . getReturnType ( ) ) {
case storm : : expressions : : ExpressionReturnType : : Bool :
stormModel . addBooleanIdentifier ( var_i . name ( ) . str ( ) , var_i_interp . evaluateAsBool ( ) ) ;
@ -157,29 +164,76 @@ namespace storm {
break ;
default :
LOG_THROW ( false , storm : : exceptions : : ExpressionEvaluationException , " Variable interpretation in model is not of type bool, int or double. " )
break ;
break ;
}
}
return stormModel ;
# else
LOG_THROW ( false , storm : : exceptions : : NotImplementedException , " StoRM is compiled without Z3 support. " ) ;
# endif
}
std : : set < storm : : expressions : : SimpleValuation > Z3SmtSolver : : solveAndDiversify ( std : : set < storm : : expressions : : SimpleValuation > diversifyers )
std : : vector < storm : : expressions : : SimpleValuation > Z3SmtSolver : : allSat ( std : : vector < storm : : expressions : : Expression > important )
{
# ifdef STORM_HAVE_Z3
LOG_THROW ( false , storm : : exceptions : : NotImplementedException , " Model generation is not implemented in this Z3 solver interface. " ) ;
std : : vector < storm : : expressions : : SimpleValuation > valuations ;
this - > allSat ( important , [ & valuations ] ( storm : : expressions : : SimpleValuation & valuation ) - > bool { valuations . push_back ( valuation ) ; return true ; } ) ;
return valuations ;
# else
LOG_THROW ( false , storm : : exceptions : : NotImplementedException , " StoRM is compiled without Z3 support. " ) ;
# endif
}
uint_fast64_t Z3SmtSolver : : solveAndDiversify ( std : : set < storm : : expressions : : SimpleValuation > diversifyers , std : : function < bool ( storm : : expressions : : Valuation & ) > callback )
uint_fast64_t Z3SmtSolver : : allSat ( std : : vector < storm : : expressions : : Expression > important , std : : function < bool ( storm : : expressions : : Simple Valuation& ) > callback )
{
# ifdef STORM_HAVE_Z3
LOG_THROW ( false , storm : : exceptions : : NotImplementedException , " Model generation is not implemented in this Z3 solver interface. " ) ;
for ( storm : : expressions : : Expression e : important ) {
if ( ! e . isVariable ( ) ) {
throw storm : : exceptions : : InvalidArgumentException ( ) < < " The important expressions for AllSat must be atoms, i.e. variable expressions. " ;
}
}
uint_fast64_t numModels = 0 ;
bool proceed = true ;
this - > push ( ) ;
while ( proceed & & this - > check ( ) = = CheckResult : : SAT ) {
+ + numModels ;
z3 : : model m = this - > m_solver . get_model ( ) ;
z3 : : expr modelExpr = this - > m_context . bool_val ( true ) ;
storm : : expressions : : SimpleValuation valuation ;
for ( storm : : expressions : : Expression importantAtom : important ) {
z3 : : expr z3ImportantAtom = this - > m_adapter . translateExpression ( importantAtom ) ;
z3 : : expr z3ImportantAtomValuation = m . eval ( z3ImportantAtom , true ) ;
modelExpr = modelExpr & & ( z3ImportantAtom = = z3ImportantAtomValuation ) ;
if ( importantAtom . getReturnType ( ) = = storm : : expressions : : ExpressionReturnType : : Bool ) {
valuation . addBooleanIdentifier ( importantAtom . getIdentifier ( ) , this - > m_adapter . translateExpression ( z3ImportantAtomValuation ) . evaluateAsBool ( ) ) ;
} else if ( importantAtom . getReturnType ( ) = = storm : : expressions : : ExpressionReturnType : : Int ) {
valuation . addIntegerIdentifier ( importantAtom . getIdentifier ( ) , this - > m_adapter . translateExpression ( z3ImportantAtomValuation ) . evaluateAsInt ( ) ) ;
} else if ( importantAtom . getReturnType ( ) = = storm : : expressions : : ExpressionReturnType : : Double ) {
valuation . addDoubleIdentifier ( importantAtom . getIdentifier ( ) , this - > m_adapter . translateExpression ( z3ImportantAtomValuation ) . evaluateAsDouble ( ) ) ;
} else {
throw storm : : exceptions : : InvalidTypeException ( ) < < " Important atom has invalid type " ;
}
}
proceed = callback ( valuation ) ;
this - > m_solver . add ( ! modelExpr ) ;
}
this - > pop ( ) ;
return numModels ;
# else
LOG_THROW ( false , storm : : exceptions : : NotImplementedException , " StoRM is compiled without Z3 support. " ) ;
# endif