B _\@sddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZddl m!Z!dd l"m#Z#dd l$m%Z%m&Z&m'Z'dd l(m)Z)dd l*Te+d Z,GdddZ-Gdddej.Z/Gddde0Z1dS)N)infinity) ComponentSet)randintunique_component_name)BlockVarParamSetVarListConstraintList Constraint ObjectiveRangeSetvalue ConcreteModelRealssqrtminimizemaximize)current)PythonCallbackFunction)_VarData)nonpyomo_leaf_types) SolverFactory SolverStatusTerminationCondition)generate_quadratic_rom_geometry)*zpyomo.contrib.trustregionc@seZdZdZdZdS)ROMTyperN)__name__ __module__ __qualname__linear quadraticr%r%L/tmp/pip-unpacked-wheel-d4p3hk07/pyomo/contrib/trustregion/PyomoInterface.pyrsrcs$eZdZfddZddZZS)ReplaceEFVisitorcs$tt|jddd||_||_dS)NTF)Zdescend_into_named_expressionsZremove_named_expressions)superr'__init__trfefSet)selfZ trf_blockr+) __class__r%r&r)s  zReplaceEFVisitor.__init__cCs|jtjk r|St|j|jkr$|Sg}t}t|jts>t xt |ddD]}t |t ksh| rvtd|f|r|jj}|t||jj||k||qP||krtd|f||||qPW|jj}|jj||jj||S)NrzZTrustRegion does not support black boxes with constant or parameter inputs Expression: %szWTrustRegion does not support black boxes with duplicate input arguments Expression: %s)r-EXPRZExternalFunctionExpressionid_fcnr+r isinstancerAssertionErrorlisttyperZis_fixed RuntimeErrorZis_expression_typer*xadd set_valuerconsetappendy external_fcns exfn_xvars)r,nodevaluesnew_argsseenarg_xZ_yr%r%r&visit$s6        zReplaceEFVisitor.visit)r r!r"r)rD __classcell__r%r%)r-r&r's r'c@seZdZdZdZdZdZejZ ddZ ddZ dd Z d d Z d d ZddZddZddZddZddZd6ddZd7ddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zdd/gfd0d1Zd2d3Z d4d5Z!dS)8PyomoInterfacea Initialize with a pyomo model m. This is used in TRF.py, same requirements for m apply m is reformulated into form for use in TRF algorithm Specified ExternalFunction() objects are replaced with new variables All new attributes (including these variables) are stored on block "tR" Note: quadratic ROM is messy, uses full dimension of x variables. clean up later. FcCsv||_||_||j||_t|jj|_t|jj|_t|jj |_ | | | |d|_d|_dS)N)configmodeltransformForTrustRegionTRFlenxvarslxzvarslzr;ly createParamcreateRomConstraintcreateCompCheckObjective cacheBoundgeoMpset)r,meflistrHr%r%r&r)mszPyomoInterface.__init__cCst|||S)aSubstitute out an External Function Arguments: expr : a pyomo expression. We will search this expression tree trf : a pyomo block. We will add tear variables y on this block efSet: the (pyomo) set of external functions for which we will use TRF method This function returns an expression after removing any ExternalFunction in the set efSet from the expression tree expr. New variables are declared on the trf block and replace the external function. )r'Zdfs_postorder_stack)r,exprr*r+r%r%r& substituteEFszPyomoInterface.substituteEFc Cs0tdd|D}t}t}g}x6|tD](}t||kr.|t|||q.W|t|d|t |_ t |_ t |_ g|_g|_x6|jtddD]$}||j||j|||jfqWx2|jtddD] } | || j||| |_qW|jjtkr"d|jj|j_t|j_g|_g|_t}xH|jD]>} x6| D].}t||krF|t||j|qFWqsz:PyomoInterface.transformForTrustRegion..ZtRT)activerG)!setrcomponent_data_objectsrr/r7r:Z add_componentrr r;r6r r9r<r=r r8lowerr[bodyupperr rZ objectiveZsenserrrMrOexfn_xvars_indrangerL) r,rIrYr+rKZseenVarZ allVariablesvarconobjZvarssZlisttmpir%r%r&rJsX $       z&PyomoInterface.transformForTrustRegioncCstj|jtd}tj|jtd}tj|jtd}x(td|jD]}t|jj |||<q>Wxtd|jD] }d||<qhWx(td|jD]}t|jj |||<qW|||fS)N)Zdtyperr) npzerosrNfloatrQrPrfrrKrMrO)r,r6r;zrjr%r%r&getInitialValues zPyomoInterface.getInitialValuecCstd|jd|j_td|jd|j_td|jd|j_t|jjddd|j_ t|jjddd|j_ t|jjddd|j_ t|jjt |jdddd|j_ t|jjt t|j|j|jdddddd|j_tddd|j_dS)NrrT)Zmutabledefaultg@)rrNrKZind_lxrQind_lyrPZind_lzrpx0Zpy0Zpz0rfplromintpqromZ ppenaltyComp)r,r%r%r&rRs":zPyomoInterface.createParamcs@|jjdftfddtdtD}|S)Nrc3s<|]4}j|dfj|j|VqdS)rN)rtrMrs)r\j)rjindrIr%r& sz+PyomoInterface.ROMlinear..)rertsumrfrL)r,rIrje1r%)rjrxrIr& ROMlinears 2zPyomoInterface.ROMlinearcsjdftfddtd|jD}|jd}xjt|jD]\}xVt||jD]F}|j|j|j|j|j|f7}|d}qVWqDW|S)Nrc3s4|],}j|dfj|j|VqdS)rN)rvrMrs)r\rw)rjrIr%r&rysz)PyomoInterface.ROMQuad..r)rvrzrfrNrMrs)r,rIrjr{countZj1Zj2r%)rjrIr&ROMQuads. :zPyomoInterface.ROMQuadcsDfdd}tjj|dj_fdd}tjj|dj_dS)Ncs|j|d||kS)Nr)r;r|)rIrj)r,r%r&consROMlsz4PyomoInterface.createRomConstraint..consROMl)rulecs|j|d||kS)Nr)r;r~)rIrj)r,r%r&consROMqsz4PyomoInterface.createRomConstraint..consROMq)r rKrrromLromQ)r,rrr%)r,r&rSs  z"PyomoInterface.createRomConstraintcCsd}|j}x6td|jD]&}|||||j|dd7}qWt|d|_d}x6td|jD]&}|||||j|dd7}q`Wt|d|_dS)Nrr)rZ) rKrfrQr|r;r objCompCheckLr~ objCompCheckQ)r,rirIrjr%r%r&rTs& &z'PyomoInterface.createCompCheckObjectivecCsg|j_g|j_g|j_g|j_x0|jjD]$}|jj|j|jj|jq*Wx0|jj D]$}|jj|j|jj|jq\WdS)N) rKxvarloxvarupzvarlozvaruprMr:ZlbZubrO)r,r6rnr%r%r&rU,szPyomoInterface.cacheBoundNcCs|dk r,x"t|jD]}|||jj|<qW|dk r|jtjkrxt|jD]6}x0tt||D]}||||jj ||f<qbWqLWnR|jtj krxDt|jD]6}x0tt||D]}||||jj ||f<qWqWdS)N) rfrNrKrsromtyperr#rQrLrtr$rv)r,x0y0z0 rom_params penaltyComprjrwr%r%r&setParam9s  " zPyomoInterface.setParamcCs|dk rJt||jkrtdx*td|jD]}|jj|||q,W|dk rt||jkrhtdx.td|jD]}|jj|d||qvW|dk rt||j krtdx*td|j D]}|jj |||qWdS)Nz0setValue: The dimension of x is not consistant! rz0setValue: The dimension of y is not consistant! rz0setValue: The dimension of z is not consistant! ) rLrN ExceptionrfrKrMr8rQr;rPrO)r,r6r;rnrjr%r%r& setVarValueSs$zPyomoInterface.setVarValuecCs"xdtd|jD]T}|jj|t||||jj||jj|t||||jj |qWxPtd|j D]@}|jj |d||||jj |d|||qtWxdtd|j D]T}|jj |t||||jj||jj |t||||jj|qWdS)Nrr)rfrNrKrMsetlbZ maxIgnoreNonersetubZ minIgnoreNonerrQr;rPrOrr)r,rrrradiusrjr%r%r&setBoundhs(,"(zPyomoInterface.setBoundcCsv|jd7_g}xXtd|jD]H}|jj|j}g}x |j|D]}|||qBW||j|q Wt |S)Nrr) countDxrfrQrKr<r0rer:rkarray)r,r6Zansrjfcnr?rwr%r%r& evaluateDxtszPyomoInterface.evaluateDxcCsJt||jks*t||jks*t||jkr2td|j|||d|S)NzFevaluateObj: The dimension is not consistent with the initialization )r6r;rn)rLrNrQrPrrrd)r,r6r;rnr%r%r& evaluateObjs*zPyomoInterface.evaluateObjcCs>|jj|jj|jj|jj|jdS)N)rKr deactivaterrrrdactivate)r,r%r%r&deactiveExtraConObjs     z"PyomoInterface.deactiveExtraConObjcCsD|j||d|jtjkr(|jjn|jtjkr@|jjdS)N)rr) rrrr#rKrrr$r)r,rrr%r%r&activateRomConss   zPyomoInterface.activateRomConscCsR|j||||d|jtjkr,|jjn|jtjkrD|jj|j dS)N)rrrr) rrrr#rKrrr$rrdr)r,rrrpenaltyr%r%r&activateCompCheckObjectives    z)PyomoInterface.activateCompCheckObjectivec Cs6|j}t|jj}|j|jj|j||j|j d}|jj t j kr|jj tjkr|j|x(td|jD]}t|jj|||<qpWx,td|jD]}t|jj|d||<qWx(td|jD]}t|jj|||<qWxL|jtddD] }d|fSWn,tdt|jj tdt|jj dSdS) N) keepfilesteerrT)r^zWaring: solver Status: zAnd Termination Conditions: )Fr)rIrrHsolveroptionsupdatesolver_optionssolver stream_solverstatusroktermination_conditionroptimal solutions load_fromrfrNrrKrMrQr;rPrOr`r printstr) r,r6r;rnrIoptresultsrjrir%r%r& solveModels&  zPyomoInterface.solveModelc Cst||jksTt||jksTt||jksTt||jksTt||jksTt||jkr\td|||||||||||||| |||S)NzATRSP_k: The dimension is not consistant with the initialization! ) rLrNrQrPrrrrrr) r,r6r;rnrrrrrr%r%r&TRSPks** zPyomoInterface.TRSPkc Cst||jksTt||jksTt||jksTt||jksTt||jksTt||jkr\td||||||||||||||| | |||S)NzNCompatibility_Check: The dimension is not consistant with the initialization! ) rLrNrQrPrrrrrr) r,r6r;rnrrrrrrr%r%r&compatibilityChecks**z!PyomoInterface.compatibilityCheckgcsBjj|||d|||d||td}|jdddj\}tt t d_ x6D].} dj | <j |  d j |  d qzWr|dkrtd t td jt d_x>td jD].} j|  ||  j|  || qWfd d} tttd| d_ttfdd|Dd_ttdd|D} tjj} | jjj| jjj d} | jj!t"j#kr| jj$t%j&krj'(| | dkrdt)| fSdt)fSn0tdt*| jj!tdt*| jj$dt+fSdS)N)r6r;rng _Bz contrib.gjhFT)rZsymbolic_solver_labels)domainggg?zMWARNING: worstcase criticality was requested but Jacobian error bound is zerorc s&}|j}d}dddjjdkrPd}tttj}tfddD}|rr|r|j |dkS|dkSn|j }|j }|dk r|j | } |dk r|j | |ko|j kSS|j | |kSn6|dk r|j |} | ||j kStd dS) NF.z.romTc3s4|],}|dkr|dj|dVqdS)rrrN)v)r\r6)rjlvarlistr%r&ryszGPyomoInterface.criticalityCheck..linConMaker..rz.linConMakerr)rc3s(|] }|dj|dVqdS)rrN)r)r\r6)rrr%r&rysz2PyomoInterface.criticalityCheck..)rZcss|]}|ddVqdS)rrNr%)r\r6r%r%r&rys)rrz3Waring: Crticality check fails with solver Status: zAnd Termination Conditions: ),rIrrrrrrZ _gjh_inforrrrrrallrrfrQrr rLZlinconsr rzrirrHrrrrrrrrrrrrrrabsrr)r,r6r;rnrrMZoptGJHgrjrZgfnormrrr%)rrrrIr,rrr&criticalityChecksL    (    zPyomoInterface.criticalityCheckcCst|\}|_|_dS)N)rrWrV)r,rN_r%r%r& initialQuad:szPyomoInterface.initialQuadcCsn||}g}|jtjkrxtd|jD]}|g|||||jj|j }g}x |j |D]}|||qfWx^tdt |D]L}|} ||| ||<|j |} ||| ||| ||| ||<qWq(Wn|jtj krf|j dkr ||jt|j|j|jddd} g} |} x4|jddD]"} ||| | }| |qDW| |tj|j t| }xtd|jD]}|gx*td| D]}|||||fqWx2td|jdD]}|||| |||<qW|jd}xNtd|jD]>}x6t||jD]&}|||| |||<|d}q0WqWqW||fS)z This function builds a linear ROM near x based on the perturbation. The ROM is returned by a format of params array. I think the evaluate count is broken here! rNrqg@rrG)rrrr#rfrQr:rKr<r0rerLr$rVrrNrurWrkZlinalgrZmatrix)r,r6Z radius_basey1rrjrr?rwry2Zdimrhspr;Zcoefsr}iir%r%r&buildROM=sN      "   zPyomoInterface.buildROM)NNNNN)NNN)"r r!r"__doc__rrrrr#rr)r[rJrorRr|r~rSrTrUrrrrrrrrrrrrrrr%r%r%r&rFXs:U        drF)2loggingosZnumpyrkZ pyutilib.mathrZpyomo.common.collectionsrZpyomo.common.modelingrrZ pyomo.corerrrr r r r r rrrrrrrZpyomo.core.exprrr.Zpyomo.core.base.externalrZpyomo.core.base.varrZpyomo.core.base.numvaluerZ pyomo.optrrrZ+pyomo.contrib.trustregion.GeometryGeneratorrZ pyomo.contrib.trustregion.helper getLoggerloggerrZExpressionReplacementVisitorr'objectrFr%r%r%r&s"  D      <