B _O+@sddlZddlmZddlmZmZmZmZmZddl m Z m Z ddl m Z mZmZmZmZmZmZmZmZddlmZddlmZddlmZed \ZZdd d ZGd d d eZ GdddeZ!dS)N)attempt_import)value SymbolMapNumericLabelerVar Constraint)EqualityExpressionInequalityExpression) ProductExpression SumExpression PowExpressionNegationExpressionMonomialTermExpressionDivisionExpressionReciprocalExpression AbsExpressionUnaryFunctionExpression)nonpyomo_leaf_types)StreamBasedExpressionVisitor) Disjunctionz3cCsJt||d}|tjkrdS|tjkr,dS|tjkr:dStd|dS)zChecks if the model is satisfiable. Returns: True if model is satisfiable, False if model is unsatisfiable, None if satisfiability cannot be determined. )loggerTFNzUnknown result: %s) SMTSatSolvercheckrsatZunsatunknown ValueError)modelrresultrE/tmp/pip-unpacked-wheel-d4p3hk07/pyomo/contrib/satsolver/satsolver.py satisfiables   r!c@szeZdZdZddZdddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZdS)ra Satisfiability solver that checks constraint feasibility through use of z3 Sat Solver. Object stores expressions and variables in form consistent with SMT-LIB standard. For documentation on SMT-LIB standard see http://smtlib.cs.uiowa.edu/ cCsd}|d}x|jD] }||}qW|d}x|jD] }||}q4W|d}x|jD] }||}qTW|d}xn|jD]d}|d|dd}xJ|d D]>}|d |dd d}x |d D]}|d |d}qWqWqtW|S) z9 Defined string representation of object z Variables: zBounds: z Expressions: zDisjunctions: z Disjunction: r z z : z ) variable_list bounds_listexpression_listdisjunctions_list)selfstringvedjndisjcrrr __str__;s$       zSMTSatSolver.__str__NcCsbttd|_||_g|_g|_g|_g|_t |j|_ t |_ ||_|dk r^||dS)Nx)rrvariable_label_map_get_default_functionsprefix_expr_listr%r&r'r( SMT_visitorwalkerrZSolversolverr_process_model)r)rrrrr __init__Rs   zSMTSatSolver.__init__cCs t}|dtdf|S)Nz-(define-fun exp ((x Real)) Real (^ %0.15f x))r$)listappendmathexp)r)defaultrrr r3`sz#SMTSatSolver._get_default_functionscCs|x |jtddD]}||}qWx"|jtddD]}||jq2Wx0|jtdD] }|jrj||qT| |qTWdS)NT)ctypeZ descend_into)r?active)r?) component_data_objectsradd_varradd_exprexprrr@_process_active_disjunction_process_inactive_disjunction)r)rr+ smtstringr/r-rrr r8fs zSMTSatSolver._process_modelcCsl|j|}|j}|j}|dk r@|jd|dt|d|dk rh|jd|dt|ddS)Nz (assert (>=  z)) z (assert (<= )r2 getSymbollbubr&r;str)r)varnmrJrKrrr _add_boundrs  zSMTSatSolver._add_boundcCs|j|}|j}|r:|jd|d||nd|rb|jd|d||n<|r|jd|d||nt dt |d|S)Nz (declare-fun z () Real) z() Int) zSMT cannot handle z variables) r2rIdomainZ is_continuousr%r;rOZ is_binary is_integerNotImplementedErrorrL)r)rMlabelrPrrr rB|s    zSMTSatSolver.add_varc Csjy$|j|}|jd|dWn@tk rd}z"|jdk rT|jdt|Wdd}~XYnXdS)Nz(assert z) zSkipping Expression: )r6walk_expressionr'r;rRrwarningrL)r)Z expressionZsmtexprr,rrr rCs   zSMTSatSolver.add_exprcCsd|d}xV|dD]J}d}x$|dD]}d|d|d}q$W|d|dd|d }qW|S) Nrr$truez(and rH)z(assert (=> ( = 1 z) z)) r)r)Zsmt_djnZ djn_stringr.Z cons_stringr/rrr _compute_disjunction_strings z(SMTSatSolver._compute_disjunction_stringc Csd}g}x|jD]}g}|j}||}d|d|d}xp|jtddD]^}y||j|jWqLt k r} z"|j dk r|j dt | Wdd} ~ XYqLXqLW|||fqW|j rd|d }n d |d }|j||fdS) N0z(+ rHrWT)r?r@zSkipping Disjunct Expression: z (assert (= 1 z)) z(assert (>= 1 ) disjuncts indicator_varrBrArr;r6rTrDrRrrUrLxorr() r)r-or_exprrZr. constraintsivrSr/r,rrr rEs$   * z(SMTSatSolver._process_active_disjunctioncCshd}x2|jD](}|j}||}d|d|d}q W|jrLd|d}n d|d}|j|dS)NrYz(+ rHrWz (assert (= 1 z)) z(assert (>= 1 )rZr[rBr\r'r;)r)r-r]r.r_rSrrr rFs   z*SMTSatSolver._process_inactive_disjunctioncsbdj}dj}dj}dj}dfddjD}|||||}|S)Nr"csg|]}|qSr)rX).0d)r)rr sz/SMTSatSolver.get_SMT_string..)joinr4r%r&r'r()r)Z prefix_stringZvariable_stringZ bounds_stringZexpression_stringZdisjunctions_stringrGr)r)r get_SMT_strings    zSMTSatSolver.get_SMT_stringcs6ddjjD}|fdd|D}t||S)NcSsg|]}|qSrr)r`r1rrr rbsz-SMTSatSolver.get_var_dict..csg|]}j|qSr)r2Z getObject)r`l)r)rr rbs)r2ZbySymbolsortzip)r)labelsvarsr)r)r get_var_dictszSMTSatSolver.get_var_dictcCs |jt||jS)N)r7r;rZparse_smt2_stringrdr)r)rrr rszSMTSatSolver.check)NN)__name__ __module__ __qualname____doc__r0r9r3r8rOrBrCrXrErFrdrjrrrrr r2s       rcs8eZdZdZfddZddZddZdd ZZS) r5zCreates an SMT expression from the corresponding Pyomo expression. This class walks a pyomo expression tree and builds up the corresponding SMT string representation of an equivalent expression cstt|||_dS)N)superr5r9r2)r)Zvarmap) __class__rr r9szSMT_visitor.__init__cCst|tr*d|dd|dd}nt|trTd|dd|dd}nt|tr|d}x(|ddD]}d|d|d}qtWnZt|tr|d}x(|ddD]}d|d|d}qWnt|trd |dd|dd}nt|trd |dd}nt|trJd|dd|dd}nt|trvd |dd|dd}nxt|t rd |dd}nXt|t rd |dd}n8t|t r|j dkrd|dd}n|j dkrt dn|j dkrd|dd}n|j dkr2d|dd}n|j dkrPd|dd}n|j dkrnd|dd}nj|j dkrd|dd}nL|j dkrd|dd}n.|j dkrd |dd}nt d |j fnt tt|d!|S)"Nz(= rrHr$rWz(<= z(* z(+ z(^ z(- 0 z(/ z(/ 1 z(abs r=z(exp logz%logarithm not handled by z3 interfacesinz(sin cosz(cos tanz(tan asinz(asin acosz(acos atanz(atan sqrtz (/ 1 2))zUnknown unary function: %sz' expression not handled by z3 interface) isinstancerr r r r r rrrrrnamerRrLtype)r)nodedataZansargrrr exitNodes\                          zSMT_visitor.exitNodecCsjt|tkrdt|fS|r$dS|rZ|rDdtt|fSdt|j|fSn dt|fSdS)NF)Tr") r{rrLZis_expression_typeZis_numeric_typeZis_fixedrr2rI)r)r|childZ child_idxrrr beforeChilds  zSMT_visitor.beforeChildcCs|S)Nr)r)Z node_resultrrr finalizeResult$szSMT_visitor.finalizeResult) rkrlrmrnr9rrr __classcell__rr)rpr r5s  2r5)N)"r<Zpyomo.common.dependenciesrZ pyomo.corerrrrrZpyomo.core.expr.logical_exprrr Zpyomo.core.expr.numeric_exprr r r r rrrrrZpyomo.core.expr.numvaluerZpyomo.core.expr.visitorrZ pyomo.gdprrZ z3_availabler!objectrr5rrrr s ,     &