B _U@sxddlmZmZmZddlmZddlTddlmZddZ ddZ d d Z d d Z d dZ ddZddZddZdS))fabslogexp)xrange)*) 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-d4p3hk07/pyomo/pysp/phobjective.pycompute_uniform_breakpointss,            rc Csg}||t|||kr8t|||kr8|||||}|} xdtd|dD]R} | } | |} t| ||krt| ||krt| ||kr|| | |7} qXWt|||krt|||kr||||t|||krt|||kr||||S)Nr)r rr sort) r r r rrnum_breakpointsrrsteprrrrrrr,compute_uniform_between_nodestat_breakpointsJs&    0     $ rcCs@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 maxminrr r)r r r rrrrrleftrightrrrrrrrr,compute_uniform_between_woodruff_breakpointsrs( ""   0  $   r"cCsg}||||}tt||} | } xPtd|dD]>} || } t| ||krpt| ||krp|| | | 9} q:W||||} tt| |} | } xPtd|dD]>} || } t| ||krt| ||kr|| | | 9} qW|||S)Nr)r rrr r)r r r rrrrrZ left_deltabasecurrent_offsetrrZ right_deltarrr)compute_exponential_from_mean_breakpointss*         r%c Csp||||}||||}d}t|||krF||||}nd}|||} d|||| df} | S)Ng)r) r rZinstance_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_idsfixed ExpressionZPHWEIGHT_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      r@cCs||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_minimizingr,r-r.r/r0r1r2r3r4 isinstancedomain BooleanSetr5ZPHPROXIMAL_EXPRESSIONr6)r7r8r9!linearize_nonbinary_penalty_termsZretain_quadratic_binary_termsr:r;rBZproximal_expressionr<r=Zxbar_parameter_nameZxbar_parameterZrho_parameter_nameZ rho_parameterZblend_parameter_nameZblend_parameterZquad_penalty_term_variableZquad_penalty_term_variable_namer>r?Zproximal_expression_componentrrradd_ph_objective_proximal_termssN        >>22 28rGc& 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'rAZPH_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!)*r1Setr Z add_componentr)r,r-r.Z_xbarsr/r0clearr AssertionErrorZ ConstraintZ constructr2r3Z _minimums RuntimeErrorrZ _maximumsstaler4rCrDrEr r ValueErrorr*valuerrr"r%sysexc_inforlenr&add)&r7r8r9rFZbreakpoint_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_setr>Z variable_nameindexZxbarr rr?xmsgr rZstrategyargsrerrrZ segment_tuplerrr%form_linearized_objective_constraintsas                           rYN)mathrrrZ six.movesrZ pyomo.coreZpyomo.pysp.phutilsrrrr"r%r&r@rGrYrrrrs  +(*-*\