B _5@stddlZddlmZddlmZddlTddlmZddlTddl m Z e dZ e jdd d Gd d d eZdS) N) iteritems)ProductExpression)*)_VarData)generate_standard_repnz pyomo.gdpz gdp.bilinearz[Creates a disjunctive model where bilinear terms are replaced with disjunctive expressions.)doccs<eZdZfddZddZddZddZd d ZZS) Bilinear_Transformationcstt|dS)N)superr__init__)self) __class__>/tmp/pip-unpacked-wheel-d4p3hk07/pyomo/gdp/plugins/bilinear.pyr sz Bilinear_Transformation.__init__c s|di}tdddkrxt_ij_tj_gj_tj_ t jj ddgj_ ij_ ij_ ij_x$jdtjdD]}||qWfdd}tjj |d j_dS) Noptionsbilinear_data_rT)activesortcs jj|S)N)rdisjunction_data)blocki)instancer rrule3sz/Bilinear_Transformation._apply_to..rule)r)popgetattrZBlockrcacheZVarListvlist vlist_booleanSetIDXZDisjunct disjuncts_ro_exprc_bodyZblock_data_objectsZSortComponentsZ deterministic_transformBlockZ DisjunctionZ disjunction_)r rkwdsrrrr )rr _apply_tos     z!Bilinear_Transformation._apply_tocCsx>|jtdddD]*}||j|}|j|jjt|<||_qWx>|jtdddD]*}||j |}|j |jj t|<||_ qRWdS)NTF)rZ descend_into) Zcomponent_objectsZ Objective_transformExpressionexprrr!idZcomponent_data_objects Constraintbodyr"_body)r rr componentr'r r rr#7s z'Bilinear_Transformation._transformBlockcCs4|dkrtd|dkr$|S|||}|S)Nz1Cannot transform polynomial terms with degree > 2)Zpolynomial_degree ValueError_replace_bilinear)r r'rr r rr&As    z,Bilinear_Transformation._transformExpressioncCsji}t||d}|j}x&t|j|jD]\}}|||7}q&Wt|jdkrfxt|j|jD]\}} |dr|j j t |dt |dfd} | dkr|j j |d|j j} | |j j t |dt |df<|dj} | | d| | dt|j j} |j j| |j j| df} t|ddkd| _t| |dkd| _|j j| df}t|ddkd|_t| dkd|_|j j| df|j j| dfg|j j| <|j j| df|j j| dfg|j j| <|| | 7}q`|drJ|j j t |dt |dfd} | dkr<|j j |d|j j} | |j j t |dt |df<|dj} | | d| | dt|j j} |j j| |j j| df} t|ddkd| _t| |dkd| _|j j| df}t|ddkd|_t| dkd|_|j j| df|j j| dfg|j j| <|| | 7}q`|| |d|d7}q`W|S)N)idMaprr)r')rZconstantzipZ linear_varsZ linear_coefslenZquadratic_coefsZquadratic_varsZ is_binaryrrgetr(rappendraddboundsZsetlbZsetubrr r)Zc1c2r)r r'rr0ZtermsevarZcoefZvars_Zcoef_vr6Zid_Zd0d1r r rr/Js` $     (($     (z)Bilinear_Transformation._replace_bilinear) __name__ __module__ __qualname__r r%r#r&r/ __classcell__r r )r rrs    r)loggingsixrZpyomo.core.expr.currentrZ pyomo.coreZpyomo.core.base.varrZ pyomo.gdpZ pyomo.repnr getLoggerloggerZTransformationFactoryregisterZTransformationrr r r r s