B @`c@sddlmZddlZddlZddlZddlmZddlmZddl m Z ddl m Z e dZdd Zd d Zd d ZddZddZGdddeZdS))divisionN) iteritems) itemgetter) indexToString) UndefinedDataz pyomo.pyspc si}fdd}d}d}xjjddD]}x||jD]r}i}||j<x:|jD]0}|dkr^P|||} |dksx| tkrP| } |}qPWx"|jD]} |j|j| || <qWq6Wq*W|S)Nc svd}|j}|j}|j}xZ|jD]P}|j|j|||}||||d}|jkr|tdt||7}qW|S)Nrg@) _xbars _minimums _maximums_standard_variable_ids_x_nameZ_integer_toleranceminabs) Zscen tree_nodedistxbarsminsmaxs variable_idZdiffZs_est)ph:/tmp/pip-unpacked-wheel-bi3529v6/pyomo/pysp/phboundbase.py ScenXbarDists  zOExtractInternalNodeSolutionsWithClosestScenarioNodebyNode..ScenXbarDistr)_scenario_tree_stages _tree_nodesr _scenariosZ ClostScenDistr r ) rnode_solutionsrZ ClosestScenZClosestScenDiststager this_node_solscenarioZthisdistZClosestScendistrr)rr9ExtractInternalNodeSolutionsWithClosestScenarioNodebyNodes"      r#cCsi}xx|jjddD]d}x^|jD]T}i}||j<|j}x:|jD]0}||s^||||<qBtt||||<qBWq"WqW|S)Nr) rrrr rr is_variable_discreteintround)rrr rr!rrrrr0ExtractInternalNodeSolutionsWithDiscreteRounding@s    r'c si}x|jjddD]}x|jD]i}|j<j}xjD]s^||<qBfddjD}tt |}g}x.|D]&| t fddjDqW|| t ||<qBWq"WqW|S)Nrcs$g|]}tt|jjqSr)r%r&r r ).0r")rrrr eszBExtractInternalNodeSolutionsWithDiscreteVoting..c3s0|](}tt|jjkr|jVqdS)N)r%r&r r _probability)r(r")rvalrrr jszAExtractInternalNodeSolutionsWithDiscreteVoting..)rrrr rr r$rlistsetappendsumindexmax)rrr r!rvalsZbinsZvoter)rr+rr.ExtractInternalNodeSolutionsWithDiscreteVotingRs"       "r4cCs^ddlm}td|ji}xZ|||jD]J\}}}x>t|D]2\}}x(|D] }||kr`i||<||||<qLWq>Wq*W|j} i} x|jjddD]} x| jD]} i} | | j <| j }| j }| j }d}xl| j D]`}| r | j|\}}|t|}td|||ks"||drz| |sP||| |<| rxtd| |n(tt||| |<| r.css |]}|jt|jfVqdS)N)r rarbrY)r(rrrrr,ls) dictrrclear_fix_queuer r\rXrNr/rV)rOrrfrgrrrrrRelaxPHFixedVariableses z"_PHBoundBase.RelaxPHFixedVariablesc Csi}i}x<|jjD]0}t|j||j<t|j||j<|qWx>|D]6}|jj|}x$t ||D]\}}| ||qjWqLW| |j |j||ffdS)N)rrrarbrjr rYrlZ_tree_node_maprrWrXrNr/r[) rOrZ fix_valuesrfrgrr9rZfix_valrrrFixScenarioTreeVariables|s    z%_PHBoundBase.FixScenarioTreeVariablescCs||j|jdfdS)N)Z&deactivate_ph_objective_proximal_termsrNr/r])rOrrrr"DeactivatePHObjectiveProximalTermssz/_PHBoundBase.DeactivatePHObjectiveProximalTermscCs||j|jdfdS)N)Z$deactivate_ph_objective_weight_termsrNr/r_)rOrrrr DeactivatePHObjectiveWeightTermssz-_PHBoundBase.DeactivatePHObjectiveWeightTermscCs>i}x"|jjD]}t|j||j<qW|j|j|fdS)N) rrrarbrcr rNr/r`)rOrrhr"rrrCachePHWeightssz_PHBoundBase.CachePHWeightsc Cs|jrtd|jrdnd|j}|jdk rJ|jdkrJtd||jO}d}|j rx|jj D]}|j |j }d}x.|jj D]"}|j|j j} || |j7}qWt|ts|dkr||jO}|jr||8}q||7}n ||jO}|||j7}qbWnzxx|jj D]l}|j} |j |j } t| tsV| dkr`||jO}|jrL| | 8} n| | 7} n ||jO}||j| 7}qW|jrtd|jrdnd||j|df||fS) NzComputing objective %s boundouterinnerrztA nonzero mipgap was detected when using the PH bound plugin. The bound computation may as a result be conservative.gz%Computed objective %s bound=%12.4f %s)r8r6rM STATUS_NONEZ_mipgaploggerwarning STATUS_MIPGAPrZcontains_bundlesZ_scenario_bundlesZ_gapsr rZ get_scenario _objectiver* isinstancerSTATUS_GAP_NONZERO STATUS_GAP_NAWARNING_MESSAGEget) rOr storage_keyZ bound_statusobjective_boundZscenario_bundleZ bundle_gapZbundle_objective_valuer"Zscenario_objectiveZthis_objective_valueZthis_gaprrrComputeOuterBoundsT                z_PHBoundBase.ComputeOuterBoundcCsl|jrtd|jrdndd}x |jjD]}||j|j7}q*W|jrbtd|jrVdnd|f||jfS)NzComputing objective %s boundrsrrgz"Computed objective %s bound=%12.4f)r8r6rMrrr*ryru)rOrrrr"rrrComputeInnerBounds  z_PHBoundBase.ComputeInnerBoundcCstdd}t|jdkr>|jr0t|j}nt|j}td|d}t|jdkr|jr~t|jt dd\}}nt|jt dd\}}td||j |j |dftdt ||td}|tdkr$|td kr$|td kr$|td kr$t ||d t |}td |d d ftdd}t|d}|d||d||td|dS)NrtrzBest Incumbent Bound: %15srC)keyzBest Dual Bound: %15s %szAbsolute Duality Gap: %15sinfz-infg|=zRelative Gap: %15s %sgY@%zphbestbound.txtwzIncumbent: %.17g z Dual: %.17g zBest bound written to file=)r6rQrLrMrvaluesr2rJitemsrr}r~rKrfloatopenwriteclose)rOZbest_inner_boundZ best_boundZbest_bound_keyZrelgapoutput_filename output_filerrrReportBestBoundsF    z_PHBoundBase.ReportBestBoundc Csjtdtdtddt|j}d|krf|dtddd|jd|j|jddfx@t|D]4}td||j ||j||j|j|dfqpWtdd}t |d }| d x.t|j D]}| d ||j |fqW| d d|jkr$| d |jdx*t|D]}| d ||j|fq.WWdQRXtd|dS)Nrtz Bound Historyz%15s %15s %15s)Z Iterationz Inner Boundz Outer Boundz%15s %15s %15s %sZTrivialz - z phbound.txtrz Inner Bound: z %d: %.17g z Outer Bound: z Trivial: %.17g zBound history written to file=) r6r-rJkeysremover}r~rKsortedrLrr)rOrrrrrrrReportBoundHistoryAsD       z_PHBoundBase.ReportBoundHistoryN)__name__ __module__ __qualname__rurxr|r{ZSTATUS_SOLVE_FAILEDr}rUrVr]r_r`r[rPrTrSrirmrnrorprqrrrrrrrrrBs>J R+rB) __future__rr=loggingrasixroperatorrZpyomo.pysp.phutilsrZ pyomo.optr getLoggerrvr#r'r4r;rAobjectrBrrrr s      &!B