B u `"@sddlZddlmZmZmZmZmZmZmZm Z m Z m Z m Z ddl mZddlmZddlmZmZddlmZGdddeZdS) N) ConcreteModelSuffixVarBlockSetRangeSet Objective ConstraintNonNegativeReals sum_productvalue) 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).0nameindicesidxrr:/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/pysp/dualphmodel.py sz,DualPHModel._create_model..r)rrZIMPORTdual_ph_scenario_tree_stages _tree_nodessetattr_namergetattrZ var_to_id id_to_var enumerater_variable_indicesappendrlen var_index_model)selfmodelstage tree_nodeblockZcntrvarindexrrr _create_models  &zDualPHModel._create_modelcCs<||_d|_d|_i|_i|_i|_d|_g|_|dS)NFr) rr,_solved_alphas_wprod_wbars_iter_historyr4)r-phrrr__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)r6r>)ri)r.r-rrrEsz&DualPHModel.add_cut..rcs<tfddjD}t|ts4tjS|dkS)Nc3sD|]<}j|j|jjdjdVqdS)rrN)r>r8r$r&)rk)r1rBr.r-r0rrrMsz7DualPHModel.add_cut.._c_rule..r)sumr>Z index_set isinstancerr ZSkip)r1rBlhs)r.r-r0)r1rBr_c_ruleLs$ z$DualPHModel.add_cut.._c_rulecon)ZruleF)#r9r,$_compute_weight_weight_inner_productr7_compute_objective_termr_rhor6"_compute_xbar_weight_inner_productr5_compute_convergenceZ del_componentrsortedkeysr=rr r>r r r?rrDrAr8r r!r"copydeepcopyr$r%r+rH)r-firstr/r1rGr)r.r-r0radd_cut0s4,      "    zDualPHModel.add_cutcCs:td}|j}|j|||d|_|dS)NZcplexT)r r,rZ clearValueloadsolver5_update_tree_node_xbars)r-optr.rrrrUUs  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)rN)r:)rx)r-rrrfsz3DualPHModel._compute_convergence..rg?z Set rho to z ?n)Z rho_valueg?FT)r,rr? _compute_xbar_wbar_inner_productr6r9printstrr:r)allrrK raw_inputr _instancesr listrOr7)r-r.Zdual_convergenceZrho_oldZrho_newrBr)r-rrM]s   *.z DualPHModel._compute_convergencecCsBd}x8|jjjD]*}|jj|j}||j tt|7}qW|S)Ng)rr _scenariosr`r$ _probabilityr r)r-totalscenarioinstancerrrrJrs 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_) rr r!r"rr(rbr`r$r%rcr ) r-Z w_inner_prodr/r0 variable_namevariable_indicesweight_parameter_nameZrho_parameter_namererfweight_parameterZ rho_parameterr3rrrrIys     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)Ngrrg) rr r!r"_xbarsrr(rbr`r$r%rcr ) r- inner_prodr/r0tree_node_xbarsrhrirjvar_xbarrerfrkr3rrrrLs    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)rr r!r"rlr8rr() r-rmr/r0rnZtree_node_wbarsrhriroZvar_wbarr3rrrr[s  $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)Nrrr) r,rr r!r"r%r$rrHr&rrlr\) r-r.r/r0r1rZcon_datavar_namer+rrrrVs  z#DualPHModel._update_tree_node_xbarsN)F) __name__ __module__ __qualname__r4r<rSrUrMrJrIrLr[rVrrrrrs %r)rPZ pyomo.corerrrrrrrr r r r Z pyomo.optr Zpyomo.core.expr.currentrZpyomo.pysp.phutilsrrsixrobjectrrrrr s 4