Skip to content

Commit

Permalink
Merge pull request remindmodel#1522 from 0UmfHxcvx5J7JoaOhFSs5mncnisT…
Browse files Browse the repository at this point in the history
…JJ6q/dev/resolve_failed_only

only solve regions that do not have a valid solution for this nash iteration
  • Loading branch information
0UmfHxcvx5J7JoaOhFSs5mncnisTJJ6q authored Jan 19, 2024
2 parents cf5eb96 + 91db95a commit fdf6cbe
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 98 deletions.
22 changes: 11 additions & 11 deletions core/loop.gms
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ $endif.calibrate
***-------------------------------------------------------------------
*** load start gdx

execute_loadpoint 'input';
execute_loadpoint "input";

***--------------------------------------------------------------------------
*** start iteration loop
Expand Down Expand Up @@ -64,7 +64,7 @@ $batinclude "./modules/include.gms" presolve
*AJS* In case of fixing, fix to prices from input_ref.gdx (t < cm_startyear).
*** Parameters are not automatically treated by the fixing mechanism above.
if( (cm_startyear gt 2005),
Execute_Loadpoint 'input_ref' p_pvpRef = pm_pvp;
Execute_Loadpoint "input_ref" p_pvpRef = pm_pvp;
pm_pvp(ttot,trade)$( (ttot.val ge 2005) and (ttot.val lt cm_startyear) and (NOT tradeSe(trade))) = p_pvpRef(ttot,trade);
);

Expand All @@ -85,7 +85,7 @@ $batinclude "./modules/include.gms" solve
***---------------------------------------------------------
*** Track of changes between iterations
***---------------------------------------------------------
loop(entyPe$(NOT sameas(entyPe,'peur')),
loop(entyPe$(NOT sameas(entyPe,"peur")),
o_negitr_cumulative_peprod(iteration,entyPe) = 0.031536
* sum(regi,
sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), vm_prodPe.l(ttot,regi,entyPe) * pm_ts(ttot) )
Expand All @@ -95,9 +95,9 @@ loop(entyPe$(NOT sameas(entyPe,'peur')),
);
o_negitr_cumulative_peprod(iteration,"peur") =
sum(regi,
sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), sum(pe2rlf('peur',rlf), 0.4102 * vm_prodPe.l(ttot,regi,'peur') * pm_ts(ttot) ) )
+ sum(ttot$(ttot.val eq 2005), 0.4102 * vm_prodPe.l(ttot,regi,'peur') * pm_ts(ttot) * 0.5 )
+ sum(ttot$(ttot.val eq 2100), 0.4102 * vm_prodPe.l(ttot,regi,'peur') * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 )
sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), sum(pe2rlf("peur",rlf), 0.4102 * vm_prodPe.l(ttot,regi,"peur") * pm_ts(ttot) ) )
+ sum(ttot$(ttot.val eq 2005), 0.4102 * vm_prodPe.l(ttot,regi,"peur") * pm_ts(ttot) * 0.5 )
+ sum(ttot$(ttot.val eq 2100), 0.4102 * vm_prodPe.l(ttot,regi,"peur") * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 )
);
o_negitr_cumulative_CO2_emineg_co2luc(iteration) =
sum(regi,
Expand Down Expand Up @@ -138,9 +138,9 @@ o_negitr_disc_cons_dr5_reg(iteration,regi) =
+ sum(ttot$(ttot.val eq 2100), vm_cons.l(ttot,regi) * (0.95 ** (pm_ttot_val(ttot) - s_t_start)) * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 )
;
o_negitr_disc_cons_drInt_reg(iteration,regi) =
sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), vm_cons.l(ttot,regi) * qm_budget.m(ttot,regi)/ (qm_budget.m('2005',regi) + 1.e-8) * pm_ts(ttot) )
+ sum(ttot$(ttot.val eq 2005), vm_cons.l(ttot,regi) * qm_budget.m(ttot,regi)/ (qm_budget.m('2005',regi) + 1.e-8) * pm_ts(ttot) * 0.5 )
+ sum(ttot$(ttot.val eq 2100), vm_cons.l(ttot,regi) * qm_budget.m(ttot,regi)/ (qm_budget.m('2005',regi) + 1.e-8) * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 )
sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), vm_cons.l(ttot,regi) * qm_budget.m(ttot,regi)/ (qm_budget.m("2005",regi) + 1.e-8) * pm_ts(ttot) )
+ sum(ttot$(ttot.val eq 2005), vm_cons.l(ttot,regi) * qm_budget.m(ttot,regi)/ (qm_budget.m("2005",regi) + 1.e-8) * pm_ts(ttot) * 0.5 )
+ sum(ttot$(ttot.val eq 2100), vm_cons.l(ttot,regi) * qm_budget.m(ttot,regi)/ (qm_budget.m("2005",regi) + 1.e-8) * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 )
;

***--------------------------------------------------------------------------
Expand All @@ -157,15 +157,15 @@ $batinclude "./modules/include.gms" postsolve
*** o_modelstat in solve.gms)
logfile.nr = 1;
if (o_modelstat le 2,
execute_unload 'fulldata';
execute_unload "fulldata";
!! retain gdxes of intermediate iterations by copying them using shell
!! commands
if (c_keep_iteration_gdxes eq 1,
put_utility logfile, "shell" /
"cp fulldata.gdx fulldata_" iteration.val:0:0 ".gdx";
);
else
execute_unload 'non_optimal';
execute_unload "non_optimal";
if (c_keep_iteration_gdxes eq 1,
put_utility logfile, "shell" /
"cp non_optimal.gdx non_optimal_" iteration.val:0:0 ".gdx";
Expand Down
3 changes: 2 additions & 1 deletion core/sets.gms
Original file line number Diff line number Diff line change
Expand Up @@ -916,6 +916,7 @@ $endif.altFeEmiFac
***######################## R SECTION START (MODULES) ###############################
*** THIS CODE IS CREATED AUTOMATICALLY, DO NOT MODIFY THESE LINES DIRECTLY
*** ANY DIRECT MODIFICATION WILL BE LOST AFTER NEXT MODEL START
*** CHANGES CAN BE DONE USING THE RESPECTIVE LINES IN scripts/start/prepare.R

sets

Expand Down Expand Up @@ -955,7 +956,7 @@ sets
codePerformance
/

module2realisation(modules,*) "mapping of modules and active realisations" /
module2realisation(modules,*) "mapping of modules and active realisations" /
macro . %macro%
welfare . %welfare%
PE_FE_parameters . %PE_FE_parameters%
Expand Down
1 change: 0 additions & 1 deletion modules/47_regipol/none/not_used.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ pm_ts,input,questionnaire
cm_postTargetIncrease,input,questionnaire
cm_emiMktTargetDelay,input,questionnaire
pm_histCap,input,questionnaire
vm_emiCdr,input,questionnaire
pm_share_CCS_CCO2,input,questionnaire
pm_emiMktCurrent,input,questionnaire
pm_factorRescaleemiMktCO2Tax,input,questionnaire
Expand Down
2 changes: 2 additions & 0 deletions modules/80_optimization/nash/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ vm_taxrev.l(ttot,regi)$(ttot.val gt 2005) = 0;
vm_co2eq.l(ttot,regi) = 0;
vm_emiAll.l(ttot,regi,enty) = 0;
p80_repy(all_regi,solveinfo80) = 0;
p80_repy_iteration(all_regi,solveinfo80,iteration) = 0;
p80_repy_nashitr_solitr(all_regi,solveinfo80,iteration,sol_itr) = 0;
pm_capCumForeign(ttot,regi,teLearn)$(ttot.val ge 2005)=0;
qm_co2eqCum.m(regi) = 0;
q80_budgetPermRestr.m(regi) = 0;
Expand Down
169 changes: 84 additions & 85 deletions modules/80_optimization/nash/solve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -6,116 +6,115 @@
*** | Contact: [email protected]
*** SOF ./modules/80_optimization/nash/solve.gms

*** -------------------------------------------------------------------
*** open regi loop
*** -------------------------------------------------------------------
regi(all_regi) = no;
hybrid.solvelink = 3;
hybrid.optfile = 9;
$IF %cm_nash_mode% == "serial" hybrid.solvelink = 0;
$IF %cm_nash_mode% == "debug" hybrid.solvelink = 0;
p80_repy(all_regi,'solvestat') = na;
p80_repy(all_regi,'modelstat') = na;

loop(all_regi,
regi(all_regi) = yes;
$ifthene.debug (sameas("%cm_nash_mode%","serial"))OR(sameas("%cm_nash_mode%","debug"))
hybrid.solvelink = 0;
$endif.debug

loop (all_regi,
!! only solve for regions that do not have a valid solution for this nash
!! iteration
if ( sol_itr.val gt 1
AND ( p80_repy(all_regi,"modelstat") eq 2
OR p80_repy(all_regi,"modelstat") eq 7),

*** -------------------------------------------------------------------
*** SOLVE statement
*** -------------------------------------------------------------------
p80_repy(all_regi,solveinfo80) = 0;
continue;
);

if (execError > 0,
execute_unload "abort.gdx";
abort "at least one execution error occured, possibly in the loop";
);
regi(all_regi) = yes;

if (cm_keep_presolve_gdxes eq 1,
execute_unload "presolve_nash.gdx";
sm_tmp = logfile.nr;
sm_tmp2 = logfile.nd;
logfile.nr = 1;
logfile.nd = 0;
put_utility logfile, "shell" /
"mv presolve_nash.gdx presolve_nash_" all_regi.tl "_CES-" sm_CES_calibration_iteration "_Nash-" iteration.val "_Sol-" sol_itr.val ".gdx";
logfile.nr = sm_tmp;
logfile.nd = sm_tmp2;
);
if (execError > 0,
execute_unload "abort.gdx";
abort "at least one execution error occured, possibly in the loop";
);

if (cm_keep_presolve_gdxes eq 1,
execute_unload "presolve_nash.gdx";
sm_tmp = logfile.nr;
sm_tmp2 = logfile.nd;
logfile.nr = 1;
logfile.nd = 0;
put_utility logfile, "shell" /
"mv presolve_nash.gdx presolve_nash_" all_regi.tl "_CES-"
sm_CES_calibration_iteration "_Nash-" iteration.val "_Sol-" sol_itr.val
".gdx";
logfile.nr = sm_tmp;
logfile.nd = sm_tmp2;
);

solve hybrid using nlp maximizing vm_welfareGlob;

$ifthene.debug (sameas("%cm_nash_mode%","serial"))OR(sameas("%cm_nash_mode%","debug"))
p80_repy(all_regi,"solvestat") = hybrid.solvestat;
p80_repy(all_regi,"modelstat") = hybrid.modelstat;
p80_repy(all_regi,"resusd") = hybrid.resusd;
p80_repy(all_regi,"objval") = hybrid.objval;
if (p80_repy(all_regi,"modelstat") eq 2,
p80_repyLastOptim(all_regi,"objval") = p80_repy(all_regi,"objval");
);
$endif.debug

solve hybrid using nlp maximizing vm_welfareGlob;


*** -------------------------------------------------------------------
*** close regi loop
*** -------------------------------------------------------------------

$IFTHEN.debug %cm_nash_mode% == "serial"
p80_repy(all_regi,'solvestat') = hybrid.solvestat;
p80_repy(all_regi,'modelstat') = hybrid.modelstat;
p80_repy(all_regi,'resusd' ) = hybrid.resusd;
p80_repy(all_regi,'objval') = hybrid.objval;
if(p80_repy(all_regi,'modelstat') eq 2,
p80_repyLastOptim(all_regi,'objval') = p80_repy(all_regi,'objval');
);
$ENDIF.debug
*AJS* Any smarter way to merge the last block with this one?
$IFTHEN.debug %cm_nash_mode% == "debug"
p80_repy(all_regi,'solvestat') = hybrid.solvestat;
p80_repy(all_regi,'modelstat') = hybrid.modelstat;
p80_repy(all_regi,'resusd' ) = hybrid.resusd;
p80_repy(all_regi,'objval') = hybrid.objval;
if(p80_repy(all_regi,'modelstat') eq 2,
p80_repyLastOptim(all_regi,'objval') = p80_repy(all_regi,'objval');
);
$ENDIF.debug

regi(all_regi) = no;
regi(all_regi) = NO;
p80_handle(all_regi) = hybrid.handle;
); !! close regi loop

$IFTHEN.debug %cm_nash_mode% == "parallel"
Repeat
loop(all_regi$handlecollect(p80_handle(all_regi)),
p80_repy(all_regi,'solvestat') = hybrid.solvestat;
p80_repy(all_regi,'modelstat') = hybrid.modelstat;
p80_repy(all_regi,'resusd' ) = hybrid.resusd;
p80_repy(all_regi,'objval') = hybrid.objval;
if(p80_repy(all_regi,'modelstat') eq 2,
p80_repyLastOptim(all_regi,'objval') = p80_repy(all_regi,'objval');
);
display$handledelete(p80_handle(all_regi)) 'trouble deleting handles' ;
p80_handle(all_regi) = 0
) ;
display$sleep(5) 'sleep some time';
$ifthen.parallel %cm_nash_mode% == "parallel"
repeat
loop (all_regi$handlecollect(p80_handle(all_regi)),
p80_repy(all_regi,"solvestat") = hybrid.solvestat;
p80_repy(all_regi,"modelstat") = hybrid.modelstat;
p80_repy(all_regi,"resusd") = hybrid.resusd;
p80_repy(all_regi,"objval") = hybrid.objval;

if (p80_repy(all_regi,"modelstat") eq 2,
p80_repyLastOptim(all_regi,"objval") = p80_repy(all_regi,"objval");
);

display$handledelete(p80_handle(all_regi)) "trouble deleting handles" ;
p80_handle(all_regi) = 0
);
display$sleep(5) "sleep some time";
until card(p80_handle) = 0;
$ENDIF.debug
$endif.parallel

regi(all_regi) = yes;
regi(all_regi) = YES;

***internal nash helper paramter:
*** internal nash helper paramter:
pm_SolNonInfes(regi) = 0;
p80_SolNonOpt(regi) = 0;
loop(regi,
if((p80_repy(regi,'modelstat') eq 2) or (p80_repy(regi,'modelstat') eq 7),
pm_SolNonInfes(regi) = 1;
p80_SolNonOpt(regi) = 0;
loop (regi,
if (p80_repy(regi,"modelstat") eq 2 OR p80_repy(regi,"modelstat") eq 7,
pm_SolNonInfes(regi) = 1;
);
if((p80_repy(regi,'modelstat') eq 7), p80_SolNonOpt(regi)= 1);
if (p80_repy(regi,"modelstat") eq 7, p80_SolNonOpt(regi) = 1);
);

***set o_modelstat to the highest value across all regions, ignoring status 7
o_modelstat = smax(regi, p80_repy(regi,'modelstat')$(p80_repy(regi,'modelstat') ne 7) );
*** set o_modelstat to the highest value across all regions, ignoring status 7
o_modelstat
= smax(regi, p80_repy(regi,"modelstat")$(p80_repy(regi,"modelstat") ne 7));

*** in cm_nash_mode=debug mode, enable solprint for next sol_itr when last iteration was non-optimal:
*** in cm_nash_mode=debug mode, enable solprint for next sol_itr when last
*** iteration was non-optimal:
$ifthen.solprint %cm_nash_mode% == "debug"
if(o_modelstat ne 2,
if (o_modelstat ne 2,
option solprint = on;
);
$endif.solprint

p80_repy_iteration(all_regi,solveinfo80,iteration) = p80_repy(all_regi,solveinfo80);
p80_repy_nashitr_solitr(all_regi,solveinfo80,iteration,sol_itr)
p80_repy_iteration(all_regi,solveinfo80,iteration)$(
p80_repy(all_regi,solveinfo80) )
!! store sum of resusd for all sol_itrs
= ( p80_repy_iteration(all_regi,solveinfo80,iteration)
+ p80_repy(all_regi,solveinfo80)
)$( sameas(solveinfo80,"resusd") )
+ p80_repy(all_regi,solveinfo80)$( NOT sameas(solveinfo80,"resusd") );

p80_repy_nashitr_solitr(all_regi,solveinfo80,iteration,sol_itr)$(
p80_repy(all_regi,solveinfo80) )
= p80_repy(all_regi,solveinfo80);

*** EOF ./modules/80_optimization/nash/solve.gms

0 comments on commit fdf6cbe

Please sign in to comment.