B u `6ã@s ddlZddlmZddlmZddlmZGdd„deƒZGdd„deƒZ Gd d „d eƒZ Gd d „d eƒZ Gd d„deƒZ Gdd„deƒZ Gdd„deƒZdS)éN)Úfabs)Ú2scenario_tree_node_variables_generator_noinstances)Úiterkeysc@sPeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dS)ÚConvergenceBasea Constructor Arguments: convergence_threshold numeric threshold at-or-below which a set of scenario solutions is considered converged. (must be >= 0.0) cOsxd|_i|_d|_d|_d|_xT|D]L}|dkr<|||_q$|dkr`||dkrXd|_qpd|_q$td|d ƒq$WdS) NÚrgTZconvergence_thresholdZconvergence_threshold_senseFzUnknown option=z1 specified in call to ConvergenceBase constructor)Ú_nameÚ_metric_historyÚ_largest_iteration_keyÚ_convergence_thresholdÚ_test_for_le_thresholdÚprint)ÚselfÚargsÚkwdsÚkey©rú:/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/pysp/convergence.pyÚ__init__$s   zConvergenceBase.__init__cCs|j ¡dS)N)rÚclear)r rrrÚresetDszConvergenceBase.resetcCs:t|jƒdkrtdƒ‚tt|jƒƒ|jks.t‚|j|jS)Nrz;ConvergenceBase::lastMetric() invoked with 0-length history)ÚlenrÚ RuntimeErrorÚmaxrr ÚAssertionError)r rrrÚ lastMetricHs   zConvergenceBase.lastMetriccCs*| |||¡}||j|<t|j|ƒ|_dS)N)Ú computeMetricrrr )r Z iteration_idÚphÚ scenario_treeÚ instancesZ current_valuerrrÚupdateRs zConvergenceBase.updatecCs tdƒ‚dS)Nz6ConvergenceBase::computeMetric() is an abstract method)ÚNotImplementedError)r rrZ solutionsrrrrYszConvergenceBase.computeMetriccCs6| ¡dkrdS|jr$| ¡|jkS| ¡|jkSdS)NF)rr r )r rrrrÚ isConverged^s  zConvergenceBase.isConvergedcCs*|j}td|j|ƒ}|j||j|kS)Nr)r Úminr)r Z iteration_lagZlast_iterationZreference_iterationrrrÚ isImprovinghszConvergenceBase.isImprovingcCs|tdƒxntt|jƒƒD]\}|j|}|dkr@td|dfƒqd}|jdkrX|d7}n|d7}td|||fƒqWdS)NzIteration Metric Valuez %5d %12sÚNonerg-Cëâ6?z%14.4fz%14.3e)r Úsortedrrr )r rÚvalZmetric_format_stringrrrÚpprintps   zConvergenceBase.pprintN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrrrr!r#r'rrrrrs   rcsZeZdZdZ‡fdd„Zedd„ƒZedd„ƒZedd „ƒZedd d „ƒZ d d„Z ‡Z S)ÚPrimalDualResidualConvergencezI Constructor Arguments: None beyond those in the base class. cs"tt|ƒj||Žd|_d|_dS)NzPrimalDual-Residual)Úsuperr,rrÚ_previous_average)r rr)Ú __class__rrr„sz&PrimalDualResidualConvergence.__init__cCsDi}x:|jjdd…D]&}x |jD]}t |j¡||j<q"WqW|S)Néÿÿÿÿ)rÚstagesÚnodesÚcopyÚdeepcopyÚ _averagesÚname)rÚprevious_averageÚstageÚ tree_noderrrÚsnapshot_average‰s  z.PrimalDualResidualConvergence.snapshot_averagec Cs¤d}xš|jjdd…D]†}x€|jD]v}d}||j}xT|jD]J}|j|j}d} x&|jD]} | || || d7} qXW||j| 7}qr?r@) rZprimal_residual_squared_normr8r9Z!node_primal_residual_squared_normÚ node_averagerBrCZ%scenario_primal_residual_squared_normrDrrrÚ$compute_primal_residual_squared_norm¨s&     zBPrimalDualResidualConvergence.compute_primal_residual_squared_normTc Cs¸d}x®|jjdd…D]š}x”|jD]Š}d}||j}|j}|jdj|j} xP|jD]F} |r‚|| | d|| || d7}qT||| || d7}qTW||j|7}q"WqW|S)Ngr0rr;) rr1r2r6r5Z _scenariosZ_rhor>r@) rr7Z rho_scaledZdual_residual_squared_normr8r9Znode_dual_residual_squared_normrArFZnode_rhorDrrrÚ"compute_dual_residual_squared_norm¾s(    z@PrimalDualResidualConvergence.compute_dual_residual_squared_normcCs<|j}| |¡|_|dkrdS| |¡}| ||¡}||S)N)r.r:rGrH)r rrrr7ZprsqnZdrsqnrrrrÖs  z+PrimalDualResidualConvergence.computeMetric)T) r(r)r*r+rÚ staticmethodr:rErGrHrÚ __classcell__rr)r/rr,€s    r,c@s eZdZdZdd„Zdd„ZdS)ÚTermDiffConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f|ž|Žd|_dS)Nz Term diff)rrr)r rrrrrrîszTermDiffConvergence.__init__c Cs`d}xVt|dddD]D\}}}}} } | r,| rx*|D]"\} } || t| |j|ƒ7}q2WqW|S)NgF)ÚincludeDerivedVariablesÚincludeLastStage)rrr5) r rrrZ term_diffr8r9rDÚvariable_valuesÚis_fixedÚis_staleÚ var_valueÚscenario_probabilityrrrrósz!TermDiffConvergence.computeMetricN)r(r)r*r+rrrrrrrKèsrKc@s eZdZdZdd„Zdd„ZdS)ÚNormalizedTermDiffConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f|ž|Žd|_dS)NzNormalized term diff)rrr)r rrrrrrsz&NormalizedTermDiffConvergence.__init__cCs„d}xjt|dddD]X\}}}}} } |j|} | r6| rt| ƒdkrx(|D] \} } || t| | | ƒ7}qHWqW||j|j}|S)NgF)rLrMg-Cëâ6?)rr5rÚ_total_discrete_varsZ_total_continuous_vars)r rrrZnormalized_term_diffr8r9rDrNrOrPZ average_valuerQrRrrrrs   z+NormalizedTermDiffConvergence.computeMetricN)r(r)r*r+rrrrrrrSsrSc@s eZdZdZdd„Zdd„ZdS)ÚNumFixedDiscreteVarConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f|ž|Žd|_dS)Nz"Number of fixed discrete variables)rrr)r rrrrrrEsz'NumFixedDiscreteVarConvergence.__init__cCs |j|jS)N)rTZ_total_fixed_discrete_vars)r rrrrrrrJsz,NumFixedDiscreteVarConvergence.computeMetricN)r(r)r*r+rrrrrrrU?srUc@s eZdZdZdd„Zdd„ZdS)ÚOuterBoundConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f|ž|Žd|_dS)Nz Outer bound)rrr)r rrrrrr[szOuterBoundConvergence.__init__cCs|jS)N)Ú_best_reported_outer_bound)r rrrrrrr`sz#OuterBoundConvergence.computeMetricN)r(r)r*r+rrrrrrrVUsrVc@s eZdZdZdd„Zdd„ZdS)ÚInnerOuterConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f|ž|Žd|_dS)NzInner Outer gap bound)rrr)r rrrrrrnszInnerOuterConvergence.__init__cCs0|jdks|jdkrtdƒSt|j|jƒSdS)NÚinf)rWZ_best_reported_inner_boundÚfloatÚabs)r rrrrrrrss   z#InnerOuterConvergence.computeMetricN)r(r)r*r+rrrrrrrXhsrX)r3ÚmathrZpyomo.pysp.generatorsrÚsixrÚobjectrr,rKrSrUrVrXrrrrÚ s   dh).