B u `^@sddlZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZmZddlmZddlmZddlmZdd lm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&m'Z'e(d Z)Gd ddZ*Gdddej+Z,Gddde-Z.dS)N)infinity) ComponentSet)unique_component_name)BlockVarParamVarListConstraintList Constraint ObjectiveRangeSetvalue ConcreteModelRealssqrtminimizemaximize)current)PythonCallbackFunction)nonpyomo_leaf_types) SolverFactory SolverStatusTerminationCondition)generate_quadratic_rom_geometry) maxIgnoreNone minIgnoreNonezpyomo.contrib.trustregionc@seZdZdZdZdS)ROMTyperN)__name__ __module__ __qualname__linear quadraticr#r#L/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/contrib/trustregion/PyomoInterface.pyr srcs$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_valuer consetappendy external_fcns exfn_xvars)r*nodevaluesnew_argsseenarg_xZ_yr#r#r$visit,s6        zReplaceEFVisitor.visit)rrr r'rB __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)configmodeltransformForTrustRegionTRFlenxvarslxzvarslzr9ly createParamcreateRomConstraintcreateCompCheckObjective cacheBoundgeoMpset)r*meflistrFr#r#r$r'uszPyomoInterface.__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)activerE)!setrcomponent_data_objectsrr-r5r8Z add_componentrrr9r4r r7r:r;r r6lowerrYbodyupperr rX objectiveZsenserrrKrMexfn_xvars_indrangerJ) r*rGrWr)rIZseenVarZ allVariablesvarconobjZvarssZlisttmpir#r#r$rHsX $       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) npzerosrLfloatrOrNrdr rIrKrM)r*r4r9zrhr#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@)r rLrIZind_lxrOind_lyrNZind_lzrpx0Zpy0Zpz0rdplromintpqromZ ppenaltyComp)r*r#r#r$rPs":zPyomoInterface.createParamcs@|jjdftfddtdtD}|S)Nrc3s<|]4}j|dfj|j|VqdS)rN)rrrKrq)rZj)rhindrGr#r$ sz+PyomoInterface.ROMlinear..)rcrrsumrdrJ)r*rGrhe1r#)rhrvrGr$ 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)rtrKrq)rZru)rhrGr#r$rw sz)PyomoInterface.ROMQuad..r)rtrxrdrLrKrq)r*rGrhrycountZj1Zj2r#)rhrGr$ROMQuad s. :zPyomoInterface.ROMQuadcsDfdd}tjj|dj_fdd}tjj|dj_dS)Ncs|j|d||kS)Nr)r9rz)rGrh)r*r#r$consROMlsz4PyomoInterface.createRomConstraint..consROMl)rulecs|j|d||kS)Nr)r9r|)rGrh)r*r#r$consROMqsz4PyomoInterface.createRomConstraint..consROMq)r rIrpromLromQ)r*r}rr#)r*r$rQs  z"PyomoInterface.createRomConstraintcCsd}|j}x6td|jD]&}|||||j|dd7}qWt|d|_d}x6td|jD]&}|||||j|dd7}q`Wt|d|_dS)Nrr)rX) rIrdrOrzr9r objCompCheckLr| objCompCheckQ)r*rgrGrhr#r#r$rRs& &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) rIxvarloxvarupzvarlozvaruprKr8ZlbZubrM)r*r4rlr#r#r$rS4szPyomoInterface.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) rdrLrIrqromtyperr!rOrJrrr"rt)r*x0y0z0 rom_params penaltyComprhrur#r#r$setParamAs  " 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! ) rJrL ExceptionrdrIrKr6rOr9rNrM)r*r4r9rlrhr#r#r$ setVarValue[s$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)rdrLrIrKsetlbrrsetubrrrOr9rNrMrr)r*rrrradiusrhr#r#r$setBoundps(,"(zPyomoInterface.setBoundcCsv|jd7_g}xXtd|jD]H}|jj|j}g}x |j|D]}|||qBW||j|q Wt |S)Nrr) countDxrdrOrIr:r.rcr8riarray)r*r4Zansrhfcnr=rur#r#r$ evaluateDx|szPyomoInterface.evaluateDxcCsJt||jks*t||jks*t||jkr2td|j|||d|S)NzFevaluateObj: The dimension is not consistent with the initialization )r4r9rl)rJrLrOrNrrrb)r*r4r9rlr#r#r$ evaluateObjs*zPyomoInterface.evaluateObjcCs>|jj|jj|jj|jj|jdS)N)rIr deactivaterrrrbactivate)r*r#r#r$deactiveExtraConObjs     z"PyomoInterface.deactiveExtraConObjcCsD|j||d|jtjkr(|jjn|jtjkr@|jjdS)N)rr) rrrr!rIrrr"r)r*rrr#r#r$activateRomConss   zPyomoInterface.activateRomConscCsR|j||||d|jtjkr,|jjn|jtjkrD|jj|j dS)N)rrrr) rrrr!rIrrr"rrbr)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)rGrrFsolveroptionsupdatesolver_optionssolver stream_solverstatusroktermination_conditionroptimal solutions load_fromrdrLr rIrKrOr9rNrMr^r printstr) r*r4r9rlrGoptresultsrhrgr#r#r$ solveModels&  zPyomoInterface.solveModelc Cst||jksTt||jksTt||jksTt||jksTt||jksTt||jkr\td|||||||||||||| |||S)NzATRSP_k: The dimension is not consistant with the initialization! ) rJrLrOrNrrrrrr) r*r4r9rlrrrrrr#r#r$TRSPks** zPyomoInterface.TRSPkc Cst||jksTt||jksTt||jksTt||jksTt||jksTt||jkr\td||||||||||||||| | |||S)NzNCompatibility_Check: The dimension is not consistant with the initialization! ) rJrLrOrNrrrrrr) r*r4r9rlrrrrrrr#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)r4r9rlg _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)rZr4)rhlvarlistr#r$rw szGPyomoInterface.criticalityCheck..linConMaker..rz.linConMakerr)r~c3s(|] }|dj|dVqdS)rrN)r)rZr4)rrr#r$rw$sz2PyomoInterface.criticalityCheck..)rXcss|]}|ddVqdS)rrNr#)rZr4r#r#r$rw's)rrz3Waring: Crticality check fails with solver Status: zAnd Termination Conditions: ),rGrrrrrrZ _gjh_inforrrrrrallrrdrOrr rJZlinconsr rxrgrrFrrrrrrrrrrrrrrabsrr)r*r4r9rlrrMZoptGJHgrhrZgfnormrrr#)rrrrGr*rrr$criticalityChecksL    (    zPyomoInterface.criticalityCheckcCst|\}|_|_dS)N)rrUrT)r*rL_r#r#r$ initialQuadBszPyomoInterface.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! rNrog@rrE)rrrr!rdrOr8rIr:r.rcrJr"rTrrLrsrUriZlinalgrZmatrix)r*r4Z radius_basey1rrhrr=rury2Zdimrhspr9Zcoefsr{iir#r#r$buildROMEsN      "   zPyomoInterface.buildROM)NNNNN)NNN)"rrr __doc__rrrrr!rr'rYrHrmrPrzr|rQrRrSrrrrrrrrrrrrrrr#r#r#r$rD`s:U        drD)/loggingZnumpyriZ pyutilib.mathrZpyomo.common.collectionsrZpyomo.common.modelingrZ pyomo.corerrrrr r r r r rrrrrZpyomo.core.exprrr,Zpyomo.core.base.externalrZpyomo.core.base.numvaluerZ pyomo.optrrrZ+pyomo.contrib.trustregion.GeometryGeneratorrZ pyomo.contrib.trustregion.helperrr getLoggerloggerrZExpressionReplacementVisitorr%objectrDr#r#r#r$ s   @     <