B u `U@sddlmZmZmZddlmZddlZddlmZm Z m Z m Z m Z ddl mZddZdd Zd d Zd d ZddZddZddZddZdS))fabslogexp)xrangeN)Set Constraint Expression BooleanSetvalue) indexToStringcCsg}|||||}|} xTtd|dD]B} | } | |} t| ||krht| ||krh|| | |7} q.Wt|||krt|||kr|||||} |} xTtd|dD]B} | } | | } t| ||krt| ||kr|| | | 7} qW|||S)N)appendranger)lbnode_minxavgnode_maxubnum_breakpoints_per_side tolerance breakpointsZ left_step current_xithis_lbthis_ubZ right_stepr:/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/pysp/phobjective.pycompute_uniform_breakpoints s,            rc Csg}||t|||kr8t|||kr8|||||}|} xdtd|dD]R} | } | |} t| ||krt| ||krt| ||kr|| | |7} qXWt|||krt|||kr||||t|||krt|||kr||||S)Nr )r rrsort) rrrrrnum_breakpointsrrsteprrrrrrr,compute_uniform_between_nodestat_breakpointsKs&    0     $ r!cCs@g}||t|d|||d||}t|d|||d||} t|||kr|t|||kr|||| ||} |} xdtd|dD]R} | } | | }t| ||krt| | |krt| ||kr|| | | 7} qWt| ||kr t| ||kr || ||||||S)Ng@g?r )r maxminrrr)rrrrrrrrleftrightr rrrrrrr,compute_uniform_between_woodruff_breakpointsss( ""   0  $   r&cCsg}||||}tt||} | } xPtd|dD]>} || } t| ||krpt| ||krp|| | | 9} q:W||||} tt| |} | } xPtd|dD]>} || } t| ||krt| ||kr|| | | 9} qW|||S)Nr )r rrrr)rrrrrrrrZ left_deltabasecurrent_offsetrrZ right_deltarrr)compute_exponential_from_mean_breakpointss*         r)c Csp||||}||||}d}t|||krF||||}nd}|||} d|||| df} | S)Ng)r) rrZinstance_variableZvariable_averageZ quad_variablerZ penalty_at_lbZ penalty_at_ubZslopeZ interceptZ expressionrrr!create_piecewise_constraint_tuples r*c Cs||j}|j}d}|jj}xl|jddD]Z}dt|j}||} x<|j D]2} | |j krbqR|| } | j dkrR|| | | 7}qRWq.Wt |d} |_ |j| 7_| |fS)NgZ PHWEIGHT_F) initialize) get_scenarioname_instance_objective_ScenarioTreeSymbolMapbySymbol _node_liststr_namefind_component _variable_ids_derived_variable_idsfixedrZPHWEIGHT_EXPRESSIONexpr) instance_nameinstance scenario_treescenario objectiveZweight_expressionnodeid_to_vardata_map tree_nodeZw_parameter_nameZ w_parameter variable_idinstance_vardataZweight_expression_componentrrradd_ph_objective_weight_termss      rCcCs||j}|j}|}d}|jj} xf|jddD]R} dt| j} | | } dt| j} | | }dt| j}| |}d}|dkrdt| j}| |}x| j D]}|| j krq| |}|j dkrt |jtr|dkrr|r4|||||d |d | ||| || |7}n<|||||d |d | ||| || |8}nh|r|||||d || ||| |7}n0|||||d || ||| |8}q|dkr |r|||d ||7}n|||d ||8}q|rX|||||d || ||| |7}q|||||d || ||| |8}qWq8Wt|d }|_|j|7_||fS) Ngr+ZPHXBAR_ZPHRHO_ZPHBLEND_rPHQUADPENALTY_Fg@)r,)r-r.r/ is_minimizingr0r1r2r3r4r5r6r7r8 isinstancedomainr rZPHPROXIMAL_EXPRESSIONr9)r:r;r<!linearize_nonbinary_penalty_termsZretain_quadratic_binary_termsr=r>rEZproximal_expressionr?r@Zxbar_parameter_nameZxbar_parameterZrho_parameter_nameZ rho_parameterZblend_parameter_nameZblend_parameterZquad_penalty_term_variableZquad_penalty_term_variable_namerArBZproximal_expression_componentrrradd_ph_objective_proximal_termssN        >>22 28rIc& Csg}d}||}|dkr>ttd|dd|d}|||||} |jj} x| jddD]r} | j} dt | j } || }dt | j }||}|dk r| nP| |d t | j }||}|dk st t|||d }||||x| jD]}|| jkr q || jkrT| j|\}}td |t|| j f|| jkr| j|\}}td |t|| j f| |}| j|}| j|}| |}|jd kr |jd kr t|jtd kr |}|jdks|jdkrd}t||jt|j}t|j}y.t t!t"t#f|}|||||||f}||} Wn2tk rxt$%d}!d}t||YnXxTt&t'| dD]@}"| |"}#| |"d}$t(|#|$|||||}%|)||"f|%qWq WqbW|S)NZPH_LINEARIZATION_INDEX_SETrr )r,Zdimenr.r+rDZPH_LINEARIZATION_ZPHINDEX_)r.zeNo minimum value statistic found for variable=%s on tree node=%s; cannot form linearized PH objectivezfNo maximums value statistic found for variable=%s on tree node=%s; cannot form linearized PH objectiveFzzMissing bound for variable '%s' Both lower and upper bounds required when piece-wise approximating quadratic penalty termszMA breakpoint distribution strategy (%s) is currently not supported within PH!)*r5rrZ add_componentr-r0r1r2Z_xbarsr3r4clearr AssertionErrorrZ constructr6r7Z _minimums RuntimeErrorr Z _maximumsstaler8rFrGr rr ValueErrorr.r rr!r&r)sysexc_inforlenr*add)&r:r;r<rHZbreakpoint_strategyrZnew_instance_attributesZlinearization_index_set_nameZlinearization_index_setr=r?r@Z xbar_dictZlinearized_cost_variable_nameZlinearized_cost_variableZlinearization_constraint_nameZlinearization_constraintZnodal_index_set_nameZnodal_index_setrAZ variable_nameindexZxbarrrrBxmsgrrZstrategyargsrerrrZ segment_tuplerrr%form_linearized_objective_constraintsbs                           rY)mathrrrZ six.movesrrPZ pyomo.corerrrr r Zpyomo.pysp.phutilsr rr!r&r)r*rCrIrYrrrrs  +(*-*\