B _!@sXddlZddlTddlmZddlmZddlmZmZddl m Z Gddde Z dS) N)*) SolverFactory)ExpressionBase)update_all_rhosfind_active_objective) iteritemsc@s^eZdZddZddZdddZdd Zd d Zd d ZddZ ddZ ddZ ddZ dS) DualPHModelcCst}ttjdd|_x|jjjddD]}x|jD]}t||j t t ||j }i|_ g|_ xFtddt|jDD]*\}\}}||j ||f<|j ||fq|Wtdt|j d|_q6Wq*W||_dS)Ng) directiondefaultcss$|]\}}|D]}||fVqqdS)N).0nameindicesidxr r :/tmp/pip-unpacked-wheel-d4p3hk07/pyomo/pysp/dualphmodel.py sz,DualPHModel._create_model..r)Z ConcreteModelZSuffixZIMPORTdual_ph_scenario_tree_stages _tree_nodessetattr_nameZBlockgetattrZ var_to_id id_to_var enumerater_variable_indicesappendZRangeSetlen var_index_model)selfmodelstage tree_nodeblockZcntrvarindexr r r _create_models  &zDualPHModel._create_modelcCs<||_d|_d|_i|_i|_i|_d|_g|_|dS)NFr ) rr"_solved_alphas_wprod_wbars_iter_historyr*)r#phr r r__init__%szDualPHModel.__init__Fcsjd7_jjj<|dkrXjjdjj jj<n jj<j dkr dkrdS dt t jd_ dtjtd_ dttjdkd _ d ttfd d jDd _ijj<x~jjjdd D]h}x`|jD]Vtjjjj<t j}fdd}| dt|j!|d|_"q>Wq2WdS)NrTg@cuts)Z initializebeta)Zwithin beta_sum_one)exprobjc3s"|]}j|j|VqdS)N)r,r4)r i)r$r#r rrEsz&DualPHModel.add_cut..r cs<tfddjD}t|ts4tjS|dkS)Nc3sD|]<}j|j|jjdjdVqdS)rrN)r4r.rr)r k)r'r8r$r#r&r rrMsz7DualPHModel.add_cut.._c_rule..r)sumr4Z index_set isinstancer ConstraintZSkip)r'r8lhs)r$r#r&)r'r8r_c_ruleLs$ z$DualPHModel.add_cut.._c_rulecon)ZruleF)#r/r"$_compute_weight_weight_inner_productr-_compute_objective_termr_rhor,"_compute_xbar_weight_inner_productr+_compute_convergenceZ del_componentSetsortedkeysr3ZVarZNonNegativeRealsr4r<Z sum_productr5Z Objectiver:r7r.rrrcopydeepcopyrrr!r?)r#firstr%r'r>r )r$r#r&radd_cut0s4,      "    zDualPHModel.add_cutcCs:td}|j}|j|||d|_|dS)NZcplexT)rr"rZ clearValueloadsolver+_update_tree_node_xbars)r#optr$r r rrMUs  zDualPHModel.solvecsj}|j|jjj}tdt|j |jdkr|dksxt fddjddDrj j }|d}j _ t d t|d d ks tj jj jj j d x@tjD].}j|d |d |j|j|<qWdSdSdS)Nz**** Convergence Metric: rg-C6?c3s|]}jd|kVqdS)r N)r0)r x)r#r rrfsz3DualPHModel._compute_convergence..r g?z Set rho to z ?n)Z rho_valueg?FT)r"rr5 _compute_xbar_wbar_inner_productr,r/printstrr0rallrrB raw_inputr _instancesrlistrGr-)r#r$Zdual_convergenceZrho_oldZrho_newr8r )r#rrD]s   *.z DualPHModel._compute_convergencecCsBd}x8|jjjD]*}|jj|j}||j tt|7}qW|S)Ng)rr _scenariosrXr _probabilityvaluer)r#totalscenarioinstancer r rrArs z#DualPHModel._compute_objective_termc Csd}x|jjjddD]}x|jD]}xt|jD]v\}}d|}d|}x\|jD]R}|jj|j} t | |} t | |} x*|D]"} ||j | | j | | j 7}qWqTWq4Wq$WqW|S)Ngr PHWEIGHT_ZPHRHO_) rrrrrrrZrXrrr[r\) r#Z w_inner_prodr%r& variable_namevariable_indicesweight_parameter_nameZrho_parameter_namer^r_weight_parameterZ rho_parameterr)r r rr@ys     2z0DualPHModel._compute_weight_weight_inner_productc Csd}x|jjjddD]}x|jD]}|j}xxt|jD]j\}}d|}||}xP|jD]F} |jj| j } t | |} x(|D] } || j || | | j 7}q|WqZWq:Wq$WqW|S)Ngr r`) rrrr_xbarsrrrZrXrrr[r\) r# inner_prodr%r&tree_node_xbarsrarbrcvar_xbarr^r_rdr)r r rrCs    0z.DualPHModel._compute_xbar_weight_inner_productc Csd}x|jjjddD]j}xd|jD]Z}|j}|j}xHt|jD]:\}}||}||} x |D]} ||| | | 7}q^Wq@Wq$WqW|S)Ngr )rrrrrer.rr) r#rfr%r&rgZtree_node_wbarsrarbrhZvar_wbarr)r r rrSs  $z,DualPHModel._compute_xbar_wbar_inner_productc Cs|j}x|jjjddD]x}xb|jD]X}t||j}xFt|jD]8\}}|j |d}|j |d}|j ||j ||<qBWq&Wt |jdj qWdS)Nr rr) r"rrrrrrrr?rrrerT) r#r$r%r&r'rZcon_datavar_namer!r r rrNs  z#DualPHModel._update_tree_node_xbarsN)F) __name__ __module__ __qualname__r*r2rKrMrDrAr@rCrSrNr r r rrs %r) rHZ pyomo.coreZ pyomo.optrZpyomo.core.expr.currentrZpyomo.pysp.phutilsrrsixrobjectrr r r r s