B u `O+ã@sÊddlZddlmZddlmZmZmZmZmZddl m Z m Z ddl m Z mZmZmZmZmZmZmZmZddlmZddlmZddlmZed ƒ\ZZdd d „ZGd d „d eƒZ Gdd„deƒZ!dS)éN)Úattempt_import)ÚvalueÚ SymbolMapÚNumericLabelerÚVarÚ Constraint)ÚEqualityExpressionÚInequalityExpression) ÚProductExpressionÚ SumExpressionÚ PowExpressionÚNegationExpressionÚMonomialTermExpressionÚDivisionExpressionÚReciprocalExpressionÚ AbsExpressionÚUnaryFunctionExpression)Únonpyomo_leaf_types)ÚStreamBasedExpressionVisitor)Ú DisjunctionÚz3cCsJt||d ¡}|tjkrdS|tjkr,dS|tjkr:dStd|ƒ‚dS)z¼Checks 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)Ú SMTSatSolverÚcheckrÚsatZunsatÚunknownÚ ValueError)ÚmodelrÚresult©rúE/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/contrib/satsolver/satsolver.pyÚ satisfiables   r!c@szeZdZdZdd„Zddd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)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/ cCsàd}|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}q¼Wq–WqtW|S) z9 Defined string representation of object Úz Variables: zBounds: z Expressions: zDisjunctions: z Disjunction: rÚ éz z : z )Ú variable_listÚ bounds_listÚexpression_listÚdisjunctions_list)ÚselfÚstringÚvÚeÚdjnÚdisjÚcrrr Ú__str__;s$       zSMTSatSolver.__str__NcCsbttdƒƒ|_| ¡|_g|_g|_g|_g|_t |jƒ|_ t   ¡|_ ||_|dk r^| |¡dS)NÚx)rrÚvariable_label_mapÚ_get_default_functionsÚprefix_expr_listr%r&r'r(Ú SMT_visitorÚwalkerrZSolverÚsolverrÚ_process_model)r)rrrrr Ú__init__Rs   zSMTSatSolver.__init__cCs tƒ}| dt d¡f¡|S)Nz-(define-fun exp ((x Real)) Real (^ %0.15f x))r$)ÚlistÚappendÚmathÚexp)r)Údefaultrrr r3`sz#SMTSatSolver._get_default_functionscCs|x |jtddD]}| |¡}qWx"|jtddD]}| |j¡q2Wx0|jtdD] }|jrj| |¡qT|  |¡qTWdS)NT)ÚctypeZ descend_into)r?Úactive)r?) Úcomponent_data_objectsrÚadd_varrÚadd_exprÚexprrr@Ú_process_active_disjunctionÚ_process_inactive_disjunction)r)rr+Ú smtstringr/r-rrr r8fs zSMTSatSolver._process_modelcCsl|j |¡}|j}|j}|dk r@|j d|dt|ƒd¡|dk rh|j d|dt|ƒd¡dS)Nz (assert (>= ú z)) z (assert (<= )r2Ú getSymbolÚlbÚubr&r;Ústr)r)ÚvarÚnmrJrKrrr Ú _add_boundrs  zSMTSatSolver._add_boundcCs¢|j |¡}|j}| ¡r:|j d|d¡| |¡nd| ¡rb|j d|d¡| |¡n<| ¡rŠ|j d|d¡| |¡nt dt |ƒdƒ‚|S)Nz (declare-fun z () Real) z() Int) zSMT cannot handle z variables) r2rIÚdomainZ is_continuousr%r;rOZ is_binaryÚ is_integerÚNotImplementedErrorrL)r)rMÚlabelrPrrr rB|s    zSMTSatSolver.add_varc Csjy$|j |¡}|j d|d¡Wn@tk rd}z"|jdk rT|j dt|ƒ¡Wdd}~XYnXdS)Nz(assert z) zSkipping Expression: )r6Úwalk_expressionr'r;rRrÚwarningrL)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_string–s z(SMTSatSolver._compute_disjunction_stringc Csôd}g}x¶|jD]¬}g}|j}| |¡}d|d|d}xp|jtddD]^}y| |j |j¡¡WqLt k r¨} z"|j dk r˜|j   dt | ƒ¡Wdd} ~ XYqLXqLW| ||f¡qW|j rÔd|d }n d |d }|j ||f¡dS) NÚ0z(+ rHrWT)r?r@zSkipping Disjunct Expression: z (assert (= 1 z)) z(assert (>= 1 )Ú disjunctsÚ indicator_varrBrArr;r6rTrDrRrrUrLÚxorr() r)r-Úor_exprrZr.Ú constraintsÚivrSr/r,rrr rE s$   * 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 rF¶s   z*SMTSatSolver._process_inactive_disjunctioncsbd ˆj¡}d ˆj¡}d ˆj¡}d ˆj¡}d ‡fdd„ˆjDƒ¡}|||||}|S)Nr"csg|]}ˆ |¡‘qSr)rX)Ú.0Úd)r)rr ú Çsz/SMTSatSolver.get_SMT_string..)Újoinr4r%r&r'r()r)Z prefix_stringZvariable_stringZ bounds_stringZexpression_stringZdisjunctions_stringrGr)r)r Úget_SMT_stringÂs    zSMTSatSolver.get_SMT_stringcs6dd„ˆjjDƒ}| ¡‡fdd„|Dƒ}t||ƒS)NcSsg|]}|‘qSrr)r`r1rrr rbÌsz-SMTSatSolver.get_var_dict..csg|]}ˆj |¡‘qSr)r2Z getObject)r`Úl)r)rr rbÎs)r2ZbySymbolÚsortÚzip)r)ÚlabelsÚvarsr)r)r Ú get_var_dictËszSMTSatSolver.get_var_dictcCs |j t | ¡¡¡|j ¡S)N)r7r;rZparse_smt2_stringrdr)r)rrr rÒszSMTSatSolver.check)NN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r0r9r3r8rOrBrCrXrErFrdrjrrrrr r2s       rcs8eZdZdZ‡fdd„Zdd„Zdd„Zdd „Z‡ZS) r5zÐCreates 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 r9ßszSMT_visitor.__init__cCsòt|tƒr*d|dd|dd}nÄt|tƒrTd|dd|dd}nšt|tƒr”|d}x(|dd…D]}d|d|d}qtWnZt|tƒrÔ|d}x(|dd…D]}d|d|d}q´Wnt|tƒrþd |dd|dd}nðt|tƒrd |dd}nÐt|tƒrJd|dd|dd}n¤t|tƒrvd |dd|dd}nxt|t ƒr–d |dd}nXt|t ƒr¶d |dd}n8t|t ƒrÚ|j dkràd|dd}nø|j dkröt dƒ‚nâ|j dkrd|dd}nÄ|j dkr2d|dd}n¦|j dkrPd|dd}nˆ|j dkrnd|dd}nj|j dkrŒd|dd}nL|j dkrªd|dd}n.|j dkrÈd |dd}nt d |j fƒ‚nt 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 interfaceÚsinz(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 rrrrrÚnamerRrLÚtype)r)ÚnodeÚdataZansÚargrrr ÚexitNodeãs\                          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 r5×s  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 ,     &