B _#6@sddlZddlmZddlmZddlmZmZGdddeZ Gddde Z Gd d d e Z Gd d d e Z Gd dde Z Gddde ZGddde ZdS)N)fabs)2scenario_tree_node_variables_generator_noinstances) iteritemsiterkeysc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ 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) NrgTZconvergence_thresholdZconvergence_threshold_senseFzUnknown option=z1 specified in call to ConvergenceBase constructor)_name_metric_history_largest_iteration_key_convergence_threshold_test_for_le_thresholdprint)selfargskwdskeyr:/tmp/pip-unpacked-wheel-d4p3hk07/pyomo/pysp/convergence.py__init__$s   zConvergenceBase.__init__cCs|jdS)N)r clear)rrrrresetDszConvergenceBase.resetcCs:t|jdkrtdtt|j|jks.t|j|jS)Nrz;ConvergenceBase::lastMetric() invoked with 0-length history)lenr RuntimeErrormaxrr AssertionError)rrrr lastMetricHs   zConvergenceBase.lastMetriccCs*||||}||j|<t|j||_dS)N) computeMetricr rr )rZ iteration_idph scenario_tree instancesZ current_valuerrrupdateRs zConvergenceBase.updatecCs tddS)Nz6ConvergenceBase::computeMetric() is an abstract method)NotImplementedError)rrrZ solutionsrrrrYszConvergenceBase.computeMetriccCs6|dkrdS|jr$||jkS||jkSdS)NF)rr r )rrrrr isConverged^s  zConvergenceBase.isConvergedcCs*|j}td|j|}|j||j|kS)Nr)r minr )rZ iteration_lagZlast_iterationZreference_iterationrrr isImprovinghszConvergenceBase.isImprovingcCs|tdxntt|jD]\}|j|}|dkr@td|dfqd}|jdkrX|d7}n|d7}td|||fqWdS)NzIteration Metric Valuez %5d %12sNonerg-C6?z%14.4fz%14.3e)r sortedrr r )rrvalZmetric_format_stringrrrpprintps   zConvergenceBase.pprintN) __name__ __module__ __qualname____doc__rrrr rr"r$r(rrrrrs   rcsZeZdZdZfddZeddZeddZedd Zedd d Z d dZ Z S)PrimalDualResidualConvergencezI Constructor Arguments: None beyond those in the base class. cs"tt|j||d|_d|_dS)NzPrimalDual-Residual)superr-rr_previous_average)rrr) __class__rrrsz&PrimalDualResidualConvergence.__init__cCsDi}x:|jjddD]&}x |jD]}t|j||j<q"WqW|S)N)rstagesnodescopydeepcopy _averagesname)rprevious_averagestage tree_noderrrsnapshot_averages  z.PrimalDualResidualConvergence.snapshot_averagec Csd}x|jjddD]}x|jD]v}d}||j}xT|jD]J}|j|j}d} x&|jD]} | || || d7} qXW||j| 7}qr7r?r@rA) rZprimal_residual_squared_normr9r:Z!node_primal_residual_squared_norm node_averagerCrDZ%scenario_primal_residual_squared_normrErrr$compute_primal_residual_squared_norms&     zBPrimalDualResidualConvergence.compute_primal_residual_squared_normTc Csd}x|jjddD]}x|jD]}d}||j}|j}|jdj|j} xP|jD]F} |r|| | d|| || d7}qT||| || d7}qTW||j|7}q"WqW|S)Ngr1rr<) rr2r3r7r6Z _scenariosZ_rhor?rA) rr8Z rho_scaledZdual_residual_squared_normr9r:Znode_dual_residual_squared_normrBrGZnode_rhorErrr"compute_dual_residual_squared_norms(    z@PrimalDualResidualConvergence.compute_dual_residual_squared_normcCs<|j}|||_|dkrdS||}|||}||S)N)r/r;rHrI)rrrrr8ZprsqnZdrsqnrrrrs  z+PrimalDualResidualConvergence.computeMetric)T) r)r*r+r,r staticmethodr;rFrHrIr __classcell__rr)r0rr-s    r-c@s eZdZdZddZddZdS)TermDiffConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f||d|_dS)Nz Term diff)rrr)rrrrrrrszTermDiffConvergence.__init__c Cs`d}xVt|dddD]D\}}}}} } | r,| rx*|D]"\} } || t| |j|7}q2WqW|S)NgF)includeDerivedVariablesincludeLastStage)rrr6) rrrrZ term_diffr9r:rEvariable_valuesis_fixedis_stale var_valuescenario_probabilityrrrrsz!TermDiffConvergence.computeMetricN)r)r*r+r,rrrrrrrLsrLc@s eZdZdZddZddZdS)NormalizedTermDiffConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f||d|_dS)NzNormalized term diff)rrr)rrrrrrrsz&NormalizedTermDiffConvergence.__init__cCsd}xjt|dddD]X\}}}}} } |j|} | r6| rt| dkrx(|D] \} } || t| | | 7}qHWqW||j|j}|S)NgF)rMrNg-C6?)rr6r_total_discrete_varsZ_total_continuous_vars)rrrrZnormalized_term_diffr9r:rErOrPrQZ average_valuerRrSrrrrs   z+NormalizedTermDiffConvergence.computeMetricN)r)r*r+r,rrrrrrrTsrTc@s eZdZdZddZddZdS)NumFixedDiscreteVarConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f||d|_dS)Nz"Number of fixed discrete variables)rrr)rrrrrrrEsz'NumFixedDiscreteVarConvergence.__init__cCs |j|jS)N)rUZ_total_fixed_discrete_vars)rrrrrrrrJsz,NumFixedDiscreteVarConvergence.computeMetricN)r)r*r+r,rrrrrrrV?srVc@s eZdZdZddZddZdS)OuterBoundConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f||d|_dS)Nz Outer bound)rrr)rrrrrrr[szOuterBoundConvergence.__init__cCs|jS)N)_best_reported_outer_bound)rrrrrrrr`sz#OuterBoundConvergence.computeMetricN)r)r*r+r,rrrrrrrWUsrWc@s eZdZdZddZddZdS)InnerOuterConvergencezJ Constructor Arguments: None beyond those in the base class. cOstj|f||d|_dS)NzInner Outer gap bound)rrr)rrrrrrrnszInnerOuterConvergence.__init__cCs0|jdks|jdkrtdSt|j|jSdS)Ninf)rXZ_best_reported_inner_boundfloatabs)rrrrrrrrss   z#InnerOuterConvergence.computeMetricN)r)r*r+r,rrrrrrrYhsrY)r4mathrZpyomo.pysp.generatorsrsixrrobjectrr-rLrTrVrWrYrrrr s   dh).