B u `0@sddlZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z ddl mZddlmZmZddlmZedZe jddd Gd d d eZdS) N) BlockVarListConstraintList ObjectiveVar Constraintmaximize ComponentUIDSetTransformationFactory)generate_standard_repn)ComplementarityList complements)Base_BilevelTransformationz pyomo.corezbilevel.linear_mpeczEGenerate a linear MPEC from the optimality conditions of the submodel)doccs,eZdZfddZddZddZZS)+LinearComplementarity_BilevelTransformationcstt|dS)N)superr__init__)self) __class__=/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/bilevel/plugins/lcp.pyrsz4LinearComplementarity_BilevelTransformation.__init__cKs|dd|_|jd|f|}||tt||jd|||t||j d_ tt ||jd|j d_ x8|j ddD]$\}}t|tst|ts|qWdS)NZ deterministicFzbilevel.linear_mpecZ_kktT)active)get_deterministicZ _preprocessZreclassify_component_typersetattrZ _submodel_add_optimality_conditionsr Z_transformation_dataZ submodel_cuidgetattrZ block_cuidZ component_mapitems isinstancerr Z deactivate)rinstancekwdssubmodelnamedatarrr _apply_tos z5LinearComplementarity_BilevelTransformation._apply_toc si}i}i}it}g}tdd}t|_t|_t|_t|_t|_ x|j t ddD]} | j t krtd} nd} t| jdd} x^t| jD]P\} } | j|jkrqt| }| | j| ||<||kr||||qWxt| jD]\} } | dj|jkr|| dj|jkr*qt| d}||d| | j| | d||<||kr||||q| dj|jkrt| d}||d| | j| | d||<||kr||||qtd qWPq^Wx|jtddD]}|j|jkr qx|D]}||j\}}|d k rl|j}|j t |||k|dknd }|d k r|j}||t||<|j t |||k|dknd }|d kr|d ks&t||}||f||<||kr&||||q&WqWx|j t!ddD]}|j"rJ|j}d |ft|<n|j#d k r|j}|jt |j$ |j# k|dknd }|j%d k r|j}|jt |j$|j%k|dknd }|d kr|d ks||ft|<t|j$dd}xrt|jD]d\} } | j|jkrqt| }|&|i&t||j| ||kr||||qWx`t|jD]P\} } | dj|jkr,| dj|jkrqvt| d}||kr|j| | d||t|<n&|&|i&t||j| | d||kr||||n| dj|jkrt| d}||krx|j| | d||t|<n&|&|i&t||j| | d||kr||||ntd qvWq Wd }x |D]}||d}|||\}}||kr.|d k r||8}|d k r.||7}||i}t'(}|j)rb|j*fd d dxX|D]P}||krh|\}}|d k r||||8}|d k rh||||7}qhWt+|t,j-kst+|t.krt/dn|j|dkqW|S)ai Add optimality conditions for the submodel This assumes that the original model has the form: min c1*x + d1*y A3*x <= b3 A1*x + B1*y <= b1 min c2*x + d2*y + x'*Q*y A2*x + B2*y + x'*E2*y <= b2 y >= 0 NOTE THE VARIABLE BOUNDS! T)Zconcrete)rF)Zcompute_valuesrzoCannot apply this transformation to a problem with quadratic terms where both variables are in the lower level.N)NNcs,|ddkr|djS|djS)Nr'r) local_name)x)utmprrzXLinearComplementarity_BilevelTransformation._add_optimality_conditions..)keyz+Unbounded variable without side constraints)0setrruvrZc1r c2c3Zcomponent_data_objectsrZsenserr expr enumerateZ linear_varsZparent_componentr(Z_fixed_upper_varsidZ linear_coefsaddappendZquadratic_varsrZquadratic_coefs RuntimeErrorZcomponent_objectsrZboundsrrZequalitylowerbodyupper setdefaultlistkeysrsorttypesix integer_typesfloatIOError) rr r"Zd2ZB2ZvtmpZsids_setZ sids_listblockodataZd_senseZo_termsivarZid_Z vcomponentZndxZlbZubr0wcdatar/Zc_termsZtmp__ZvidexpZlb_dualZub_dualZB2_Z utmp_keysuidr)r*rr7s    &    &                  $        &      &               zFLinearComplementarity_BilevelTransformation._add_optimality_conditions)__name__ __module__ __qualname__rr%r __classcell__rr)rrrs r)rAloggingZpyomo.core.baserrrrrrrr r r Z pyomo.repnr Z pyomo.mpecr rZpyomo.bilevel.plugins.transformr getLoggerloggerregisterrrrrr s0