From aa0ffdd7553b3d3f25ff15e534ebf2b04640c6db Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Tue, 7 Mar 2023 15:50:00 +0100 Subject: [PATCH 01/25] Update MESSAGE_master.gms --- message_ix/model/MESSAGE_master.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index bd6bb99fe..47dc6315b 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -1,7 +1,7 @@ $TITLE The MESSAGEix Integrated Assessment Model $ONDOLLAR $ONTEXT - +TEST Copyright 2018 IIASA Energy Program Licensed under the Apache License, Version 2.0 (the "License"); From 13bfa5d8318256303cd1870af002ce08cd636062 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:25:35 +0100 Subject: [PATCH 02/25] Recursive Dynamic Module Updates on recursive dynamic development in MESSAGE and a Fix for No-"CAP_NEW" bug in the "model_learningeos.gms" --- message_ix/model/MESSAGE/data_load.gms | 2 + .../model/MESSAGE/model_learningeos.gms | 47 ++ message_ix/model/MESSAGE/model_setup.gms | 6 + message_ix/model/MESSAGE/model_solve.gms | 85 +- message_ix/model/MESSAGE/sets_maps_def.gms | 3 + message_ix/model/MESSAGE_master.gms | 9 +- message_ix/model/MESSAGE_project.gpr | 766 ++++++++++++++++++ message_ix/model/cplex.op2 | 5 + 8 files changed, 887 insertions(+), 36 deletions(-) create mode 100644 message_ix/model/MESSAGE/model_learningeos.gms create mode 100644 message_ix/model/cplex.op2 diff --git a/message_ix/model/MESSAGE/data_load.gms b/message_ix/model/MESSAGE/data_load.gms index f5848720d..95a99ae08 100644 --- a/message_ix/model/MESSAGE/data_load.gms +++ b/message_ix/model/MESSAGE/data_load.gms @@ -97,6 +97,8 @@ Set rating_unrated(rating) ; rating_unrated(rating) = yes ; rating_unrated('unrated') = no ; +Set newtec(tec) / wind_ppl / ; + *----------------------------------------------------------------------------------------------------------------------* * assignment and computation of MESSAGE-specific auxiliary parameters * *----------------------------------------------------------------------------------------------------------------------* diff --git a/message_ix/model/MESSAGE/model_learningeos.gms b/message_ix/model/MESSAGE/model_learningeos.gms new file mode 100644 index 000000000..389c5a00e --- /dev/null +++ b/message_ix/model/MESSAGE/model_learningeos.gms @@ -0,0 +1,47 @@ +SETS + size 'size' / small, medium, large / ; + +ALIAS (size,size2); +PARAMETERS + cap_new2(node,newtec,year_all2) 'annual newly installed capacity' + bin_cap_new(node,newtec,year_all2) 'binary of newly installed capacity' + rho(newtec) 'economy of scale parameter' / wind_ppl 1.0 / #0.8 + b(newtec) 'technology cost learning parameter' / wind_ppl 0.9 / #0.9 + u(size) 'unit size' + / small 5 + medium 10 + large 50 / + inv_cost_ref(node,newtec) 'initial capex' + nbr_unit_ref(newtec) 'initial number of unit' / wind_ppl 100 / + u_ref(newtec) 'reference size' / wind_ppl 5 / ; +inv_cost_ref(node,newtec) = 1500; + +SCALAR hist_length the length of historical periods; +hist_length = card(year_all2) - card(model_horizon); + +VARIABLES + NBR_UNIT(node,newtec,size,year_all2) number of units for each size every year + CAPEX_TEC(node,newtec,year_all2) capital cost in dollar per kW + OBJECT objective function ; + +POSITIVE VARIABLES + NBR_UNIT ; + +EQUATIONS + OBJECTIVE_INNER total investment cost + CAP_NEW_BALANCE installed capacity balance + CAPEX_ESTIMATE estimating average capex + NO_BUILT_YEAR annual investment cost +; + + +OBJECTIVE_INNER.. OBJECT =e= sum((node,newtec,year_all2), CAPEX_TEC(node,newtec,year_all2)*cap_new2(node,newtec,year_all2)) ; +CAP_NEW_BALANCE(node,newtec,year_all2).. sum(size, NBR_UNIT(node,newtec,size,year_all2)*u(size)) =e= cap_new2(node,newtec,year_all2) ; +CAPEX_ESTIMATE(node,newtec,year_all2).. CAPEX_TEC(node,newtec,year_all2)*cap_new2(node,newtec,year_all2) =g= sum(size,inv_cost_ref(node,newtec) + * NBR_UNIT(node,newtec,size,year_all2)*u(size) + * [(((sum((size2,year_all3)$(ord(year_all3) le ord(year_all2) and ord(year_all3) gt hist_length), NBR_UNIT(node,newtec,size2,year_all3))+nbr_unit_ref(newtec))/nbr_unit_ref(newtec))**(-b(newtec)))] + * [((u(size)/u_ref(newtec))**rho(newtec))]) ; +NO_BUILT_YEAR(node,newtec,year_all2).. CAPEX_TEC(node,newtec,year_all2) =e= bin_cap_new(node,newtec,year_all2)*CAPEX_TEC(node,newtec,year_all2) + + (1-bin_cap_new(node,newtec,year_all2))*CAPEX_TEC(node,newtec,year_all2-1) ; + +model learningeos / all /; diff --git a/message_ix/model/MESSAGE/model_setup.gms b/message_ix/model/MESSAGE/model_setup.gms index 74a27742f..bab699280 100644 --- a/message_ix/model/MESSAGE/model_setup.gms +++ b/message_ix/model/MESSAGE/model_setup.gms @@ -21,6 +21,11 @@ $IF NOT SET out $SETGLOBAL out "output/MsgOutput.gdx" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $IF NOT SET foresight $SETGLOBAL foresight "0" +** define learning mode (active / inactive) ** +* deactivate - 0 (assumed as default if not specified) +* activate - 1 +$IF NOT SET learningmode $SETGLOBAL learningmode "0" + ** specify optional additional calibration output ** $IF NOT SET calibration $SETGLOBAL calibration "" * mark with * to include detailed calibration information in outputs and get an extended GAMS listing (.lst) file @@ -84,3 +89,4 @@ $INCLUDE MESSAGE/scaling_investment_costs.gms *----------------------------------------------------------------------------------------------------------------------* $INCLUDE MESSAGE/model_core.gms +$INCLUDE MESSAGE/model_learningeos.gms diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index b6ae12891..918eaf023 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -5,6 +5,11 @@ * This part of the code includes the perfect-foresight, myopic and rolling-horizon model solve statements * including the required accounting of investment costs beyond the model horizon. *** +*set year_rd(year_all) /700, 710/; +*set year_rd(year_all) all year in recursive dynamic iterations ; +*year_rd(year_all) = ord(year_all) >1; +Parameter iter 'iteration number'; +iter = 1; if (%foresight% = 0, *** @@ -24,6 +29,7 @@ if (%foresight% = 0, * write a status update to the log file, solve the model put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; + option threads = 4 ; Solve MESSAGE_LP using LP minimizing OBJ ; * write model status summary @@ -87,47 +93,56 @@ else * variables in additional reporting parameters - the last model solve automatically includes the results over the * entire model horizon and can be imported via the ixmp interface. *** - year(year_all) = no ; LOOP(year_all$( model_horizon(year_all) ), * include all past periods and future periods including the period where the %foresight% is reached - year(year_all) = yes ; - -* reset the investment cost scaling parameter - year(year_all2)$( ORD(year_all2) > ORD(year_all) - AND duration_period_sum(year_all,year_all2) < %foresight% ) = yes ; - -* write a status update and time elapsed to the log file, solve the model - put_utility 'log' /'+++ Solve the recursive-dynamic version of MESSAGEix - iteration ' year_all.tl:0 ' +++ ' ; - $$INCLUDE includes/aux_computation_time.gms - Solve MESSAGE_LP using LP minimizing OBJ ; - -* write model status summary - status(year_all,'modelstat') = MESSAGE_LP.modelstat ; - status(year_all,'solvestat') = MESSAGE_LP.solvestat ; - status(year_all,'resUsd') = MESSAGE_LP.resUsd ; - status(year_all,'objEst') = MESSAGE_LP.objEst ; - status(year_all,'objVal') = MESSAGE_LP.objVal ; - -* write an error message AND ABORT THE SOLVE LOOP if model did not solve to optimality - IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), - put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; - ABORT "MESSAGEix did not solve to optimality!" - ) ; + year(year_all2)$( ORD(year_all2) < (ORD(year_all) + %foresight%) ) = yes ; + year4(year_all2)$((ord(year_all2) < ord(year_all))) = yes ; + + option threads = 4 ; + Solve MESSAGE_LP using LP minimizing OBJ ; +* write model status summary + status('perfect_foresight','modelstat') = MESSAGE_LP.modelstat ; + status('perfect_foresight','solvestat') = MESSAGE_LP.solvestat ; + status('perfect_foresight','resUsd') = MESSAGE_LP.resUsd ; + status('perfect_foresight','objEst') = MESSAGE_LP.objEst ; + status('perfect_foresight','objVal') = MESSAGE_LP.objVal ; + +* write an error message if model did not solve to optimality + IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), + put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; + ABORT "MESSAGEix did not solve to optimality!" + ) ; + + IF(%learningmode% = 1, +* passing CAP_NEW values to update cap_new2 data for unit and size optimization + cap_new2(node,newtec,year_all2) = CAP_NEW.l(node,newtec,year_all2); +* this is to make bin param equal to 1 when technology is built, and 0 if otherwise + bin_cap_new(node,newtec,year_all2) = CAP_NEW.l(node,newtec,year_all2); + bin_cap_new(node,newtec,year_all2)$(bin_cap_new(node,newtec,year_all2) > 0) = 1 ; + solve learningeos using nlp minimizing OBJECT; +* passing CapexTec values to update inv_cost data for MESSAGE optimization + inv_cost(node,newtec,year_all2) = CAPEX_TEC.l(node,newtec,year_all2); + + display bin_cap_new, NBR_UNIT.l, CAPEX_TEC.l, inv_cost, cap_new2, CAP_NEW.l; + ); * fix all variables of the current iteration period 'year_all' to the optimal levels - EXT.fx(node,commodity,grade,year_all) = EXT.l(node,commodity,grade,year_all) ; - CAP_NEW.fx(node,tec,year_all) = CAP_NEW.l(node,tec,year_all) ; - CAP.fx(node,tec,year_all2,year_all)$( map_period(year_all2,year_all) ) = CAP.l(node,tec,year_all,year_all2) ; - ACT.fx(node,tec,year_all2,year_all,mode,time)$( map_period(year_all2,year_all) ) - = ACT.l(node,tec,year_all2,year_all,mode,time) ; - CAP_NEW_UP.fx(node,tec,year_all) = CAP_NEW_UP.l(node,tec,year_all) ; - CAP_NEW_LO.fx(node,tec,year_all) = CAP_NEW_LO.l(node,tec,year_all) ; - ACT_UP.fx(node,tec,year_all,time) = ACT_UP.l(node,tec,year_all,time) ; - ACT_LO.fx(node,tec,year_all,time) = ACT_LO.l(node,tec,year_all,time) ; - + EXT.fx(node,commodity,grade,year4) = EXT.l(node,commodity,grade,year4) ; + CAP_NEW.fx(node,tec,year4) = CAP_NEW.l(node,tec,year4) ; +* CAP.fx(node,tec,year4,year4) = CAP.l(node,tec,year4,year4) ; + CAP.up(node,tec,year4,year4) = 1.000001*CAP.l(node,tec,year4,year4) ; + CAP.lo(node,tec,year4,year4) = 0.999999*CAP.l(node,tec,year4,year4) ; + ACT.fx(node,tec,year4,year4,mode,time) = ACT.l(node,tec,year4,year4,mode,time) ; + CAP_NEW_UP.fx(node,tec,year4) = CAP_NEW_UP.l(node,tec,year4) ; + CAP_NEW_LO.fx(node,tec,year4) = CAP_NEW_LO.l(node,tec,year4) ; + ACT_UP.fx(node,tec,year4,time) = ACT_UP.l(node,tec,year4,time) ; + ACT_LO.fx(node,tec,year4,time) = ACT_LO.l(node,tec,year4,time) ; + + + Display year,year4,year_all,year_all2,model_horizon ; ) ; # end of the recursive-dynamic loop ) ; # end of if statement for the selection betwen perfect-foresight or recursive-dynamic model @@ -167,4 +182,4 @@ COST_NODAL_NET.L(node, year)$(NOT macro_base_period(year)) = ( AND map_node(node2,node) AND cat_year(type_year,year) ), emission_scaling(type_emission,emission) * tax_emission(node2,type_emission,type_tec,type_year) * EMISS.L(node,emission,type_tec,year) ) -) ; +) / 1000 ; diff --git a/message_ix/model/MESSAGE/sets_maps_def.gms b/message_ix/model/MESSAGE/sets_maps_def.gms index 1c0a5ea69..bdecb9799 100644 --- a/message_ix/model/MESSAGE/sets_maps_def.gms +++ b/message_ix/model/MESSAGE/sets_maps_def.gms @@ -152,6 +152,8 @@ Sets land_type types of land use year_all years (over entire model horizon) year (year_all) years included in a model instance (for myopic or rolling-horizon optimization) + year4 (year_all) years included in a model instance (for myopic or rolling-horizon optimization) + year_hist (year_all) historical year time subannual time periods (seasons - days - hours) shares share constraint relations relation generic linear relations @@ -301,6 +303,7 @@ Sets addon(tec) technologies that are an add-on to other (parent) technologies type_addon types of add-on technologies (that can be applied mutually exclusive) cat_addon(type_addon,addon) mapping of add-on technologies to respective add-on technology types + newtec(tec) new technologies that will experience technological learning type_year types of year aggregations cat_year(type_year,year_all) mapping of years to respective categories type_emission types of emission aggregations diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index 47dc6315b..8dcab16ec 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -1,7 +1,7 @@ $TITLE The MESSAGEix Integrated Assessment Model $ONDOLLAR $ONTEXT -TEST + Copyright 2018 IIASA Energy Program Licensed under the Apache License, Version 2.0 (the "License"); @@ -46,6 +46,7 @@ $ONGLOBAL ** scenario/case selection - this must match the name of the MsgData_<%%%>.gdx input data file ** $SETGLOBAL data "" +*$SETGLOBAL data "Westeros_Electrified_baseline" ** MACRO mode * "none": MESSAGEix is run in stand-alone mode @@ -58,6 +59,12 @@ $SETGLOBAL macromode "none" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $SETGLOBAL foresight "0" +** for recursive dynamic approach, this is to activate/deactivate technology learning module ** +* deactivate technology learning - 0 +* activate technology learning - 1 +$SETGLOBAL learningmode "0" + + ** add a comment and name extension for model report files (e.g. run-specific info, calibration notes) - optional ** $SETGLOBAL comment "" diff --git a/message_ix/model/MESSAGE_project.gpr b/message_ix/model/MESSAGE_project.gpr index ca6d47fe9..63c28a2b2 100644 --- a/message_ix/model/MESSAGE_project.gpr +++ b/message_ix/model/MESSAGE_project.gpr @@ -1,2 +1,768 @@ [PROJECT] +[RP:MESSAGE/MODEL_SOLVE] +1= + +[GDXDISP: CAP_NEW Var 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: CapexTec Var 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: abs_cost_activity_soft_lo Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: growth_activity_up Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: historical_gdp Par 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: historical_land Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: historical_new_capacity Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_activity_lo Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_activity_up Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_scen_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_scen_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_new_capacity_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_new_capacity_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: input Par 10] +PlaneDim=0 +RowDim=10 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7,8,9,10 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: interestrate Par 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: inv_cost Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: inv_tec Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_activity_up Set 5] +PlaneDim=0 +RowDim=5 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_emission Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_extraction_up Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_new_capacity_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_new_capacity_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_total_capacity_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_total_capacity_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_capacity_factor Set 5] +PlaneDim=0 +RowDim=5 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_activity_lo Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_activity_up Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_scen_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_scen_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_new_capacity_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_new_capacity_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_activity Set 6] +PlaneDim=0 +RowDim=6 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_capacity Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_extraction Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_land Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_new_capacity Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_stock Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_relation_lower Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_relation_upper Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_cost Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_emission Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_input Par 6] +PlaneDim=0 +RowDim=6 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_output Par 6] +PlaneDim=0 +RowDim=6 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_scenario Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_type Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_use Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_activity_soft_lo Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_activity_soft_up Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_new_capacity_soft_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_new_capacity_soft_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_renewable Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_resource Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_stocks Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_storage Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: lvl_spatial Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: lvl_temporal Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_commodity Set 5] +PlaneDim=0 +RowDim=5 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_land Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_node Set 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_relation Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_resource Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_shares_commodity_share Set 7] +PlaneDim=0 +RowDim=7 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_shares_commodity_total Set 7] +PlaneDim=0 +RowDim=7 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_spatial_hierarchy Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_stocks Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_addon Set 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_mode Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_storage Set 8] +PlaneDim=0 +RowDim=8 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7,8 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_time Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_temporal_hierarchy Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_time Set 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: MESSAGE_ix_version Par 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: min_utilization_factor Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: mode Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[RP:MESSAGE/DATA_LOAD] +1= + +[RP:SETS_MAPS_DEF] +1= + +[RP:MODEL_SETUP] +1= + +[RP:MODEL_CORE] +1= + +[RP:MODEL_LEARNINGEOS] +1= + +[RP:MODEL_SOLVE] +1= + +[RP:MESSAGE_MASTER] +1= + +[MRUFILES] +1=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_setup.gms +2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\sets_maps_def.gms +3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE/data_load.gms +4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\data\MsgData_Westeros_Electrified_baseline.gdx +5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_run.lst +6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\output\MsgOutput_Westeros_Electrified_baseline.gdx +7=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\learningeos.gdx + +[OPENWINDOW_1] +FILE0=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_core.gms +FILE1=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_learningeos.gms +FILE2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_solve.gms +FILE3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.gms +FILE4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.lst +FILE5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\model_solve.lst +FILE6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.gms +MAXIM=0 +TOP=7 +LEFT=50 +HEIGHT=618 +WIDTH=1307 diff --git a/message_ix/model/cplex.op2 b/message_ix/model/cplex.op2 new file mode 100644 index 000000000..db3d36b8b --- /dev/null +++ b/message_ix/model/cplex.op2 @@ -0,0 +1,5 @@ +advind = 0 +lpmethod = 4 +threads = 4 +epopt = 1e-06 +barcrossalg = 2 \ No newline at end of file From e178624dcbf73132ea7b3dcd5c3e29018d8eae47 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:27:07 +0100 Subject: [PATCH 03/25] Tutorial to activate recursive dynamic module This tutorial show how user can activate/deactivate recursive dynamic module in MESSAGE --- .../westeros_baseline_recursive-dynamic.ipynb | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb new file mode 100644 index 000000000..ea2dc8b10 --- /dev/null +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Westeros Tutorial: Running MESSAGE in Recursive Dynamic Mode\n", + "\n", + "While considering the full time horizon in a single run is useful for a long-term energy systems planning, the recursive dynamic approach can provide insights that reflect the relevant foresight windows decision makers can have in making adaptive and robust planning.\n", + "\n", + "In addition to running the model with the perfect foresights, MESSAGE can also be run using the recursive dynamic approach. Here, the model is run iteratively throughout the periods with key decision variables from the previous periods, or iterations, are fixed so that new informations do not alter decisions that are already made in the previous periods. These variables\n", + "include $CAP$ , $CAP\\_NEW$, $ACT$, and $EXT$. \n", + "\n", + "In this tutorial, we will implement the recursive dynamic mode on Westeros baseline scenario. Hence, before we start, we have to make sure that we can successfully run the baseline scenarion (``westeros_baseline.ipynb``).\n", + "\n", + "Let's start with importing all the libraries we need and connect to the `ixmp` platform." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"baseline\")\n", + "scen = base.clone(\n", + " model,\n", + " \"recursive-dynamic\",\n", + " \"introducing recursive dynamic mode\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model\n", + "\n", + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing recursive dynamic mode in MESSAGE\")\n", + "scen.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.solve(gams_args =[\"--foresight=1\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting Results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "prepare_plots(rep)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Activity\n", + "\n", + "How much energy is generated in each time period from the different potential sources?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", + "rep.get(\"plot activity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Capacity\n", + "\n", + "How much capacity of each plant is installed in each period?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rep.get(\"plot capacity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From e3d7dc18298a9842b281f2a32f7428d0b757d953 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:28:41 +0100 Subject: [PATCH 04/25] Tutorial to add DACCS to a MESSAGE model/scenario This tutorial shows how to add new technology (DACCS) to a MESSAGE model/scenario. In this example, we use the Westeros emissions bound scenario as baseline --- .../westeros_emissions_bounds_daccs.ipynb | 403 ++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 tutorial/westeros/westeros_emissions_bounds_daccs.ipynb diff --git a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb new file mode 100644 index 000000000..bdbfe481a --- /dev/null +++ b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3ce427fd", + "metadata": {}, + "source": [ + "# Adding DACCS in MESSAGE\n", + "In the previous tutorials, we have learnt how to create a baseline scenario (`westeros_baseline.ipynb`) and add emissions bounds (`westeros_emissions_bounds.ipynb`) to the baseline scenario. Here, we will show how to include an additional/new technology to a MESSAGE model. While the combination of currently existing technologies might be able to deliver the Paris targets, the deployment of some new technologies might improve the probability of meeting the targets and/or reducing the costs. These technologies include CO2 removal (CDR) technologies. Hence, in this tutorial, we will use direct air carbon capture and storage (DACCS) as an example of new technologies to be considered in climate mitigation pathways. \n", + "\n", + "In order to smoothly follow this tutorial, you have to alrady have the MESSAGEix framework installed and working. Moreover, you should have run the Westeros baseline and emissions bounds scenarios successfully as this tutorial is built on top of those scenarios.\n", + "\n", + "If all set, we can start by importing all the packages we need and connect to a database that store the scenario input and results. We can also name the model as `Westeros Electrified` here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "239a17a2", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.utils import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"Westeros Electrified\"" + ] + }, + { + "cell_type": "markdown", + "id": "c82f18ff", + "metadata": {}, + "source": [ + "After we are connected to the database, we can call the prevously run `\"emission_bound\"` scenario as our base model and clone the data before we start adding DACCS to the model. As prevoiusly mentioned, to run this tutorial, you have to have succesfully run the `\"emission_bound\"` scenario, which was built based on the `\"baseline\"` scenario." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a868ad2", + "metadata": {}, + "outputs": [], + "source": [ + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "scen = base.clone(\n", + " model,\n", + " \"emission_bound_DACCS\",\n", + " \"introducing an upper bound on emissions\",\n", + " keep_solution=False,)\n", + "scen.check_out()\n", + "\n", + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "id": "634cecd6", + "metadata": {}, + "source": [ + "Now, let's call the list of historical and model orizon years so we can use these lists for the next steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a2bb27c", + "metadata": {}, + "outputs": [], + "source": [ + "history = [690]\n", + "model_horizon = [700, 710, 720]" + ] + }, + { + "cell_type": "markdown", + "id": "b5db71ca", + "metadata": {}, + "source": [ + "# Adding DACCS description\n", + "First step of adding DACCS as a technology in the model is by including DACCS into the `\"technology\"` set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b203192", + "metadata": {}, + "outputs": [], + "source": [ + "scen.add_set(\"technology\", [\"DACCS\"])" + ] + }, + { + "cell_type": "markdown", + "id": "017c5ca3", + "metadata": {}, + "source": [ + "Similar to what we did when generating the `\"baseline\"` scenario, the first thing we need to do is defining the input and output comodities of each technology. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c74cf466", + "metadata": {}, + "outputs": [], + "source": [ + "# Some common values to be used for both the \"input\" and \"output\" parameters\n", + "base = dict(\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"-\",\n", + ")\n", + "\n", + "# Use the message_ix utility function make_df() to create a base data frame for\n", + "# different \"input\" parameter values\n", + "base_input = make_df(\"input\", **base, node_origin=country, time_origin=\"year\")\n", + "\n", + "# Create a base data frame for different \"output\" parameter values\n", + "base_output = make_df(\"output\", **base, node_dest=country, time_dest=\"year\")" + ] + }, + { + "cell_type": "markdown", + "id": "74bc41d1", + "metadata": {}, + "source": [ + "In this example, DACCS is described as a technology that consumes electricity in order to remove CO2 from the atmosphere. This electricity is assumed to be obtained from the grid. Hence, we define DACCS input as final energy in the form of electricity." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0dae391a", + "metadata": {}, + "outputs": [], + "source": [ + "daccs_in = base_input.assign(\n", + " technology=\"DACCS\", commodity=\"electricity\", level=\"final\", value=1.0\n", + ")\n", + "scen.add_par(\"input\", daccs_in)" + ] + }, + { + "cell_type": "markdown", + "id": "8e087a2c", + "metadata": {}, + "source": [ + "Then, we can also add emissions and capacity factors as well as the technical lifetime of the technology. As can be seen in the code block below, the emissions factor has a negative value, showing that the technology removes insted of emits CO2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c80ec39f", + "metadata": {}, + "outputs": [], + "source": [ + "emission_factor = make_df(\n", + " \"emission_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " unit=\"tCO2/kWa\",\n", + " technology=\"DACCS\",\n", + " emission=\"CO2\",\n", + " value=-20,\n", + ")\n", + "scen.add_par(\"emission_factor\", emission_factor)\n", + "\n", + "capacity_factor = make_df(\n", + " \"capacity_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology='DACCS',\n", + " value=1,\n", + ")\n", + "scen.add_par(\"capacity_factor\", capacity_factor)\n", + " \n", + "lifetime = make_df(\n", + " \"technical_lifetime\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"y\",\n", + " technology='DACCS',\n", + " value=20,\n", + ")\n", + "scen.add_par(\"technical_lifetime\", lifetime)" + ] + }, + { + "cell_type": "markdown", + "id": "cef799ae", + "metadata": {}, + "source": [ + "We also asume that DACCS is a first of a kind technology, i.e., the technology has never been historically deployed. Accordingly, to allow the technology to be installed in the system, we need to define initial deployment (`\"initial_new_capacity_up\"`) and capacity growth (`\"growth_new_capacity_up\"`) rates" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad76ac94", + "metadata": {}, + "outputs": [], + "source": [ + "initial_newcapacity_up = {\n", + " \"DACCS\":0.5,\n", + "}\n", + "\n", + "for tec,val in initial_newcapacity_up.items():\n", + " df = make_df(\n", + " \"initial_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"GW\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"initial_new_capacity_up\", df)\n", + "\n", + "growth_newcapacity_up = {\n", + " \"DACCS\":0.05,\n", + "}\n", + "\n", + "for tec,val in growth_newcapacity_up.items():\n", + " dfgrowth = make_df(\n", + " \"growth_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"growth_new_capacity_up\", dfgrowth)" + ] + }, + { + "cell_type": "markdown", + "id": "dfe89d5e", + "metadata": {}, + "source": [ + "The last thing we need to do in describing DACCS is adding the technology costs data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ae4574b", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new unit for ixmp to recognize as valid\n", + "mp.add_unit(\"USD/kW\")\n", + "\n", + "# in $ / kW (specific investment cost)\n", + "capex = make_df(\n", + " \"inv_cost\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"USD/kW\",\n", + " technology='DACCS',\n", + " value=2500,\n", + ")\n", + "scen.add_par(\"inv_cost\", capex)\n", + " \n", + "# in $ / kW / year (every year a fixed quantity is destinated to cover part of the O&M costs\n", + "# based on the size of the plant, e.g. lightning, labor, scheduled maintenance, etc.)\n", + "\n", + "omfix = make_df(\n", + " \"fix_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=5,\n", + ")\n", + "scen.add_par(\"fix_cost\", omfix)\n", + "\n", + "# In $ / kWa (costs associated to the degradation of equipment\n", + "# when the plant is functioning per unit of energy consumed\n", + "# kW·year = 8760 kWh in generating electricity. Therefore the costs represents USD per 8760 kWh\n", + "# of electricity consumed.\n", + "\n", + "omvar = make_df(\n", + " \"var_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=0,\n", + ")\n", + "scen.add_par(\"var_cost\", omvar)" + ] + }, + { + "cell_type": "markdown", + "id": "54cc0111", + "metadata": {}, + "source": [ + "# Solve Statement and Plotting Results\n", + "Finally, this is the solve statement and plotting results command" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb160143", + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing emissions, DACCS technology, and setting an upper bound\")\n", + "scen.set_as_default()\n", + "\n", + "scen.solve()\n", + "scen.var(\"OBJ\")[\"lvl\"]\n", + "\n", + "# Create a Reporter object to describe and carry out reporting\n", + "# calculations and operations (like plotting) based on `scenario`\n", + "# Add keys like \"plot activity\" to describe reporting operations.\n", + "# See tutorial/utils/plotting.py\n", + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "\n", + "prepare_plots(rep)\n", + "\n", + "# Only show a subset of technologies in the follow plots;\n", + "# e.g. exclude \"bulb\" and \"grid\"\n", + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\",\"DACCS\"])\n", + "\n", + "# Trigger the calculation and plotting\n", + "rep.get(\"plot activity\")\n", + "\n", + "# Create a different plot. The same filters are still active.\n", + "rep.get(\"plot capacity\")\n", + "\n", + "# Replace the technology filters with a commodity filter;\n", + "# show only \"light\" and not e.g. \"electricity\".\n", + "rep.set_filters(t=None, c=[\"light\"])\n", + "\n", + "# Create a price plot\n", + "rep.get(\"plot prices\")\n", + "\n", + "mp.close_db()" + ] + }, + { + "cell_type": "markdown", + "id": "3a6671bf", + "metadata": {}, + "source": [ + "# All Done\n", + "Voila! You can now see DACCS included in the model. Congratulations!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2fcce43c41e73493bcbdd5f953851096c8351657 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 15:15:13 +0100 Subject: [PATCH 05/25] Add technology learning activation instruction --- .../westeros_baseline_recursive-dynamic.ipynb | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb index ea2dc8b10..8de824dc8 100644 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -18,9 +18,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import pandas as pd\n", "import ixmp\n", @@ -33,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -49,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -67,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -83,12 +96,12 @@ "source": [ "## Time to Solve the Model\n", "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example. To activate technology cost learning module, an additional gams argument `\"--learningmode=1\"` needs to be included. Hence, the solve statement becomes `scen.solve(gams_args =[\"--foresight=1\",\"--learningmode=1\"])`. Please note that, in the current version, technology cost learning is only available if recursive dynamic mode is activated, i.e., the `X` in foresight argument is not equal to 0." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -107,9 +120,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "173795.09375" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "scen.var(\"OBJ\")[\"lvl\"]" ] @@ -123,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -145,9 +169,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", "rep.get(\"plot activity\")" @@ -164,9 +209,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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3M81ceJEY7PZzK+//urYdscddxg/Pz+nbcYYp77I7aPk5GTHtpo1a+bbD1dzDgEoPZhaAEupXr26goODHXNfd+7cqczMTMdcx0aNGjneyt6wYYMuXLjgeNv6P//5j3JyctSlSxcdO3bMcQsPD1dsbKxjxYOAgABJ0ooVK3TmzJlC1WeM0eLFi9W+fXsZY5yeJyEhQenp6dq2bZvTY3r27OkYnZIuvk195MgRPfHEE463uSWpXbt2iouL05dffilJ8vb2lqenpxITE3Xy5MlC1Zlr8eLFWrlypdNt1qxZedr16tXLae7o7bffLuniCJ0k7dixQ/v27dODDz6o48ePO15zZmamWrZsqW+++cZpyockPf744073V61apfPnz+uJJ55w2j5w4MA89XTp0kVeXl6aN2+eY9uKFSt07NgxPfTQQ5d8zWFhYdq5c6cef/xxnTx5UjNnztSDDz6o0NBQjRs3zunt+B49eigpKUm//PKLY9u8efMUFRWlpk2bSvr/Pxi3bNkynTt37pLP/XcnTpzQ6tWr1aVLF506dcrRb8ePH1dCQoL27duXZzpJnz59nKYANGzYUMYY9enTx7HN3d1d9evXd/x8CpI7jcXPz++y6rXb7Y752xcuXNDx48fl6+uratWq5TmvpYv999djd+rUSREREfq///s/x7a/nvuZmZk6duyYGjVqJGOMtm/fLuniKhPffPONevfurUqVKjk9R37TIS7H1ZxDAEoPgiwsxWazqVGjRo65sOvXr1doaKhuvPFGSc5BNve/uUF23759MsYoNjZW5cuXd7rt2bNHR44ckSTFxMRoyJAhev/99xUSEqKEhARNnz7dMT/2Uo4ePaq0tDS9++67eZ6jV69ekuR4nlwxMTFO93/99VdJUrVq1fIcPy4uzrHfbrdr8uTJ+uqrrxQWFqY77rhDU6ZMKdTSWXfccYdatWrldIuPj8/T7u/hoVy5cpLkCND79u2TdDGU//11v//++8rOzs7TfwW97tyfZa6goCDH8+UKDAxU+/btNX/+fMe2efPmqUKFCmrRosU/vu6IiAjNmDFDf/zxh/bu3as33nhD5cuX18iRI/XBBx842j3wwAOy2+2OsJOenq5ly5ape/fujgDVtGlTdezYUWPGjFFISIjuvfdezZo1S9nZ2f9Yx/79+2WM0YgRI/L026hRoyTlPV/+/rPI/cMrKioqz/Z/+gPH399fknTq1Kl/rFW6OIf5tddeU2xsrOx2u0JCQlS+fHl9//33+f77iI2Ndbpvs9l04403Os3hPnjwoB555BEFBQXJ19dX5cuXd/yRkHvM3EBeq1aty6rzclztOQSgdGCOLCynSZMmWrp0qXbt2pXnk+eNGjXS0KFDdfjwYa1bt06RkZG64YYbJF38JWyz2fTVV1/lOx/wr0suTZ06VY888og+//xz/fe//9WTTz6piRMnauPGjapYsWKBteWOOj700EMFzr/MnRuZ668jUoU1ePBgtW/fXp999plWrFihESNGaOLEiVq9erXq1q17xcf9u4LmT+aOXua+7pdffll16tTJt+3fl7S6mtctXRztW7hwob777jvVrl1bX3zxhZ544olCrfhgs9lUtWpVVa1aVe3atVNsbKzmzZunRx99VNLFwH733Xdr3rx5GjlypBYtWqTs7GynETubzaZFixZp48aNWrp0qVasWKHevXtr6tSp2rhx4yWX8srtt2eeeUYJCQn5tvl7sC/oZ5HfdvMPH/aKi4uTJO3ateuylpGbMGGCRowYod69e2vcuHEKCgqSm5ubBg8enGfE/XJcuHBBd955p06cOKHnnntOcXFx8vHx0eHDh/XII49c0TELoyjOIQCuRZCF5fx1Pdn169c7fXiqXr16stvtSkxMVFJSktq2bevYV6VKFRljFBMTo6pVq/7j89SuXVu1a9fWiy++qO+++06NGzfWzJkz9dJLL0nK/y3N8uXLy8/PTxcuXFCrVq2u6PVVrlxZkrR37948I0N79+517P/r63r66af19NNPa9++fapTp46mTp2qf//731f0/Fci94Nu/v7+V/269+/f7zRae/z48XxHFu+66y6VL19e8+bNU8OGDXXmzBk9/PDDV/Tc0sUPkZUrV05//PGH0/YePXro3nvv1ebNmzVv3jzVrVtXNWvWzPP42267TbfddpvGjx+v+fPnq3v37vr444/16KOPFvj2d+4fWWXKlLnifrsaTZo0Ubly5bRgwQI9//zz//iBr0WLFql58+ZOo9aSlJaWlu8ybrkj9bmMMdq/f7/jj7ldu3bp559/1pw5c5w+lLZy5Uqnx+X20+7duy//xf0/l5p6UNTnEICSx5+dsJz69es75rYdPnzYaUTWbrfrlltu0fTp05WZmem0fuz9998v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Wtu3b1d8fLzat2+v48eP52kzdepUbd68WeXLl1f79u0vax3Yq8WHvQAAAEqJU6dO6fXXX9dbb72lnj17SpKqVKmiJk2a6L333lNWVpY++ugj+fj4SJLeeusttW/fXpMnT1ZYWJhatGjhdLx3331XgYGBWrt2re6+++4rqmnAgAHq2LGjJGnGjBlavny5PvjgAz377LOONqNGjdKdd94pSZozZ44qVqyoJUuWqEuXLlf0nJeLEVkAAIBSYs+ePcrOzlbLli3z3XfzzTc7QqwkNW7cWDk5Odq7d68kKTU1VX379lVsbKwCAgLk7++v06dP6+DBg1dcU3x8vOP/PTw8VL9+fe3Zs6fANkFBQapWrVqeNsWhUCOylStXVosWLdS8eXM1b95cUVFRxVUXAADAdcfb2/uqHt+zZ08dP35cr7/+uipXriy73a74+HidPXu2iCosXQo1IturVy8lJyfrscceU3R0tG688Ub17dtXCxYsUEpKSnHVCAAAcF2IjY2Vt7e3Vq1alWdf9erVtXPnTmVmZjq2rV+/Xm5ubqpWrZrj/pNPPqm2bduqZs2astvtOnbs2FXVtHHjRsf/nz9/Xlu3blX16tULbHPy5En9/PPPedoUh0KNyI4ePVqSlJ2drfXr12vt2rVKTEzU3Llzde7cOVWtWlUtWrTQ9OnTi6NWAACAa5qXl5eee+45Pfvss/L09FTjxo119OhR/fDDD+revbtGjRqlnj17avTo0Tp69KgGDhyohx9+WGFhYZIuBuG5c+eqfv36ysjI0NChQ696lHf69OmKjY1V9erV9dprr+nkyZPq3bu3U5uxY8cqODhYYWFheuGFFxQSElIiX7hwRR/2stvtatGihWNC8cmTJzV16lS9+eabmjlzJkEWAACUSqXxm7b+bsSIEfLw8NDIkSP1+++/KyIiQo8//rjKli2rFStWaNCgQbr11ltVtmxZdezYUa+++qrjsR988IH69eunW265RVFRUZowYYKeeeaZq6pn0qRJmjRpknbs2KEbb7xRX3zxhUJCQvK0GTRokPbt26c6depo6dKl8vT0vKrnvRxXFGTPnj2rDRs2KDExUYmJiUpKSlKFChXUqVMnNW3atKhrBAAAuG64ubnphRde0AsvvJBnX+3atbV69eoCH1u3bl1t3rzZaVunTp2c7htjClVP9erVlZSUdMk2TZo0KXDt2EceeUSPPPJIoZ7zchUqyI4dO9YRXCtXrqw77rhD/fr107x58xQZGVksBQIAAAD5KfQc2UqVKmnq1Knq3LmzgoODi6suAAAAFKMJEyZowoQJ+e67/fbbNWPGjBKuqPAKFWS/+uorrVmzRrNnz9agQYNUtWpVNWvWTE2bNlXTpk1Vvnz54qoTAAAARejxxx8v8AsLvL29VaFChX+chtCsWbNCT1UoSoVafishIUGTJk3Sxo0bdezYMU2ePFlly5bVlClTVLFiRdWsWdPpa9KKwuHDh/XQQw8pODhY3t7eql27trZs2eLYb4zRyJEjFRERIW9vb7Vq1Ur79u0r0hoAAACuNUFBQbrxxhvzvVWoUMHV5V2WK/5mLz8/P7Vt21YTJkzQ66+/riFDhui3334r0mHokydPqnHjxipTpoy++uor/fjjj5o6darKlSvnaDNlyhS98cYbmjlzppKSkuTj46OEhARlZWUVWR0AAAAofQq9akFOTo62bNmiNWvWKDExUevXr1dmZqYqVqyo++67T82bNy+y4iZPnqyoqCjNmjXLsS0mJsbx/8YYTZs2TS+++KLuvfdeSdJHH32ksLAwffbZZ+ratWu+x83OzlZ2drbjfkZGRpHVDAAAgJJRqBHZNm3aqFy5crrtttv05ptvKiQkRK+99pr27dunX3/9VbNnz1bPnj2LrLgvvvhC9evXV+fOnRUaGqq6devqvffec+xPTk5WSkqKWrVq5dgWEBCghg0basOGDQUed+LEiQoICHDc+KpdAAAA6ynUiGxgYKBefvllNW/eXLGxscVVk8P//vc/zZgxQ0OGDNHzzz+vzZs368knn5Snp6d69uzp+Frc3G+zyBUWFnbJr8wdPny4hgwZ4rifkZFBmAUAALCYQgXZDz/8UKtWrXKE2OHDhzu9Re/u7q5x48bJy8urSIrLyclR/fr1HUtD1K1bV7t379bMmTOvauTXbrfLbrcXSY0AAABwjUIF2Tlz5ujLL7/U3XffLUl66623VLNmTcd3+P7000+KjIzUU089VSTFRUREqEaNGk7bqlevrsWLF0uSwsPDJUmpqamKiIhwtElNTVWdOnWKpAYAAHANGR1Qws+XXmyHnj17tgYPHqy0tLSrOk6zZs1Up04dTZs2rUjq+icHDhxQTEyMtm/fftV5rVBzZP/973+rX79+Ttvmz5+vNWvWaM2aNXr55Zf16aefXlVBf9W4cWPt3bvXadvPP/+sypUrS7r4wa/w8HCtWrXKsT8jI0NJSUmKj48vsjoAAABKmwceeEA///yzq8twqUIF2V9++UW1a9d23Pfy8pKb2/9/iAYNGujHH38ssuKeeuopbdy4URMmTND+/fs1f/58vfvuu+rfv78kyWazafDgwXrppZf0xRdfaNeuXerRo4ciIyPVoUOHIqsDAACgtPH29lZoaKiry3CpQgXZtLQ0pzmxR48eVXR0tON+Tk6O0/6rdeutt2rJkiVasGCBatWqpXHjxmnatGnq3r27o82zzz6rgQMHql+/frr11lt1+vRpLV++vMjm6QIAAJSUZcuWKTAwUBcuXJAk7dixQzabTcOGDXO0efTRR/XQQw9p9uzZCgwMdGwfPXq06tSpo7lz5yo6OloBAQHq2rWrTp065WiTmZmpHj16yNfXVxEREZo6dWqh6ouOjta4cePUrVs3+fj4qEKFCpo+fbpTG5vNphkzZqhNmzby9vbWDTfcoEWLFl1Bb/yzQgXZihUravfu3QXu//7771WxYsWrLuqv7r77bu3atUtZWVnas2eP+vbt67TfZrNp7NixSklJUVZWlr7++mtVrVq1SGsAAAAoCbfffrtOnTql7du3S5LWrl2rkJAQJSYmOtqsXbtWzZo1y/fxv/zyiz777DMtW7ZMy5Yt09q1azVp0iTH/qFDh2rt2rX6/PPP9d///leJiYnatm1boWp8+eWXdfPNN2v79u0aNmyYBg0apJUrVzq1GTFihDp27KidO3eqe/fu6tq1q/bs2VOo57kchQqybdu21ciRI/P91qw///xTY8aMUbt27YqsOAAAgOtJQECA6tSp4wiuiYmJeuqpp7R9+3adPn1ahw8f1v79+9W0adN8H5+Tk6PZs2erVq1auv322/Xwww87Pkt0+vRpffDBB3rllVfUsmVL1a5dW3PmzNH58+cLVWPjxo01bNgwVa1aVQMHDlSnTp302muvObXp3LmzHn30UVWtWlXjxo1T/fr19eabbxa+Q/5BoYLs888/rxMnTqhatWp6+eWX9fnnn+vzzz/XlClTVK1aNZ08eVLPP/98kRcJAABwvWjatKkSExNljNG3336r+++/X9WrV9e6deu0du1aRUZGFrief3R0tPz8/Bz3IyIidOTIEUkXR2vPnj2r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vviiuXDhgqvLdInTp0+b7t27G3d3d+Ph4WFCQ0NNaGio8fDwMO7u7uahhx4ymZmZri7TJThvCsb1Jn+cMwXjWgMrIMi6kK+vr9m2bVuB+7ds2WJ8fX1LsKLSY+jQoaZ8+fJm5syZJjk52Zw5c8acOXPGJCcnm3feeceEhoaaZ5991tVlukSfPn1MbGysWb58uTl//rxj+/nz582KFStM1apVzaOPPurCCl2H86ZgXG/yxzlTMK41sAKCrAsFBwebxMTEAvevWbPGBAcHl2BFpUdYWJhZvnx5gfuXL19uQkNDS7Ci0iMwMNCsX7++wP3r1q0zgYGBJVhR6cF5UzCuN/njnCkY1xpYAasWuNADDzygnj17asmSJcrIyHBsz8jI0JIlS9SrVy9169bNhRW6zqlTpxQZGVng/oiICGVmZpZgRaVHTk6OPD09C9zv6empnJycEqyo9OC8KRjXm/xxzhSMaw0swdVJ+nqWlZVlHn/8cePp6Wnc3NyMl5eX8fLyMm5ubsbT09P861//MllZWa4u0yXatm1rWrdubY4ePZpn39GjR81dd91l2rVr54LKXO/BBx80devWzfdt4m3btpl69eqZ7t27u6Ay1+O8KRjXm/xxzhSMaw2sgFULSoGMjAxt2bJFqampki5+IrRevXry9/d3cWWuc+jQIbVt21Y//fSTateu7fQJ6127dqlGjRpatmyZoqKiXFxpyTt58qQefPBBrVixQuXKlXN8yvzIkSNKS0tTQkKC5s+fr8DAQNcW6gKcN/+M640zzpmCca2BFRBkUWrl5ORoxYoV2rhxY541L1u3bi03t+t7ZsxPP/2U73qgcXFxLq7MtThvUFicM5fGtQalGUHWxf78808tWLBA69at0x9//CE3NzfdcMMN6tChg1q2bOnq8gBcQ7jeALjWEGRdaP/+/WrVqpX+/PNP2e12/fbbb2rbtq2OHTumLVu26P7779f8+fPl4XH9fgFbft9C1KhRI916660urqz0OnnypJYuXaoePXq4uhSXycnJyXcULScnR7/99psqVarkgqpci+vNpXGtKTyuNSgVXDc9F23atDGPPfaYycnJMcYYM2nSJNOmTRtjjDE///yziY6ONqNGjXJhha6TmppqmjRpYmw2m6lcubJp0KCBadCggalcubKx2WymSZMmJjU11dVllko7duwwbm5uri7D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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "rep.get(\"plot capacity\")" ] @@ -204,7 +270,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.10.9" } }, "nbformat": 4, From eaf963e0c91f6bb78d85615206a4d91c3683924f Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 17:11:34 +0100 Subject: [PATCH 06/25] Revert "Add technology learning activation instruction" This reverts commit 2fcce43c41e73493bcbdd5f953851096c8351657. --- .../westeros_baseline_recursive-dynamic.ipynb | 98 +---- .../westeros_emissions_bounds_daccs.ipynb | 403 ------------------ 2 files changed, 16 insertions(+), 485 deletions(-) delete mode 100644 tutorial/westeros/westeros_emissions_bounds_daccs.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb index 8de824dc8..ea2dc8b10 100644 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -18,22 +18,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import ixmp\n", @@ -46,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -96,12 +83,12 @@ "source": [ "## Time to Solve the Model\n", "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example. To activate technology cost learning module, an additional gams argument `\"--learningmode=1\"` needs to be included. Hence, the solve statement becomes `scen.solve(gams_args =[\"--foresight=1\",\"--learningmode=1\"])`. Please note that, in the current version, technology cost learning is only available if recursive dynamic mode is activated, i.e., the `X` in foresight argument is not equal to 0." + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -120,20 +107,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "173795.09375" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "scen.var(\"OBJ\")[\"lvl\"]" ] @@ -147,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -169,30 +145,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", "rep.get(\"plot activity\")" @@ -209,30 +164,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAHTCAYAAADbOfviAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKtUlEQVR4nO3dfXzO9f////uxzY7NTm2zM8aWxpwVEQ3lNAsp5SRShKh3iJSicp7TUjoRnSJvVHir6BNvYYqYc1ESvSdSm9NtTJuTPX9/+O74dbRNxrZjL27Xy+W41PF6PY/X8Tiee3ntvufxPJ6HzRhjBAAAAFiMm6sLAAAAAK4EQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAcE2YPXu2bDabDhw44OpSAJQQgiws49NPP5XNZtOSJUvy7Lv55ptls9m0Zs2aPPsqVaqkRo0aFXk9EyZM0GeffVbkxy0Jo0ePls1mK/CWkpLi6hKL1dGjRzVo0CDFxcXJ29tboaGhatCggZ577jmdPn26yJ/vzJkzGj16tBITE4v82EVlyZIlatOmjUJCQuTp6anIyEh16dJFq1evdnVpV+Xtt9/W7NmzXV0GgGLi4eoCgMvVpEkTSdK6det03333ObZnZGRo9+7d8vDw0Pr169W8eXPHvkOHDunQoUPq2rVrkdczYcIEderUSR06dCjyY5eUGTNmyNfXN8/2wMDAki+mhJw4cUL169dXRkaGevfurbi4OB0/flzff/+9ZsyYoX/961/59snVOHPmjMaMGSNJatasWZEe+2oZY9S7d2/Nnj1bdevW1ZAhQxQeHq4//vhDS5YsUcuWLbV+/fpi+WOwqD388MPq2rWr7Ha7Y9vbb7+tkJAQPfLII64rDECxIcjCMiIjIxUTE6N169Y5bd+wYYOMMercuXOefbn3c0NwaZeVlSVPT0+5uZXMmyWdOnVSSEhIiTzXpWRmZsrHx6dEnuuDDz7QwYMH8w1nGRkZ8vT0LJE6SoupU6dq9uzZGjx4sF599VXZbDbHvhdeeEFz586Vh4c1flW4u7vL3d3d1WUAKEFMLYClNGnSRNu3b9eff/7p2LZ+/XrVrFlTbdq00caNG5WTk+O0z2azqXHjxo5t//73v1WvXj15e3srKChIXbt21aFDh5yeZ9++ferYsaPCw8Pl5eWlihUrqmvXrkpPT5ck2Ww2ZWZmas6cOY634/864nP48GH17t1bYWFhstvtqlmzpj788EOn50hMTJTNZtPHH3+sF198URUqVFDZsmWVkZEhSVq4cKGjzpCQED300EM6fPiw0zFSUlLUq1cvVaxYUXa7XREREbr33nuLbI5gbo2ffvqpxo8fr4oVK8rLy0stW7bU/v3787RPSkrSXXfdpYCAAJUtW1ZNmzbV+vXrndrkTmv48ccf9eCDD6pcuXKOPzRycnI0evRoRUZGqmzZsmrevLl+/PFHRUdHO/r3f//7n2w2m1577bU8z//dd9/JZrNpwYIFBb6mX375Re7u7rrtttvy7PP395eXl5ckadSoUSpTpoyOHj2ap12/fv0UGBiorKwsSdKWLVuUkJCgkJAQeXt7KyYmRr1795YkHThwQOXLl5ckjRkzxnG+jB492nG8n376SZ06dVJQUJC8vLxUv359ffHFF07PmTv/c926dXryySdVvnx5BQYG6rHHHtPZs2eVlpamHj16qFy5cipXrpyeffZZGWMK7AdJ+vPPPzVx4kTFxcXplVdecQqxuR5++GE1aNBA0sXR7GeeeUa1a9eWr6+v/P391aZNG+3cudPpMbnnzSeffKLnn39e4eHh8vHx0T333JPn39q3336rzp07q1KlSrLb7YqKitJTTz3l9G/8r/3UpUsXlS9fXt7e3qpWrZpeeOGFPH2Ue/5HR0frhx9+0Nq1ax393qxZs6s+hwCUHtb4Mxv4f5o0aaK5c+cqKSnJ8RZt7shao0aNlJ6ert27d+umm25y7IuLi1NwcLAkafz48RoxYoS6dOmiRx99VEePHtWbb76pO+64Q9u3b1dgYKDOnj2rhIQEZWdna+DAgQoPD9fhw4e1bNkypaWlKSAgQHPnztWjjz6qBg0aqF+/fpKkKlWqSJJSU1N12223yWazacCAASpfvry++uor9enTRxkZGRo8eLDTaxo3bpw8PT31zDPPKDs7W56enpo9e7Z69eqlW2+9VRMnTlRqaqpef/11rV+/3lGnJHXs2FE//PCDBg4cqOjoaB05ckQrV67UwYMHFR0d/Y/9eeLEiTzbPDw88kwtmDRpktzc3PTMM88oPT1dU6ZMUffu3ZWUlORos3r1arVp00b16tXTqFGj5ObmplmzZqlFixb69ttvHWEoV+fOnRUbG6sJEyY4Atfw4cM1ZcoUtW/fXgkJCdq5c6cSEhIcgVGSbrjhBjVu3Fjz5s3TU0895XTMefPmyc/PT/fee2+Br7ly5cq6cOGC5s6dq549exbY7uGHH9bYsWP1ySefaMCAAY7tZ8+e1aJFi9SxY0d5eXnpyJEjat26tcqXL69hw4YpMDBQBw4c0H/+8x9JUvny5R1TFu677z7df//9kuQ4R3/44Qc1btxYFSpU0LBhw+Tj46NPP/1UHTp00OLFi52m0UhynJNjxozRxo0b9e677yowMFDfffedKlWqpAkTJuj//u//9PLLL6tWrVrq0aNHga9x3bp1OnHihAYPHnxZI5n/+9//9Nlnn6lz586KiYlRamqq3nnnHTVt2lQ//vijIiMjndqPHz9eNptNzz33nI4cOaJp06apVatW2rFjh7y9vSVd/IPtzJkz+te//qXg4GBt2rRJb775pn777TctXLjQcazvv/9et99+u8qUKaN+/fopOjpav/zyi5YuXarx48fnW++0adM0cOBA+fr6OgJvWFjYVZ9DAEoRA1jIDz/8YCSZcePGGWOMOXfunPHx8TFz5swxxhgTFhZmpk+fbowxJiMjw7i7u5u+ffsaY4w5cOCAcXd3N+PHj3c65q5du4yHh4dj+/bt240ks3DhwkvW4uPjY3r27Jlne58+fUxERIQ5duyY0/auXbuagIAAc+bMGWOMMWvWrDGSzA033ODYZowxZ8+eNaGhoaZWrVrmzz//dGxftmyZkWRGjhxpjDHm5MmTRpJ5+eWXL91p+Rg1apSRlO+tWrVqjna5NVavXt1kZ2c7tr/++utGktm1a5cxxpicnBwTGxtrEhISTE5OjqPdmTNnTExMjLnzzjvzPHe3bt2cakpJSTEeHh6mQ4cOTttHjx5tJDn19TvvvGMkmT179jj1W0hISL4/k78/T/ny5Y0kExcXZx5//HEzf/58k5aWlqdtfHy8adiwodO2//znP0aSWbNmjTHGmCVLlhhJZvPmzQU+59GjR40kM2rUqDz7WrZsaWrXrm2ysrIc23JyckyjRo1MbGysY9usWbOMpDx9HB8fb2w2m3n88ccd286fP28qVqxomjZtesm+yP05Llmy5JLtcmVlZZkLFy44bUtOTjZ2u92MHTvWsS33vKlQoYLJyMhwbP/000+NJPP66687tv313M81ceJEY7PZzK+//urYdscddxg/Pz+nbcYYp77I7aPk5GTHtpo1a+bbD1dzDgEoPZhaAEupXr26goODHXNfd+7cqczMTMdcx0aNGjneyt6wYYMuXLjgeNv6P//5j3JyctSlSxcdO3bMcQsPD1dsbKxjxYOAgABJ0ooVK3TmzJlC1WeM0eLFi9W+fXsZY5yeJyEhQenp6dq2bZvTY3r27OkYnZIuvk195MgRPfHEE463uSWpXbt2iouL05dffilJ8vb2lqenpxITE3Xy5MlC1Zlr8eLFWrlypdNt1qxZedr16tXLae7o7bffLuniCJ0k7dixQ/v27dODDz6o48ePO15zZmamWrZsqW+++cZpyockPf744073V61apfPnz+uJJ55w2j5w4MA89XTp0kVeXl6aN2+eY9uKFSt07NgxPfTQQ5d8zWFhYdq5c6cef/xxnTx5UjNnztSDDz6o0NBQjRs3zunt+B49eigpKUm//PKLY9u8efMUFRWlpk2bSvr/Pxi3bNkynTt37pLP/XcnTpzQ6tWr1aVLF506dcrRb8ePH1dCQoL27duXZzpJnz59nKYANGzYUMYY9enTx7HN3d1d9evXd/x8CpI7jcXPz++y6rXb7Y752xcuXNDx48fl6+uratWq5TmvpYv999djd+rUSREREfq///s/x7a/nvuZmZk6duyYGjVqJGOMtm/fLuniKhPffPONevfurUqVKjk9R37TIS7H1ZxDAEoPgiwsxWazqVGjRo65sOvXr1doaKhuvPFGSc5BNve/uUF23759MsYoNjZW5cuXd7rt2bNHR44ckSTFxMRoyJAhev/99xUSEqKEhARNnz7dMT/2Uo4ePaq0tDS9++67eZ6jV69ekuR4nlwxMTFO93/99VdJUrVq1fIcPy4uzrHfbrdr8uTJ+uqrrxQWFqY77rhDU6ZMKdTSWXfccYdatWrldIuPj8/T7u/hoVy5cpLkCND79u2TdDGU//11v//++8rOzs7TfwW97tyfZa6goCDH8+UKDAxU+/btNX/+fMe2efPmqUKFCmrRosU/vu6IiAjNmDFDf/zxh/bu3as33nhD5cuX18iRI/XBBx842j3wwAOy2+2OsJOenq5ly5ape/fujgDVtGlTdezYUWPGjFFISIjuvfdezZo1S9nZ2f9Yx/79+2WM0YgRI/L026hRoyTlPV/+/rPI/cMrKioqz/Z/+gPH399fknTq1Kl/rFW6OIf5tddeU2xsrOx2u0JCQlS+fHl9//33+f77iI2Ndbpvs9l04403Os3hPnjwoB555BEFBQXJ19dX5cuXd/yRkHvM3EBeq1aty6rzclztOQSgdGCOLCynSZMmWrp0qXbt2pXnk+eNGjXS0KFDdfjwYa1bt06RkZG64YYbJF38JWyz2fTVV1/lOx/wr0suTZ06VY888og+//xz/fe//9WTTz6piRMnauPGjapYsWKBteWOOj700EMFzr/MnRuZ668jUoU1ePBgtW/fXp999plWrFihESNGaOLEiVq9erXq1q17xcf9u4LmT+aOXua+7pdffll16tTJt+3fl7S6mtctXRztW7hwob777jvVrl1bX3zxhZ544olCrfhgs9lUtWpVVa1aVe3atVNsbKzmzZunRx99VNLFwH733Xdr3rx5GjlypBYtWqTs7GynETubzaZFixZp48aNWrp0qVasWKHevXtr6tSp2rhx4yWX8srtt2eeeUYJCQn5tvl7sC/oZ5HfdvMPH/aKi4uTJO3ateuylpGbMGGCRowYod69e2vcuHEKCgqSm5ubBg8enGfE/XJcuHBBd955p06cOKHnnntOcXFx8vHx0eHDh/XII49c0TELoyjOIQCuRZCF5fx1Pdn169c7fXiqXr16stvtSkxMVFJSktq2bevYV6VKFRljFBMTo6pVq/7j89SuXVu1a9fWiy++qO+++06NGzfWzJkz9dJLL0nK/y3N8uXLy8/PTxcuXFCrVq2u6PVVrlxZkrR37948I0N79+517P/r63r66af19NNPa9++fapTp46mTp2qf//731f0/Fci94Nu/v7+V/269+/f7zRae/z48XxHFu+66y6VL19e8+bNU8OGDXXmzBk9/PDDV/Tc0sUPkZUrV05//PGH0/YePXro3nvv1ebNmzVv3jzVrVtXNWvWzPP42267TbfddpvGjx+v+fPnq3v37vr444/16KOPFvj2d+4fWWXKlLnifrsaTZo0Ubly5bRgwQI9//zz//iBr0WLFql58+ZOo9aSlJaWlu8ybrkj9bmMMdq/f7/jj7ldu3bp559/1pw5c5w+lLZy5Uqnx+X20+7duy//xf0/l5p6UNTnEICSx5+dsJz69es75rYdPnzYaUTWbrfrlltu0fTp05WZmem0fuz9998v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Wtu3b1d8fLzat2+v48eP52kzdepUbd68WeXLl1f79u0vax3Yq8WHvQAAAEqJU6dO6fXXX9dbb72lnj17SpKqVKmiJk2a6L333lNWVpY++ugj+fj4SJLeeusttW/fXpMnT1ZYWJhatGjhdLx3331XgYGBWrt2re6+++4rqmnAgAHq2LGjJGnGjBlavny5PvjgAz377LOONqNGjdKdd94pSZozZ44qVqyoJUuWqEuXLlf0nJeLEVkAAIBSYs+ePcrOzlbLli3z3XfzzTc7QqwkNW7cWDk5Odq7d68kKTU1VX379lVsbKwCAgLk7++v06dP6+DBg1dcU3x8vOP/PTw8VL9+fe3Zs6fANkFBQapWrVqeNsWhUCOylStXVosWLdS8eXM1b95cUVFRxVUXAADAdcfb2/uqHt+zZ08dP35cr7/+uipXriy73a74+HidPXu2iCosXQo1IturVy8lJyfrscceU3R0tG688Ub17dtXCxYsUEpKSnHVCAAAcF2IjY2Vt7e3Vq1alWdf9erVtXPnTmVmZjq2rV+/Xm5ubqpWrZrj/pNPPqm2bduqZs2astvtOnbs2FXVtHHjRsf/nz9/Xlu3blX16tULbHPy5En9/PPPedoUh0KNyI4ePVqSlJ2drfXr12vt2rVKTEzU3Llzde7cOVWtWlUtWrTQ9OnTi6NWAACAa5qXl5eee+45Pfvss/L09FTjxo119OhR/fDDD+revbtGjRqlnj17avTo0Tp69KgGDhyohx9+WGFhYZIuBuG5c+eqfv36ysjI0NChQ696lHf69OmKjY1V9erV9dprr+nkyZPq3bu3U5uxY8cqODhYYWFheuGFFxQSElIiX7hwRR/2stvtatGihWNC8cmTJzV16lS9+eabmjlzJkEWAACUSqXxm7b+bsSIEfLw8NDIkSP1+++/KyIiQo8//rjKli2rFStWaNCgQbr11ltVtmxZdezYUa+++qrjsR988IH69eunW265RVFRUZowYYKeeeaZq6pn0qRJmjRpknbs2KEbb7xRX3zxhUJCQvK0GTRokPbt26c6depo6dKl8vT0vKrnvRxXFGTPnj2rDRs2KDExUYmJiUpKSlKFChXUqVMnNW3atKhrBAAAuG64ubnphRde0AsvvJBnX+3atbV69eoCH1u3bl1t3rzZaVunTp2c7htjClVP9erVlZSUdMk2TZo0KXDt2EceeUSPPPJIoZ7zchUqyI4dO9YRXCtXrqw77rhD/fr107x58xQZGVksBQIAAAD5KfQc2UqVKmnq1Knq3LmzgoODi6suAAAAFKMJEyZowoQJ+e67/fbbNWPGjBKuqPAKFWS/+uorrVmzRrNnz9agQYNUtWpVNWvWTE2bNlXTpk1Vvnz54qoTAAAARejxxx8v8AsLvL29VaFChX+chtCsWbNCT1UoSoVafishIUGTJk3Sxo0bdezYMU2ePFlly5bVlClTVLFiRdWsWdPpa9KKwuHDh/XQQw8pODhY3t7eql27trZs2eLYb4zRyJEjFRERIW9vb7Vq1Ur79u0r0hoAAACuNUFBQbrxxhvzvVWoUMHV5V2WK/5mLz8/P7Vt21YTJkzQ66+/riFDhui3334r0mHokydPqnHjxipTpoy++uor/fjjj5o6darKlSvnaDNlyhS98cYbmjlzppKSkuTj46OEhARlZWUVWR0AAAAofQq9akFOTo62bNmiNWvWKDExUevXr1dmZqYqVqyo++67T82bNy+y4iZPnqyoqCjNmjXLsS0mJsbx/8YYTZs2TS+++KLuvfdeSdJHH32ksLAwffbZZ+ratWu+x83OzlZ2drbjfkZGRpHVDAAAgJJRqBHZNm3aqFy5crrtttv05ptvKiQkRK+99pr27dunX3/9VbNnz1bPnj2LrLgvvvhC9evXV+fOnRUaGqq6devqvffec+xPTk5WSkqKWrVq5dgWEBCghg0basOGDQUed+LEiQoICHDc+KpdAAAA6ynUiGxgYKBefvllNW/eXLGxscVVk8P//vc/zZgxQ0OGDNHzzz+vzZs368knn5Snp6d69uzp+Frc3G+zyBUWFnbJr8wdPny4hgwZ4rifkZFBmAUAALCYQgXZDz/8UKtWrXKE2OHDhzu9Re/u7q5x48bJy8urSIrLyclR/fr1HUtD1K1bV7t379bMmTOvauTXbrfLbrcXSY0AAABwjUIF2Tlz5ujLL7/U3XffLUl66623VLNmTcd3+P7000+KjIzUU089VSTFRUREqEaNGk7bqlevrsWLF0uSwsPDJUmpqamKiIhwtElNTVWdOnWKpAYAAHANGR1Qws+XXmyHnj17tgYPHqy0tLSrOk6zZs1Up04dTZs2rUjq+icHDhxQTEyMtm/fftV5rVBzZP/973+rX79+Ttvmz5+vNWvWaM2aNXr55Zf16aefXlVBf9W4cWPt3bvXadvPP/+sypUrS7r4wa/w8HCtWrXKsT8jI0NJSUmKj48vsjoAAABKmwceeEA///yzq8twqUIF2V9++UW1a9d23Pfy8pKb2/9/iAYNGujHH38ssuKeeuopbdy4URMmTND+/fs1f/58vfvuu+rfv78kyWazafDgwXrppZf0xRdfaNeuXerRo4ciIyPVoUOHIqsDAACgtPH29lZoaKiry3CpQgXZtLQ0pzmxR48eVXR0tON+Tk6O0/6rdeutt2rJkiVasGCBatWqpXHjxmnatGnq3r27o82zzz6rgQMHql+/frr11lt1+vRpLV++vMjm6QIAAJSUZcuWKTAwUBcuXJAk7dixQzabTcOGDXO0efTRR/XQQw9p9uzZCgwMdGwfPXq06tSpo7lz5yo6OloBAQHq2rWrTp065WiTmZmpHj16yNfXVxEREZo6dWqh6ouOjta4cePUrVs3+fj4qEKFCpo+fbpTG5vNphkzZqhNmzby9vbWDTfcoEWLFl1Bb/yzQgXZihUravfu3QXu//7771WxYsWrLuqv7r77bu3atUtZWVnas2eP+vbt67TfZrNp7NixSklJUVZWlr7++mtVrVq1SGsAAAAoCbfffrtOnTql7du3S5LWrl2rkJAQJSYmOtqsXbtWzZo1y/fxv/zyiz777DMtW7ZMy5Yt09q1azVp0iTH/qFDh2rt2rX6/PPP9d///leJiYnatm1boWp8+eWXdfPNN2v79u0aNmyYBg0apJUrVzq1GTFihDp27KidO3eqe/fu6tq1q/bs2VOo57kchQqybdu21ciRI/P91qw///xTY8aMUbt27YqsOAAAgOtJQECA6tSp4wiuiYmJeuqpp7R9+3adPn1ahw8f1v79+9W0adN8H5+Tk6PZs2erVq1auv322/Xwww87Pkt0+vRpffDBB3rllVfUsmVL1a5dW3PmzNH58+cLVWPjxo01bNgwVa1aVQMHDlSnTp302muvObXp3LmzHn30UVWtWlXjxo1T/fr19eabbxa+Q/5BoYLs888/rxMnTqhatWp6+eWX9fnnn+vzzz/XlClTVK1aNZ08eVLPP/98kRcJAABwvWjatKkSExNljNG3336r+++/X9WrV9e6deu0du1aRUZGFrief3R0tPz8/Bz3IyIidOTIEUkXR2vPnj2r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vviiuXDhgqvLdInTp0+b7t27G3d3d+Ph4WFCQ0NNaGio8fDwMO7u7uahhx4ymZmZri7TJThvCsb1Jn+cMwXjWgMrIMi6kK+vr9m2bVuB+7ds2WJ8fX1LsKLSY+jQoaZ8+fJm5syZJjk52Zw5c8acOXPGJCcnm3feeceEhoaaZ5991tVlukSfPn1MbGysWb58uTl//rxj+/nz582KFStM1apVzaOPPurCCl2H86ZgXG/yxzlTMK41sAKCrAsFBwebxMTEAvevWbPGBAcHl2BFpUdYWJhZvnx5gfuXL19uQkNDS7Ci0iMwMNCsX7++wP3r1q0zgYGBJVhR6cF5UzCuN/njnCkY1xpYAasWuNADDzygnj17asmSJcrIyHBsz8jI0JIlS9SrVy9169bNhRW6zqlTpxQZGVng/oiICGVmZpZgRaVHTk6OPD09C9zv6empnJycEqyo9OC8KRjXm/xxzhSMaw0swdVJ+nqWlZVlHn/8cePp6Wnc3NyMl5eX8fLyMm5ubsbT09P861//MllZWa4u0yXatm1rWrdubY4ePZpn39GjR81dd91l2rVr54LKXO/BBx80devWzfdt4m3btpl69eqZ7t27u6Ay1+O8KRjXm/xxzhSMaw2sgFULSoGMjAxt2bJFqampki5+IrRevXry9/d3cWWuc+jQIbVt21Y//fSTateu7fQJ6127dqlGjRpatmyZoqKiXFxpyTt58qQefPBBrVixQuXKlXN8yvzIkSNKS0tTQkKC5s+fr8DAQNcW6gKcN/+M640zzpmCca2BFRBkUWrl5ORoxYoV2rhxY541L1u3bi03t+t7ZsxPP/2U73qgcXFxLq7MtThvUFicM5fGtQalGUHWxf78808tWLBA69at0x9//CE3NzfdcMMN6tChg1q2bOnq8gBcQ7jeALjWEGRdaP/+/WrVqpX+/PNP2e12/fbbb2rbtq2OHTumLVu26P7779f8+fPl4XH9fgFbft9C1KhRI916660urqz0OnnypJYuXaoePXq4uhSXycnJyXcULScnR7/99psqVarkgqpci+vNpXGtKTyuNSgVXDc9F23atDGPPfaYycnJMcYYM2nSJNOmTRtjjDE///yziY6ONqNGjXJhha6TmppqmjRpYmw2m6lcubJp0KCBadCggalcubKx2WymSZMmJjU11dVllko7duwwbm5uri7D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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rep.get(\"plot capacity\")" ] @@ -270,7 +204,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb deleted file mode 100644 index bdbfe481a..000000000 --- a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb +++ /dev/null @@ -1,403 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3ce427fd", - "metadata": {}, - "source": [ - "# Adding DACCS in MESSAGE\n", - "In the previous tutorials, we have learnt how to create a baseline scenario (`westeros_baseline.ipynb`) and add emissions bounds (`westeros_emissions_bounds.ipynb`) to the baseline scenario. Here, we will show how to include an additional/new technology to a MESSAGE model. While the combination of currently existing technologies might be able to deliver the Paris targets, the deployment of some new technologies might improve the probability of meeting the targets and/or reducing the costs. These technologies include CO2 removal (CDR) technologies. Hence, in this tutorial, we will use direct air carbon capture and storage (DACCS) as an example of new technologies to be considered in climate mitigation pathways. \n", - "\n", - "In order to smoothly follow this tutorial, you have to alrady have the MESSAGEix framework installed and working. Moreover, you should have run the Westeros baseline and emissions bounds scenarios successfully as this tutorial is built on top of those scenarios.\n", - "\n", - "If all set, we can start by importing all the packages we need and connect to a database that store the scenario input and results. We can also name the model as `Westeros Electrified` here." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "239a17a2", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import ixmp\n", - "import message_ix\n", - "\n", - "from message_ix.utils import make_df\n", - "\n", - "%matplotlib inline\n", - "\n", - "mp = ixmp.Platform()\n", - "\n", - "model = \"Westeros Electrified\"" - ] - }, - { - "cell_type": "markdown", - "id": "c82f18ff", - "metadata": {}, - "source": [ - "After we are connected to the database, we can call the prevously run `\"emission_bound\"` scenario as our base model and clone the data before we start adding DACCS to the model. As prevoiusly mentioned, to run this tutorial, you have to have succesfully run the `\"emission_bound\"` scenario, which was built based on the `\"baseline\"` scenario." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9a868ad2", - "metadata": {}, - "outputs": [], - "source": [ - "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", - "\n", - "scen = base.clone(\n", - " model,\n", - " \"emission_bound_DACCS\",\n", - " \"introducing an upper bound on emissions\",\n", - " keep_solution=False,)\n", - "scen.check_out()\n", - "\n", - "year_df = scen.vintage_and_active_years()\n", - "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", - "model_horizon = scen.set(\"year\")\n", - "country = \"Westeros\"" - ] - }, - { - "cell_type": "markdown", - "id": "634cecd6", - "metadata": {}, - "source": [ - "Now, let's call the list of historical and model orizon years so we can use these lists for the next steps." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0a2bb27c", - "metadata": {}, - "outputs": [], - "source": [ - "history = [690]\n", - "model_horizon = [700, 710, 720]" - ] - }, - { - "cell_type": "markdown", - "id": "b5db71ca", - "metadata": {}, - "source": [ - "# Adding DACCS description\n", - "First step of adding DACCS as a technology in the model is by including DACCS into the `\"technology\"` set." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b203192", - "metadata": {}, - "outputs": [], - "source": [ - "scen.add_set(\"technology\", [\"DACCS\"])" - ] - }, - { - "cell_type": "markdown", - "id": "017c5ca3", - "metadata": {}, - "source": [ - "Similar to what we did when generating the `\"baseline\"` scenario, the first thing we need to do is defining the input and output comodities of each technology. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c74cf466", - "metadata": {}, - "outputs": [], - "source": [ - "# Some common values to be used for both the \"input\" and \"output\" parameters\n", - "base = dict(\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " mode=\"standard\",\n", - " time=\"year\",\n", - " unit=\"-\",\n", - ")\n", - "\n", - "# Use the message_ix utility function make_df() to create a base data frame for\n", - "# different \"input\" parameter values\n", - "base_input = make_df(\"input\", **base, node_origin=country, time_origin=\"year\")\n", - "\n", - "# Create a base data frame for different \"output\" parameter values\n", - "base_output = make_df(\"output\", **base, node_dest=country, time_dest=\"year\")" - ] - }, - { - "cell_type": "markdown", - "id": "74bc41d1", - "metadata": {}, - "source": [ - "In this example, DACCS is described as a technology that consumes electricity in order to remove CO2 from the atmosphere. This electricity is assumed to be obtained from the grid. Hence, we define DACCS input as final energy in the form of electricity." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0dae391a", - "metadata": {}, - "outputs": [], - "source": [ - "daccs_in = base_input.assign(\n", - " technology=\"DACCS\", commodity=\"electricity\", level=\"final\", value=1.0\n", - ")\n", - "scen.add_par(\"input\", daccs_in)" - ] - }, - { - "cell_type": "markdown", - "id": "8e087a2c", - "metadata": {}, - "source": [ - "Then, we can also add emissions and capacity factors as well as the technical lifetime of the technology. As can be seen in the code block below, the emissions factor has a negative value, showing that the technology removes insted of emits CO2." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c80ec39f", - "metadata": {}, - "outputs": [], - "source": [ - "emission_factor = make_df(\n", - " \"emission_factor\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " mode=\"standard\",\n", - " unit=\"tCO2/kWa\",\n", - " technology=\"DACCS\",\n", - " emission=\"CO2\",\n", - " value=-20,\n", - ")\n", - "scen.add_par(\"emission_factor\", emission_factor)\n", - "\n", - "capacity_factor = make_df(\n", - " \"capacity_factor\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " time=\"year\",\n", - " unit=\"-\",\n", - " technology='DACCS',\n", - " value=1,\n", - ")\n", - "scen.add_par(\"capacity_factor\", capacity_factor)\n", - " \n", - "lifetime = make_df(\n", - " \"technical_lifetime\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " unit=\"y\",\n", - " technology='DACCS',\n", - " value=20,\n", - ")\n", - "scen.add_par(\"technical_lifetime\", lifetime)" - ] - }, - { - "cell_type": "markdown", - "id": "cef799ae", - "metadata": {}, - "source": [ - "We also asume that DACCS is a first of a kind technology, i.e., the technology has never been historically deployed. Accordingly, to allow the technology to be installed in the system, we need to define initial deployment (`\"initial_new_capacity_up\"`) and capacity growth (`\"growth_new_capacity_up\"`) rates" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ad76ac94", - "metadata": {}, - "outputs": [], - "source": [ - "initial_newcapacity_up = {\n", - " \"DACCS\":0.5,\n", - "}\n", - "\n", - "for tec,val in initial_newcapacity_up.items():\n", - " df = make_df(\n", - " \"initial_new_capacity_up\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " time=\"year\",\n", - " unit=\"GW\",\n", - " technology=tec,\n", - " value=val,\n", - " )\n", - " scen.add_par(\"initial_new_capacity_up\", df)\n", - "\n", - "growth_newcapacity_up = {\n", - " \"DACCS\":0.05,\n", - "}\n", - "\n", - "for tec,val in growth_newcapacity_up.items():\n", - " dfgrowth = make_df(\n", - " \"growth_new_capacity_up\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " time=\"year\",\n", - " unit=\"-\",\n", - " technology=tec,\n", - " value=val,\n", - " )\n", - " scen.add_par(\"growth_new_capacity_up\", dfgrowth)" - ] - }, - { - "cell_type": "markdown", - "id": "dfe89d5e", - "metadata": {}, - "source": [ - "The last thing we need to do in describing DACCS is adding the technology costs data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ae4574b", - "metadata": {}, - "outputs": [], - "source": [ - "# Add a new unit for ixmp to recognize as valid\n", - "mp.add_unit(\"USD/kW\")\n", - "\n", - "# in $ / kW (specific investment cost)\n", - "capex = make_df(\n", - " \"inv_cost\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " unit=\"USD/kW\",\n", - " technology='DACCS',\n", - " value=2500,\n", - ")\n", - "scen.add_par(\"inv_cost\", capex)\n", - " \n", - "# in $ / kW / year (every year a fixed quantity is destinated to cover part of the O&M costs\n", - "# based on the size of the plant, e.g. lightning, labor, scheduled maintenance, etc.)\n", - "\n", - "omfix = make_df(\n", - " \"fix_cost\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " unit=\"USD/kWa\",\n", - " technology='DACCS',\n", - " value=5,\n", - ")\n", - "scen.add_par(\"fix_cost\", omfix)\n", - "\n", - "# In $ / kWa (costs associated to the degradation of equipment\n", - "# when the plant is functioning per unit of energy consumed\n", - "# kW·year = 8760 kWh in generating electricity. Therefore the costs represents USD per 8760 kWh\n", - "# of electricity consumed.\n", - "\n", - "omvar = make_df(\n", - " \"var_cost\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " mode=\"standard\",\n", - " time=\"year\",\n", - " unit=\"USD/kWa\",\n", - " technology='DACCS',\n", - " value=0,\n", - ")\n", - "scen.add_par(\"var_cost\", omvar)" - ] - }, - { - "cell_type": "markdown", - "id": "54cc0111", - "metadata": {}, - "source": [ - "# Solve Statement and Plotting Results\n", - "Finally, this is the solve statement and plotting results command" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fb160143", - "metadata": {}, - "outputs": [], - "source": [ - "scen.commit(comment=\"Introducing emissions, DACCS technology, and setting an upper bound\")\n", - "scen.set_as_default()\n", - "\n", - "scen.solve()\n", - "scen.var(\"OBJ\")[\"lvl\"]\n", - "\n", - "# Create a Reporter object to describe and carry out reporting\n", - "# calculations and operations (like plotting) based on `scenario`\n", - "# Add keys like \"plot activity\" to describe reporting operations.\n", - "# See tutorial/utils/plotting.py\n", - "from message_ix.reporting import Reporter\n", - "from message_ix.util.tutorial import prepare_plots\n", - "\n", - "rep = Reporter.from_scenario(scen)\n", - "\n", - "prepare_plots(rep)\n", - "\n", - "# Only show a subset of technologies in the follow plots;\n", - "# e.g. exclude \"bulb\" and \"grid\"\n", - "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\",\"DACCS\"])\n", - "\n", - "# Trigger the calculation and plotting\n", - "rep.get(\"plot activity\")\n", - "\n", - "# Create a different plot. The same filters are still active.\n", - "rep.get(\"plot capacity\")\n", - "\n", - "# Replace the technology filters with a commodity filter;\n", - "# show only \"light\" and not e.g. \"electricity\".\n", - "rep.set_filters(t=None, c=[\"light\"])\n", - "\n", - "# Create a price plot\n", - "rep.get(\"plot prices\")\n", - "\n", - "mp.close_db()" - ] - }, - { - "cell_type": "markdown", - "id": "3a6671bf", - "metadata": {}, - "source": [ - "# All Done\n", - "Voila! You can now see DACCS included in the model. Congratulations!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 92a4dd8933d0f9bb21bfbae0a7007864e228e1c2 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 04:58:17 +0100 Subject: [PATCH 07/25] Delete westeros_baseline_recursive-dynamic.ipynb --- .../westeros_baseline_recursive-dynamic.ipynb | 212 ------------------ 1 file changed, 212 deletions(-) delete mode 100644 tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb deleted file mode 100644 index ea2dc8b10..000000000 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ /dev/null @@ -1,212 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Westeros Tutorial: Running MESSAGE in Recursive Dynamic Mode\n", - "\n", - "While considering the full time horizon in a single run is useful for a long-term energy systems planning, the recursive dynamic approach can provide insights that reflect the relevant foresight windows decision makers can have in making adaptive and robust planning.\n", - "\n", - "In addition to running the model with the perfect foresights, MESSAGE can also be run using the recursive dynamic approach. Here, the model is run iteratively throughout the periods with key decision variables from the previous periods, or iterations, are fixed so that new informations do not alter decisions that are already made in the previous periods. These variables\n", - "include $CAP$ , $CAP\\_NEW$, $ACT$, and $EXT$. \n", - "\n", - "In this tutorial, we will implement the recursive dynamic mode on Westeros baseline scenario. Hence, before we start, we have to make sure that we can successfully run the baseline scenarion (``westeros_baseline.ipynb``).\n", - "\n", - "Let's start with importing all the libraries we need and connect to the `ixmp` platform." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import ixmp\n", - "import message_ix\n", - "\n", - "from message_ix.util import make_df\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mp = ixmp.Platform()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Making a clone of the existing scenario 'baseline'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = \"Westeros Electrified\"\n", - "\n", - "base = message_ix.Scenario(mp, model=model, scenario=\"baseline\")\n", - "scen = base.clone(\n", - " model,\n", - " \"recursive-dynamic\",\n", - " \"introducing recursive dynamic mode\",\n", - " keep_solution=False,\n", - ")\n", - "scen.check_out()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "year_df = scen.vintage_and_active_years()\n", - "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", - "model_horizon = scen.set(\"year\")\n", - "country = \"Westeros\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Time to Solve the Model\n", - "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.commit(comment=\"Introducing recursive dynamic mode in MESSAGE\")\n", - "scen.set_as_default()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.solve(gams_args =[\"--foresight=1\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.var(\"OBJ\")[\"lvl\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting Results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from message_ix.reporting import Reporter\n", - "from message_ix.util.tutorial import prepare_plots\n", - "\n", - "rep = Reporter.from_scenario(scen)\n", - "prepare_plots(rep)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Activity\n", - "\n", - "How much energy is generated in each time period from the different potential sources?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", - "rep.get(\"plot activity\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Capacity\n", - "\n", - "How much capacity of each plant is installed in each period?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rep.get(\"plot capacity\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Close the connection to the database" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mp.close_db()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From dd4d66564c6b67f7e9df5c444a86c1bee30efbdc Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 05:28:38 +0100 Subject: [PATCH 08/25] Create westeros_baseline_recursive-dynamic.ipynb --- .../westeros_baseline_recursive-dynamic.ipynb | 285 ++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb new file mode 100644 index 000000000..72dbe9229 --- /dev/null +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -0,0 +1,285 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Westeros Tutorial: Running MESSAGE in Recursive Dynamic Mode\n", + "\n", + "While considering the full time horizon in a single run is useful for a long-term energy systems planning, the recursive dynamic approach can provide insights that reflect the relevant foresight windows decision makers can have in making adaptive and robust planning.\n", + "\n", + "In addition to running the model with the perfect foresights, MESSAGE can also be run using the recursive dynamic approach. Here, the model is run iteratively throughout the periods with key decision variables from the previous periods, or iterations, are fixed so that new informations do not alter decisions that are already made in the previous periods. These variables\n", + "include $CAP$ , $CAP\\_NEW$, $ACT$, and $EXT$. \n", + "\n", + "In this tutorial, we will implement the recursive dynamic mode on Westeros baseline scenario. Hence, before we start, we have to make sure that we can successfully run the baseline scenarion (``westeros_baseline.ipynb``).\n", + "\n", + "Let's start with importing all the libraries we need and connect to the `ixmp` platform." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"baseline\")\n", + "scen = base.clone(\n", + " model,\n", + " \"recursive-dynamic\",\n", + " \"introducing recursive dynamic mode\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model\n", + "\n", + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing recursive dynamic mode in MESSAGE\")\n", + "scen.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "scen.solve(gams_args =[\"--foresight=1\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "173795.09375" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting Results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "prepare_plots(rep)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Activity\n", + "\n", + "How much energy is generated in each time period from the different potential sources?" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", + "rep.get(\"plot activity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Capacity\n", + "\n", + "How much capacity of each plant is installed in each period?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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3M81ceJEY7PZzK+//urYdscddxg/Pz+nbcYYp77I7aPk5GTHtpo1a+bbD1dzDgEoPZhaAEupXr26goODHXNfd+7cqczMTMdcx0aNGjneyt6wYYMuXLjgeNv6P//5j3JyctSlSxcdO3bMcQsPD1dsbKxjxYOAgABJ0ooVK3TmzJlC1WeM0eLFi9W+fXsZY5yeJyEhQenp6dq2bZvTY3r27OkYnZIuvk195MgRPfHEE463uSWpXbt2iouL05dffilJ8vb2lqenpxITE3Xy5MlC1Zlr8eLFWrlypdNt1qxZedr16tXLae7o7bffLuniCJ0k7dixQ/v27dODDz6o48ePO15zZmamWrZsqW+++cZpyockPf744073V61apfPnz+uJJ55w2j5w4MA89XTp0kVeXl6aN2+eY9uKFSt07NgxPfTQQ5d8zWFhYdq5c6cef/xxnTx5UjNnztSDDz6o0NBQjRs3zunt+B49eigpKUm//PKLY9u8efMUFRWlpk2bSvr/Pxi3bNkynTt37pLP/XcnTpzQ6tWr1aVLF506dcrRb8ePH1dCQoL27duXZzpJnz59nKYANGzYUMYY9enTx7HN3d1d9evXd/x8CpI7jcXPz++y6rXb7Y752xcuXNDx48fl6+uratWq5TmvpYv999djd+rUSREREfq///s/x7a/nvuZmZk6duyYGjVqJGOMtm/fLuniKhPffPONevfurUqVKjk9R37TIS7H1ZxDAEoPgiwsxWazqVGjRo65sOvXr1doaKhuvPFGSc5BNve/uUF23759MsYoNjZW5cuXd7rt2bNHR44ckSTFxMRoyJAhev/99xUSEqKEhARNnz7dMT/2Uo4ePaq0tDS9++67eZ6jV69ekuR4nlwxMTFO93/99VdJUrVq1fIcPy4uzrHfbrdr8uTJ+uqrrxQWFqY77rhDU6ZMKdTSWXfccYdatWrldIuPj8/T7u/hoVy5cpLkCND79u2TdDGU//11v//++8rOzs7TfwW97tyfZa6goCDH8+UKDAxU+/btNX/+fMe2efPmqUKFCmrRosU/vu6IiAjNmDFDf/zxh/bu3as33nhD5cuX18iRI/XBBx842j3wwAOy2+2OsJOenq5ly5ape/fujgDVtGlTdezYUWPGjFFISIjuvfdezZo1S9nZ2f9Yx/79+2WM0YgRI/L026hRoyTlPV/+/rPI/cMrKioqz/Z/+gPH399fknTq1Kl/rFW6OIf5tddeU2xsrOx2u0JCQlS+fHl9//33+f77iI2Ndbpvs9l04403Os3hPnjwoB555BEFBQXJ19dX5cuXd/yRkHvM3EBeq1aty6rzclztOQSgdGCOLCynSZMmWrp0qXbt2pXnk+eNGjXS0KFDdfjwYa1bt06RkZG64YYbJF38JWyz2fTVV1/lOx/wr0suTZ06VY888og+//xz/fe//9WTTz6piRMnauPGjapYsWKBteWOOj700EMFzr/MnRuZ668jUoU1ePBgtW/fXp999plWrFihESNGaOLEiVq9erXq1q17xcf9u4LmT+aOXua+7pdffll16tTJt+3fl7S6mtctXRztW7hwob777jvVrl1bX3zxhZ544olCrfhgs9lUtWpVVa1aVe3atVNsbKzmzZunRx99VNLFwH733Xdr3rx5GjlypBYtWqTs7GynETubzaZFixZp48aNWrp0qVasWKHevXtr6tSp2rhx4yWX8srtt2eeeUYJCQn5tvl7sC/oZ5HfdvMPH/aKi4uTJO3ateuylpGbMGGCRowYod69e2vcuHEKCgqSm5ubBg8enGfE/XJcuHBBd955p06cOKHnnntOcXFx8vHx0eHDh/XII49c0TELoyjOIQCuRZCF5fx1Pdn169c7fXiqXr16stvtSkxMVFJSktq2bevYV6VKFRljFBMTo6pVq/7j89SuXVu1a9fWiy++qO+++06NGzfWzJkz9dJLL0nK/y3N8uXLy8/PTxcuXFCrVq2u6PVVrlxZkrR37948I0N79+517P/r63r66af19NNPa9++fapTp46mTp2qf//731f0/Fci94Nu/v7+V/269+/f7zRae/z48XxHFu+66y6VL19e8+bNU8OGDXXmzBk9/PDDV/Tc0sUPkZUrV05//PGH0/YePXro3nvv1ebNmzVv3jzVrVtXNWvWzPP42267TbfddpvGjx+v+fPnq3v37vr444/16KOPFvj2d+4fWWXKlLnifrsaTZo0Ubly5bRgwQI9//zz//iBr0WLFql58+ZOo9aSlJaWlu8ybrkj9bmMMdq/f7/jj7ldu3bp559/1pw5c5w+lLZy5Uqnx+X20+7duy//xf0/l5p6UNTnEICSx5+dsJz69es75rYdPnzYaUTWbrfrlltu0fTp05WZmem0fuz9998v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Wtu3b1d8fLzat2+v48eP52kzdepUbd68WeXLl1f79u0vax3Yq8WHvQAAAEqJU6dO6fXXX9dbb72lnj17SpKqVKmiJk2a6L333lNWVpY++ugj+fj4SJLeeusttW/fXpMnT1ZYWJhatGjhdLx3331XgYGBWrt2re6+++4rqmnAgAHq2LGjJGnGjBlavny5PvjgAz377LOONqNGjdKdd94pSZozZ44qVqyoJUuWqEuXLlf0nJeLEVkAAIBSYs+ePcrOzlbLli3z3XfzzTc7QqwkNW7cWDk5Odq7d68kKTU1VX379lVsbKwCAgLk7++v06dP6+DBg1dcU3x8vOP/PTw8VL9+fe3Zs6fANkFBQapWrVqeNsWhUCOylStXVosWLdS8eXM1b95cUVFRxVUXAADAdcfb2/uqHt+zZ08dP35cr7/+uipXriy73a74+HidPXu2iCosXQo1IturVy8lJyfrscceU3R0tG688Ub17dtXCxYsUEpKSnHVCAAAcF2IjY2Vt7e3Vq1alWdf9erVtXPnTmVmZjq2rV+/Xm5ubqpWrZrj/pNPPqm2bduqZs2astvtOnbs2FXVtHHjRsf/nz9/Xlu3blX16tULbHPy5En9/PPPedoUh0KNyI4ePVqSlJ2drfXr12vt2rVKTEzU3Llzde7cOVWtWlUtWrTQ9OnTi6NWAACAa5qXl5eee+45Pfvss/L09FTjxo119OhR/fDDD+revbtGjRqlnj17avTo0Tp69KgGDhyohx9+WGFhYZIuBuG5c+eqfv36ysjI0NChQ696lHf69OmKjY1V9erV9dprr+nkyZPq3bu3U5uxY8cqODhYYWFheuGFFxQSElIiX7hwRR/2stvtatGihWNC8cmTJzV16lS9+eabmjlzJkEWAACUSqXxm7b+bsSIEfLw8NDIkSP1+++/KyIiQo8//rjKli2rFStWaNCgQbr11ltVtmxZdezYUa+++qrjsR988IH69eunW265RVFRUZowYYKeeeaZq6pn0qRJmjRpknbs2KEbb7xRX3zxhUJCQvK0GTRokPbt26c6depo6dKl8vT0vKrnvRxXFGTPnj2rDRs2KDExUYmJiUpKSlKFChXUqVMnNW3atKhrBAAAuG64ubnphRde0AsvvJBnX+3atbV69eoCH1u3bl1t3rzZaVunTp2c7htjClVP9erVlZSUdMk2TZo0KXDt2EceeUSPPPJIoZ7zchUqyI4dO9YRXCtXrqw77rhD/fr107x58xQZGVksBQIAAAD5KfQc2UqVKmnq1Knq3LmzgoODi6suAAAAFKMJEyZowoQJ+e67/fbbNWPGjBKuqPAKFWS/+uorrVmzRrNnz9agQYNUtWpVNWvWTE2bNlXTpk1Vvnz54qoTAAAARejxxx8v8AsLvL29VaFChX+chtCsWbNCT1UoSoVafishIUGTJk3Sxo0bdezYMU2ePFlly5bVlClTVLFiRdWsWdPpa9KKwuHDh/XQQw8pODhY3t7eql27trZs2eLYb4zRyJEjFRERIW9vb7Vq1Ur79u0r0hoAAACuNUFBQbrxxhvzvVWoUMHV5V2WK/5mLz8/P7Vt21YTJkzQ66+/riFDhui3334r0mHokydPqnHjxipTpoy++uor/fjjj5o6darKlSvnaDNlyhS98cYbmjlzppKSkuTj46OEhARlZWUVWR0AAAAofQq9akFOTo62bNmiNWvWKDExUevXr1dmZqYqVqyo++67T82bNy+y4iZPnqyoqCjNmjXLsS0mJsbx/8YYTZs2TS+++KLuvfdeSdJHH32ksLAwffbZZ+ratWu+x83OzlZ2drbjfkZGRpHVDAAAgJJRqBHZNm3aqFy5crrtttv05ptvKiQkRK+99pr27dunX3/9VbNnz1bPnj2LrLgvvvhC9evXV+fOnRUaGqq6devqvffec+xPTk5WSkqKWrVq5dgWEBCghg0basOGDQUed+LEiQoICHDc+KpdAAAA6ynUiGxgYKBefvllNW/eXLGxscVVk8P//vc/zZgxQ0OGDNHzzz+vzZs368knn5Snp6d69uzp+Frc3G+zyBUWFnbJr8wdPny4hgwZ4rifkZFBmAUAALCYQgXZDz/8UKtWrXKE2OHDhzu9Re/u7q5x48bJy8urSIrLyclR/fr1HUtD1K1bV7t379bMmTOvauTXbrfLbrcXSY0AAABwjUIF2Tlz5ujLL7/U3XffLUl66623VLNmTcd3+P7000+KjIzUU089VSTFRUREqEaNGk7bqlevrsWLF0uSwsPDJUmpqamKiIhwtElNTVWdOnWKpAYAAHANGR1Qws+XXmyHnj17tgYPHqy0tLSrOk6zZs1Up04dTZs2rUjq+icHDhxQTEyMtm/fftV5rVBzZP/973+rX79+Ttvmz5+vNWvWaM2aNXr55Zf16aefXlVBf9W4cWPt3bvXadvPP/+sypUrS7r4wa/w8HCtWrXKsT8jI0NJSUmKj48vsjoAAABKmwceeEA///yzq8twqUIF2V9++UW1a9d23Pfy8pKb2/9/iAYNGujHH38ssuKeeuopbdy4URMmTND+/fs1f/58vfvuu+rfv78kyWazafDgwXrppZf0xRdfaNeuXerRo4ciIyPVoUOHIqsDAACgtPH29lZoaKiry3CpQgXZtLQ0pzmxR48eVXR0tON+Tk6O0/6rdeutt2rJkiVasGCBatWqpXHjxmnatGnq3r27o82zzz6rgQMHql+/frr11lt1+vRpLV++vMjm6QIAAJSUZcuWKTAwUBcuXJAk7dixQzabTcOGDXO0efTRR/XQQw9p9uzZCgwMdGwfPXq06tSpo7lz5yo6OloBAQHq2rWrTp065WiTmZmpHj16yNfXVxEREZo6dWqh6ouOjta4cePUrVs3+fj4qEKFCpo+fbpTG5vNphkzZqhNmzby9vbWDTfcoEWLFl1Bb/yzQgXZihUravfu3QXu//7771WxYsWrLuqv7r77bu3atUtZWVnas2eP+vbt67TfZrNp7NixSklJUVZWlr7++mtVrVq1SGsAAAAoCbfffrtOnTql7du3S5LWrl2rkJAQJSYmOtqsXbtWzZo1y/fxv/zyiz777DMtW7ZMy5Yt09q1azVp0iTH/qFDh2rt2rX6/PPP9d///leJiYnatm1boWp8+eWXdfPNN2v79u0aNmyYBg0apJUrVzq1GTFihDp27KidO3eqe/fu6tq1q/bs2VOo57kchQqybdu21ciRI/P91qw///xTY8aMUbt27YqsOAAAgOtJQECA6tSp4wiuiYmJeuqpp7R9+3adPn1ahw8f1v79+9W0adN8H5+Tk6PZs2erVq1auv322/Xwww87Pkt0+vRpffDBB3rllVfUsmVL1a5dW3PmzNH58+cLVWPjxo01bNgwVa1aVQMHDlSnTp302muvObXp3LmzHn30UVWtWlXjxo1T/fr19eabbxa+Q/5BoYLs888/rxMnTqhatWp6+eWX9fnnn+vzzz/XlClTVK1aNZ08eVLPP/98kRcJAABwvWjatKkSExNljNG3336r+++/X9WrV9e6deu0du1aRUZGFrief3R0tPz8/Bz3IyIidOTIEUkXR2vPnj2r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vviiuXDhgqvLdInTp0+b7t27G3d3d+Ph4WFCQ0NNaGio8fDwMO7u7uahhx4ymZmZri7TJThvCsb1Jn+cMwXjWgMrIMi6kK+vr9m2bVuB+7ds2WJ8fX1LsKLSY+jQoaZ8+fJm5syZJjk52Zw5c8acOXPGJCcnm3feeceEhoaaZ5991tVlukSfPn1MbGysWb58uTl//rxj+/nz582KFStM1apVzaOPPurCCl2H86ZgXG/yxzlTMK41sAKCrAsFBwebxMTEAvevWbPGBAcHl2BFpUdYWJhZvnx5gfuXL19uQkNDS7Ci0iMwMNCsX7++wP3r1q0zgYGBJVhR6cF5UzCuN/njnCkY1xpYAasWuNADDzygnj17asmSJcrIyHBsz8jI0JIlS9SrVy9169bNhRW6zqlTpxQZGVng/oiICGVmZpZgRaVHTk6OPD09C9zv6empnJycEqyo9OC8KRjXm/xxzhSMaw0swdVJ+nqWlZVlHn/8cePp6Wnc3NyMl5eX8fLyMm5ubsbT09P861//MllZWa4u0yXatm1rWrdubY4ePZpn39GjR81dd91l2rVr54LKXO/BBx80devWzfdt4m3btpl69eqZ7t27u6Ay1+O8KRjXm/xxzhSMaw2sgFULSoGMjAxt2bJFqampki5+IrRevXry9/d3cWWuc+jQIbVt21Y//fSTateu7fQJ6127dqlGjRpatmyZoqKiXFxpyTt58qQefPBBrVixQuXKlXN8yvzIkSNKS0tTQkKC5s+fr8DAQNcW6gKcN/+M640zzpmCca2BFRBkUWrl5ORoxYoV2rhxY541L1u3bi03t+t7ZsxPP/2U73qgcXFxLq7MtThvUFicM5fGtQalGUHWxf78808tWLBA69at0x9//CE3NzfdcMMN6tChg1q2bOnq8gBcQ7jeALjWEGRdaP/+/WrVqpX+/PNP2e12/fbbb2rbtq2OHTumLVu26P7779f8+fPl4XH9fgFbft9C1KhRI916660urqz0OnnypJYuXaoePXq4uhSXycnJyXcULScnR7/99psqVarkgqpci+vNpXGtKTyuNSgVXDc9F23atDGPPfaYycnJMcYYM2nSJNOmTRtjjDE///yziY6ONqNGjXJhha6TmppqmjRpYmw2m6lcubJp0KCBadCggalcubKx2WymSZMmJjU11dVllko7duwwbm5uri7D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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rep.get(\"plot capacity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 8c92531ecb18e1cd3c97710e31e4dad7c9b00d38 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 05:34:05 +0100 Subject: [PATCH 09/25] Create westeros_emissions_bounds_daccs.ipynb --- .../westeros_emissions_bounds_daccs.ipynb | 455 ++++++++++++++++++ 1 file changed, 455 insertions(+) create mode 100644 tutorial/westeros/westeros_emissions_bounds_daccs.ipynb diff --git a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb new file mode 100644 index 000000000..bf1dcbeac --- /dev/null +++ b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb @@ -0,0 +1,455 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3ce427fd", + "metadata": {}, + "source": [ + "# Adding DACCS in MESSAGE\n", + "In the previous tutorials, we have learnt how to create a baseline scenario (`westeros_baseline.ipynb`) and add emissions bounds (`westeros_emissions_bounds.ipynb`) to the baseline scenario. Here, we will show how to include an additional/new technology to a MESSAGE model. While the combination of currently existing technologies might be able to deliver the Paris targets, the deployment of some new technologies might improve the probability of meeting the targets and/or reducing the costs. These technologies include CO2 removal (CDR) technologies. Hence, in this tutorial, we will use direct air carbon capture and storage (DACCS) as an example of new technologies to be considered in climate mitigation pathways. \n", + "\n", + "In order to smoothly follow this tutorial, you have to alrady have the MESSAGEix framework installed and working. Moreover, you should have run the Westeros baseline and emissions bounds scenarios successfully as this tutorial is built on top of those scenarios.\n", + "\n", + "If all set, we can start by importing all the packages we need and connect to a database that store the scenario input and results. We can also name the model as `Westeros Electrified` here." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "239a17a2", + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.utils import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"Westeros Electrified\"" + ] + }, + { + "cell_type": "markdown", + "id": "c82f18ff", + "metadata": {}, + "source": [ + "After we are connected to the database, we can call the prevously run `\"emission_bound\"` scenario as our base model and clone the data before we start adding DACCS to the model. As prevoiusly mentioned, to run this tutorial, you have to have succesfully run the `\"emission_bound\"` scenario, which was built based on the `\"baseline\"` scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9a868ad2", + "metadata": {}, + "outputs": [], + "source": [ + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "scen = base.clone(\n", + " model,\n", + " \"emission_bound_DACCS\",\n", + " \"introducing an upper bound on emissions\",\n", + " keep_solution=False,)\n", + "scen.check_out()\n", + "\n", + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "id": "634cecd6", + "metadata": {}, + "source": [ + "Now, let's call the list of historical and model orizon years so we can use these lists for the next steps." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0a2bb27c", + "metadata": {}, + "outputs": [], + "source": [ + "history = [690]\n", + "model_horizon = [700, 710, 720]" + ] + }, + { + "cell_type": "markdown", + "id": "b5db71ca", + "metadata": {}, + "source": [ + "# Adding DACCS description\n", + "First step of adding DACCS as a technology in the model is by including DACCS into the `\"technology\"` set." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3b203192", + "metadata": {}, + "outputs": [], + "source": [ + "scen.add_set(\"technology\", [\"DACCS\"])" + ] + }, + { + "cell_type": "markdown", + "id": "017c5ca3", + "metadata": {}, + "source": [ + "Similar to what we did when generating the `\"baseline\"` scenario, the first thing we need to do is defining the input and output comodities of each technology. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c74cf466", + "metadata": {}, + "outputs": [], + "source": [ + "# Some common values to be used for both the \"input\" and \"output\" parameters\n", + "base = dict(\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"-\",\n", + ")\n", + "\n", + "# Use the message_ix utility function make_df() to create a base data frame for\n", + "# different \"input\" parameter values\n", + "base_input = make_df(\"input\", **base, node_origin=country, time_origin=\"year\")\n", + "\n", + "# Create a base data frame for different \"output\" parameter values\n", + "base_output = make_df(\"output\", **base, node_dest=country, time_dest=\"year\")" + ] + }, + { + "cell_type": "markdown", + "id": "74bc41d1", + "metadata": {}, + "source": [ + "In this example, DACCS is described as a technology that consumes electricity in order to remove CO2 from the atmosphere. This electricity is assumed to be obtained from the grid. Hence, we define DACCS input as final energy in the form of electricity." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0dae391a", + "metadata": {}, + "outputs": [], + "source": [ + "daccs_in = base_input.assign(\n", + " technology=\"DACCS\", commodity=\"electricity\", level=\"final\", value=1.0\n", + ")\n", + "scen.add_par(\"input\", daccs_in)" + ] + }, + { + "cell_type": "markdown", + "id": "8e087a2c", + "metadata": {}, + "source": [ + "Then, we can also add emissions and capacity factors as well as the technical lifetime of the technology. As can be seen in the code block below, the emissions factor has a negative value, showing that the technology removes insted of emits CO2." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c80ec39f", + "metadata": {}, + "outputs": [], + "source": [ + "emission_factor = make_df(\n", + " \"emission_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " unit=\"tCO2/kWa\",\n", + " technology=\"DACCS\",\n", + " emission=\"CO2\",\n", + " value=-20,\n", + ")\n", + "scen.add_par(\"emission_factor\", emission_factor)\n", + "\n", + "capacity_factor = make_df(\n", + " \"capacity_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology='DACCS',\n", + " value=1,\n", + ")\n", + "scen.add_par(\"capacity_factor\", capacity_factor)\n", + " \n", + "lifetime = make_df(\n", + " \"technical_lifetime\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"y\",\n", + " technology='DACCS',\n", + " value=20,\n", + ")\n", + "scen.add_par(\"technical_lifetime\", lifetime)" + ] + }, + { + "cell_type": "markdown", + "id": "cef799ae", + "metadata": {}, + "source": [ + "We also asume that DACCS is a first of a kind technology, i.e., the technology has never been historically deployed. Accordingly, to allow the technology to be installed in the system, we need to define initial deployment (`\"initial_new_capacity_up\"`) and capacity growth (`\"growth_new_capacity_up\"`) rates" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ad76ac94", + "metadata": {}, + "outputs": [], + "source": [ + "initial_newcapacity_up = {\n", + " \"DACCS\":0.5,\n", + "}\n", + "\n", + "for tec,val in initial_newcapacity_up.items():\n", + " df = make_df(\n", + " \"initial_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"GW\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"initial_new_capacity_up\", df)\n", + "\n", + "growth_newcapacity_up = {\n", + " \"DACCS\":0.05,\n", + "}\n", + "\n", + "for tec,val in growth_newcapacity_up.items():\n", + " dfgrowth = make_df(\n", + " \"growth_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"growth_new_capacity_up\", dfgrowth)" + ] + }, + { + "cell_type": "markdown", + "id": "dfe89d5e", + "metadata": {}, + "source": [ + "The last thing we need to do in describing DACCS is adding the technology costs data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3ae4574b", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new unit for ixmp to recognize as valid\n", + "mp.add_unit(\"USD/kW\")\n", + "\n", + "# in $ / kW (specific investment cost)\n", + "capex = make_df(\n", + " \"inv_cost\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"USD/kW\",\n", + " technology='DACCS',\n", + " value=2500,\n", + ")\n", + "scen.add_par(\"inv_cost\", capex)\n", + " \n", + "# in $ / kW / year (every year a fixed quantity is destinated to cover part of the O&M costs\n", + "# based on the size of the plant, e.g. lightning, labor, scheduled maintenance, etc.)\n", + "\n", + "omfix = make_df(\n", + " \"fix_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=5,\n", + ")\n", + "scen.add_par(\"fix_cost\", omfix)\n", + "\n", + "# In $ / kWa (costs associated to the degradation of equipment\n", + "# when the plant is functioning per unit of energy consumed\n", + "# kW·year = 8760 kWh in generating electricity. Therefore the costs represents USD per 8760 kWh\n", + "# of electricity consumed.\n", + "\n", + "omvar = make_df(\n", + " \"var_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=0,\n", + ")\n", + "scen.add_par(\"var_cost\", omvar)" + ] + }, + { + "cell_type": "markdown", + "id": "54cc0111", + "metadata": {}, + "source": [ + "# Solve Statement and Plotting Results\n", + "Finally, this is the solve statement and plotting results command" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fb160143", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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SDLeeecd27K/X/vZJkyYYFgsFuPPP/+0LWvWrJlRsmRJu2WGYdidi+xzdOjQIduymjVr5noebuUaAlB8MLQAplK9enWVLl3aNvZ1x44dSktLs411bNy4se2t7I0bNyozM9P2tvXXX3+trKwsdevWTadOnbI9rFarqlSpYpvxwNfXV5K0fPlyXbx4MU/1GYahhQsXqnPnzjIMw24/UVFRSklJ0a+//mr3mpiYGFvvlHT1berk5GQ988wztre5Jaljx44KDw/Xd999J0ny9PSUm5ubEhISdPbs2TzVmW3hwoVasWKF3WPWrFk52vXp08du7Oh9990n6WoPnSRt375d+/fv16OPPqrTp0/bjjktLU2tW7fWjz/+aDfkQ5Keeuopu+erVq1SRkaGnnnmGbvlgwcPzlFPt27d5OHhofj4eNuy5cuX69SpU3rssceue8xBQUHasWOHnnrqKZ09e1YzZszQo48+qsDAQI0bN87u7fjevXtr8+bNOnjwoG1ZfHy8QkND1bx5c0n//4NxS5Ys0ZUrV6677386c+aMVq9erW7duun8+fO283b69GlFRUVp//79OYaT9OvXz24IQMOGDWUYhvr162db5uzsrPr169u+PteSPYylZMmSN1Wvu7u7bfx2ZmamTp8+LW9vb1WrVi3HdS1dPX9/33bXrl0VHBys77//3rbs79d+WlqaTp06pcaNG8swDG3btk3S1VkmfvzxR/Xt21fly5e320duwyFuxq1cQwCKD4IsTMVisahx48a2sbDr169XYGCgKleuLMk+yGb/mx1k9+/fL8MwVKVKFZUpU8busXfvXiUnJ0uSwsLCNGzYMH3yyScKCAhQVFSUpk2bZhsfez0nT57UuXPn9NFHH+XYR58+fSTJtp9sYWFhds///PNPSVK1atVybD88PNy23t3dXW+88YaWLl2qoKAgNWvWTJMmTcrT1FnNmjVTmzZt7B6RkZE52v0zPJQqVUqSbAF6//79kq6G8n8e9yeffKL09PQc5+9ax539tczm7+9v2182Pz8/de7cWXPnzrUti4+PV9myZdWqVasbHndwcLCmT5+uEydOaN++fXr33XdVpkwZvfLKK5o5c6at3SOPPCJ3d3db2ElJSdGSJUvUs2dPW4Bq3ry5oqOjNXbsWAUEBOiBBx7QrFmzlJ6efsM6Dhw4IMMwNGrUqBznbfTo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6f4OT+yYp/aPP/64Zs+eLUlycXGRv7+/ateurR49eujxxx/PMftCVFSUVq5cqU2bNqlBgwY5trdt2zaNHz9eP/74o1JSUhQaGqoWLVpoxIgRqlq1qq3dwoUL9d5772nbtm3KzMzUXXfdpa5du2rQoEHy9/dXZmamJk+erLi4OP3555/y9PRUlSpV1L9/fz3xxBP5ODMFw6E9shMmTFCDBg1UsmRJBQYGqkuXLtq3b59dm0uXLmngwIEqXbq0vL29FR0draSkJLs2R44cUceOHVWiRAkFBgZqxIgRysjIKMpDAQAAKBD333+/Tpw4ocOHD2vp0qVq2bKlhgwZok6dOtnlmyNHjmjDhg0aNGiQPv300xzbWbJkiRo1aqT09HTFx8dr7969+vzzz+Xr66tRo0bZ2r300kt65JFH1KBBAy1dulS7du3SlClTtGPHDs2ZM0eSNHbsWL399tsaN26c9uzZozVr1mjAgAE6d+5coZ+P63Foj+zatWs1cOBANWjQQBkZGXrxxRfVrl077dmzR15eXpKkZ599Vt99953mz58vX19fDRo0SA899JDWr18v6eqnEjt27Cir1aoNGzboxIkT6t27t1xdXTV+/HhHHh4AAECeubu7y2q1SpLKli2re+65R40aNVLr1q0VFxdn6wGdNWuWOnXqpKefflqNGjXSW2+9ZZu+6uLFi+rTp486dOigRYsW2bYdFhamhg0b2gLoli1bNH78eE2dOlVDhgyxtatYsaLatm1ra/ftt9/qmWee0cMPP2xrU6dOncI8DTfFoT2yy5Yt0+OPP66aNWuqTp06iouL05EjR7R161ZJUkpKimbOnKm33npLrVq1Ur169TRr1ixt2LBBmzZtkiT98MMP2rNnjz7//HPVrVtX7du317hx4zRt2jRuSQcAAG4LrVq1Up06dfT1119LunrzgFmzZumxxx5TeHi4KleurAULFtjaL1++XKdOndLzzz+f6/b8/PwkSfHx8fL29tYzzzxz3XZWq1WrV6/WyZMnC+6gCkCx+rBXSkqKJMnf31+StHXrVl25ckVt2rSxtQkPD1f58uW1ceNGSdLGjRsVERGhoKAgW5uoqCilpqZq9+7due4nPT1dqampdg8AAIDiLDw8XIcPH5YkrVy5UhcvXlRUVJQk6bHHHtPMmTNtbffv3297zfXs379fd911l1xdXa/b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quWpvsjIyBzP/9nbejNtCgIf9gIAAChGWrRooU8//VQ7duyQq6urwsPD1aJFCyUkJOjs2bPX7I2VJFdXV7vnFotFWVlZhV2yw9AjCwAAUIxkj5N9++23baE1O8gmJCRcc3zsjVSqVEmurq7avHmzbdnZs2f13//+N0/b2bRpU47n1atXz3ObgkCPLAAAQDFSqlQp1a5dW/Hx8Xr//fclSc2aNVO3bt105cqV6/bIXo+3t7f69eunESNGqHTp0goMDNRLL70kJ6e89WuuX79ekyZNUpcuXbRixQrNnz9f3333nV2b+fPnq379+mratKni4+O1ZcsWzZw5M191Xw9BFgAA3DEK8wYFBal58+bavn27rffV399fNWrUUFJSUp7HtP7d5MmTdeHCBXXu3FklS5bUc889p5SUlDxt47nnntMvv/yisWPHysfHR2+99ZaioqLs2owdO1bz5s3TM888o+DgYH3xxReqUaNGvuu+FothGEaBb9VkUlNT5evrq5SUFPn4+Di6HADArRjj6+gKbg9j8hZuHOF6v78vXbqkQ4cOKSwsTB4eHg6q8PZTsWJFDR069Lq3tLVYLFq0aJG6dOmSr33k5Wvn0DGyP/74ozp37qyQkBBZLBZ98803dusff/xxWSwWu8f9999v1+bMmTPq2bOnfHx85Ofnp379+unChQtFeBQAAABwBIcG2bS0NNWpUyfHHSH+7v7779eJEydsjy+++MJufc+ePbV7926tWLFCS5Ys0Y8//qgBAwYUdukAAAC3lZ9++kne3t7XfBRHDh0j2759e7Vv3/66bdzd3WW1WnNdt3fvXi1btkw///yz6tevL0l677331KFDB7355psKCQkp8JoBAABuR/Xr19f27duv2+bw4cM33E5Rjlot9h/2SkhIUGBgoEqVKqVWrVrptddeU+nSpSVJGzdulJ+fny3ESlKbNm3k5OSkzZs368EHH8x1m+np6UpPT7c9T01NLdyDAAAAKOY8PT1VuXJlR5eRJ8V6Htn7779fn332mVatWqU33nhDa9euVfv27ZWZmSlJSkxMVGBgoN1rXFxc5O/vr8TExGtud8KECfL19bU9QkNDC/U4AACAY/CZdvPJy9esWPfIdu/e3fb/iIgI1a5dW5UqVVJCQoJat26d7+3GxsZq2LBhtuepqamEWQAAbiPOzs6SpMuXL8vT09PB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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAAHTCAYAAABY/cLZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3TklEQVR4nO3deXgUVd728buzdSBkAZIQkIQAApFNdiQgYREi2wPKiKAzQRYBBQYGGZVHARlUFsXBUQZBR1CMwyqMoBjZMgxhB2EQAdkiiJCwZSGRAOl6/+BNP7YJyBLSIef7ua6+TNeprvpVpejcnqo6ZbMsyxIAAACM4uHuAgAAAFD0CIEAAAAGIgQCAAAYiBAIAABgIEIgAACAgQiBAAAABiIEAgAAGIgQCAAAYCBCIAAAgIEIgQCAG2Kz2fTKK6+4uwwAhYQQiGJn4cKFstlsWrp0ab62+++/XzabTevWrcvXFhERoejo6EKv5/XXX9eyZcsKfblF4ZVXXpHNZrvm69SpU+4u8Y46ffq0RowYoaioKJUqVUqhoaFq1qyZXnjhBV24cKHQ15edna1XXnlFiYmJhb7s29WmTRuX3325cuXUtGlTffjhh3I4HO4uD4AbeLm7AODXWrVqJUnasGGDHnnkEef0jIwMffvtt/Ly8lJSUpLatm3rbDt+/LiOHz+u3r17F3o9r7/+un73u9+pR48ehb7sojJz5kyVKVMm3/SgoKCiL6aInDt3Tk2aNFFGRob69++vqKgonT17Vv/97381c+ZMPfPMMwXuk9uRnZ2tCRMmSLoauoqbypUra9KkSZKuBuSPP/5YAwYM0Pfff6/Jkyf/5ud//vlneXnxZwMoKfjXjGKnUqVKqlq1qjZs2OAyfdOmTbIsS4899li+trz3eQGyuLt48aJ8fHzk4VE0nfG/+93vFBwcXCTrup6srCz5+fkVybr+8Y9/6NixY0pKSsrXQ5yRkSEfH58iqaM4CQwM1O9//3vn+8GDB6tWrVp69913NXHiRHl7e+f7jMPh0KVLl+Tr6ytfX9+iLBfAHcbpYBRLrVq10jfffKOff/7ZOS0pKUl16tRRp06dtHnzZpdTWElJSbLZbGrZsqVz2ieffKLGjRurVKlSKleunHr37q3jx4+7rOfgwYPq2bOnwsLC5Ovrq8qVK6t3795KT0+XdPUaqKysLH300UfO02hPPfWU8/MnTpxQ//79VaFCBdntdtWpU0cffvihyzoSExNls9k0f/58vfzyy7rnnntUunRpZWRkSJIWLVrkrDM4OFi///3vdeLECZdlnDp1Sv369VPlypVlt9tVsWJFde/eXcnJybe1n39d48KFC/Xaa6+pcuXK8vX1Vfv27XXo0KF882/ZskUPP/ywAgMDVbp0acXExCgpKcllnrxT0d99952eeOIJlS1b1hnSHQ6HXnnlFVWqVEmlS5dW27Zt9d133ykyMtK5f48cOSKbzaa//vWv+da/ceNG2Ww2/fOf/7zmNh0+fFienp564IEH8rUFBAQ4A8348ePl7e2t06dP55tv0KBBCgoK0sWLFyVJ27dvV2xsrIKDg1WqVClVrVpV/fv3lyQlJycrJCREkjRhwgTn8fLLa+j279+v3/3udypXrpx8fX3VpEkTff755y7rnDt3rmw2mzZs2KA//vGPCgkJUVBQkAYPHqxLly4pLS1NcXFxKlu2rMqWLavnn39elmVdcz9cT+nSpfXAAw8oKyvLuf02m03Dhg1TfHy86tSpI7vdrq+++srZ9utrAk+cOKEBAwaoUqVKstvtqlq1qp555hldunTJOU9aWppGjhyp8PBw2e123XvvvZoyZUq+09Dz589X48aN5e/vr4CAANWrV09vv/32LW0bgN9GTyCKpVatWmnevHnasmWL87RaXo9OdHS00tPT9e2336p+/frOtqioKJUvX16S9Nprr2ns2LHq1auXBg4cqNOnT+udd95R69at9c033ygoKEiXLl1SbGyscnJyNHz4cIWFhenEiRNasWKF0tLSFBgYqHnz5mngwIFq1qyZBg0aJEmqXr26JCklJUUPPPCA849mSEiIVq5cqQEDBigjI0MjR4502aaJEyfKx8dHo0ePVk5Ojnx8fDR37lz169dPTZs21aRJk5SSkqK3335bSUlJzjolqWfPntq7d6+GDx+uyMhIpaamatWqVTp27JgiIyN/c3+eO3cu3zQvL698p4MnT54sDw8PjR49Wunp6Zo6daqefPJJbdmyxTnP2rVr1alTJzVu3Fjjx4+Xh4eH5syZo3bt2uk///mPmjVr5rLMxx57TDVq1NDrr7/uDCtjxozR1KlT1a1bN8XGxmr37t2KjY11hi1Jqlatmlq2bKn4+Hj96U9/cllmfHy8/P391b1792tuc5UqVZSbm6t58+apb9++15zvD3/4g/7yl79owYIFGjZsmHP6pUuXtHjxYvXs2VO+vr5KTU1Vx44dFRISohdffFFBQUFKTk7WZ599JkkKCQlxnmZ+5JFH9Oijj0qS8xjdu3evWrZsqXvuuUcvvvii/Pz8tHDhQvXo0UNLlixxufRBkvOYnDBhgjZv3qzZs2crKChIGzduVEREhF5//XV9+eWXeuONN1S3bl3FxcVdcxuv58iRI/L09HQ5FtauXauFCxdq2LBhCg4OvuYx9tNPP6lZs2ZKS0vToEGDFBUVpRMnTmjx4sXKzs6Wj4+PsrOzFRMToxMnTmjw4MGKiIjQxo0bNWbMGJ08eVLTp0+XJK1atUp9+vRR+/btNWXKFEnSvn37lJSUpBEjRtzStgH4DRZQDO3du9eSZE2cONGyLMu6fPmy5efnZ3300UeWZVlWhQoVrBkzZliWZVkZGRmWp6en9fTTT1uWZVnJycmWp6en9dprr7ksc8+ePZaXl5dz+jfffGNJshYtWnTdWvz8/Ky+ffvmmz5gwACrYsWK1pkzZ1ym9+7d2woMDLSys7Mty7KsdevWWZKsatWqOadZlmVdunTJCg0NterWrWv9/PPPzukrVqywJFnjxo2zLMuyzp8/b0my3njjjevvtAKMHz/eklTgq1atWs758mq87777rJycHOf0t99+25Jk7dmzx7Isy3I4HFaNGjWs2NhYy+FwOOfLzs62qlatanXo0CHfuvv06eNS06lTpywvLy+rR48eLtNfeeUVS5LLvp41a5Ylydq3b5/LfgsODi7wd/Lr9YSEhFiSrKioKGvIkCHWp59+aqWlpeWbt0WLFlbz5s1dpn322WeWJGvdunWWZVnW0qVLLUnWtm3brrnO06dPW5Ks8ePH52tr3769Va9ePevixYvOaQ6Hw4qOjrZq1KjhnDZnzhxLUr593KJFC8tms1lDhgxxTrty5YpVuXJlKyYm5rr7wrIsKyYmxoqKirJOnz5tnT592tq3b5/1xz/+0ZJkdevWzTmfJMvDw8Pau3dvvmX8etvi4uIsDw+PAvdJXu0TJ060/Pz8rO+//96l/cUXX7Q8PT2tY8eOWZZlWSNGjLACAgKsK1eu/Oa2ACgcnA5GsXTfffepfPnyzmv9du/eraysLOe1XdHR0c7Tj5s2bVJubq7zVONnn30mh8OhXr166cyZM85XWFiYatSo4byzODAwUJKUkJCg7Ozsm6rPsiwtWbJE3bp1k2VZLuuJjY1Venq6du7c6fKZvn37qlSpUs7327dvV2pqqp599lmXa626dOmiqKgoffHFF5KkUqVKycfHR4mJiTp//vxN1ZlnyZIlWrVqlctrzpw5+ebr16+fy7VyDz74oKSrvUWStGvXLh08eFBPPPGEzp4969zmrKwstW/fXuvXr893im/IkCEu79esWaMrV67o2WefdZk+fPjwfPX06tVLvr6+io+Pd05LSEjQmTNnXK5tK0iFChW0e/duDRkyROfPn9d7772nJ554QqGhoZo4caLLKdS4uDht2bJFhw8fdk6Lj49XeHi4YmJiJP3fTTQrVqzQ5cuXr7vuXzt37pzWrl2rXr16KTMz07nfzp49q9jYWB08eDDfJQADBgyQzWZzvm/evLksy9KAAQOc0zw9PdWkSRPn7+e37N+/XyEhIQoJCdF9992nd955R126dMl3CUNMTIxq16593WU5HA4tW7ZM3bp1U5MmTfK159W+aNEiPfjggypbtqzLv5OHHnpIubm5Wr9+vaSr+zcrK0urVq26oW0BcPsIgSiWbDaboqOjndf+JSUlKTQ0VPfee68k1xCY99+8EHjw4EFZlqUaNWo4/+Dlvfbt26fU1FRJUtWqVTVq1Ch98MEHCg4OVmxsrGbMmOG8HvB6Tp8+rbS0NM2ePTvfOvr16ydJzvXkqVq1qsv7H374QZJUq1atfMuPiopyttvtdk2ZMkUrV65UhQoV1Lp1a02dOvWmhndp3bq1HnroIZdXixYt8s0XERHh8r5s2bKS5AyfBw8elHQ10P56uz/44APl5OTk23/X2u6832WecuXKOdeXJygoSN26ddOnn37qnBYfH6977rlH7dq1+83trlixombOnKmTJ0/qwIED+tvf/qaQkBCNGzdO//jHP5zzPf7447Lb7c6wmZ6erhUrVujJJ590hpmYmBj17NlTEyZMUHBwsLp37645c+YoJyfnN+s4dOiQLMvS2LFj8+238ePHS8p/vPz6d5H3Py3h4eH5pt/o/xxERkZq1apVWr16tTZs2KBTp05pxYoV+W4a+vXvrCCnT59WRkaG6tate935Dh48qK+++irfdj/00EOS/m+7n332WdWsWVOdOnVS5cqV1b9/f+e1iADuDK4JRLHVqlUrLV++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Db3uqeHbCoEff/yxsrOzb2cRAAAATnnXAJYuXdrNldy98vbd5cuX71wIbNq06e18HAAAoECcAr51N7rvbmqw6L59++rjjz/WsWPHbqkoAAAAFA83FQJ/+OEHDR48WFWrVlX16tU1cOBAxcfH6+TJk3eqPgAAgLtCmzZtNHLkSElSZGSkpk+ffsOfTU5Ols1m065du+5IbQW5qdPBiYmJysnJ0caNG5WYmKjExER98sknunz5smrUqKG2bduqXbt2euyxx+5UvQAAwFCRL35RZOtKntzltj6/bds2+fn5FVI1V82dO1cjR44stKFzbvqaQLvdrrZt26pt27aSpIsXL2rjxo1auXKlZs+erdmzZxMCAQCA0UJCQtxdwm+6qdPBv3Tp0iX9+9//1pQpU/SXv/xF7777roKDg9W3b9/CrA8AAOCu8+vTwfv371erVq3k6+ur2rVra/Xq1bLZbFq2bJnL544cOaK2bduqdOnSuv/++7Vp0yZJV8/G9uvXT+np6bLZbLLZbHrllVduq8ab6glcv369EhMTtW7dOm3ZskURERGKiYnRoEGD9Mknn6hy5cq3VQwAAEBJk5ubqx49eigiIkJbtmxRZmamnnvuuQLnfemll/Tmm2+qRo0aeumll9SnTx8dOnRI0dHRmj59usaNG6cDBw5IksqUKXNbdd1UCGzTpo0iIiL0wgsvaP78+apQocJtrRwAAKCkW7VqlQ4fPqzExESFhYVJkl577TV16NAh37yjR49Wly5Xr0ecMGGC6tSpo0OHDikqKkqBgYGy2WzOZdyumzod/PzzzyssLEwjR45Uhw4dNHz4cC1ZskRnzpwplGIAAABKmgMHDig8PNwlvDVr1qzAeevXr+/8Oe+xb3mPgStsNxUCJ0+erM2bN+vs2bOaMmWKSpcuralTp6pSpUqqW7euhg4dqsWLF9+RQgEAAEo6b29v5895gz47HI47sq5bemJImTJl1KlTJ3Xq1EmSdO7cOb311lt655139N577/EsYQAAgP+vVq1aOn78uFJSUpyX0m3btu2ml+Pj41OoGeuWQqDD4dC2bducYwUmJSXpwoULioiI0KOPPlpoxQEAANztOnTooOrVq6tv376aOnWqMjMz9fLLL0u6ucfjRUZG6sKFC1qzZo3uv/9+lS5d+raesXxTp4OnTp2qzp07q2zZsmrRooVzWJjp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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "scen.commit(comment=\"Introducing emissions, DACCS technology, and setting an upper bound\")\n", + "scen.set_as_default()\n", + "\n", + "scen.solve()\n", + "scen.var(\"OBJ\")[\"lvl\"]\n", + "\n", + "# Create a Reporter object to describe and carry out reporting\n", + "# calculations and operations (like plotting) based on `scenario`\n", + "# Add keys like \"plot activity\" to describe reporting operations.\n", + "# See tutorial/utils/plotting.py\n", + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "\n", + "prepare_plots(rep)\n", + "\n", + "# Only show a subset of technologies in the follow plots;\n", + "# e.g. exclude \"bulb\" and \"grid\"\n", + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\",\"DACCS\"])\n", + "\n", + "# Trigger the calculation and plotting\n", + "rep.get(\"plot activity\")\n", + "\n", + "# Create a different plot. The same filters are still active.\n", + "rep.get(\"plot capacity\")\n", + "\n", + "# Replace the technology filters with a commodity filter;\n", + "# show only \"light\" and not e.g. \"electricity\".\n", + "rep.set_filters(t=None, c=[\"light\"])\n", + "\n", + "# Create a price plot\n", + "rep.get(\"plot prices\")\n", + "\n", + "mp.close_db()" + ] + }, + { + "cell_type": "markdown", + "id": "3a6671bf", + "metadata": {}, + "source": [ + "# All Done\n", + "Voila! You can now see DACCS included in the model. Congratulations!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2009f76", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 88b52de03aed8fbd0682961fc6abec1f88c785dd Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 05:46:10 +0100 Subject: [PATCH 10/25] Update westeros_baseline_recursive-dynamic.ipynb --- tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb index 72dbe9229..526a52b04 100644 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -96,7 +96,9 @@ "source": [ "## Time to Solve the Model\n", "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example. \n", + "\n", + "Similarly, technology cost learning module can be activated by setting `learningmode` value to 1. This can also be done by passing `\"--learningmode=1\"` GAMS argument in the solve statement, i.e., `gams_args =[\"--foresight=X\",\"--learningmode=1\"]`. It is important to note that the learning module lives under the recursive dynamic module. Hence, this module needs to be active if learning module is used." ] }, { From 8f146b284f461c98d4ff5786706401cd94925080 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Fri, 5 Apr 2024 16:14:38 +0200 Subject: [PATCH 11/25] Begin looping method --- message_ix/tools/lp_diag/Readme.rst | 189 +++ ...YPE] Matrix Rescale Tool-Loop method.ipynb | 1264 +++++++++++++++++ .../[PROTOTYPE] Matrix Rescale Tool.ipynb | 1230 ++++++++++++++++ message_ix/tools/lp_diag/coeff_matrix.xlsx | Bin 0 -> 7326 bytes message_ix/tools/lp_diag/cplex.opt | 1 + message_ix/tools/lp_diag/cplex_mpstest.opt | 1 + message_ix/tools/lp_diag/data/Readme.txt | 5 + .../tools/lp_diag/lp_diag - Original.py | 910 ++++++++++++ .../tools/lp_diag/lp_diag - Yoga edit.py | 939 ++++++++++++ message_ix/tools/lp_diag/lp_diag.py | 932 ++++++++++++ message_ix/tools/lp_diag/lpdiag - Original.py | 149 ++ message_ix/tools/lp_diag/lpdiag.py | 149 ++ message_ix/tools/lp_diag/nohup.out | 977 +++++++++++++ message_ix/tools/lp_diag/scale_trial.gms | 64 + .../tools/lp_diag/transport_mpstest_mps | 38 + .../lp_diag/transport_mpstest_scaled_mps | 38 + .../tools/lp_diag/transport_original_mps | 38 + .../lp_diag/transport_problem_mpstest.gms | 67 + .../transport_problem_mpstest_scaled.gms | 70 + .../lp_diag/transport_problem_original.gms | 65 + 20 files changed, 7126 insertions(+) create mode 100644 message_ix/tools/lp_diag/Readme.rst create mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb create mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb create mode 100644 message_ix/tools/lp_diag/coeff_matrix.xlsx create mode 100644 message_ix/tools/lp_diag/cplex.opt create mode 100644 message_ix/tools/lp_diag/cplex_mpstest.opt create mode 100644 message_ix/tools/lp_diag/data/Readme.txt create mode 100644 message_ix/tools/lp_diag/lp_diag - Original.py create mode 100644 message_ix/tools/lp_diag/lp_diag - Yoga edit.py create mode 100644 message_ix/tools/lp_diag/lp_diag.py create mode 100644 message_ix/tools/lp_diag/lpdiag - Original.py create mode 100644 message_ix/tools/lp_diag/lpdiag.py create mode 100644 message_ix/tools/lp_diag/nohup.out create mode 100644 message_ix/tools/lp_diag/scale_trial.gms create mode 100644 message_ix/tools/lp_diag/transport_mpstest_mps create mode 100644 message_ix/tools/lp_diag/transport_mpstest_scaled_mps create mode 100644 message_ix/tools/lp_diag/transport_original_mps create mode 100644 message_ix/tools/lp_diag/transport_problem_mpstest.gms create mode 100644 message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms create mode 100644 message_ix/tools/lp_diag/transport_problem_original.gms diff --git a/message_ix/tools/lp_diag/Readme.rst b/message_ix/tools/lp_diag/Readme.rst new file mode 100644 index 000000000..156466418 --- /dev/null +++ b/message_ix/tools/lp_diag/Readme.rst @@ -0,0 +1,189 @@ +.. LPdiag documentation file + +``LPdiag``: basic diagnostics of the LP programming problems +============================================================ + +Description +----------- + +``LPdiag`` provides basic information about the LP programming problems +defined by corresponding MPS-format files. +The diagnostics focuses on the implied numerical properties of the underlying +optimization problem. + +In this context, the term `outlier` denotes the model entities having values +in either lower or upper tail of the corresponding value distribution. +The tails are defined by the corresponding orders of magnitudes defined as +:math:`int(alog(abs(val)))`, where :math:`val` stands for the value of +the corresponding coefficient. +The default values of the tails are equal to (-6, 6), respectively; +they can be redefined, if desired. + +The rule of thumb says: the maximum and minimum orders of magnitudes of +the LP matrix coefficients passed to optimization should differ by at most four. +``LPdiag`` helps to achieve such a goal by providing info on outliers. +Such info can be used e.g., for: + +- reconsideration of measurement units of the corresponding variables + and relations, +- consideration of replacing `small` (in relations to other coefficients in + the same row or column) by zero, +- splitting the corresponding rows and/or columns, +- verification of the coefficients' values. + +Features +^^^^^^^^ + +The current ``LPdiag`` version provides the following information: + +- characteristics of the problem (including numbers of rows, columns, non-zero + coefficients and distributions of their values), +- distributions of diverse values characterizing the LP matrix, +- location (row and column) of each outlier, +- ranges of values of other coefficients in each such row or column, as well as + the corresponding bounds (LHS, RHS for rows, lower and upper bounds for + columns). + +The functionality of ``LPdiag`` will be gradually enhanced to meet actual needs +of the ``message_ix`` modelers. + +Usage +----- + +The tool analyzes provided MPS-format files. +We provide several small MPSs for testing local installations, as well +as becoming familiar with ``LPdiag``. +Hints on generating MPS files are provided below. + +We suggest the following steps for becoming familiar with ``LPdiag`` and +then use it for analysis of actual MPS files: + +- becoming familiar with ``LPdiag``, +- prepare MPS file, +- actual analysis. + +We outline each of these steps below. + +Becoming familiar with ``LPdiag`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Note that ``LPdiag`` should be run at the terminal prompt. + +- Navigate to the folder `message_ix/tools/lp_diag`. +- For initial testing run the following command, which will run analysis of + the default (pre-specified) MPS provided in the test_mps folder. + Other provided MPS example can be run by using the ``--mps`` option explained + below. :: + + python lpdiag.py + +- To display the available ``LPdiag`` options run: :: + + python lpdiag.py -h + +The output of the above should read as follows (except of the work_dir line, +which differs for each local repository): :: + + work_dir: '/Users/marek/Documents/GitHub/marek_iiasa/message_ix/message_ix/tools/lp_diag'. + usage: lpdiag.py [-h] [--wdir WDIR] [--mps MPS] [--outp OUTP] + Diagnostics of basic properties of LP Problems represented by the MPS-format. + Examples of usage: + python lpdiag.py + python lpdiag.py -h + python lpdiag.py --mps test_mps/aez --outp foo.txt + options: + -h, --help show this help message and exit + --wdir WDIR --wdir : string Working directory. + --mps MPS --mps : string Name of the MPS file (optionally with path). + --outp OUTP --outp : string Redirect output to the named file. + +Comments on the arguments of the above three options: + +- WDIR: specification of the desired work-directory (by default the work-directory + is the same, in which ``LPdiag`` is located). +- MPS: name of the MPS file to be analysed; if the file is not located in the + work-directory, then the name should include the path to the file (see + the example above). +- OUTP: name of the file to which the output shall be redirected. + By default the output is listed to the stdout, i.e., to the terminal window + unless the redirection is included in the command. + Optionally, the output can be redirected to a specified file. + Such redirection can be specified by either using the ``--outp file_name`` + option, as illustrated by the second example shown above (in the output + resulting from using the ``-h`` option), + or by including the redirection in the corresponding command, e.g.,: :: + + python lpdiag.py -h > foo.txt + + +Generation of the MPS file in the ``message_ix`` environment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The MPS-format is the oldest but still widely used for specification of +the LP problems. +Most modeling environments provide various ways of the MPS file generation. + +In the ``message_ix`` environment one can generate the MPS file e.g., +upon solving a :class:`message_ix scenario` by defining +in `scenario.solve()` the `writemps` option together with the desired name of +the MPS file. +The MPS file will then be generated and deposited in the `message_ix/message_ix/model` +folder. +Details are available in the GAMS-Documentation: +https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXwritemps + +Example of specification of the corresponding option:: + + `scenario.solve(solve_options={"writemps": ".mps"})` + + +Actual analysis +^^^^^^^^^^^^^^^ + +For actual analysis one needs to specify the corresponding MPS file in +a command run (still in the directory `message_ix/tools/lp_diag`): :: + + python lpdiag.py --mps loc/name + +where `loc` and `name` stand for the path to the directory where the MPS-file is +located, and `name` stands for the corresponding file-name, respectively. +Other option(s) can be included in the command, as explained above. + +If the output redirection is desired (e.g., for results to be shared or composed +of many lines), then run: :: + + python lpdiag.py --mps loc/name --outp outfile.txt + +Extensions in the file names are optional. +An alternative way of output redirection is explained above. + + +Summary of the provided analysis results +---------------------------------------- + +The results are composed of the following elements: + +- Info on the work-directory. +- Info during reading the MPS file: + + - Should a syntax error occur during reading the file, then the corresponding + exception is thrown with the corresponding details. + - Basic info during processing of each MPS section. +- Basic attributes of the read MPS. +- Distribution of values of the objective (goal function) coefficients. +- Distribution of :math:`abs(val)` of the matrix elements. +- Distribution of values of :math:`int(log10(abs(values)))`. +- Distribution of values of :math:`int(log10(abs(values)))` sorted by + magnitudes of values (magnitudes of zero-occurrences skipped). +- For each (lower and upper) tail of the matrix coefficient values of the + corresponding sub-matrix: + + - Distributions of diverse values (:math:`value, abs(val), log10(abs(val))`) + of the matrix elements. + - For each order of magnitude: number of elements + - Row-wise location of each outlier with: + (1) info on other coefficients in the same row, (2) order of magnitude of the row's LHS and RHS. + - Column-wise location of each outlier with: + (1) info on other coefficients in the same column, and (2) order of magnitude of the column's lower and upper bounds. +- The processing start- and end-times. + diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb new file mode 100644 index 000000000..c8b6760f8 --- /dev/null +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -0,0 +1,1264 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fdbea0ef", + "metadata": {}, + "source": [ + "# MESSAGE-ix matrix improvement tool\n", + "\n", + "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", + "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", + "\n", + "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", + "\n", + "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", + "\n", + "$\n", + "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", + "$\n", + "\n", + "with $v$ is an acceptable matrix quality criteria.\n", + "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a771a522", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyomo.environ import *\n", + "from datetime import datetime\n", + "import xarray as xr\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def showme(df):\n", + " return df[\"val\"].unstack()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "afc2eec6", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the whole matrix\n", + "matrix = (pd.read_csv('matrix_transport problem.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "\n", + "# create a binary matrix for optimization coefficient\n", + "matrix_sbin = matrix.copy()\n", + "matrix_sbin.loc[matrix_sbin['val']!=0,'val'] = 1\n", + "matrix_sbin = matrix_sbin.astype(int)\n", + "\n", + "## converting matrix_sbin to dictiony\n", + "dict_matrix_sbin = matrix_sbin['val'].to_dict()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6948f8fb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "66e003c3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.01.01.01.01.01.0
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.0NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.0NaNNaN1.0
supply(san-diego)NaN1.01.01.0NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.0 1.0 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.0 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.0 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.0 1.0 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.0 NaN \n", + "supply(san-diego) 1.0 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 1.0 1.0 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix_sbin)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "92838309", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj0.00.847997-28.575425-26.0899980.7655351.3219280.847997
demand(chicago)NaN0.000000NaNNaN0.000000NaNNaN
demand(new-york)NaNNaN0.000000NaNNaN0.000000NaN
demand(topeka)NaNNaNNaN0.000000NaNNaN0.000000
supply(san-diego)NaN0.0000000.0000000.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0000000.0000000.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 0.0 0.847997 -28.575425 \n", + "demand(chicago) NaN 0.000000 NaN \n", + "demand(new-york) NaN NaN 0.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.000000 0.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj -26.089998 0.765535 \n", + "demand(chicago) NaN 0.000000 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 0.000000 NaN \n", + "supply(san-diego) 0.000000 NaN \n", + "supply(seattle) NaN 0.000000 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 1.321928 0.847997 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.000000 NaN \n", + "demand(topeka) NaN 0.000000 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 0.000000 0.000000 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# calculate log base 2 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", + " np.absolute(\n", + " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "\n", + "log_absmatrix = showme(log_absmatrix)\n", + "log_absmatrix" + ] + }, + { + "cell_type": "markdown", + "id": "a4435293", + "metadata": {}, + "source": [ + "## Start Looping" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "6dbeb665", + "metadata": {}, + "outputs": [], + "source": [ + "RSFs = []\n", + "for row in log_absmatrix.index:\n", + " rval = log_absmatrix.loc[row].fillna(0)\n", + " lb,ub = min(rval),max(rval)\n", + " mid = np.mean([lb,ub])\n", + " RSFs += [2**(-mid)]\n", + "\n", + "matrix0 = showme(matrix).mul(RSFs,axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "e0e3dd97", + "metadata": {}, + "outputs": [], + "source": [ + "log_absmatrix0 = np.log2(matrix0)\n", + "CSFs = []\n", + "for col in log_absmatrix0.columns:\n", + " cval = log_absmatrix0[col].fillna(0)\n", + " lb,ub = min(cval),max(cval)\n", + " mid = np.mean([lb,ub])\n", + " CSFs += [2**(-mid)]\n", + "new_matrix = showme(matrix).mul(row_scaler,axis=0).mul(CSFs,axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "2e5a0796", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original value: [ -8 , 0 ]\n", + "Row scaling val: [ -4 , 4 ]\n", + "New Matrix: [ -2 , 2 ]\n" + ] + } + ], + "source": [ + "def report(text,df):\n", + " print(f\"{text}:\",\"[\",np.int32(np.min(np.log10(df))),\",\",np.int32(np.max(np.log10(df))),\"]\")\n", + "report(\"Original value\",showme(matrix))\n", + "report(\"Row scaling val\",matrix0)\n", + "report(\"New Matrix\",new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "c33ccdcf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "0d1675e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 12649.110641 22768.399153 0.000032 \n", + "demand(chicago) NaN 1.000000 NaN \n", + "demand(new-york) NaN NaN 1.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.000000 1.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.000177 21503.488089 \n", + "demand(chicago) NaN 1.000000 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000 NaN \n", + "supply(san-diego) 1.000000 NaN \n", + "supply(seattle) NaN 1.000000 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 31622.776602 22768.399153 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.000000 NaN \n", + "demand(topeka) NaN 1.000000 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.000000 1.000000 " + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matrix0" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "3596c26a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj112.468265150.8920120.0056230.013307146.640677177.827941150.892012
demand(chicago)NaN0.006627NaNNaN0.006819NaNNaN
demand(new-york)NaNNaN177.827941NaNNaN0.005623NaN
demand(topeka)NaNNaNNaN75.146020NaNNaN0.006627
supply(san-diego)NaN0.006627177.82794175.146020NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0068190.0056230.006627
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 112.468265 150.892012 0.005623 \n", + "demand(chicago) NaN 0.006627 NaN \n", + "demand(new-york) NaN NaN 177.827941 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.006627 177.827941 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.013307 146.640677 \n", + "demand(chicago) NaN 0.006819 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 75.146020 NaN \n", + "supply(san-diego) 75.146020 NaN \n", + "supply(seattle) NaN 0.006819 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 177.827941 150.892012 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.005623 NaN \n", + "demand(topeka) NaN 0.006627 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 0.005623 0.006627 " + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "85bc031e", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'list' object has no attribute 'items'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[72], line 4\u001b[0m\n\u001b[0;32m 2\u001b[0m prescale_args \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m s \u001b[38;5;129;01min\u001b[39;00m scalers:\n\u001b[1;32m----> 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k,v \u001b[38;5;129;01min\u001b[39;00m \u001b[43ms\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m():\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_obj\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 6\u001b[0m k_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_obj.scale\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'list' object has no attribute 'items'" + ] + } + ], + "source": [ + "scalers = [RSFs,CSFs]\n", + "prescale_args = {}\n", + "for s in scalers:\n", + " for k,v in s.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v})\n", + "\n", + "gams_args = (str(prescale_args)\n", + " .replace('{','')\n", + " .replace('}','')\n", + " .replace('\"','')\n", + " .replace(':','=')\n", + " .replace(', ',';\\n')\n", + " +';'\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2751f1ad", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demand.scale('new-york')= 2048.0;\n", + "'_obj.scale'= 1.0;\n", + "supply.scale('seattle')= 8.0;\n", + "supply.scale('san-diego')= 32768.0;\n", + "demand.scale('topeka')= 1024.0;\n", + "demand.scale('chicago')= 32.0;\n", + "x.scale('seattle','new-york')= 8.0;\n", + "x.scale('san-diego','topeka')= 262144.0;\n", + "x.scale('seattle','chicago')= 8.0;\n", + "x.scale('seattle','topeka')= 8.0;\n", + "x.scale('san-diego','chicago')= 128.0;\n", + "x.scale('san-diego','new-york')= 524288.0;\n", + "'constobj.scale'= 1.0;\n" + ] + } + ], + "source": [ + "print(gams_args)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "656dbd7b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19.0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.log2(524288.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "9a9a3956", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Old Matrix stats:\n", + ">> log10 coefficient range: -9.0 -- 0.0\n", + "\n", + "New Matrix stats:\n", + ">> log10 coefficient range: -3.0 -- 2.0\n", + "\n" + ] + } + ], + "source": [ + "# Printing stats\n", + "\n", + "matrices_dict = {'Old Matrix':matrix,\n", + " 'New Matrix':new_matrix,\n", + " } \n", + "\n", + "for k,v in matrices_dict.items():\n", + " print(f'{k} stats:')\n", + " print('>> log10 coefficient range:',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", + " print('')\n", + "\n", + "# TO DO:\n", + "# 1. plot histogram of log10 distribution of those matrix\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "62a7999e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 2., 0., 0., 0., 0., 0., 0., 0., 0., 17.]),\n", + " array([-8.60205999, -7.70205999, -6.80205999, -5.90205999, -5.00205999,\n", + " -4.10205999, -3.20205999, -2.30205999, -1.40205999, -0.50205999,\n", + " 0.39794001]),\n", + " )" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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//645JJL4iUveUkceeSR0djYGO94xzti586dWc4MANSwHsdHZ2dnTJw4MVasWHHQY48//nhs2rQplixZEps2bYrvfe97sWXLlnjDG96QybAAQO2r6+kTmpubo7m5+ZCPNTQ0xB133NHt2Be+8IU47bTT4tFHH42xY8c+uykBgD6jx/HRUx0dHZHL5eIFL3jBIR8vFotRLBbL+4VCodIjAQBVVNEPnP773/+OSy65JN761rdGfX39Ic9pa2uLhoaG8tbU1FTJkQCAKqtYfOzfvz/OPffcKJVKcd111z3lea2trdHR0VHe2tvbKzUSANALVORtl/+Gx5///Oe48847n/KuR0REPp+PfD5fiTEAgF4o8/j4b3g88sgjcdddd8WIESOyXgIAqGE9jo99+/bF1q1by/vbtm2LzZs3x/Dhw2PMmDHx5je/OTZt2hS33XZbHDhwIHbt2hUREcOHD49BgwZlNzkAUJN6HB8bNmyIGTNmlPdbWloiImL+/PnxiU98Ir7//e9HRMSkSZO6Pe+uu+6K6dOnP/tJAYA+ocfxMX369CiVSk/5+NM9BgDgu10AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASfU4PtavXx9z586NxsbGyOVysWbNmm6Pl0qlWLp0aYwZMyaGDBkSM2fOjEceeSSreQGAGtfj+Ojs7IyJEyfGihUrDvn41VdfHZ///Odj5cqV8atf/SqOPPLImDVrVvz73/9+zsMCALWvrqdPaG5ujubm5kM+ViqVYvny5fHxj388zjzzzIiI+OpXvxqjRo2KNWvWxFve8pbnNi0AUPMy/czHtm3bYteuXTFz5szysYaGhpg6dWrce++9h3xOsViMQqHQbQMA+q5M42PXrl0RETFq1Khux0eNGlV+7Mna2tqioaGhvDU1NWU5EgDQy1T9t11aW1ujo6OjvLW3t1d7JACggjKNj9GjR0dExO7du7sd3717d/mxJ8vn81FfX99tAwD6rkzjY8KECTF69OhYt25d+VihUIhf/epXcfrpp2e5FABQo3r82y779u2L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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(np.log10(matrix))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1f49d32f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([4., 1., 0., 0., 1., 4., 1., 5., 0., 3.]),\n", + " array([-2.88249007, -2.35341707, -1.82434407, -1.29527106, -0.76619806,\n", + " -0.23712505, 0.29194795, 0.82102095, 1.35009396, 1.87916696,\n", + " 2.40823997]),\n", + " )" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUIUlEQVR4nO3dbYxU9dnA4XuBMqDurvIOYRHUqFUCTREIaAy0VEsMLU1qGmMqJca0ZiEl2zayTVrkg1mSNtZGCdKmxS8SaNMgjY1aSwQ+1FWEkooNpFAJK8iLJe7CPulg2Hk+POk+pQI6yz0MA9eVTOKcPbPnzp9l+XnmzExdqVQqBQBAgn7VHgAAuHwICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgzYCLfcCenp44dOhQ1NfXR11d3cU+PADQB6VSKU6cOBFjxoyJfv3OfV7ioofFoUOHoqmp6WIfFgBI0NHREWPHjj3n1y96WNTX10fE/w3W0NBwsQ8PAPRBV1dXNDU19f47fi4XPSz+/fRHQ0ODsACAGvNJlzG4eBMASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0ZYXF448/HnV1dWfcbr311krNBgDUmLI/K+T222+PP/3pT///DQZc9I8bAQAuUWVXwYABA2LUqFGVmAUAqHFlX2Px97//PcaMGRM33HBDPPjgg3HgwIHz7l8sFqOrq+uMGwBweaorlUqlT7vzSy+9FCdPnoxbbrkl3n///Vi+fHkcPHgwdu3adc7PZ3/88cdj+fLlH9ve2dnpY9MB+mj80j9Ue4Sy7V9xX7VH4AJ0dXVFY2PjJ/77XVZY/LcPP/wwrr/++njyySfj4YcfPus+xWIxisXiGYM1NTUJC4ALICy42D5tWFzQlZfXXntt3HzzzbF3795z7lMoFKJQKFzIYQCAGnFB72Nx8uTJ2LdvX4wePTprHgCghpUVFt///vdjy5YtsX///vjzn/8cX/va16J///7xwAMPVGo+AKCGlPVUyHvvvRcPPPBA/POf/4zhw4fHXXfdFe3t7TF8+PBKzQcA1JCywmLdunWVmgMAuAz4rBAAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSXFBYrFixIurq6mLJkiVJ4wAAtazPYbFt27ZYvXp1TJo0KXMeAKCG9SksTp48GQ8++GD88pe/jOuuuy57JgCgRvUpLJqbm+O+++6LOXPmfOK+xWIxurq6zrgBAJenAeU+YN26dbFjx47Ytm3bp9q/ra0tli9fXvZgfTF+6R8uynEy7V9xX7VHgFT+HsKVrawzFh0dHfHd7343nn/++Rg0aNCnekxra2t0dnb23jo6Ovo0KABw6SvrjMX27dvj6NGj8fnPf7532+nTp2Pr1q3xzDPPRLFYjP79+5/xmEKhEIVCIWdaAOCSVlZYfPGLX4y33377jG0LFy6MW2+9NR577LGPRQUAcGUpKyzq6+tj4sSJZ2y7+uqrY+jQoR/bDgBcebzzJgCQpuxXhfy3zZs3J4wBAFwOnLEAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANKUFRarVq2KSZMmRUNDQzQ0NMSMGTPipZdeqtRsAECNKSssxo4dGytWrIjt27fHW2+9FV/4whfiq1/9arzzzjuVmg8AqCEDytl53rx5Z9x/4oknYtWqVdHe3h6333576mAAQO0pKyz+0+nTp+O3v/1tdHd3x4wZM865X7FYjGKx2Hu/q6urr4cEAC5xZYfF22+/HTNmzIh//etfcc0118SGDRvitttuO+f+bW1tsXz58gsaEgCqYfzSP1R7hLLtX3FfVY9f9qtCbrnllti5c2e88cYb8eijj8aCBQvib3/72zn3b21tjc7Ozt5bR0fHBQ0MAFy6yj5jMXDgwLjpppsiImLKlCmxbdu2+PnPfx6rV68+6/6FQiEKhcKFTQkA1IQLfh+Lnp6eM66hAACuXGWdsWhtbY25c+fGuHHj4sSJE7F27drYvHlzvPLKK5WaDwCoIWWFxdGjR+Ohhx6K999/PxobG2PSpEnxyiuvxJe+9KVKzQcA1JCywuJXv/pVpeYAAC4DPisEAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEhTVli0tbXF1KlTo76+PkaMGBHz58+PPXv2VGo2AKDGlBUWW7Zsiebm5mhvb49XX301Pvroo7jnnnuiu7u7UvMBADVkQDk7v/zyy2fcf+6552LEiBGxffv2uPvuu1MHAwBqT1lh8d86OzsjImLIkCHn3KdYLEaxWOy939XVdSGHBAAuYX2+eLOnpyeWLFkSd955Z0ycOPGc+7W1tUVjY2Pvrampqa+HBAAucX0Oi+bm5ti1a1esW7fuvPu1trZGZ2dn762jo6OvhwQALnF9eipk0aJF8eKLL8bWrVtj7Nix5923UChEoVDo03AAQG0pKyxKpVIsXrw4NmzYEJs3b44JEyZUai4AoAaVFRbNzc2xdu3a2LhxY9TX18fhw4cjIqKxsTEGDx5ckQEBgNpR1jUWq1atis7Ozpg1a1aMHj2697Z+/fpKzQcA1JCynwoBADgXnxUCAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(np.log10(new_matrix))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c483f4d9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb new file mode 100644 index 000000000..4b48ba1ed --- /dev/null +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb @@ -0,0 +1,1230 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fdbea0ef", + "metadata": {}, + "source": [ + "# MESSAGE-ix matrix improvement tool\n", + "\n", + "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", + "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", + "\n", + "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", + "\n", + "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", + "\n", + "$\n", + "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", + "$\n", + "\n", + "with $v$ is an acceptable matrix quality criteria.\n", + "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a771a522", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyomo.environ import *\n", + "from datetime import datetime\n", + "import xarray as xr\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def showme(df):\n", + " return df[\"val\"].unstack()\n", + "\n", + "# generating piecewise of x and y\n", + "x_pos = [2**x for x in range(0,6)]\n", + "x_neg = x_pos.copy()\n", + "x_neg.reverse()\n", + "x_neg = [-e for e in x_neg]\n", + "\n", + "x = x_neg + [0] + x_pos\n", + "y = [np.power(e,2) for e in x]\n", + "\n", + "# populating gradient and intercept for each line segment\n", + "linparams = {n: {'G':[], 'I': []} for n in range(1,len(x))}\n", + "for n in linparams.keys():\n", + " M = (y[n]-y[n-1])/(x[n]-x[n-1])\n", + " C = y[n-1] - M*x[n-1]\n", + " linparams[n]['G'] = M # M\n", + " linparams[n]['I'] = C # C\n", + "\n", + "# create dataframe of gradient and intercept\n", + "df_linparams = pd.DataFrame(linparams).transpose()\n", + "\n", + "fig, ax = plt.subplots(figsize=(5,5))\n", + "\n", + "break_value = ax.scatter(x,y, marker='o', s=50, c='white', edgecolor='maroon', lw=2, zorder=1, )\n", + "for n in df_linparams.index:\n", + " x_lin = [x[n-1],x[n]]\n", + " y_lin = [y[n-1],y[n]]\n", + " linearized_value = ax.plot(x_lin,y_lin, c='maroon', lw=2, zorder=0)\n", + "\n", + "ax.set_xlabel('x', size=14)\n", + "ax.set_ylabel(r'$y = x^2$', size=14)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "afc2eec6", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the whole matrix\n", + "matrix = (pd.read_csv('matrix_transport problem.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "\n", + "# create a binary matrix for optimization coefficient\n", + "matrix_sbin = matrix.copy()\n", + "matrix_sbin.loc[matrix_sbin['val']!=0,'val'] = 1\n", + "matrix_sbin = matrix_sbin.astype(int)\n", + "\n", + "## converting matrix_sbin to dictiony\n", + "dict_matrix_sbin = matrix_sbin['val'].to_dict()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6948f8fb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "66e003c3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.01.01.01.01.01.0
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.0NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.0NaNNaN1.0
supply(san-diego)NaN1.01.01.0NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.0 1.0 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.0 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.0 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.0 1.0 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.0 NaN \n", + "supply(san-diego) 1.0 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 1.0 1.0 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix_sbin)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "92838309", + "metadata": {}, + "outputs": [], + "source": [ + "# calculate log base 2 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", + " np.absolute(\n", + " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "\n", + "# converting log_absmatrix to dictiony\n", + "dict_log_absmatrix = log_absmatrix['val'].to_dict()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d3314890", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj0.00.847997-28.575425-26.0899980.7655351.3219280.847997
demand(chicago)NaN0.000000NaNNaN0.000000NaNNaN
demand(new-york)NaNNaN0.000000NaNNaN0.000000NaN
demand(topeka)NaNNaNNaN0.000000NaNNaN0.000000
supply(san-diego)NaN0.0000000.0000000.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0000000.0000000.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 0.0 0.847997 -28.575425 \n", + "demand(chicago) NaN 0.000000 NaN \n", + "demand(new-york) NaN NaN 0.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.000000 0.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj -26.089998 0.765535 \n", + "demand(chicago) NaN 0.000000 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 0.000000 NaN \n", + "supply(san-diego) 0.000000 NaN \n", + "supply(seattle) NaN 0.000000 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 1.321928 0.847997 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.000000 NaN \n", + "demand(topeka) NaN 0.000000 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 0.000000 0.000000 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_absmatrix[\"val\"].unstack()" + ] + }, + { + "cell_type": "markdown", + "id": "12dafaaa", + "metadata": {}, + "source": [ + "## Matrix quality optimization problem\n", + "Matrix $Ax$ then may be adjusted to fulfill the matrix quality criterion in $Eq. 1$ through the use of scaling coefficient $r_{i}$ for row $i$ and $c_{j}$ for column $j$ to minimize the following objective function:\n", + "\n", + "$\n", + "Min_{(r,c)}: \\frac{1}{2} \\sum_{i} \\sum_{j} (log_{2} \\ r_{i} \\ c_{j} \\ |a_{i,j}|)^2 \\qquad \\qquad Eq. 2\n", + "$\n", + "\n", + "Let us define:\n", + "\n", + "$\n", + "w_{i} = log_{2} \\ r_{i} \\\\\n", + "z_{j} = log_{2} \\ c_{j}\n", + "$\n", + "\n", + "With $w$ and $z$ are positive integer variables, an optimization problem using the equivalent of $Eq. 2$ as objective function can be formulated as:\n", + "\n", + "$\n", + "Min_{(w,j)}: \\frac{1}{2} \\sum_{i} \\sum_{j} \\ (w_{i} + z_{j} + log_{2} \\ |a_{i,j}|)^2 \\qquad \\qquad Eq. 3 \\\\\n", + "S.t.: \\\\\n", + "\\qquad w_{i}, z_{j} \\geq 0 \\qquad \\qquad Eq. 4 \\\\\n", + "\\qquad w_{i}, z_{j} \\in Z \\qquad \\qquad Eq. 5\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e309b274", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start Time: 13:21:28.031574\n", + "Solution status : optimal\n", + "Objective function: 310.8452172597383\n", + "Finish Time: 13:21:28.276195\n" + ] + } + ], + "source": [ + "# Generate dictionary of log_absmatrix\n", + "log_absmatrix_data = dict_log_absmatrix\n", + "matrix_sbin_data = dict_matrix_sbin\n", + "row_name = list(set(matrix.index.get_level_values('row')))\n", + "col_name = list(set(matrix.index.get_level_values('col')))\n", + "lin_sgmt = list(df_linparams.index)\n", + "\n", + "# print start time\n", + "start_time = datetime.now().time()\n", + "print(\"Start Time:\", start_time)\n", + "\n", + "## Declare model's name\n", + "model = ConcreteModel('Matrix_Rescaling_Factor')\n", + "\n", + "## Define sets\n", + "model.i = Set(initialize=row_name, doc='Rows')\n", + "model.j = Set(initialize=col_name, doc='Columns')\n", + "model.l = Set(initialize=lin_sgmt, doc='Segments')\n", + "\n", + "## Define parameters\n", + "model.log_absmatrix = Param(model.i, model.j, initialize=log_absmatrix_data, default=0,\n", + " doc='log2 of absolute value of a(i,j)')\n", + "model.matrix_sbin = Param(model.i, model.j, initialize=matrix_sbin_data, default=0,\n", + " doc='binary value for row and column coefficients a(i,j)')\n", + "model.lin_grad = Param(model.l, initialize=df_linparams['G'].to_dict(), \n", + " doc='gradient')\n", + "model.lin_intr = Param(model.l, initialize=df_linparams['I'].to_dict(), \n", + " doc='intercept')\n", + "\n", + "## Define variables\n", + "model.Log2RSF = Var(model.i, bounds=(-50,50), domain=Integers, doc='Row scaling factor') # domain='PositiveIntegers'\n", + "model.Log2CSF = Var(model.j, bounds=(-50,50), domain=Integers, doc='Column scaling factor')\n", + "model.LS_obj = Var(model.i, model.j, bounds=(0,None), doc='Linearized substitute of objective function')\n", + "\n", + "## Define constraints\n", + "def linobj_rule(model, i, j, l):\n", + " return model.LS_obj[i,j] >= (model.lin_grad[l] * (- model.Log2RSF[i] + model.Log2CSF[j] + model.log_absmatrix[i,j])\n", + " + model.lin_intr[l])\n", + "model.linobj = Constraint(model.i, model.j, model.l, rule=linobj_rule, doc='Piece linearization of quadratic objective function')\n", + "\n", + "def colobj_rule(model):\n", + " return model.Log2CSF['constobj'] == 0\n", + "model.colobj = Constraint(rule=colobj_rule, doc='objective function column cannot be changed')\n", + "\n", + "def rowobj_rule(model):\n", + " return model.Log2RSF['_obj'] == 0\n", + "model.rowobj = Constraint(rule=rowobj_rule, doc='objective function column cannot be changed')\n", + "\n", + "\n", + "## Define objective function\n", + "def objective_rule(model):\n", + " return (1/2)*sum(model.LS_obj[i,j] * model.matrix_sbin[i,j] for i in model.i for j in model.j)\n", + "model.objective = Objective(rule=objective_rule, sense=minimize, doc='Objective function')\n", + "\n", + "if __name__ == '__main__':\n", + " # This emulates what the pyomo command-line tools does\n", + " from pyomo.opt import SolverFactory\n", + " import pyomo.environ\n", + " opt = SolverFactory(\"gams\")\n", + " opt.options['solver'] = 'cplex'\n", + " results = opt.solve(model)\n", + " print('Solution status : ', results.solver.termination_condition)\n", + " print('Objective function: ', model.objective(value))\n", + "\n", + " \n", + "# print finish time\n", + "finish_time = datetime.now().time()\n", + "print(\"Finish Time:\", finish_time)\n", + "\n", + "\n", + "# collecting results\n", + "Log2RSFs = []\n", + "for i in row_name:\n", + " Log2RSFs.append(model.Log2RSF[i](value))\n", + "\n", + "Log2CSFs = []\n", + "for j in col_name:\n", + " Log2CSFs.append(model.Log2CSF[j](value))\n", + " \n", + "# Create dictionaries of row and column scalers\n", + "RSFs = dict(zip(row_name, [np.round(2**e,6) for e in Log2RSFs]))\n", + "CSFs = dict(zip(col_name, [np.round(2**e,6) for e in Log2CSFs]))\n", + "\n", + "# Create dataframes for row and column scalers\n", + "row_scaler = pd.DataFrame(RSFs,index=['val']).transpose().rename_axis(index='row')\n", + "col_scaler = pd.DataFrame(CSFs,index=['val']).transpose().rename_axis(index='col')\n", + "\n", + "# Create new_matrix dataframe for display\n", + "new_matrix = matrix.div(row_scaler,level=0).mul(col_scaler,level=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "38c72dde", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8f2ad8bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.0230.4000000.0013110.0036713.6020.00000014.400000
demand(chicago)NaN4.000000NaNNaN0.25NaNNaN
demand(new-york)NaNNaN256.000000NaNNaN0.003906NaN
demand(topeka)NaNNaNNaN256.00000NaNNaN0.007812
supply(san-diego)NaN0.00390616.0000008.00000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.001.0000001.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 230.400000 0.001311 \n", + "demand(chicago) NaN 4.000000 NaN \n", + "demand(new-york) NaN NaN 256.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.003906 16.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.00367 13.60 \n", + "demand(chicago) NaN 0.25 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 256.00000 NaN \n", + "supply(san-diego) 8.00000 NaN \n", + "supply(seattle) NaN 1.00 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 20.000000 14.400000 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.003906 NaN \n", + "demand(topeka) NaN 0.007812 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.000000 1.000000 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "85bc031e", + "metadata": {}, + "outputs": [], + "source": [ + "scalers = [RSFs,CSFs]\n", + "prescale_args = {}\n", + "for s in scalers:\n", + " for k,v in s.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v})\n", + "\n", + "gams_args = (str(prescale_args)\n", + " .replace('{','')\n", + " .replace('}','')\n", + " .replace('\"','')\n", + " .replace(':','=')\n", + " .replace(', ',';\\n')\n", + " +';'\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2751f1ad", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demand.scale('new-york')= 2048.0;\n", + "'_obj.scale'= 1.0;\n", + "supply.scale('seattle')= 8.0;\n", + "supply.scale('san-diego')= 32768.0;\n", + "demand.scale('topeka')= 1024.0;\n", + "demand.scale('chicago')= 32.0;\n", + "x.scale('seattle','new-york')= 8.0;\n", + "x.scale('san-diego','topeka')= 262144.0;\n", + "x.scale('seattle','chicago')= 8.0;\n", + "x.scale('seattle','topeka')= 8.0;\n", + "x.scale('san-diego','chicago')= 128.0;\n", + "x.scale('san-diego','new-york')= 524288.0;\n", + "'constobj.scale'= 1.0;\n" + ] + } + ], + "source": [ + "print(gams_args)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "656dbd7b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19.0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.log2(524288.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "9a9a3956", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Old Matrix stats:\n", + ">> log10 coefficient range: -9.0 -- 0.0\n", + "\n", + "New Matrix stats:\n", + ">> log10 coefficient range: -3.0 -- 2.0\n", + "\n" + ] + } + ], + "source": [ + "# Printing stats\n", + "\n", + "matrices_dict = {'Old Matrix':matrix,\n", + " 'New Matrix':new_matrix,\n", + " } \n", + "\n", + "for k,v in matrices_dict.items():\n", + " print(f'{k} stats:')\n", + " print('>> log10 coefficient range:',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", + " print('')\n", + "\n", + "# TO DO:\n", + "# 1. plot histogram of log10 distribution of those matrix\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "62a7999e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 2., 0., 0., 0., 0., 0., 0., 0., 0., 17.]),\n", + " array([-8.60205999, -7.70205999, -6.80205999, -5.90205999, -5.00205999,\n", + " -4.10205999, -3.20205999, -2.30205999, -1.40205999, -0.50205999,\n", + " 0.39794001]),\n", + " )" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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//645JJL4iUveUkceeSR0djYGO94xzti586dWc4MANSwHsdHZ2dnTJw4MVasWHHQY48//nhs2rQplixZEps2bYrvfe97sWXLlnjDG96QybAAQO2r6+kTmpubo7m5+ZCPNTQ0xB133NHt2Be+8IU47bTT4tFHH42xY8c+uykBgD6jx/HRUx0dHZHL5eIFL3jBIR8vFotRLBbL+4VCodIjAQBVVNEPnP773/+OSy65JN761rdGfX39Ic9pa2uLhoaG8tbU1FTJkQCAKqtYfOzfvz/OPffcKJVKcd111z3lea2trdHR0VHe2tvbKzUSANALVORtl/+Gx5///Oe48847n/KuR0REPp+PfD5fiTEAgF4o8/j4b3g88sgjcdddd8WIESOyXgIAqGE9jo99+/bF1q1by/vbtm2LzZs3x/Dhw2PMmDHx5je/OTZt2hS33XZbHDhwIHbt2hUREcOHD49BgwZlNzkAUJN6HB8bNmyIGTNmlPdbWloiImL+/PnxiU98Ir7//e9HRMSkSZO6Pe+uu+6K6dOnP/tJAYA+ocfxMX369CiVSk/5+NM9BgDgu10AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASfU4PtavXx9z586NxsbGyOVysWbNmm6Pl0qlWLp0aYwZMyaGDBkSM2fOjEceeSSreQGAGtfj+Ojs7IyJEyfGihUrDvn41VdfHZ///Odj5cqV8atf/SqOPPLImDVrVvz73/9+zsMCALWvrqdPaG5ujubm5kM+ViqVYvny5fHxj388zjzzzIiI+OpXvxqjRo2KNWvWxFve8pbnNi0AUPMy/czHtm3bYteuXTFz5szysYaGhpg6dWrce++9h3xOsViMQqHQbQMA+q5M42PXrl0RETFq1Khux0eNGlV+7Mna2tqioaGhvDU1NWU5EgDQy1T9t11aW1ujo6OjvLW3t1d7JACggjKNj9GjR0dExO7du7sd3717d/mxJ8vn81FfX99tAwD6rkzjY8KECTF69OhYt25d+VihUIhf/epXcfrpp2e5FABQo3r82y779u2L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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(np.log10(matrix))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1f49d32f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([4., 1., 0., 0., 1., 4., 1., 5., 0., 3.]),\n", + " array([-2.88249007, -2.35341707, -1.82434407, -1.29527106, -0.76619806,\n", + " -0.23712505, 0.29194795, 0.82102095, 1.35009396, 1.87916696,\n", + " 2.40823997]),\n", + " )" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUIUlEQVR4nO3dbYxU9dnA4XuBMqDurvIOYRHUqFUCTREIaAy0VEsMLU1qGmMqJca0ZiEl2zayTVrkg1mSNtZGCdKmxS8SaNMgjY1aSwQ+1FWEkooNpFAJK8iLJe7CPulg2Hk+POk+pQI6yz0MA9eVTOKcPbPnzp9l+XnmzExdqVQqBQBAgn7VHgAAuHwICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgzYCLfcCenp44dOhQ1NfXR11d3cU+PADQB6VSKU6cOBFjxoyJfv3OfV7ioofFoUOHoqmp6WIfFgBI0NHREWPHjj3n1y96WNTX10fE/w3W0NBwsQ8PAPRBV1dXNDU19f47fi4XPSz+/fRHQ0ODsACAGvNJlzG4eBMASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0ZYXF448/HnV1dWfcbr311krNBgDUmLI/K+T222+PP/3pT///DQZc9I8bAQAuUWVXwYABA2LUqFGVmAUAqHFlX2Px97//PcaMGRM33HBDPPjgg3HgwIHz7l8sFqOrq+uMGwBweaorlUqlT7vzSy+9FCdPnoxbbrkl3n///Vi+fHkcPHgwdu3adc7PZ3/88cdj+fLlH9ve2dnpY9MB+mj80j9Ue4Sy7V9xX7VH4AJ0dXVFY2PjJ/77XVZY/LcPP/wwrr/++njyySfj4YcfPus+xWIxisXiGYM1NTUJC4ALICy42D5tWFzQlZfXXntt3HzzzbF3795z7lMoFKJQKFzIYQCAGnFB72Nx8uTJ2LdvX4wePTprHgCghpUVFt///vdjy5YtsX///vjzn/8cX/va16J///7xwAMPVGo+AKCGlPVUyHvvvRcPPPBA/POf/4zhw4fHXXfdFe3t7TF8+PBKzQcA1JCywmLdunWVmgMAuAz4rBAAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSXFBYrFixIurq6mLJkiVJ4wAAtazPYbFt27ZYvXp1TJo0KXMeAKCG9SksTp48GQ8++GD88pe/jOuuuy57JgCgRvUpLJqbm+O+++6LOXPmfOK+xWIxurq6zrgBAJenAeU+YN26dbFjx47Ytm3bp9q/ra0tli9fXvZgfTF+6R8uynEy7V9xX7VHgFT+HsKVrawzFh0dHfHd7343nn/++Rg0aNCnekxra2t0dnb23jo6Ovo0KABw6SvrjMX27dvj6NGj8fnPf7532+nTp2Pr1q3xzDPPRLFYjP79+5/xmEKhEIVCIWdaAOCSVlZYfPGLX4y33377jG0LFy6MW2+9NR577LGPRQUAcGUpKyzq6+tj4sSJZ2y7+uqrY+jQoR/bDgBcebzzJgCQpuxXhfy3zZs3J4wBAFwOnLEAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANKUFRarVq2KSZMmRUNDQzQ0NMSMGTPipZdeqtRsAECNKSssxo4dGytWrIjt27fHW2+9FV/4whfiq1/9arzzzjuVmg8AqCEDytl53rx5Z9x/4oknYtWqVdHe3h6333576mAAQO0pKyz+0+nTp+O3v/1tdHd3x4wZM865X7FYjGKx2Hu/q6urr4cEAC5xZYfF22+/HTNmzIh//etfcc0118SGDRvitttuO+f+bW1tsXz58gsaEgCqYfzSP1R7hLLtX3FfVY9f9qtCbrnllti5c2e88cYb8eijj8aCBQvib3/72zn3b21tjc7Ozt5bR0fHBQ0MAFy6yj5jMXDgwLjpppsiImLKlCmxbdu2+PnPfx6rV68+6/6FQiEKhcKFTQkA1IQLfh+Lnp6eM66hAACuXGWdsWhtbY25c+fGuHHj4sSJE7F27drYvHlzvPLKK5WaDwCoIWWFxdGjR+Ohhx6K999/PxobG2PSpEnxyiuvxJe+9KVKzQcA1JCywuJXv/pVpeYAAC4DPisEAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEhTVli0tbXF1KlTo76+PkaMGBHz58+PPXv2VGo2AKDGlBUWW7Zsiebm5mhvb49XX301Pvroo7jnnnuiu7u7UvMBADVkQDk7v/zyy2fcf+6552LEiBGxffv2uPvuu1MHAwBqT1lh8d86OzsjImLIkCHn3KdYLEaxWOy939XVdSGHBAAuYX2+eLOnpyeWLFkSd955Z0ycOPGc+7W1tUVjY2Pvrampqa+HBAAucX0Oi+bm5ti1a1esW7fuvPu1trZGZ2dn762jo6OvhwQALnF9eipk0aJF8eKLL8bWrVtj7Nix5923UChEoVDo03AAQG0pKyxKpVIsXrw4NmzYEJs3b44JEyZUai4AoAaVFRbNzc2xdu3a2LhxY9TX18fhw4cjIqKxsTEGDx5ckQEBgNpR1jUWq1atis7Ozpg1a1aMHj2697Z+/fpKzQcA1JCynwoBADgXnxUCAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(np.log10(new_matrix))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c483f4d9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/message_ix/tools/lp_diag/coeff_matrix.xlsx b/message_ix/tools/lp_diag/coeff_matrix.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a65b48f127829125dbb2fc4c89df77232f23b156 GIT binary patch literal 7326 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 literal 0 HcmV?d00001 diff --git a/message_ix/tools/lp_diag/cplex.opt b/message_ix/tools/lp_diag/cplex.opt new file mode 100644 index 000000000..195baf34c --- /dev/null +++ b/message_ix/tools/lp_diag/cplex.opt @@ -0,0 +1 @@ +writemps=scalemod_mps.mps diff --git a/message_ix/tools/lp_diag/cplex_mpstest.opt b/message_ix/tools/lp_diag/cplex_mpstest.opt new file mode 100644 index 000000000..0c1f0120d --- /dev/null +++ b/message_ix/tools/lp_diag/cplex_mpstest.opt @@ -0,0 +1 @@ +writemps=transport_mpstest_mps diff --git a/message_ix/tools/lp_diag/data/Readme.txt b/message_ix/tools/lp_diag/data/Readme.txt new file mode 100644 index 000000000..f8d22c6a6 --- /dev/null +++ b/message_ix/tools/lp_diag/data/Readme.txt @@ -0,0 +1,5 @@ +mps dir contains large MPS files for actual analysis. Files from this dir + are NOT posted to gitHub. + +mps_tst contains small MPS files for testing the application. Files from this dir + are posted at gitHub. diff --git a/message_ix/tools/lp_diag/lp_diag - Original.py b/message_ix/tools/lp_diag/lp_diag - Original.py new file mode 100644 index 000000000..8dc510643 --- /dev/null +++ b/message_ix/tools/lp_diag/lp_diag - Original.py @@ -0,0 +1,910 @@ +""" +Prototype of simple analysis of the MPS-format file +Written by Marek Makowski, ECE Program of IIASA, in March 2023 +""" + +import math + +# import os +# import sys # needed for sys.exit() +import typing +from collections import Counter + +import numpy as np +import pandas as pd + +# from datetime import datetime as dt +# from datetime import timedelta as td +# import matplotlib.pyplot as plt +# from matplotlib import cm +# from matplotlib import colors +# from matplotlib.ticker import LinearLocator # needed for ax.set_major_locator +# import seaborn as sns +# # sns.set() # settings for seaborn plotting style + + +class LPdiag: + """Process the MPS-format input file and provide its basic diagnotics. + + The diagnostics currently includes: + - handling formal errors of the MPS file + - basic statistics of the matrix coefficients. + + Attributes + ---------- + + """ + + def __init__(self): + self.fname = "undefined" # MPS file name, to be defined by rd_mps() call + self.pname = "undefined" # problem name + self.id_rhs = False # True, if rhs_id defined + self.id_range = False # True, if range_id defined + self.id_bnd = False # True, if bnd_id defined + self.rhs_id = "" # id of rhs elements + self.range_id = "" # id of ranges elements (might differ from rhs_id) + self.bnd_id = "" # id of bounds elements + self.infty = "none" # marker for infinity value + self.n_lines = 0 # number of processed lines of the MPS file + self.n_rhs = 0 # number of defined RHS + self.n_ranges = 0 # number of defined ranges + self.n_bounds = 0 # number of defined bounds + # if not os.path.exists(self.rep_dir): + # os.makedirs(self.rep_dir, mode=0o755) + + # dictionaries for searchable names and its indices + # (searching very-long lists is prohibitively slow) + self.row_name = {} # key: row-name, item: its seq_id + self.seq_row = {} # key: row sequence, item: [row-name, lo_bnd, up_bond, type] + self.col_name = {} # key: col-name, item: its seq_id + self.seq_col = {} # key: col-sequence, item: [col-name, lo_bnd, up_bond] + # tmp space for reading COLUMN section of the MPS + self.mat_row = [] # row seq_no of the matrix coef. + self.mat_col = [] # col seq_no the matrix coef. + self.mat_val = [] # matrix coeff. + self.col_curr = "" # current column (initialized to an illegal empty name) + self.gf_seq = ( + -1 + ) # sequence_no of the goal function (objective) row: equal = -1, if undefined + # representation of the LP matrix: + self.mat = pd.DataFrame(columns=["row", "col", "val"]) # LP matrix + # cols attributes: + # self.cols = pd.DataFrame(columns=['seq_id', 'name', 'lo_bnd', 'up_bnd']) + # rows attributes: + # self.rows = pd.DataFrame( + # columns=['seq_id', 'name', 'type', 'lo_bnd', 'up_bnd'] + # ) + + def rd_mps(self, fname): # process the MPS file + print(f"\nReading MPS-format file {fname}.") + self.fname = fname + sections = [ + "NAME", + "ROWS", + "COLUMNS", + "RHS", + "RANGES", + "BOUNDS", + "SOS", + "ENDATA", + ] + + # lists are OK only for small and medium problems + # row_names = [] # names of rows + # row_types = [] # types of rows + # col_names = [] # names of columns + + # wrk vars + n_section = 0 # seq_no of the currently processed MPS-file section + next_sect = 0 # seq_no of the next (to be processed) MPS-file section + # last_sect = -1 # last processed section + + # process the MPS file + with open(self.fname, "r") as reader: + for n_line, line in enumerate(reader): + line = line.rstrip("\n") + # print(f'line {line}') + if line[0] == "*" or len(line) == 0: # skip commented and empty lines + continue + words = line.split() + if line[0] == " ": # continue reading the current MPS section + # columns/matrix (first here because most frequently used) + if n_section == 2: + self.add_coeff(words, n_line) # add column and its coefficients + elif n_section == 1: # rows + self.add_row(words, n_line) # add row and its type + elif n_section == 3: # rhs + self.add_rhs(words, n_line) # process RHS + elif n_section == 4: # ranges + self.add_range(words, n_line) # process range + elif n_section == 5: # bounds + self.add_bnd(words, n_line) # process bound + elif n_section == 6: # SOS section + pass # SOS section not processed + # elif n_section == 7: # end data + # raise Exception( + # "Unexpected execution flow; needs to be explored." + # ) + else: + print(f"MPS record {n_line}, section id {n_section}.") + raise Exception( + f"MPS line '{line}' (line {n_line}) misplaced," + f" processing section {sections[n_section]}." + ) + else: # found a new section + if n_section == 0: # problem-name processed with the section header + pass + elif n_section <= 5: + # print(f'\tData of section {sections[n_section]} processed.') + pass + elif n_section == 6: # SOS + print(f"WARNING: Section {sections[n_section]} not processed.") + else: + raise Exception( + f"Should not come here, n_section = {n_section}." + ) + + # process the head of new section + print(f"Next section found: {line} (line {n_line}).") + self.n_lines = n_line + # last_sect = n_section + n_section = self.next_sec(next_sect, words, sections) + next_sect = n_section + 1 + # print(f'{n_section = }, {next_sect = }') + # end of MPS reading + + # check, if the last required section ('ENDATA') was defined + assert ( + n_section == 7 + ), f'The "ENDATA" section is not declared; last section_id = {n_section}.' + + self.mps_sum() # summarize the processed MPS content + + def next_sec(self, n_exp, words, sections): + # required/optional MPS sections + req_sect = [True, True, True, False, False, False, False, True] + n_line = self.n_lines + n_words = len(words) + if req_sect[n_exp]: # required section must be in the sequence + # assert ( + # words[0] == sections[next_sect] + # ), f"expect section {sections[next_sect]} found: {line}." + if words[0] == sections[n_exp]: # required section found + if n_exp == 0: # store the problem name + assert n_words > 1, ( + f"problem name undefined: line {n_line} has" + f" {n_words} words." + ) + # print(f"\tProblem name line {words[1:]}.") + if n_words == 2: + self.pname = words[1] # store the problem name + else: + self.pname = words[1:] # store the problem name + print(f"\tProblem name: {self.pname}.") + return n_exp # n_sections equals to the expected: n_exp + else: + print(f"section {words} found.") + raise Exception( + f"Required MPS section {sections[n_exp]} undefined" " or misplaced." + ) + else: # the found section does not follow the last processed section + try: + n_section = sections.index(words[0]) + except ValueError: + raise Exception(f"Unknown section: {words} (line {n_line}).") + if n_section < n_exp: + raise Exception( + f"Section {words[0]} (line {n_line}) is misplaced or duplicated." + ) + return n_section + + def mps_sum(self): + # check, if there was at least one N row + # (the first N row assumed to be the objective): + assert self.gf_seq != -1, "objective (goal function) row is undefined." + + # create a df with the matrix coefficients + self.mat = pd.DataFrame( + {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} + ) + self.mat["abs_val"] = abs( + self.mat["val"] + ) # add column with absolute values of coeff. + self.mat["log"] = np.log10(self.mat["abs_val"]).astype( + int + ) # add col with int(log10(coeffs)) + # print(f'matrix after initialization:\n {self.mat}') + + # Finish the MPS processing with the summary of its attributes + dens = f"{float(len(self.mat)) / (len(self.row_name) * len(self.col_name)):.2e}" + print( + f"\nFinished processing {self.n_lines} lines of the MPS file: {self.fname}." + ) + print( + f"LP has: {len(self.row_name)} rows, {len(self.col_name)} cols," + f" {len(self.mat)} non-zeros, matrix density = {dens}." + ) + print( + f"Numbers of redefined: RHS = {self.n_rhs}, ranges = {self.n_ranges}," + f" bounds = {self.n_bounds}." + ) + + # todo: add info on dense rows and cols + + # info on the GF row, RHS, ranges, bounds + df = self.mat.loc[self.mat["row"] == self.gf_seq][ + "val" + ] # df with values of the GF coefficients. + print( + f'\nThe GF (objective) row named "{self.seq_row.get(self.gf_seq)[0]}" has' + f" {len(df)} elements." + ) + print(f"Distribution of the GF (objective) values:\n{df.describe()}") + + def add_row(self, words, n_line): + """Process current line of the ROWS section. + + While processing the ROWS section the row attributes are initialized to the + default (for the corresponding row type) values. The attributes are updated for + optionally defined values in the (also optional) RHS and RANGES sections. The + interpretation of the MPS-format (in particular of values in the RANGES section) + follows the original MPS standard, see e.g., "Advanced Linear Programming," by + Bruce A. Murtagh. or the standard summary at + https://lpsolve.sourceforge.net/5.5/mps-format.htm . + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + row_types = ["N", "E", "G", "L"] # types of rows + n_words = len(words) + assert ( + n_words == 2 + ), f"row declaration (line {n_line}) has {n_words} words instead of 2." + row_type = words[0] + row_name = words[1] + row_seq = len(self.row_name) + assert row_type in row_types, f"unknown row type {row_type} (line {n_line})." + assert ( + row_name not in self.row_name + ), f"duplicated row name: {row_name} (line {n_line})." + if row_type == "N" and self.gf_seq == -1: + self.gf_seq = row_seq + print( + f"\tRow {row_name} (row_seq = {row_seq}) is the objective" + " (goal function) row." + ) + self.row_name.update({row_name: row_seq}) # add to dict of row_names + # store row_{seq, name, type} and the default + # (to be changed in rhs/ranges) [lo_bnd, upp_bnd] + self.row_att(row_seq, row_name, row_type, "rows") + + def add_coeff(self, words, n_line): + """Process current line of the COLUMNS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + # print( + # f"processing line no {n_line}, n_words {n_words}:" + # f" {line}" + # ) + assert n_words in [ + 3, + 5, + ], f"matrix element (line {n_line}) has {n_words} words." + col_name = words[0] + if col_name != self.col_curr: # new column + assert ( + col_name not in self.col_name + ), f"duplicated column name: {col_name} (line {n_line})" + col_seq = len(self.col_name) + self.col_name.update({col_name: col_seq}) + self.seq_col.update({col_seq: [col_name, 0.0, self.infty]}) + self.col_curr = col_name + else: + col_seq = self.col_name.get(col_name) + row_name = words[1] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." + val = float(words[2]) + assert ( + type(val) is float + ), f"string {words[2]} (line {n_line}) is not a number." + # add the matrix element to the lists of: seq_row, seq_col, val + # the lists will be converted to self.mat df after all elements + # will be read + self.mat_row.append(row_seq) + self.mat_col.append(col_seq) + self.mat_val.append(val) + # print(f' matrix element ({row_seq}, {col_seq}) = {val}') + # the next two commands take far too long for large matrices; + # thus tmp-store in three lists + # df2 = pd.DataFrame( + # {"row": row_seq, "col": col_seq, "val": val}, + # index=list(range(1)), + # ) + # self.mat = pd.concat( + # [self.mat, df2], + # axis=0, + # ignore_index=True + # ) + + # proccess the second matrix element in the same MPS row, if defined + if n_words > 3: + assert n_words == 5, ( + f"line {n_line}) has {n_words} words, five words needed" + " fordefining second element in the same MPS line." + ) + row_name = words[3] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." + val = float(words[4]) + assert ( + type(val) is float + ), f"string {words[4]} (line {n_line}) is not a number." + self.mat_row.append(row_seq) + self.mat_col.append(col_seq) + self.mat_val.append(val) + + def add_rhs(self, words, n_line): + """Process current line of the RHS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + + # first RHS record implies RHS/ranges id (might be empty) + if self.n_rhs == 0: + # print(f"first rhs line: {n_line}: '{words}'") + if n_words in [3, 5]: # RHS name/id defined + self.id_rhs = True + self.rhs_id = words[0] + print(f"\tId of RHS: {self.rhs_id}") + else: + self.id_rhs = False + self.rhs_id = "" + print("\tId of RHS: (empty)") + + if self.id_rhs: + n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) + pos_name = 1 # first row-name in words[pos_name] + else: + n_req_wrd = [2, 4] + pos_name = 0 # first row-name in words[pos_name] + + assert n_words in n_req_wrd, ( + f"rhs line {n_line} has {n_words} words, expected" f" {n_req_wrd}." + ) + if self.id_rhs: # check id of the RHS entry, if it was defined + assert words[0] == self.rhs_id, ( + f"RHS id {words[0]}, line {n_line} differ from" + f"expected: {self.rhs_id}." + ) + row_name = words[pos_name] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown RHS row-name {row_name} (line {n_line})." + val = float(words[pos_name + 1]) + assert type(val) is float, ( + f"RHS value {words[pos_name + 1]} (line {n_line}) is not a" " number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "rhs", val) + self.n_rhs += 1 + if n_words == n_req_wrd[1]: # second pair of rhs defined + row_name = words[pos_name + 2] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown RHS row-name {row_name} (line {n_line})." + val = float(words[pos_name + 3]) + assert type(val) is float, ( + f"RHS value {words[pos_name + 1]} (line {n_line}) is" " not a number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "rhs", val) + self.n_rhs += 1 + + def add_range(self, words, n_line): + """Process current line of the RANGES section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + + # first ranges record implies ranges id (might be empty) + if self.n_ranges == 0: + if n_words in [3, 5]: + self.id_range = True + self.range_id = words[0] + print(f"\tId of ranges: {self.range_id}") + else: + self.id_range = False + self.range_id = "" + print("\tId of ranges: (empty)") + + if self.id_range: + n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) + pos_name = 1 # first row-name in words[pos_name] + else: + n_req_wrd = [2, 4] + pos_name = 0 # first row-name in words[pos_name] + + assert ( + n_words in n_req_wrd + ), f"ranges line {n_line} has {n_words} words, expected {n_req_wrd}." + if self.id_range: # check id of the ranges' entry, if it was defined + assert words[0] == self.range_id, ( + f"Ranges id {words[0]}, line {n_line} differ from" + f" expected: {self.range_id}." + ) + row_name = words[pos_name] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown range row-name {row_name} (line {n_line})." + val = float(words[pos_name + 1]) + assert ( + type(val) is float + ), f"Range value {words[pos_name + 1]} (line {n_line}) is not a number." + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "ranges", val) + self.n_ranges += 1 + if n_words == n_req_wrd[1]: # second pair of ranges defined + row_name = words[pos_name + 2] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown ranges row-name {row_name} (line {n_line})." + val = float(words[pos_name + 3]) + assert type(val) is float, ( + f"Ranges value {words[pos_name + 1]} (line {n_line}) is" + " not a number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "ranges", val) + self.n_ranges += 1 + + def add_bnd(self, words, n_line): + """Process current line of the BOUNDS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + # items of the below dictionaries indicate bounds to be modified: + # 1 - low, 2 - upper, 3 - both + bnd_type1 = {"LO": 1, "UP": 2, "FX": 3} # types of bounds requiring value + bnd_type2 = {"MI": 1, "PL": 2, "FR": 3} # types of bounds not requiring value + bnd_type3 = { + "BV": 0, + "LI": 0, + "UI": 0, + "SC": 0, + } # types of bounds legal for int-type vars, not processed yet + + n_words = len(words) + + # first Bounds record implies bounds id (might be empty) + if self.n_bounds == 0: + # print(f"first BOUNDS line: {n_line}: '{words}'") + if n_words == 4 or (n_words == 3 and words[0] in ["FR", "MI", "PL"]): + self.id_bnd = True + self.bnd_id = words[1] + print(f"\tId of BOUNDS: {self.bnd_id}") + else: + self.id_bnd = False + self.bnd_id = "" + print("\tId of BOUNDS: (empty)") + + # number of required words in a line (with/without) required value: + if self.id_bnd: + n_req_wrd = [4, 3] + pos_name = 2 # col-name in words[pos_name] + else: + n_req_wrd = [3, 2] + pos_name = 1 # col-name in words[pos_name] + + assert ( + n_words in n_req_wrd + ), f"bounds line {n_line} has {n_words} words, expected: {n_req_wrd}." + if self.id_bnd: # check id of the BOUNDS line, if it was defined + assert words[1] == self.bnd_id, ( + f"BOUNDS id {words[1]}, line {n_line} differ from " + f"expected id: {self.bnd_id}." + ) + col_name = words[pos_name] + col_seq = self.col_name.get(col_name) + assert ( + col_seq is not None + ), f"unknown BOUNDS col-name {col_name} (line {n_line})." + attr = self.seq_col.get(col_seq) # [col_name, lo_bnd, up_bnd] + + typ = words[0] + if typ in bnd_type1: # bound-types that require a value + val = float(words[pos_name + 1]) + assert ( + type(val) is float + ), f"BOUND value {words[pos_name + 1]} (line {n_line}) is not a number." + at_pos = bnd_type1.get(typ) + if at_pos == 3: # set both bounds + attr[1] = attr[2] = val + else: + attr[at_pos] = val + elif typ in bnd_type2: # value not needed; + # therefore it is neither checked nor processed + at_pos = bnd_type2.get(typ) + if at_pos == 3: # set both bounds + attr[1] = attr[2] = self.infty + else: + attr[at_pos] = self.infty + elif typ in bnd_type3: + raise Exception( + f"Bound type {typ} of integer var. (line {n_line}) not" + " processed yet." + ) + else: + raise Exception(f"Unknown bound type {typ} (line {n_line}).") + self.seq_col.update({col_seq: attr}) # store the updated col-attributes + self.n_bounds += 1 + + def row_att(self, row_seq, row_name, row_type, sec_name, val=0.0): + """Process values defined in ROWS, RHS and RANGES sections and store/update + the corresponding row attributes. + + While processing the ROWS section the row attributes are initialized to the + default (for the corresponding row type) values. The attributes are updated for + optionally defined values in the (also optional) RHS and RANGES sections. The + interpretation of the MPS-format (in particular of values in the RANGES section) + follows the original MPS standard, see e.g., "Advanced Linear Programming," by + Bruce A. Murtagh. or the standard summary at + https://lpsolve.sourceforge.net/5.5/mps-format.htm . + + Attributes + ---------- + row_seq: int + position of row in dictionaries and the matrix df + row_name: str + row name (defined in the ROWS section) + row_type: str + row type (defined in the ROWS section) + sec_name: str + identifies the MPS section: either 'rows' (for initialization) or 'rhs' or + 'ranges' (for updates) + val: float + value of the row attribute defining either lo_bnd or up_bnd of the row + (the type checked while processing the MPS section) + """ + + type2bnd = { + "E": [0.0, 0.0], + "G": [0.0, self.infty], + "L": [self.infty, 0.0], + "N": [self.infty, self.infty], + } + assert row_seq == self.row_name.get( + row_name + ), f"{row_seq=} should be equal to: {self.row_name.get(row_name)}." + assert row_type in type2bnd, f"undefined row type {row_type=} for {row_name=}." + if sec_name == "rows": # initialize row attributes (used in ROW section) + low_upp = type2bnd.get(row_type) + self.seq_row.update({row_seq: [row_name, low_upp[0], low_upp[1], row_type]}) + # print( + # f"attributes of row {row_name} initialized in section {sec_name} to" + # f"{self.seq_row.get(row_seq)}." + # ) + elif sec_name in [ + "rhs", + "ranges", + ]: # update row attributes (used in RHS and ranges sections) + if row_type == "N": + print(f"{sec_name} value {val} ignored for neutral row {row_name}.") + return + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + if sec_name == "rhs": # process the RHS value + if row_type == "G": # update lo_bnd + attr[1] = val + elif row_type == "L": # update up_bnd + attr[2] = val + elif row_type == "E": # update both bounds + attr[1] = attr[2] = val + else: # process the ranges value + if row_type == "G": # update up_bnd + attr[2] = attr[1] + abs(val) + elif row_type == "L": # update lo_bnd + attr[1] = attr[2] - abs(val) + elif row_type == "E": # update both bounds + if val > 0: + attr[2] = attr[1] + val + else: + attr[1] = attr[2] - abs(val) + self.seq_row.update({row_seq: attr}) + # print( + # f"attributes of row {row_name} updated in section {sec_name} to" + # f" {attr}." + # ) + else: # update row attributes (used in RHS and ranges sections) + raise Exception(f"row_att() should not be called for {sec_name=}.") + + def stat(self, lo_tail=-7, up_tail=6): + """Basic statistics of the matrix coefficients. + + Focus on distributions of magnitudes of non-zero coeff. represented by values + of int(log10(abs(coeff))). + Additionally, tails (low and upp) of the distributions are reported. + + Attributes + ---------- + lo_tail: int + Magnitude order of the low-tail (-7 denotes values < 10^(-6)) + up_tail: int + Magnitude order of the upper-tail (6 denotes values >= 10^6) + """ + + # print(f'\nDistribution of non-zero values:\n{self.mat["val"].describe()}') + print( + f'\nDistribution of abs(non-zero) values:\n{self.mat["abs_val"].describe()}' + ) + print( + f'\nDistribution of int(log10(abs(values))):\n{self.mat["log"].describe()}' + ) + min_logv = self.mat["log"].min() + max_logv = self.mat["log"].max() + + # count numbers of coeffs for each order of magnitude of their value + magn_dist = Counter(self.mat["log"]) + magn_dist = dict( + sorted(magn_dist.items()) + ) # counter (sorted by occurances) --> dict sorted by magnitudes + print( + "\nDistribution of int(log10(abs(values))) sorted by magnitudes of values:" + ) + print( + f"range = [{min_logv}, {max_logv}] (magnitudes with zero-occurrences" + " skipped)." + ) + for magn in magn_dist: + print(f"{magn:3d}: {magn_dist[magn]:7d}") + + if lo_tail > up_tail: + print(f"Overlapping distribution tails ({lo_tail}, {up_tail}) reset to 0.") + lo_tail = up_tail = 0 + + # low-tail of the distribution + if lo_tail < min_logv: + print( + f"\nNo log10(values) in the requested low-tail (<= {lo_tail}) of the" + " distribution." + ) + else: + print( + "\nDistribution of log10(values) in the requested low-tail (<=" + f" {lo_tail}) of the distribution." + ) + print(f'{self.mat.loc[self.mat["log"] <= lo_tail].describe()}') + for val in [*range(min_logv, lo_tail + 1)]: + print( + f"Number of log10(values) == {val}:" + f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" + ) + # up-tail of the distribution + if max_logv < up_tail: + print( + f"\nNo log10(values) in the requested upper-tail (>= {up_tail}) of the" + " distribution." + ) + else: + print( + "\nDistribution of log10(values) in the requested upp-tail (>=" + f" {up_tail}) of the distribution." + ) + print(f'{self.mat.loc[self.mat["log"] >= up_tail].describe()}') + for val in [*range(up_tail, max_logv + 1)]: + print( + f"Number of log10(values) == {val}:" + f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" + ) + + def out_loc(self, small=True, thresh=-7, max_rec=500): + """Locations of outliers, i.e., elements having small/large coeff values. + + Locations of outliers (in the term of the matrix coefficient values). + The provided ranges of values in the corresponding row/col indicate potential + of the simple scaling. + + Attributes + ---------- + small: bool + True/False for threshold of either small or large coefficients + thresh: int + Magnitude of the threshold (in: int(log10(abs(coeff))), i.e. -7 denotes + values < 10^(-6)) + max_rec: int + Maximum number of processed coefficients + """ + + if small: # sub-matrix composed of only small-value outliers + df = self.mat.loc[self.mat["log"] <= thresh] + print( + f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' + f" values of log10(values) <= {thresh})." + ) + else: # large-value outliers + df = self.mat.loc[self.mat["log"] >= thresh] + print( + f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' + f" values of log10(values) >= {thresh})." + ) + df1 = df.sort_values( + "row" + ) # sort the df with outliers ascending seq_id of rows + df1.reset_index() + col_out = [] # col_seq of outliers' cols + for n_rows, (indx, row) in enumerate(df1.iterrows()): + assert ( + n_rows < max_rec + ), "To process all requested coeffs modify the safety limit assertion." + row_seq, row_name = self.ent_inf( + row, True + ) # row seq_id and name of the current coeff. + col_seq, col_name = self.ent_inf( + row, False + ) # col seq_id and name of the current coeff. + if col_seq not in col_out: + col_out.append(col_seq) + else: + print(f"{col_seq = } already in another outlier row.") + print( + f'Coeff. ({row_seq}, {col_seq}): val = {row["val"]:.4e}, log(val) =' + f' {row["log"]:n}' + ) + df_row_out = df1.loc[df1["row"] == row_seq] # df with only outlier elements + df_row_all = self.mat.loc[ + self.mat["row"] == row_seq + ] # df with all elements + # print(f'matrix elements in the same row:\n{df_row}') + print( + f"\tRow {row_name} {self.ent_range(row_seq, True)} has" + f" {df_row_out['log'].count()} outlier-coeff. of magnitudes in" + f" [{df_row_out['log'].min()}, {df_row_out['log'].max()}]" + ) + print( + f"\tRow {row_name} {self.ent_range(row_seq, True)} has" + f" {df_row_all['log'].count()} (all)-coeff. of magnitudes in" + f" [{df_row_all['log'].min()}, {df_row_all['log'].max()}]" + ) + # a column may include more than 1 outlier; + # therefore columns with outliers reported below: + # df with outliers in the same col: + # df_col = df1.loc[df1['col'] == col_seq] + # print( + # f"\tCol {col_name} {self.ent_range(col_seq, False)} has " + # f"{df_col["log"].count()} outlier coeff. of magnitudes in " + # f"[{df_col["log"].min()}, {df_col["log"].max()}]" + # ) + print( + "\nColumn-wise locations of outlier coefficients in" + f" {len(col_out)} columns:" + ) + col_out.sort() + for col_seq in col_out: + col_name = self.seq_col.get(col_seq)[0] + df_col = self.mat.loc[ + self.mat["col"] == col_seq + ] # df with elements in the same col + print( + f"\tCol {col_name} {self.ent_range(col_seq, False)} has" + f" {df_col['log'].count()} coeff. of magnitudes in" + f" [{df_col['log'].min()}, {df_col['log'].max()}]" + ) + + def ent_inf(self, mat_row, by_row=True) -> typing.Tuple[int, str]: + """Return info on the entity (either row or col) defining the selected matrix + coefficient. + + Each row of the dataFrame contains the definition (composed of the row_seq, + col_seq, value, log(value)) of one matrix coefficient. + The function returns seq_id and name of either row or col of the currently + considered coeff. + + Attributes + ---------- + mat_row: dataFrame row + record of the df with the data of currently processed element + by_row: bool + True/False for returning the seq_id and name of the corresponding row/col + """ + + if by_row: + # if seq_row {} not stored, then: + # names = [k for k, idx in self.row_name.items() if idx == ent_seq] + ent_seq = int(mat_row["row"]) + name = self.seq_row.get(ent_seq)[0] + else: + ent_seq = int(mat_row["col"]) + name = self.seq_col.get(ent_seq)[0] + return ent_seq, name + + def ent_range(self, seq_id, by_row=True) -> str: + """Return formatted string representing ranges of feasible values of either a + row or a column. + + The returned values of ranges are either 'none' (for plus/minus infinity) or + int(log10(abs(val))) for other values. Small values, defined as + abs(value) < 1e-10, are represented by 0. + + Attributes + ---------- + seq_id: int + sequence number of either row or col. + by_row: bool + True/False for returning the seq_id and name of the corresponding row/col. + """ + + if by_row: + attr = self.seq_row.get(seq_id) # [row_name, lo_bnd, up_bnd, row_type] + pass + else: + attr = self.seq_col.get(seq_id) # [col_name, lo_bnd, up_bnd] + pass + s = [] # strings representing lo/up-bounds + for pos in [0, 1]: + val = attr[pos + 1] # 0-th element is the name + if val == self.infty: # used for both infinites (positive and negative) + s.append(self.infty) + else: + if type(val) is int: + val = float(val) + if abs(val) < 1e-10: + s.append("0") # same string for int and float zeros + else: + val = int(math.log10(abs(val))) + s.append(f"{val}") # small integer value, no formatting needed + ret = "[" + s[0] + ", " + s[1] + "]" + return ret # the range is formatted as: '[lo_bnd, up_bnd]' + + def plot_hist(self): + """Plot histograms.""" + # todo: might not be needed; therefore the implementation postponed diff --git a/message_ix/tools/lp_diag/lp_diag - Yoga edit.py b/message_ix/tools/lp_diag/lp_diag - Yoga edit.py new file mode 100644 index 000000000..6118e34cb --- /dev/null +++ b/message_ix/tools/lp_diag/lp_diag - Yoga edit.py @@ -0,0 +1,939 @@ +""" +Prototype of simple analysis of the MPS-format file +Written by Marek Makowski, ECE Program of IIASA, in March 2023 +""" + +import math + +# import os +# import sys # needed for sys.exit() +import typing +from collections import Counter + +import numpy as np +import pandas as pd + +# from datetime import datetime as dt +# from datetime import timedelta as td +# import matplotlib.pyplot as plt +# from matplotlib import cm +# from matplotlib import colors +# from matplotlib.ticker import LinearLocator # needed for ax.set_major_locator +# import seaborn as sns +# # sns.set() # settings for seaborn plotting style + + +class LPdiag: + """Process the MPS-format input file and provide its basic diagnotics. + + The diagnostics currently includes: + - handling formal errors of the MPS file + - basic statistics of the matrix coefficients. + + Attributes + ---------- + + """ + + def __init__(self): + self.fname = "undefined" # MPS file name, to be defined by rd_mps() call + self.pname = "undefined" # problem name + self.id_rhs = False # True, if rhs_id defined + self.id_range = False # True, if range_id defined + self.id_bnd = False # True, if bnd_id defined + self.rhs_id = "" # id of rhs elements + self.range_id = "" # id of ranges elements (might differ from rhs_id) + self.bnd_id = "" # id of bounds elements + self.infty = "none" # marker for infinity value + self.n_lines = 0 # number of processed lines of the MPS file + self.n_rhs = 0 # number of defined RHS + self.n_ranges = 0 # number of defined ranges + self.n_bounds = 0 # number of defined bounds + # if not os.path.exists(self.rep_dir): + # os.makedirs(self.rep_dir, mode=0o755) + + # dictionaries for searchable names and its indices + # (searching very-long lists is prohibitively slow) + self.row_name = {} # key: row-name, item: its seq_id + self.seq_row = {} # key: row sequence, item: [row-name, lo_bnd, up_bond, type] + self.col_name = {} # key: col-name, item: its seq_id + self.seq_col = {} # key: col-sequence, item: [col-name, lo_bnd, up_bond] + # tmp space for reading COLUMN section of the MPS + self.mat_row = [] # row seq_no of the matrix coef. + self.mat_col = [] # col seq_no the matrix coef. + self.mat_val = [] # matrix coeff. + self.col_curr = "" # current column (initialized to an illegal empty name) + self.gf_seq = ( + -1 + ) # sequence_no of the goal function (objective) row: equal = -1, if undefined + # representation of the LP matrix: + self.mat = pd.DataFrame(columns=["row", "col", "val"]) # LP matrix + # cols attributes: + # self.cols = pd.DataFrame(columns=['seq_id', 'name', 'lo_bnd', 'up_bnd']) + # rows attributes: + # self.rows = pd.DataFrame( + # columns=['seq_id', 'name', 'type', 'lo_bnd', 'up_bnd'] + # ) + print('[YOGA TEST 8] self.mat:\n', self.mat) + + + def rd_mps(self, fname): # process the MPS file + print(f"\nReading MPS-format file {fname}.") + self.fname = fname + sections = [ + "NAME", + "ROWS", + "COLUMNS", + "RHS", + "RANGES", + "BOUNDS", + "SOS", + "ENDATA", + ] + + # lists are OK only for small and medium problems + # row_names = [] # names of rows + # row_types = [] # types of rows + # col_names = [] # names of columns + + # wrk vars + n_section = 0 # seq_no of the currently processed MPS-file section + next_sect = 0 # seq_no of the next (to be processed) MPS-file section + # last_sect = -1 # last processed section + + # process the MPS file + with open(self.fname, "r") as reader: + for n_line, line in enumerate(reader): + line = line.rstrip("\n") + # print(f'line {line}') + if line[0] == "*" or len(line) == 0: # skip commented and empty lines + continue + words = line.split() + if line[0] == " ": # continue reading the current MPS section + # columns/matrix (first here because most frequently used) + if n_section == 2: + self.add_coeff(words, n_line) # add column and its coefficients + elif n_section == 1: # rows + self.add_row(words, n_line) # add row and its type + elif n_section == 3: # rhs + self.add_rhs(words, n_line) # process RHS + elif n_section == 4: # ranges + self.add_range(words, n_line) # process range + elif n_section == 5: # bounds + self.add_bnd(words, n_line) # process bound + elif n_section == 6: # SOS section + pass # SOS section not processed + # elif n_section == 7: # end data + # raise Exception( + # "Unexpected execution flow; needs to be explored." + # ) + else: + print(f"MPS record {n_line}, section id {n_section}.") + raise Exception( + f"MPS line '{line}' (line {n_line}) misplaced," + f" processing section {sections[n_section]}." + ) + else: # found a new section + if n_section == 0: # problem-name processed with the section header + pass + elif n_section <= 5: + # print(f'\tData of section {sections[n_section]} processed.') + pass + elif n_section == 6: # SOS + print(f"WARNING: Section {sections[n_section]} not processed.") + else: + raise Exception( + f"Should not come here, n_section = {n_section}." + ) + + # process the head of new section + print(f"Next section found: {line} (line {n_line}).") + self.n_lines = n_line + # last_sect = n_section + n_section = self.next_sec(next_sect, words, sections) + next_sect = n_section + 1 + # print(f'{n_section = }, {next_sect = }') + # end of MPS reading + + # check, if the last required section ('ENDATA') was defined + assert ( + n_section == 7 + ), f'The "ENDATA" section is not declared; last section_id = {n_section}.' + + self.mps_sum() # summarize the processed MPS content + + def next_sec(self, n_exp, words, sections): + # required/optional MPS sections + req_sect = [True, True, True, False, False, False, False, True] + n_line = self.n_lines + n_words = len(words) + if req_sect[n_exp]: # required section must be in the sequence + # assert ( + # words[0] == sections[next_sect] + # ), f"expect section {sections[next_sect]} found: {line}." + if words[0] == sections[n_exp]: # required section found + if n_exp == 0: # store the problem name + assert n_words > 1, ( + f"problem name undefined: line {n_line} has" + f" {n_words} words." + ) + # print(f"\tProblem name line {words[1:]}.") + if n_words == 2: + self.pname = words[1] # store the problem name + else: + self.pname = words[1:] # store the problem name + print(f"\tProblem name: {self.pname}.") + return n_exp # n_sections equals to the expected: n_exp + else: + print(f"section {words} found.") + raise Exception( + f"Required MPS section {sections[n_exp]} undefined" " or misplaced." + ) + else: # the found section does not follow the last processed section + try: + n_section = sections.index(words[0]) + except ValueError: + raise Exception(f"Unknown section: {words} (line {n_line}).") + if n_section < n_exp: + raise Exception( + f"Section {words[0]} (line {n_line}) is misplaced or duplicated." + ) + return n_section + + def mps_sum(self): + # check, if there was at least one N row + # (the first N row assumed to be the objective): + assert self.gf_seq != -1, "objective (goal function) row is undefined." + + # create a df with the matrix coefficients + self.mat = pd.DataFrame( + # {"row": self.mat_row, "col": self.mat_row, "val": self.mat_val} # this is the original line + {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} # this is Yoga edited line + ) + self.mat["abs_val"] = abs( + self.mat["val"] + ) # add column with absolute values of coeff. + self.mat["log"] = np.log10(self.mat["abs_val"]).astype( + int + ) # add col with int(log10(coeffs)) + # print(f'matrix after initialization:\n {self.mat}') + print('[YOGA TEST 10] self.mat:\n', self.mat) + print('[YOGA TEST 11]: writing dataframe to excel') + row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() + col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() + matrix = (self.mat['val'].set_index(['row','col'],drop=True) + .unstack().fillna(0).rename(index=row_name,columns=col_name)) + #with pd.ExcelWriter('coeff_matrix.xlsx') as writer: + # self.mat.to_excel(writer, sheet_name='Matrix') + # df_seq_row_name.to_excel(writer, sheet_name='Row_Name') + # df_seq_col_name.to_excel(writer, sheet_name='Col_Name') + cmatrix = matrix.to_xarray() + cmatrix.to_netcdf('matrix.nc') + + + # Finish the MPS processing with the summary of its attributes + dens = f"{float(len(self.mat)) / (len(self.row_name) * len(self.col_name)):.2e}" + print( + f"\nFinished processing {self.n_lines} lines of the MPS file: {self.fname}." + ) + print( + f"LP has: {len(self.row_name)} rows, {len(self.col_name)} cols," + f" {len(self.mat)} non-zeros, matrix density = {dens}." + ) + print( + f"Numbers of redefined: RHS = {self.n_rhs}, ranges = {self.n_ranges}," + f" bounds = {self.n_bounds}." + ) + + # todo: add info on dense rows and cols + + # info on the GF row, RHS, ranges, bounds + df = self.mat.loc[self.mat["row"] == self.gf_seq][ + "val" + ] # df with values of the GF coefficients. + print( + f'\nThe GF (objective) row named "{self.seq_row.get(self.gf_seq)[0]}" has' + f" {len(df)} elements." + ) + print(f"Distribution of the GF (objective) values:\n{df.describe()}") + print('[YOGA TEST 9] self.mat:\n', self.mat) + + + def add_row(self, words, n_line): + """Process current line of the ROWS section. + + While processing the ROWS section the row attributes are initialized to the + default (for the corresponding row type) values. The attributes are updated for + optionally defined values in the (also optional) RHS and RANGES sections. The + interpretation of the MPS-format (in particular of values in the RANGES section) + follows the original MPS standard, see e.g., "Advanced Linear Programming," by + Bruce A. Murtagh. or the standard summary at + https://lpsolve.sourceforge.net/5.5/mps-format.htm . + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + row_types = ["N", "E", "G", "L"] # types of rows + n_words = len(words) + assert ( + n_words == 2 + ), f"row declaration (line {n_line}) has {n_words} words instead of 2." + row_type = words[0] + row_name = words[1] + row_seq = len(self.row_name) + assert row_type in row_types, f"unknown row type {row_type} (line {n_line})." + assert ( + row_name not in self.row_name + ), f"duplicated row name: {row_name} (line {n_line})." + if row_type == "N" and self.gf_seq == -1: + self.gf_seq = row_seq + print( + f"\tRow {row_name} (row_seq = {row_seq}) is the objective" + " (goal function) row." + ) + self.row_name.update({row_name: row_seq}) # add to dict of row_names + # store row_{seq, name, type} and the default + # (to be changed in rhs/ranges) [lo_bnd, upp_bnd] + self.row_att(row_seq, row_name, row_type, "rows") + + def add_coeff(self, words, n_line): + """Process current line of the COLUMNS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + # print( + # f"processing line no {n_line}, n_words {n_words}:" + # f" {line}" + # ) + assert n_words in [ + 3, + 5, + ], f"matrix element (line {n_line}) has {n_words} words." + col_name = words[0] + if col_name != self.col_curr: # new column + assert ( + col_name not in self.col_name + ), f"duplicated column name: {col_name} (line {n_line})" + col_seq = len(self.col_name) + self.col_name.update({col_name: col_seq}) + self.seq_col.update({col_seq: [col_name, 0.0, self.infty]}) + self.col_curr = col_name + else: + col_seq = self.col_name.get(col_name) + row_name = words[1] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." + val = float(words[2]) + assert ( + type(val) is float + ), f"string {words[2]} (line {n_line}) is not a number." + # add the matrix element to the lists of: seq_row, seq_col, val + # the lists will be converted to self.mat df after all elements + # will be read + self.mat_row.append(row_seq) + self.mat_col.append(col_seq) + self.mat_val.append(val) + print('[YOGA TEST 5]', + '\nROW, COL, VAL: ', row_seq, col_seq, val) + # print(f' matrix element ({row_seq}, {col_seq}) = {val}') + # the next two commands take far too long for large matrices; + # thus tmp-store in three lists + # df2 = pd.DataFrame( + # {"row": row_seq, "col": col_seq, "val": val}, + # index=list(range(1)), + # ) + # self.mat = pd.concat( + # [self.mat, df2], + # axis=0, + # ignore_index=True + # ) + + # proccess the second matrix element in the same MPS row, if defined + if n_words > 3: + assert n_words == 5, ( + f"line {n_line}) has {n_words} words, five words needed" + " fordefining second element in the same MPS line." + ) + row_name = words[3] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." + val = float(words[4]) + assert ( + type(val) is float + ), f"string {words[4]} (line {n_line}) is not a number." + self.mat_row.append(row_seq) + self.mat_col.append(col_seq) + self.mat_val.append(val) + print('[YOGA TEST 6]', + '\nROW, COL, VAL: ', row_seq, col_seq, val) + + + def add_rhs(self, words, n_line): + """Process current line of the RHS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + + # first RHS record implies RHS/ranges id (might be empty) + if self.n_rhs == 0: + # print(f"first rhs line: {n_line}: '{words}'") + if n_words in [3, 5]: # RHS name/id defined + self.id_rhs = True + self.rhs_id = words[0] + print(f"\tId of RHS: {self.rhs_id}") + else: + self.id_rhs = False + self.rhs_id = "" + print("\tId of RHS: (empty)") + + if self.id_rhs: + n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) + pos_name = 1 # first row-name in words[pos_name] + else: + n_req_wrd = [2, 4] + pos_name = 0 # first row-name in words[pos_name] + + assert n_words in n_req_wrd, ( + f"rhs line {n_line} has {n_words} words, expected" f" {n_req_wrd}." + ) + if self.id_rhs: # check id of the RHS entry, if it was defined + assert words[0] == self.rhs_id, ( + f"RHS id {words[0]}, line {n_line} differ from" + f"expected: {self.rhs_id}." + ) + row_name = words[pos_name] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown RHS row-name {row_name} (line {n_line})." + val = float(words[pos_name + 1]) + assert type(val) is float, ( + f"RHS value {words[pos_name + 1]} (line {n_line}) is not a" " number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "rhs", val) + self.n_rhs += 1 + if n_words == n_req_wrd[1]: # second pair of rhs defined + row_name = words[pos_name + 2] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown RHS row-name {row_name} (line {n_line})." + val = float(words[pos_name + 3]) + assert type(val) is float, ( + f"RHS value {words[pos_name + 1]} (line {n_line}) is" " not a number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "rhs", val) + self.n_rhs += 1 + + def add_range(self, words, n_line): + """Process current line of the RANGES section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + + # first ranges record implies ranges id (might be empty) + if self.n_ranges == 0: + if n_words in [3, 5]: + self.id_range = True + self.range_id = words[0] + print(f"\tId of ranges: {self.range_id}") + else: + self.id_range = False + self.range_id = "" + print("\tId of ranges: (empty)") + + if self.id_range: + n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) + pos_name = 1 # first row-name in words[pos_name] + else: + n_req_wrd = [2, 4] + pos_name = 0 # first row-name in words[pos_name] + + assert ( + n_words in n_req_wrd + ), f"ranges line {n_line} has {n_words} words, expected {n_req_wrd}." + if self.id_range: # check id of the ranges' entry, if it was defined + assert words[0] == self.range_id, ( + f"Ranges id {words[0]}, line {n_line} differ from" + f" expected: {self.range_id}." + ) + row_name = words[pos_name] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown range row-name {row_name} (line {n_line})." + val = float(words[pos_name + 1]) + assert ( + type(val) is float + ), f"Range value {words[pos_name + 1]} (line {n_line}) is not a number." + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "ranges", val) + self.n_ranges += 1 + if n_words == n_req_wrd[1]: # second pair of ranges defined + row_name = words[pos_name + 2] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown ranges row-name {row_name} (line {n_line})." + val = float(words[pos_name + 3]) + assert type(val) is float, ( + f"Ranges value {words[pos_name + 1]} (line {n_line}) is" + " not a number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "ranges", val) + self.n_ranges += 1 + + def add_bnd(self, words, n_line): + """Process current line of the BOUNDS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + # items of the below dictionaries indicate bounds to be modified: + # 1 - low, 2 - upper, 3 - both + bnd_type1 = {"LO": 1, "UP": 2, "FX": 3} # types of bounds requiring value + bnd_type2 = {"MI": 1, "PL": 2, "FR": 3} # types of bounds not requiring value + bnd_type3 = { + "BV": 0, + "LI": 0, + "UI": 0, + "SC": 0, + } # types of bounds legal for int-type vars, not processed yet + + n_words = len(words) + + # first Bounds record implies bounds id (might be empty) + if self.n_bounds == 0: + # print(f"first BOUNDS line: {n_line}: '{words}'") + if n_words == 4 or (n_words == 3 and words[0] in ["FR", "MI", "PL"]): + self.id_bnd = True + self.bnd_id = words[1] + print(f"\tId of BOUNDS: {self.bnd_id}") + else: + self.id_bnd = False + self.bnd_id = "" + print("\tId of BOUNDS: (empty)") + + # number of required words in a line (with/without) required value: + if self.id_bnd: + n_req_wrd = [4, 3] + pos_name = 2 # col-name in words[pos_name] + else: + n_req_wrd = [3, 2] + pos_name = 1 # col-name in words[pos_name] + + assert ( + n_words in n_req_wrd + ), f"bounds line {n_line} has {n_words} words, expected: {n_req_wrd}." + if self.id_bnd: # check id of the BOUNDS line, if it was defined + assert words[1] == self.bnd_id, ( + f"BOUNDS id {words[1]}, line {n_line} differ from " + f"expected id: {self.bnd_id}." + ) + col_name = words[pos_name] + col_seq = self.col_name.get(col_name) + assert ( + col_seq is not None + ), f"unknown BOUNDS col-name {col_name} (line {n_line})." + attr = self.seq_col.get(col_seq) # [col_name, lo_bnd, up_bnd] + + typ = words[0] + if typ in bnd_type1: # bound-types that require a value + val = float(words[pos_name + 1]) + assert ( + type(val) is float + ), f"BOUND value {words[pos_name + 1]} (line {n_line}) is not a number." + at_pos = bnd_type1.get(typ) + if at_pos == 3: # set both bounds + attr[1] = attr[2] = val + else: + attr[at_pos] = val + elif typ in bnd_type2: # value not needed; + # therefore it is neither checked nor processed + at_pos = bnd_type2.get(typ) + if at_pos == 3: # set both bounds + attr[1] = attr[2] = self.infty + else: + attr[at_pos] = self.infty + elif typ in bnd_type3: + raise Exception( + f"Bound type {typ} of integer var. (line {n_line}) not" + " processed yet." + ) + else: + raise Exception(f"Unknown bound type {typ} (line {n_line}).") + self.seq_col.update({col_seq: attr}) # store the updated col-attributes + self.n_bounds += 1 + + def row_att(self, row_seq, row_name, row_type, sec_name, val=0.0): + """Process values defined in ROWS, RHS and RANGES sections and store/update + the corresponding row attributes. + + While processing the ROWS section the row attributes are initialized to the + default (for the corresponding row type) values. The attributes are updated for + optionally defined values in the (also optional) RHS and RANGES sections. The + interpretation of the MPS-format (in particular of values in the RANGES section) + follows the original MPS standard, see e.g., "Advanced Linear Programming," by + Bruce A. Murtagh. or the standard summary at + https://lpsolve.sourceforge.net/5.5/mps-format.htm . + + Attributes + ---------- + row_seq: int + position of row in dictionaries and the matrix df + row_name: str + row name (defined in the ROWS section) + row_type: str + row type (defined in the ROWS section) + sec_name: str + identifies the MPS section: either 'rows' (for initialization) or 'rhs' or + 'ranges' (for updates) + val: float + value of the row attribute defining either lo_bnd or up_bnd of the row + (the type checked while processing the MPS section) + """ + + type2bnd = { + "E": [0.0, 0.0], + "G": [0.0, self.infty], + "L": [self.infty, 0.0], + "N": [self.infty, self.infty], + } + assert row_seq == self.row_name.get( + row_name + ), f"{row_seq=} should be equal to: {self.row_name.get(row_name)}." + assert row_type in type2bnd, f"undefined row type {row_type=} for {row_name=}." + if sec_name == "rows": # initialize row attributes (used in ROW section) + low_upp = type2bnd.get(row_type) + self.seq_row.update({row_seq: [row_name, low_upp[0], low_upp[1], row_type]}) + # print( + # f"attributes of row {row_name} initialized in section {sec_name} to" + # f"{self.seq_row.get(row_seq)}." + # ) + elif sec_name in [ + "rhs", + "ranges", + ]: # update row attributes (used in RHS and ranges sections) + if row_type == "N": + print(f"{sec_name} value {val} ignored for neutral row {row_name}.") + return + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + if sec_name == "rhs": # process the RHS value + if row_type == "G": # update lo_bnd + attr[1] = val + elif row_type == "L": # update up_bnd + attr[2] = val + elif row_type == "E": # update both bounds + attr[1] = attr[2] = val + else: # process the ranges value + if row_type == "G": # update up_bnd + attr[2] = attr[1] + abs(val) + elif row_type == "L": # update lo_bnd + attr[1] = attr[2] - abs(val) + elif row_type == "E": # update both bounds + if val > 0: + attr[2] = attr[1] + val + else: + attr[1] = attr[2] - abs(val) + self.seq_row.update({row_seq: attr}) + # print( + # f"attributes of row {row_name} updated in section {sec_name} to" + # f" {attr}." + # ) + else: # update row attributes (used in RHS and ranges sections) + raise Exception(f"row_att() should not be called for {sec_name=}.") + + def stat(self, lo_tail=-7, up_tail=6): + """Basic statistics of the matrix coefficients. + + Focus on distributions of magnitudes of non-zero coeff. represented by values + of int(log10(abs(coeff))). + Additionally, tails (low and upp) of the distributions are reported. + + Attributes + ---------- + lo_tail: int + Magnitude order of the low-tail (-7 denotes values < 10^(-6)) + up_tail: int + Magnitude order of the upper-tail (6 denotes values >= 10^6) + """ + + # print(f'\nDistribution of non-zero values:\n{self.mat["val"].describe()}') + print( + f'\nDistribution of abs(non-zero) values:\n{self.mat["abs_val"].describe()}' + ) + print( + f'\nDistribution of int(log10(abs(values))):\n{self.mat["log"].describe()}' + ) + min_logv = self.mat["log"].min() + max_logv = self.mat["log"].max() + + # count numbers of coeffs for each order of magnitude of their value + magn_dist = Counter(self.mat["log"]) + magn_dist = dict( + sorted(magn_dist.items()) + ) # counter (sorted by occurances) --> dict sorted by magnitudes + print( + "\nDistribution of int(log10(abs(values))) sorted by magnitudes of values:" + ) + print( + f"range = [{min_logv}, {max_logv}] (magnitudes with zero-occurrences" + " skipped)." + ) + for magn in magn_dist: + print(f"{magn:3d}: {magn_dist[magn]:7d}") + + if lo_tail > up_tail: + print(f"Overlapping distribution tails ({lo_tail}, {up_tail}) reset to 0.") + lo_tail = up_tail = 0 + + # low-tail of the distribution + if lo_tail < min_logv: + print( + f"\nNo log10(values) in the requested low-tail (<= {lo_tail}) of the" + " distribution." + ) + else: + print( + "\nDistribution of log10(values) in the requested low-tail (<=" + f" {lo_tail}) of the distribution." + ) + print(f'{self.mat.loc[self.mat["log"] <= lo_tail].describe()}') + for val in [*range(min_logv, lo_tail + 1)]: + print( + f"Number of log10(values) == {val}:" + f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" + ) + # up-tail of the distribution + if max_logv < up_tail: + print( + f"\nNo log10(values) in the requested upper-tail (>= {up_tail}) of the" + " distribution." + ) + else: + print( + "\nDistribution of log10(values) in the requested upp-tail (>=" + f" {up_tail}) of the distribution." + ) + print(f'{self.mat.loc[self.mat["log"] >= up_tail].describe()}') + for val in [*range(up_tail, max_logv + 1)]: + print( + f"Number of log10(values) == {val}:" + f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" + ) + + def out_loc(self, small=True, thresh=-7, max_rec=500): + """Locations of outliers, i.e., elements having small/large coeff values. + + Locations of outliers (in the term of the matrix coefficient values). + The provided ranges of values in the corresponding row/col indicate potential + of the simple scaling. + + Attributes + ---------- + small: bool + True/False for threshold of either small or large coefficients + thresh: int + Magnitude of the threshold (in: int(log10(abs(coeff))), i.e. -7 denotes + values < 10^(-6)) + max_rec: int + Maximum number of processed coefficients + """ + print('[YOGA TEST 7] self.mat:\n', self.mat) + + if small: # sub-matrix composed of only small-value outliers + df = self.mat.loc[self.mat["log"] <= thresh] + print( + f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' + f" values of log10(values) <= {thresh})." + ) + else: # large-value outliers + df = self.mat.loc[self.mat["log"] >= thresh] + print( + f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' + f" values of log10(values) >= {thresh})." + ) + df1 = df.sort_values( + "row" + ) # sort the df with outliers ascending seq_id of rows + df1.reset_index() + print('[YOGA TEST 2] df:\n', df) + print('[YOGA TEST 3] df1:\n', df1) + print('[YOGA TEST 4] self.mat:\n', self.mat) + col_out = [] # col_seq of outliers' cols + for n_rows, (indx, row) in enumerate(df1.iterrows()): + assert ( + n_rows < max_rec + ), "To process all requested coeffs modify the safety limit assertion." + row_seq, row_name = self.ent_inf( + row, True + ) # row seq_id and name of the current coeff. + col_seq, col_name = self.ent_inf( + row, False + ) # col seq_id and name of the current coeff. + if col_seq not in col_out: + col_out.append(col_seq) + else: + print(f"{col_seq = } already in another outlier row.") + print( + f'Coeff. ({row_seq}, {col_seq}): val = {row["val"]:.4e}, log(val) =' + f' {row["log"]:n}' + ) + df_row_out = df1.loc[df1["row"] == row_seq] # df with only outlier elements + df_row_all = self.mat.loc[ + self.mat["row"] == row_seq + ] # df with all elements + # print(f'matrix elements in the same row:\n{df_row}') + print( + f"\tRow {row_name} {self.ent_range(row_seq, True)} has" + f" {df_row_out['log'].count()} outlier-coeff. of magnitudes in" + f" [{df_row_out['log'].min()}, {df_row_out['log'].max()}]" + ) + print( + f"\tRow {row_name} {self.ent_range(row_seq, True)} has" + f" {df_row_all['log'].count()} (all)-coeff. of magnitudes in" + f" [{df_row_all['log'].min()}, {df_row_all['log'].max()}]" + ) + # a column may include more than 1 outlier; + # therefore columns with outliers reported below: + # df with outliers in the same col: + # df_col = df1.loc[df1['col'] == col_seq] + # print( + # f"\tCol {col_name} {self.ent_range(col_seq, False)} has " + # f"{df_col["log"].count()} outlier coeff. of magnitudes in " + # f"[{df_col["log"].min()}, {df_col["log"].max()}]" + # ) + print( + "\nColumn-wise locations of outlier coefficients in" + f" {len(col_out)} columns:" + ) + col_out.sort() + print('[YOGA TEST 1]| col_out',col_out) + print('[YOGA TEST 1]| col_name',self.seq_col) + for col_seq in col_out: + col_name = self.seq_col.get(col_seq)[0] + df_col = self.mat.loc[ + self.mat["col"] == col_seq + ] # df with elements in the same col + print( + f"\tCol {col_name} {self.ent_range(col_seq, False)} has" + f" {df_col['log'].count()} coeff. of magnitudes in" + f" [{df_col['log'].min()}, {df_col['log'].max()}]" + ) + + def ent_inf(self, mat_row, by_row=True) -> typing.Tuple[int, str]: + """Return info on the entity (either row or col) defining the selected matrix + coefficient. + + Each row of the dataFrame contains the definition (composed of the row_seq, + col_seq, value, log(value)) of one matrix coefficient. + The function returns seq_id and name of either row or col of the currently + considered coeff. + + Attributes + ---------- + mat_row: dataFrame row + record of the df with the data of currently processed element + by_row: bool + True/False for returning the seq_id and name of the corresponding row/col + """ + + if by_row: + # if seq_row {} not stored, then: + # names = [k for k, idx in self.row_name.items() if idx == ent_seq] + ent_seq = int(mat_row["row"]) + name = self.seq_row.get(ent_seq)[0] + else: + ent_seq = int(mat_row["col"]) + name = self.seq_col.get(ent_seq)[0] + return ent_seq, name + + def ent_range(self, seq_id, by_row=True) -> str: + """Return formatted string representing ranges of feasible values of either a + row or a column. + + The returned values of ranges are either 'none' (for plus/minus infinity) or + int(log10(abs(val))) for other values. Small values, defined as + abs(value) < 1e-10, are represented by 0. + + Attributes + ---------- + seq_id: int + sequence number of either row or col. + by_row: bool + True/False for returning the seq_id and name of the corresponding row/col. + """ + + if by_row: + attr = self.seq_row.get(seq_id) # [row_name, lo_bnd, up_bnd, row_type] + pass + else: + attr = self.seq_col.get(seq_id) # [col_name, lo_bnd, up_bnd] + pass + s = [] # strings representing lo/up-bounds + for pos in [0, 1]: + val = attr[pos + 1] # 0-th element is the name + if val == self.infty: # used for both infinites (positive and negative) + s.append(self.infty) + else: + if type(val) is int: + val = float(val) + if abs(val) < 1e-10: + s.append("0") # same string for int and float zeros + else: + val = int(math.log10(abs(val))) + s.append(f"{val}") # small integer value, no formatting needed + ret = "[" + s[0] + ", " + s[1] + "]" + return ret # the range is formatted as: '[lo_bnd, up_bnd]' + + def plot_hist(self): + """Plot histograms.""" + # todo: might not be needed; therefore the implementation postponed diff --git a/message_ix/tools/lp_diag/lp_diag.py b/message_ix/tools/lp_diag/lp_diag.py new file mode 100644 index 000000000..7501880dd --- /dev/null +++ b/message_ix/tools/lp_diag/lp_diag.py @@ -0,0 +1,932 @@ +""" +Prototype of simple analysis of the MPS-format file +Written by Marek Makowski, ECE Program of IIASA, in March 2023 +""" + +import math + +# import os +# import sys # needed for sys.exit() +import typing +from collections import Counter + +import numpy as np +import pandas as pd + +# from datetime import datetime as dt +# from datetime import timedelta as td +# import matplotlib.pyplot as plt +# from matplotlib import cm +# from matplotlib import colors +# from matplotlib.ticker import LinearLocator # needed for ax.set_major_locator +# import seaborn as sns +# # sns.set() # settings for seaborn plotting style + + +class LPdiag: + """Process the MPS-format input file and provide its basic diagnotics. + + The diagnostics currently includes: + - handling formal errors of the MPS file + - basic statistics of the matrix coefficients. + + Attributes + ---------- + + """ + + def __init__(self): + self.fname = "undefined" # MPS file name, to be defined by rd_mps() call + self.pname = "undefined" # problem name + self.id_rhs = False # True, if rhs_id defined + self.id_range = False # True, if range_id defined + self.id_bnd = False # True, if bnd_id defined + self.rhs_id = "" # id of rhs elements + self.range_id = "" # id of ranges elements (might differ from rhs_id) + self.bnd_id = "" # id of bounds elements + self.infty = "none" # marker for infinity value + self.n_lines = 0 # number of processed lines of the MPS file + self.n_rhs = 0 # number of defined RHS + self.n_ranges = 0 # number of defined ranges + self.n_bounds = 0 # number of defined bounds + # if not os.path.exists(self.rep_dir): + # os.makedirs(self.rep_dir, mode=0o755) + + # dictionaries for searchable names and its indices + # (searching very-long lists is prohibitively slow) + self.row_name = {} # key: row-name, item: its seq_id + self.seq_row = {} # key: row sequence, item: [row-name, lo_bnd, up_bond, type] + self.col_name = {} # key: col-name, item: its seq_id + self.seq_col = {} # key: col-sequence, item: [col-name, lo_bnd, up_bond] + # tmp space for reading COLUMN section of the MPS + self.mat_row = [] # row seq_no of the matrix coef. + self.mat_col = [] # col seq_no the matrix coef. + self.mat_val = [] # matrix coeff. + self.col_curr = "" # current column (initialized to an illegal empty name) + self.gf_seq = ( + -1 + ) # sequence_no of the goal function (objective) row: equal = -1, if undefined + # representation of the LP matrix: + self.mat = pd.DataFrame(columns=["row", "col", "val"]) # LP matrix + # cols attributes: + # self.cols = pd.DataFrame(columns=['seq_id', 'name', 'lo_bnd', 'up_bnd']) + # rows attributes: + # self.rows = pd.DataFrame( + # columns=['seq_id', 'name', 'type', 'lo_bnd', 'up_bnd'] + # ) + + def rd_mps(self, fname): # process the MPS file + print(f"\nReading MPS-format file {fname}.") + self.fname = fname + sections = [ + "NAME", + "ROWS", + "COLUMNS", + "RHS", + "RANGES", + "BOUNDS", + "SOS", + "ENDATA", + ] + + # lists are OK only for small and medium problems + # row_names = [] # names of rows + # row_types = [] # types of rows + # col_names = [] # names of columns + + # wrk vars + n_section = 0 # seq_no of the currently processed MPS-file section + next_sect = 0 # seq_no of the next (to be processed) MPS-file section + # last_sect = -1 # last processed section + + # process the MPS file + with open(self.fname, "r") as reader: + for n_line, line in enumerate(reader): + line = line.rstrip("\n") + # print(f'line {line}') + if line[0] == "*" or len(line) == 0: # skip commented and empty lines + continue + words = line.split() + if line[0] == " ": # continue reading the current MPS section + # columns/matrix (first here because most frequently used) + if n_section == 2: + self.add_coeff(words, n_line) # add column and its coefficients + elif n_section == 1: # rows + self.add_row(words, n_line) # add row and its type + elif n_section == 3: # rhs + self.add_rhs(words, n_line) # process RHS + elif n_section == 4: # ranges + self.add_range(words, n_line) # process range + elif n_section == 5: # bounds + self.add_bnd(words, n_line) # process bound + elif n_section == 6: # SOS section + pass # SOS section not processed + # elif n_section == 7: # end data + # raise Exception( + # "Unexpected execution flow; needs to be explored." + # ) + else: + print(f"MPS record {n_line}, section id {n_section}.") + raise Exception( + f"MPS line '{line}' (line {n_line}) misplaced," + f" processing section {sections[n_section]}." + ) + else: # found a new section + if n_section == 0: # problem-name processed with the section header + pass + elif n_section <= 5: + # print(f'\tData of section {sections[n_section]} processed.') + pass + elif n_section == 6: # SOS + print(f"WARNING: Section {sections[n_section]} not processed.") + else: + raise Exception( + f"Should not come here, n_section = {n_section}." + ) + + # process the head of new section + print(f"Next section found: {line} (line {n_line}).") + self.n_lines = n_line + # last_sect = n_section + n_section = self.next_sec(next_sect, words, sections) + next_sect = n_section + 1 + # print(f'{n_section = }, {next_sect = }') + # end of MPS reading + + # check, if the last required section ('ENDATA') was defined + assert ( + n_section == 7 + ), f'The "ENDATA" section is not declared; last section_id = {n_section}.' + + self.mps_sum() # summarize the processed MPS content + + def next_sec(self, n_exp, words, sections): + # required/optional MPS sections + req_sect = [True, True, True, False, False, False, False, True] + n_line = self.n_lines + n_words = len(words) + if req_sect[n_exp]: # required section must be in the sequence + # assert ( + # words[0] == sections[next_sect] + # ), f"expect section {sections[next_sect]} found: {line}." + if words[0] == sections[n_exp]: # required section found + if n_exp == 0: # store the problem name + assert n_words > 1, ( + f"problem name undefined: line {n_line} has" + f" {n_words} words." + ) + # print(f"\tProblem name line {words[1:]}.") + if n_words == 2: + self.pname = words[1] # store the problem name + else: + self.pname = words[1:] # store the problem name + print(f"\tProblem name: {self.pname}.") + return n_exp # n_sections equals to the expected: n_exp + else: + print(f"section {words} found.") + raise Exception( + f"Required MPS section {sections[n_exp]} undefined" " or misplaced." + ) + else: # the found section does not follow the last processed section + try: + n_section = sections.index(words[0]) + except ValueError: + raise Exception(f"Unknown section: {words} (line {n_line}).") + if n_section < n_exp: + raise Exception( + f"Section {words[0]} (line {n_line}) is misplaced or duplicated." + ) + return n_section + + def mps_sum(self): + # check, if there was at least one N row + # (the first N row assumed to be the objective): + assert self.gf_seq != -1, "objective (goal function) row is undefined." + + # create a df with the matrix coefficients + self.mat = pd.DataFrame( + {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} + ) + self.mat["abs_val"] = abs( + self.mat["val"] + ) # add column with absolute values of coeff. + self.mat["log"] = np.log10(self.mat["abs_val"]).astype( + int + ) # add col with int(log10(coeffs)) + # print(f'matrix after initialization:\n {self.mat}') + + # recreate all matrix dataframe for rescaler + row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() + col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() + matrix = self.mat.copy() + matrix = (matrix.set_index(['row','col'],drop=True)[['val']] + .rename(index=row_name,level='row') + .rename(index=col_name,level='col')) + + matrix.to_csv('matrix.csv',index=True) + + # Finish the MPS processing with the summary of its attributes + dens = f"{float(len(self.mat)) / (len(self.row_name) * len(self.col_name)):.2e}" + print( + f"\nFinished processing {self.n_lines} lines of the MPS file: {self.fname}." + ) + print( + f"LP has: {len(self.row_name)} rows, {len(self.col_name)} cols," + f" {len(self.mat)} non-zeros, matrix density = {dens}." + ) + print( + f"Numbers of redefined: RHS = {self.n_rhs}, ranges = {self.n_ranges}," + f" bounds = {self.n_bounds}." + ) + + # todo: add info on dense rows and cols + + # info on the GF row, RHS, ranges, bounds + df = self.mat.loc[self.mat["row"] == self.gf_seq][ + "val" + ] # df with values of the GF coefficients. + print( + f'\nThe GF (objective) row named "{self.seq_row.get(self.gf_seq)[0]}" has' + f" {len(df)} elements." + ) + print(f"Distribution of the GF (objective) values:\n{df.describe()}") + + def add_row(self, words, n_line): + """Process current line of the ROWS section. + + While processing the ROWS section the row attributes are initialized to the + default (for the corresponding row type) values. The attributes are updated for + optionally defined values in the (also optional) RHS and RANGES sections. The + interpretation of the MPS-format (in particular of values in the RANGES section) + follows the original MPS standard, see e.g., "Advanced Linear Programming," by + Bruce A. Murtagh. or the standard summary at + https://lpsolve.sourceforge.net/5.5/mps-format.htm . + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + row_types = ["N", "E", "G", "L"] # types of rows + n_words = len(words) + assert ( + n_words == 2 + ), f"row declaration (line {n_line}) has {n_words} words instead of 2." + row_type = words[0] + row_name = words[1] + row_seq = len(self.row_name) + assert row_type in row_types, f"unknown row type {row_type} (line {n_line})." + assert ( + row_name not in self.row_name + ), f"duplicated row name: {row_name} (line {n_line})." + if row_type == "N" and self.gf_seq == -1: + self.gf_seq = row_seq + print( + f"\tRow {row_name} (row_seq = {row_seq}) is the objective" + " (goal function) row." + ) + self.row_name.update({row_name: row_seq}) # add to dict of row_names + # store row_{seq, name, type} and the default + # (to be changed in rhs/ranges) [lo_bnd, upp_bnd] + self.row_att(row_seq, row_name, row_type, "rows") + + def add_coeff(self, words, n_line): + """Process current line of the COLUMNS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + # print( + # f"processing line no {n_line}, n_words {n_words}:" + # f" {line}" + # ) + assert n_words in [ + 3, + 5, + ], f"matrix element (line {n_line}) has {n_words} words." + col_name = words[0] + if col_name != self.col_curr: # new column + assert ( + col_name not in self.col_name + ), f"duplicated column name: {col_name} (line {n_line})" + col_seq = len(self.col_name) + self.col_name.update({col_name: col_seq}) + self.seq_col.update({col_seq: [col_name, 0.0, self.infty]}) + self.col_curr = col_name + else: + col_seq = self.col_name.get(col_name) + row_name = words[1] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." + val = float(words[2]) + assert ( + type(val) is float + ), f"string {words[2]} (line {n_line}) is not a number." + # add the matrix element to the lists of: seq_row, seq_col, val + # the lists will be converted to self.mat df after all elements + # will be read + self.mat_row.append(row_seq) + self.mat_col.append(col_seq) + self.mat_val.append(val) + # print(f' matrix element ({row_seq}, {col_seq}) = {val}') + # the next two commands take far too long for large matrices; + # thus tmp-store in three lists + # df2 = pd.DataFrame( + # {"row": row_seq, "col": col_seq, "val": val}, + # index=list(range(1)), + # ) + # self.mat = pd.concat( + # [self.mat, df2], + # axis=0, + # ignore_index=True + # ) + + # proccess the second matrix element in the same MPS row, if defined + if n_words > 3: + assert n_words == 5, ( + f"line {n_line}) has {n_words} words, five words needed" + " fordefining second element in the same MPS line." + ) + row_name = words[3] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." + val = float(words[4]) + assert ( + type(val) is float + ), f"string {words[4]} (line {n_line}) is not a number." + self.mat_row.append(row_seq) + self.mat_col.append(col_seq) + self.mat_val.append(val) + + def add_rhs(self, words, n_line): + """Process current line of the RHS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + + # first RHS record implies RHS/ranges id (might be empty) + if self.n_rhs == 0: + # print(f"first rhs line: {n_line}: '{words}'") + if n_words in [3, 5]: # RHS name/id defined + self.id_rhs = True + self.rhs_id = words[0] + print(f"\tId of RHS: {self.rhs_id}") + else: + self.id_rhs = False + self.rhs_id = "" + print("\tId of RHS: (empty)") + + if self.id_rhs: + n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) + pos_name = 1 # first row-name in words[pos_name] + else: + n_req_wrd = [2, 4] + pos_name = 0 # first row-name in words[pos_name] + + assert n_words in n_req_wrd, ( + f"rhs line {n_line} has {n_words} words, expected" f" {n_req_wrd}." + ) + if self.id_rhs: # check id of the RHS entry, if it was defined + assert words[0] == self.rhs_id, ( + f"RHS id {words[0]}, line {n_line} differ from" + f"expected: {self.rhs_id}." + ) + row_name = words[pos_name] + row_seq = self.row_name.get(row_name) + assert row_seq is not None, f"unknown RHS row-name {row_name} (line {n_line})." + val = float(words[pos_name + 1]) + assert type(val) is float, ( + f"RHS value {words[pos_name + 1]} (line {n_line}) is not a" " number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "rhs", val) + self.n_rhs += 1 + if n_words == n_req_wrd[1]: # second pair of rhs defined + row_name = words[pos_name + 2] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown RHS row-name {row_name} (line {n_line})." + val = float(words[pos_name + 3]) + assert type(val) is float, ( + f"RHS value {words[pos_name + 1]} (line {n_line}) is" " not a number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "rhs", val) + self.n_rhs += 1 + + def add_range(self, words, n_line): + """Process current line of the RANGES section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + n_words = len(words) + + # first ranges record implies ranges id (might be empty) + if self.n_ranges == 0: + if n_words in [3, 5]: + self.id_range = True + self.range_id = words[0] + print(f"\tId of ranges: {self.range_id}") + else: + self.id_range = False + self.range_id = "" + print("\tId of ranges: (empty)") + + if self.id_range: + n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) + pos_name = 1 # first row-name in words[pos_name] + else: + n_req_wrd = [2, 4] + pos_name = 0 # first row-name in words[pos_name] + + assert ( + n_words in n_req_wrd + ), f"ranges line {n_line} has {n_words} words, expected {n_req_wrd}." + if self.id_range: # check id of the ranges' entry, if it was defined + assert words[0] == self.range_id, ( + f"Ranges id {words[0]}, line {n_line} differ from" + f" expected: {self.range_id}." + ) + row_name = words[pos_name] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown range row-name {row_name} (line {n_line})." + val = float(words[pos_name + 1]) + assert ( + type(val) is float + ), f"Range value {words[pos_name + 1]} (line {n_line}) is not a number." + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "ranges", val) + self.n_ranges += 1 + if n_words == n_req_wrd[1]: # second pair of ranges defined + row_name = words[pos_name + 2] + row_seq = self.row_name.get(row_name) + assert ( + row_seq is not None + ), f"unknown ranges row-name {row_name} (line {n_line})." + val = float(words[pos_name + 3]) + assert type(val) is float, ( + f"Ranges value {words[pos_name + 1]} (line {n_line}) is" + " not a number." + ) + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + row_type = attr[3] + self.row_att(row_seq, row_name, row_type, "ranges", val) + self.n_ranges += 1 + + def add_bnd(self, words, n_line): + """Process current line of the BOUNDS section. + + The section defines both column names and values of the matrix coefficients. + One line can have either one or two matrix elements. + + Attributes + ---------- + words: str[] + words of the current line + n_line: int + sequence number of the current MPS line + """ + + # items of the below dictionaries indicate bounds to be modified: + # 1 - low, 2 - upper, 3 - both + bnd_type1 = {"LO": 1, "UP": 2, "FX": 3} # types of bounds requiring value + bnd_type2 = {"MI": 1, "PL": 2, "FR": 3} # types of bounds not requiring value + bnd_type3 = { + "BV": 0, + "LI": 0, + "UI": 0, + "SC": 0, + } # types of bounds legal for int-type vars, not processed yet + + n_words = len(words) + + # first Bounds record implies bounds id (might be empty) + if self.n_bounds == 0: + # print(f"first BOUNDS line: {n_line}: '{words}'") + if n_words == 4 or (n_words == 3 and words[0] in ["FR", "MI", "PL"]): + self.id_bnd = True + self.bnd_id = words[1] + print(f"\tId of BOUNDS: {self.bnd_id}") + else: + self.id_bnd = False + self.bnd_id = "" + print("\tId of BOUNDS: (empty)") + + # number of required words in a line (with/without) required value: + if self.id_bnd: + n_req_wrd = [4, 3] + pos_name = 2 # col-name in words[pos_name] + else: + n_req_wrd = [3, 2] + pos_name = 1 # col-name in words[pos_name] + + assert ( + n_words in n_req_wrd + ), f"bounds line {n_line} has {n_words} words, expected: {n_req_wrd}." + if self.id_bnd: # check id of the BOUNDS line, if it was defined + assert words[1] == self.bnd_id, ( + f"BOUNDS id {words[1]}, line {n_line} differ from " + f"expected id: {self.bnd_id}." + ) + col_name = words[pos_name] + col_seq = self.col_name.get(col_name) + assert ( + col_seq is not None + ), f"unknown BOUNDS col-name {col_name} (line {n_line})." + attr = self.seq_col.get(col_seq) # [col_name, lo_bnd, up_bnd] + + typ = words[0] + if typ in bnd_type1: # bound-types that require a value + val = float(words[pos_name + 1]) + assert ( + type(val) is float + ), f"BOUND value {words[pos_name + 1]} (line {n_line}) is not a number." + at_pos = bnd_type1.get(typ) + if at_pos == 3: # set both bounds + attr[1] = attr[2] = val + else: + attr[at_pos] = val + elif typ in bnd_type2: # value not needed; + # therefore it is neither checked nor processed + at_pos = bnd_type2.get(typ) + if at_pos == 3: # set both bounds + attr[1] = attr[2] = self.infty + else: + attr[at_pos] = self.infty + elif typ in bnd_type3: + raise Exception( + f"Bound type {typ} of integer var. (line {n_line}) not" + " processed yet." + ) + else: + raise Exception(f"Unknown bound type {typ} (line {n_line}).") + self.seq_col.update({col_seq: attr}) # store the updated col-attributes + self.n_bounds += 1 + + def row_att(self, row_seq, row_name, row_type, sec_name, val=0.0): + """Process values defined in ROWS, RHS and RANGES sections and store/update + the corresponding row attributes. + + While processing the ROWS section the row attributes are initialized to the + default (for the corresponding row type) values. The attributes are updated for + optionally defined values in the (also optional) RHS and RANGES sections. The + interpretation of the MPS-format (in particular of values in the RANGES section) + follows the original MPS standard, see e.g., "Advanced Linear Programming," by + Bruce A. Murtagh. or the standard summary at + https://lpsolve.sourceforge.net/5.5/mps-format.htm . + + Attributes + ---------- + row_seq: int + position of row in dictionaries and the matrix df + row_name: str + row name (defined in the ROWS section) + row_type: str + row type (defined in the ROWS section) + sec_name: str + identifies the MPS section: either 'rows' (for initialization) or 'rhs' or + 'ranges' (for updates) + val: float + value of the row attribute defining either lo_bnd or up_bnd of the row + (the type checked while processing the MPS section) + """ + + type2bnd = { + "E": [0.0, 0.0], + "G": [0.0, self.infty], + "L": [self.infty, 0.0], + "N": [self.infty, self.infty], + } + assert row_seq == self.row_name.get( + row_name + ), f"{row_seq=} should be equal to: {self.row_name.get(row_name)}." + assert row_type in type2bnd, f"undefined row type {row_type=} for {row_name=}." + if sec_name == "rows": # initialize row attributes (used in ROW section) + low_upp = type2bnd.get(row_type) + self.seq_row.update({row_seq: [row_name, low_upp[0], low_upp[1], row_type]}) + # print( + # f"attributes of row {row_name} initialized in section {sec_name} to" + # f"{self.seq_row.get(row_seq)}." + # ) + elif sec_name in [ + "rhs", + "ranges", + ]: # update row attributes (used in RHS and ranges sections) + if row_type == "N": + print(f"{sec_name} value {val} ignored for neutral row {row_name}.") + return + attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] + if sec_name == "rhs": # process the RHS value + if row_type == "G": # update lo_bnd + attr[1] = val + elif row_type == "L": # update up_bnd + attr[2] = val + elif row_type == "E": # update both bounds + attr[1] = attr[2] = val + else: # process the ranges value + if row_type == "G": # update up_bnd + attr[2] = attr[1] + abs(val) + elif row_type == "L": # update lo_bnd + attr[1] = attr[2] - abs(val) + elif row_type == "E": # update both bounds + if val > 0: + attr[2] = attr[1] + val + else: + attr[1] = attr[2] - abs(val) + self.seq_row.update({row_seq: attr}) + # print( + # f"attributes of row {row_name} updated in section {sec_name} to" + # f" {attr}." + # ) + else: # update row attributes (used in RHS and ranges sections) + raise Exception(f"row_att() should not be called for {sec_name=}.") + + def stat(self, lo_tail=-7, up_tail=6): + """Basic statistics of the matrix coefficients. + + Focus on distributions of magnitudes of non-zero coeff. represented by values + of int(log10(abs(coeff))). + Additionally, tails (low and upp) of the distributions are reported. + + Attributes + ---------- + lo_tail: int + Magnitude order of the low-tail (-7 denotes values < 10^(-6)) + up_tail: int + Magnitude order of the upper-tail (6 denotes values >= 10^6) + """ + + # print(f'\nDistribution of non-zero values:\n{self.mat["val"].describe()}') + print( + f'\nDistribution of abs(non-zero) values:\n{self.mat["abs_val"].describe()}' + ) + print( + f'\nDistribution of int(log10(abs(values))):\n{self.mat["log"].describe()}' + ) + min_logv = self.mat["log"].min() + max_logv = self.mat["log"].max() + + # count numbers of coeffs for each order of magnitude of their value + magn_dist = Counter(self.mat["log"]) + magn_dist = dict( + sorted(magn_dist.items()) + ) # counter (sorted by occurances) --> dict sorted by magnitudes + print( + "\nDistribution of int(log10(abs(values))) sorted by magnitudes of values:" + ) + print( + f"range = [{min_logv}, {max_logv}] (magnitudes with zero-occurrences" + " skipped)." + ) + for magn in magn_dist: + print(f"{magn:3d}: {magn_dist[magn]:7d}") + + if lo_tail > up_tail: + print(f"Overlapping distribution tails ({lo_tail}, {up_tail}) reset to 0.") + lo_tail = up_tail = 0 + + # low-tail of the distribution + if lo_tail < min_logv: + print( + f"\nNo log10(values) in the requested low-tail (<= {lo_tail}) of the" + " distribution." + ) + else: + print( + "\nDistribution of log10(values) in the requested low-tail (<=" + f" {lo_tail}) of the distribution." + ) + print(f'{self.mat.loc[self.mat["log"] <= lo_tail].describe()}') + for val in [*range(min_logv, lo_tail + 1)]: + print( + f"Number of log10(values) == {val}:" + f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" + ) + # up-tail of the distribution + + if max_logv < up_tail: + print( + f"\nNo log10(values) in the requested upper-tail (>= {up_tail}) of the" + " distribution." + ) + else: + print( + "\nDistribution of log10(values) in the requested upp-tail (>=" + f" {up_tail}) of the distribution." + ) + print(f'{self.mat.loc[self.mat["log"] >= up_tail].describe()}') + for val in [*range(up_tail, max_logv + 1)]: + print( + f"Number of log10(values) == {val}:" + f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" + ) + + def out_loc(self, small=True, thresh=-7, max_rec=500): + """Locations of outliers, i.e., elements having small/large coeff values. + + Locations of outliers (in the term of the matrix coefficient values). + The provided ranges of values in the corresponding row/col indicate potential + of the simple scaling. + + Attributes + ---------- + small: bool + True/False for threshold of either small or large coefficients + thresh: int + Magnitude of the threshold (in: int(log10(abs(coeff))), i.e. -7 denotes + values < 10^(-6)) + max_rec: int + Maximum number of processed coefficients + """ + + if small: # sub-matrix composed of only small-value outliers + df = self.mat.loc[self.mat["log"] <= thresh] + print( + f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' + f" values of log10(values) <= {thresh})." + ) + else: # large-value outliers + df = self.mat.loc[self.mat["log"] >= thresh] + print( + f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' + f" values of log10(values) >= {thresh})." + ) + df1 = df.sort_values( + "row" + ) # sort the df with outliers ascending seq_id of rows + df1.reset_index() + + col_out = [] # col_seq of outliers' cols + for n_rows, (indx, row) in enumerate(df1.iterrows()): + assert ( + n_rows < max_rec + ), "To process all requested coeffs modify the safety limit assertion." + row_seq, row_name = self.ent_inf( + row, True + ) # row seq_id and name of the current coeff. + col_seq, col_name = self.ent_inf( + row, False + ) # col seq_id and name of the current coeff. + if col_seq not in col_out: + col_out.append(col_seq) + else: + print(f"{col_seq = } already in another outlier row.") + print( + f'Coeff. ({row_seq}, {col_seq}): val = {row["val"]:.4e}, log(val) =' + f' {row["log"]:n}' + ) + df_row_out = df1.loc[df1["row"] == row_seq] # df with only outlier elements + df_row_all = self.mat.loc[ + self.mat["row"] == row_seq + ] # df with all elements + # print(f'matrix elements in the same row:\n{df_row}') + print( + f"\tRow {row_name} {self.ent_range(row_seq, True)} has" + f" {df_row_out['log'].count()} outlier-coeff. of magnitudes in" + f" [{df_row_out['log'].min()}, {df_row_out['log'].max()}]" + ) + print( + f"\tRow {row_name} {self.ent_range(row_seq, True)} has" + f" {df_row_all['log'].count()} (all)-coeff. of magnitudes in" + f" [{df_row_all['log'].min()}, {df_row_all['log'].max()}]" + ) + # a column may include more than 1 outlier; + # therefore columns with outliers reported below: + # df with outliers in the same col: + # df_col = df1.loc[df1['col'] == col_seq] + # print( + # f"\tCol {col_name} {self.ent_range(col_seq, False)} has " + # f"{df_col["log"].count()} outlier coeff. of magnitudes in " + # f"[{df_col["log"].min()}, {df_col["log"].max()}]" + # ) + print( + "\nColumn-wise locations of outlier coefficients in" + f" {len(col_out)} columns:" + ) + col_out.sort() + for col_seq in col_out: + col_name = self.seq_col.get(col_seq)[0] + df_col = self.mat.loc[ + self.mat["col"] == col_seq + ] # df with elements in the same col + print( + f"\tCol {col_name} {self.ent_range(col_seq, False)} has" + f" {df_col['log'].count()} coeff. of magnitudes in" + f" [{df_col['log'].min()}, {df_col['log'].max()}]" + ) + # recreate bad coefficient dataframe for rescaler + row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() + col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() + matrix_prob = df1.copy() + + matrix_prob = (matrix_prob.set_index(['row','col'],drop=True)[['val']] + .rename(index=row_name,level='row') + .rename(index=col_name,level='col')) + + matrix_prob_name = 'matrix_prob_lower.csv' if small else 'matrix_prob_upper.csv' + matrix_prob.to_csv(matrix_prob_name,index=True) + def ent_inf(self, mat_row, by_row=True) -> typing.Tuple[int, str]: + """Return info on the entity (either row or col) defining the selected matrix + coefficient. + + Each row of the dataFrame contains the definition (composed of the row_seq, + col_seq, value, log(value)) of one matrix coefficient. + The function returns seq_id and name of either row or col of the currently + considered coeff. + + Attributes + ---------- + mat_row: dataFrame row + record of the df with the data of currently processed element + by_row: bool + True/False for returning the seq_id and name of the corresponding row/col + """ + + if by_row: + # if seq_row {} not stored, then: + # names = [k for k, idx in self.row_name.items() if idx == ent_seq] + ent_seq = int(mat_row["row"]) + name = self.seq_row.get(ent_seq)[0] + else: + ent_seq = int(mat_row["col"]) + name = self.seq_col.get(ent_seq)[0] + return ent_seq, name + + def ent_range(self, seq_id, by_row=True) -> str: + """Return formatted string representing ranges of feasible values of either a + row or a column. + + The returned values of ranges are either 'none' (for plus/minus infinity) or + int(log10(abs(val))) for other values. Small values, defined as + abs(value) < 1e-10, are represented by 0. + + Attributes + ---------- + seq_id: int + sequence number of either row or col. + by_row: bool + True/False for returning the seq_id and name of the corresponding row/col. + """ + + if by_row: + attr = self.seq_row.get(seq_id) # [row_name, lo_bnd, up_bnd, row_type] + pass + else: + attr = self.seq_col.get(seq_id) # [col_name, lo_bnd, up_bnd] + pass + s = [] # strings representing lo/up-bounds + for pos in [0, 1]: + val = attr[pos + 1] # 0-th element is the name + if val == self.infty: # used for both infinites (positive and negative) + s.append(self.infty) + else: + if type(val) is int: + val = float(val) + if abs(val) < 1e-10: + s.append("0") # same string for int and float zeros + else: + val = int(math.log10(abs(val))) + s.append(f"{val}") # small integer value, no formatting needed + ret = "[" + s[0] + ", " + s[1] + "]" + return ret # the range is formatted as: '[lo_bnd, up_bnd]' + + def plot_hist(self): + """Plot histograms.""" + # todo: might not be needed; therefore the implementation postponed diff --git a/message_ix/tools/lp_diag/lpdiag - Original.py b/message_ix/tools/lp_diag/lpdiag - Original.py new file mode 100644 index 000000000..4d5cde671 --- /dev/null +++ b/message_ix/tools/lp_diag/lpdiag - Original.py @@ -0,0 +1,149 @@ +""" +Prototype of simple analysis of the MPS-format file +Written by Marek Makowski, ECE Program of IIASA, in March 2023 +Developed in PyCharm, with Python 3.10.4 +""" + +import argparse +import os +import sys # needed for sys.exit() and redirecting stdout +from datetime import datetime as dt +from os import R_OK, access +from os.path import isfile + +# from datetime import timedelta as td +# noinspection PyUnresolvedReferences +from message_ix.tools.lp_diag.lp_diag import ( + LPdiag, # LPdiag class for processing and analysis of LP matrices +) + +""" +The above import stmt works only in the message-ix editable environment; it is treated +as error by PyCharm (but it works); therefore, the noinspection option is applied for +this statement. +In other environments the import from message_ix... does not work; therefore, it has +to be replaced by the below (now commented-out) import statement. The latter, however, +mypy flags as error. +""" +# from lp_diag import LPdiag + + +def read_args(): + descr = """ + Diagnostics of basic properties of LP Problems represented by the MPS-format. + + Examples of usage: + python lpdiag.py + python lpdiag.py -h + python lpdiag.py --mps test_mps/aez --outp foo.txt + + """ + # python lpdiag.py --path "message_ix/tools/lp_diag" --mps "test.mps" -s + + parser = argparse.ArgumentParser( + description=descr, formatter_class=argparse.RawDescriptionHelpFormatter + ) + wdir = "--wdir : string\n Working directory." + parser.add_argument("--wdir", help=wdir) + mps = "--mps : string\n Name of the MPS file (optionally with path)." + parser.add_argument("--mps", help=mps) + outp = "--outp : string\n Redirect output to the named file." + parser.add_argument("--outp", help=outp) + # parser.add_argument("-s", "--save", action="store_true") # on/off flag + + # parse cli + cl_args = parser.parse_args() + return cl_args + + +if __name__ == "__main__": + """Driver of the LP diagnostics provided by LPdiag class. + + Defines the working space, then controls the flow by executing the desired + functions of LPdiag class. + """ + + work_dir = os.getcwd() + print(f"work_dir: '{work_dir}'.") + tstart = dt.now() + # print('Started at:', str(tstart)) + + # Retrieve and assign arguments + args = read_args() + # dir2 = os.getcwd() + # print(f"{dir2 =}") + w_dir = args.wdir or "." + prob_id = args.mps or "test_mps/aez" # default MPS for testing + # alternative specs of test-MPS commented below + # prob_id = args.mps or "test_mps/diet" # default MPS for testing + # prob_id = args.mps or "test_mps/err_tst" # default MPS for testing + # prob_id = args.mps or "test_mps/jg_korh" # default MPS for testing + # prob_id = args.mps or "test_mps/lotfi" # default MPS for testing + if len(w_dir) > 1: + work_dir = w_dir + print(f"Changing work-directory to: {w_dir}.") + try: + os.chdir(w_dir) + except OSError: + print(f"Cannot change work-directory to: {w_dir}.") + # dir3 = os.getcwd() + # print(f"{dir3 =}") + assert isfile(prob_id), ( + f"MPS file {prob_id} not accessible from the work-directory:\n'{work_dir}'." + "\nTry to use the --wdir command option to set the work-directory." + ) + assert access(prob_id, R_OK), f"MPS file {prob_id} is not readable." + + # large (1+ GB) MPSs files, shall not be posted to gitHub. + # app was tested on two (1+ GB) MPSs posted by Oliver in /t/fricko on Feb 16, 2023: + # OFR_test_led_barrier.mps + # baseline_barrier.mps + + # small MPSs, for testing the code, posted to 'test_mps' subdirectory: + # err_tst - small MPS with various errors for testing the diagnostics + # aez - agro-ecological zones, medium size; two matrix elems in a row + # diet - classical small LP + # jg_korh - tiny testing problem + # lotfi - classical medium size; two matrix elems in a row + + fn_outp = args.outp or None # optional redirection of stdout + + default_stdout = sys.stdout + if fn_outp: + # fn_out = "./" + repdir + prob_id + ".txt" # file for redirected stdout + print(f"Stdout redirected to: {fn_outp}") + f_out = open(fn_outp, "w") + sys.stdout = f_out + # else: # defined to avoid warnings (only used when redir_stdo == True) + # fn_out = "foo" + # f_out = open(fn_out, "w") + + lp = LPdiag() # LPdiag ctor + lp.rd_mps(prob_id) # read MPS, store the matrix in dataFrame + lp.stat(lo_tail=-7, up_tail=5) # stats of matrix coeffs, incl. distrib. tails + # to get numbers of coeffs for each magnitute specify equal/overlapping tails: + # lp.stat(lo_tail=0, up_tail=0) + lp.out_loc(small=True, thresh=-7, max_rec=100) # locations of small-value outliers + lp.out_loc(small=False, thresh=6, max_rec=500) # locations of large-value outliers + # lp.out_loc(small=True, thresh=-1, max_rec=100) # test (lotfi) small-value outliers + # lp.out_loc(small=False, thresh=2, max_rec=500) # test (lotfi) large-value outliers + + tend = dt.now() + time_diff = tend - tstart + print("\nStarted at: ", str(tstart)) + print("Finished at:", str(tend)) + print(f"Wall-clock execution time: {time_diff.seconds} sec.") + + if fn_outp: # close the redirected output + # noinspection PyUnboundLocalVariable + f_out.close() + sys.stdout = default_stdout + print(f"\nRedirected stdout stored in {fn_outp}. Now writing to the console.") + print("\nStarted at: ", str(tstart)) + print("Finished at:", str(tend)) + print(f"Wall-clock execution time: {time_diff.seconds} sec.") + + # todo: TBD, if the MPS-standard should be observed; should it cause error or info + # in particular, range of values: 10^{-10} < abs(val) < 10^{10} + # todo: naive scaling? might not be informative due to the later preprocessing + # todo: plots of distributions of coeffs, if indeed usefull diff --git a/message_ix/tools/lp_diag/lpdiag.py b/message_ix/tools/lp_diag/lpdiag.py new file mode 100644 index 000000000..20af1cbe7 --- /dev/null +++ b/message_ix/tools/lp_diag/lpdiag.py @@ -0,0 +1,149 @@ +""" +Prototype of simple analysis of the MPS-format file +Written by Marek Makowski, ECE Program of IIASA, in March 2023 +Developed in PyCharm, with Python 3.10.4 +""" + +import argparse +import os +import sys # needed for sys.exit() and redirecting stdout +from datetime import datetime as dt +from os import R_OK, access +from os.path import isfile + +# from datetime import timedelta as td +# noinspection PyUnresolvedReferences +from message_ix.tools.lp_diag.lp_diag import ( + LPdiag, # LPdiag class for processing and analysis of LP matrices +) + +""" +The above import stmt works only in the message-ix editable environment; it is treated +as error by PyCharm (but it works); therefore, the noinspection option is applied for +this statement. +In other environments the import from message_ix... does not work; therefore, it has +to be replaced by the below (now commented-out) import statement. The latter, however, +mypy flags as error. +""" +# from lp_diag import LPdiag + + +def read_args(): + descr = """ + Diagnostics of basic properties of LP Problems represented by the MPS-format. + + Examples of usage: + python lpdiag.py + python lpdiag.py -h + python lpdiag.py --mps test_mps/aez --outp foo.txt + + """ + # python lpdiag.py --path "message_ix/tools/lp_diag" --mps "test.mps" -s + + parser = argparse.ArgumentParser( + description=descr, formatter_class=argparse.RawDescriptionHelpFormatter + ) + wdir = "--wdir : string\n Working directory." + parser.add_argument("--wdir", help=wdir) + mps = "--mps : string\n Name of the MPS file (optionally with path)." + parser.add_argument("--mps", help=mps) + outp = "--outp : string\n Redirect output to the named file." + parser.add_argument("--outp", help=outp) + # parser.add_argument("-s", "--save", action="store_true") # on/off flag + + # parse cli + cl_args = parser.parse_args() + return cl_args + + +if __name__ == "__main__": + """Driver of the LP diagnostics provided by LPdiag class. + + Defines the working space, then controls the flow by executing the desired + functions of LPdiag class. + """ + + work_dir = os.getcwd() + print(f"work_dir: '{work_dir}'.") + tstart = dt.now() + # print('Started at:', str(tstart)) + + # Retrieve and assign arguments + args = read_args() + # dir2 = os.getcwd() + # print(f"{dir2 =}") + w_dir = args.wdir or "." + prob_id = args.mps or "test_mps/aez" # default MPS for testing + # alternative specs of test-MPS commented below + # prob_id = args.mps or "test_mps/diet" # default MPS for testing + # prob_id = args.mps or "test_mps/err_tst" # default MPS for testing + # prob_id = args.mps or "test_mps/jg_korh" # default MPS for testing + # prob_id = args.mps or "test_mps/lotfi" # default MPS for testing + if len(w_dir) > 1: + work_dir = w_dir + print(f"Changing work-directory to: {w_dir}.") + try: + os.chdir(w_dir) + except OSError: + print(f"Cannot change work-directory to: {w_dir}.") + # dir3 = os.getcwd() + # print(f"{dir3 =}") + assert isfile(prob_id), ( + f"MPS file {prob_id} not accessible from the work-directory:\n'{work_dir}'." + "\nTry to use the --wdir command option to set the work-directory." + ) + assert access(prob_id, R_OK), f"MPS file {prob_id} is not readable." + + # large (1+ GB) MPSs files, shall not be posted to gitHub. + # app was tested on two (1+ GB) MPSs posted by Oliver in /t/fricko on Feb 16, 2023: + # OFR_test_led_barrier.mps + # baseline_barrier.mps + + # small MPSs, for testing the code, posted to 'test_mps' subdirectory: + # err_tst - small MPS with various errors for testing the diagnostics + # aez - agro-ecological zones, medium size; two matrix elems in a row + # diet - classical small LP + # jg_korh - tiny testing problem + # lotfi - classical medium size; two matrix elems in a row + + fn_outp = args.outp or None # optional redirection of stdout + + default_stdout = sys.stdout + if fn_outp: + # fn_out = "./" + repdir + prob_id + ".txt" # file for redirected stdout + print(f"Stdout redirected to: {fn_outp}") + f_out = open(fn_outp, "w") + sys.stdout = f_out + # else: # defined to avoid warnings (only used when redir_stdo == True) + # fn_out = "foo" + # f_out = open(fn_out, "w") + + lp = LPdiag() # LPdiag ctor + lp.rd_mps(prob_id) # read MPS, store the matrix in dataFrame + lp.stat(lo_tail=-6, up_tail=6) # stats of matrix coeffs, incl. distrib. tails + # to get numbers of coeffs for each magnitute specify equal/overlapping tails: + # lp.stat(lo_tail=0, up_tail=0) + lp.out_loc(small=True, thresh=-6, max_rec=100) # locations of small-value outliers + lp.out_loc(small=False, thresh=6, max_rec=500) # locations of large-value outliers + # lp.out_loc(small=True, thresh=-1, max_rec=100) # test (lotfi) small-value outliers + # lp.out_loc(small=False, thresh=2, max_rec=500) # test (lotfi) large-value outliers + + tend = dt.now() + time_diff = tend - tstart + print("\nStarted at: ", str(tstart)) + print("Finished at:", str(tend)) + print(f"Wall-clock execution time: {time_diff.seconds} sec.") + + if fn_outp: # close the redirected output + # noinspection PyUnboundLocalVariable + f_out.close() + sys.stdout = default_stdout + print(f"\nRedirected stdout stored in {fn_outp}. Now writing to the console.") + print("\nStarted at: ", str(tstart)) + print("Finished at:", str(tend)) + print(f"Wall-clock execution time: {time_diff.seconds} sec.") + + # todo: TBD, if the MPS-standard should be observed; should it cause error or info + # in particular, range of values: 10^{-10} < abs(val) < 10^{10} + # todo: naive scaling? might not be informative due to the later preprocessing + # todo: plots of distributions of coeffs, if indeed usefull diff --git a/message_ix/tools/lp_diag/nohup.out b/message_ix/tools/lp_diag/nohup.out new file mode 100644 index 000000000..75e038180 --- /dev/null +++ b/message_ix/tools/lp_diag/nohup.out @@ -0,0 +1,977 @@ +[I 17:31:34.132 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag +[I 17:31:34.132 NotebookApp] Jupyter Notebook 6.5.3 is running at: +[I 17:31:34.132 NotebookApp] http://localhost:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 +[I 17:31:34.132 NotebookApp] or http://127.0.0.1:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 +[I 17:31:34.132 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[C 17:31:34.251 NotebookApp] + + To access the notebook, open this file in a browser: + file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-9180-open.html + Or copy and paste one of these URLs: + http://localhost:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 + or http://127.0.0.1:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 +[I 17:31:42.551 NotebookApp] Creating new notebook in +[I 17:31:45.014 NotebookApp] Kernel started: c7170213-4682-4a9f-aa31-a04414c7a587, name: python3 +[I 17:33:44.941 NotebookApp] Saving file at /Untitled.ipynb +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate(nb) +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate_nb(model['content']) +[I 17:35:45.922 NotebookApp] Saving file at /Untitled.ipynb +[I 17:37:44.943 NotebookApp] Saving file at /Untitled.ipynb +[I 17:38:48.477 NotebookApp] Saving file at /Untitled.ipynb +[I 17:47:44.953 NotebookApp] Saving file at /Untitled.ipynb +[I 17:49:44.942 NotebookApp] Saving file at /Untitled.ipynb +[I 18:27:06.505 NotebookApp] Starting buffering for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 +[I 18:27:09.662 NotebookApp] Restoring connection for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 +[I 18:27:12.775 NotebookApp] Starting buffering for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 +[I 18:27:27.666 NotebookApp] Restoring connection for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 +[I 20:24:34.127 NotebookApp] Starting buffering for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 +[I 20:24:38.909 NotebookApp] Kernel shutdown: c7170213-4682-4a9f-aa31-a04414c7a587 +[I 20:24:40.316 NotebookApp] Shutting down on /api/shutdown request. +[I 20:24:40.318 NotebookApp] Shutting down 0 kernels +[I 20:24:40.318 NotebookApp] Shutting down 0 terminals + + _ _ _ _ + | | | |_ __ __| |__ _| |_ ___ + | |_| | '_ \/ _` / _` | _/ -_) + \___/| .__/\__,_\__,_|\__\___| + |_| + +Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. + +https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html + +Please note that updating to Notebook 7 might break some of your extensions. + +,_\__,_|\__\___| + |_| + +Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. + +https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html + +Please note that updating to Notebook 7 might break some of your extensions. + +[I 20:31:49.579 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag +[I 20:31:49.579 NotebookApp] Jupyter Notebook 6.5.3 is running at: +[I 20:31:49.579 NotebookApp] http://localhost:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 +[I 20:31:49.579 NotebookApp] or http://127.0.0.1:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 +[I 20:31:49.579 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[C 20:31:49.710 NotebookApp] + + To access the notebook, open this file in a browser: + file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-19876-open.html + Or copy and paste one of these URLs: + http://localhost:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 + or http://127.0.0.1:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 +[W 20:31:56.246 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 20:31:56.356 NotebookApp] Kernel started: 08b25722-a90a-4727-8980-ba9ff63b142e, name: python3 +[I 20:33:56.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 20:33:56.323 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 20:35:56.319 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:37:56.325 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:39:56.330 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:41:56.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:43:56.338 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:45:56.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:47:56.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:49:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate(nb) +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate_nb(model['content']) +[I 20:51:56.326 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:55:56.335 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:57:56.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:59:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:01:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:03:07.562 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:03:56.337 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:05:56.342 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:07:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:11:56.342 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:13:56.331 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:15:56.340 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:17:56.337 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:19:56.352 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:21:56.976 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:23:56.354 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:25:56.347 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:26:09.315 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:31:56.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:33:56.343 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:35:56.344 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:36:17.503 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 21:36:34.091 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 21:52:18.955 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 21:59:56.343 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:01:12.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:01:56.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:03:56.327 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:05:56.317 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:06:19.842 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:07:56.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:09:56.322 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:20:04.757 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 22:20:05.454 NotebookApp] Kernel restarted: 08b25722-a90a-4727-8980-ba9ff63b142e +[I 22:20:05.462 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 22:20:07.003 NotebookApp] Replaying 3 buffered messages +[I 22:21:56.321 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 22:37:45.741 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 06:07:56.317 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 06:09:56.311 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 06:13:56.308 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 06:15:56.320 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 07:19:45.367 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 07:19:50.950 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 07:19:54.303 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 07:49:51.074 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 07:49:55.892 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 07:49:59.666 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 10:11:25.043 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 10:12:38.619 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 10:14:40.743 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 10:14:44.426 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 10:39:39.702 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:39:45.483 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e +[I 10:39:48.999 NotebookApp] Kernel shutdown: 08b25722-a90a-4727-8980-ba9ff63b142e +[I 10:39:53.577 NotebookApp] Shutting down on /api/shutdown request. +[I 10:39:53.579 NotebookApp] Shutting down 0 kernels +[I 10:39:53.579 NotebookApp] Shutting down 0 terminals + + _ _ _ _ + | | | |_ __ __| |__ _| |_ ___ + | |_| | '_ \/ _` / _` | _/ -_) + \___/| .__/\__,_\__,_|\__\___| + |_| + +Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. + +https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html + +Please note that updating to Notebook 7 might break some of your extensions. + +[I 15:33:44.317 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag +[I 15:33:44.317 NotebookApp] Jupyter Notebook 6.5.3 is running at: +[I 15:33:44.317 NotebookApp] http://localhost:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d +[I 15:33:44.317 NotebookApp] or http://127.0.0.1:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d +[I 15:33:44.317 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[C 15:33:44.465 NotebookApp] + + To access the notebook, open this file in a browser: + file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-3168-open.html + Or copy and paste one of these URLs: + http://localhost:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d + or http://127.0.0.1:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d +[W 15:34:53.707 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 15:34:54.205 NotebookApp] Kernel started: 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1, name: python3 +[I 15:35:53.107 NotebookApp] Starting buffering for 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1:277889f27a44462289c8e32fad85a9e7 +[I 15:35:53.375 NotebookApp] Kernel restarted: 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1 +[I 15:35:53.422 NotebookApp] Restoring connection for 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1:277889f27a44462289c8e32fad85a9e7 +[I 15:35:54.441 NotebookApp] Replaying 3 buffered messages +[I 15:36:53.965 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate(nb) +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate_nb(model['content']) +[I 15:38:53.972 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:46:53.966 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:00:53.983 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:02:53.991 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:04:53.984 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:06:53.967 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:08:54.833 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:11:08.042 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:12:53.968 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:14:53.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:16:53.961 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:18:53.981 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:32:53.982 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:34:53.963 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:35:02.665 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:35:03.792 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:36:53.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:38:53.977 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:40:53.968 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:43:44.511 NotebookApp] Kernel interrupted: 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1 +[I 16:44:53.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:46:53.980 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:48:53.970 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:50:53.973 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:51:27.384 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:51:30.412 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:51:44.245 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:52:04.398 NotebookApp] Starting buffering for 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1:277889f27a44462289c8e32fad85a9e7 +[I 07:30:39.001 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag +[I 07:30:39.001 NotebookApp] Jupyter Notebook 6.5.3 is running at: +[I 07:30:39.001 NotebookApp] http://localhost:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 +[I 07:30:39.001 NotebookApp] or http://127.0.0.1:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 +[I 07:30:39.001 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[C 07:30:39.117 NotebookApp] + + To access the notebook, open this file in a browser: + file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-7780-open.html + Or copy and paste one of these URLs: + http://localhost:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 + or http://127.0.0.1:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 +[W 07:30:46.544 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 07:30:47.010 NotebookApp] Kernel started: 4aa50906-521b-44c8-997a-aaabcbe91cce, name: python3 +[I 07:34:45.277 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 07:34:45.829 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 07:34:45.838 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 07:34:46.855 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 07:34:47.372 NotebookApp] Replaying 3 buffered messages +[I 07:36:46.859 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 07:38:46.853 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 07:52:46.868 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 08:04:46.856 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate(nb) +C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. + validate_nb(model['content']) +[I 08:06:46.859 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 08:08:46.867 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:00:21.131 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 10:00:23.383 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 10:00:28.151 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 10:00:45.315 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 10:32:46.906 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:34:46.912 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:36:46.908 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:38:46.905 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:40:08.211 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:40:46.919 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:42:46.910 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:43:33.376 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:54:46.918 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 10:56:20.711 NotebookApp] IOPub message rate exceeded. + The notebook server will temporarily stop sending output + to the client in order to avoid crashing it. + To change this limit, set the config variable + `--NotebookApp.iopub_msg_rate_limit`. + + Current values: + NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec) + NotebookApp.rate_limit_window=3.0 (secs) + +[W 10:56:21.612 NotebookApp] iopub messages resumed +[I 10:56:46.987 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:57:17.964 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 10:57:20.324 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 10:58:46.985 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:00:46.914 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:01:50.004 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:02:46.923 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:04:46.928 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:17:41.903 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:17:59.462 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:18:10.674 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:18:43.457 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:18:46.918 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:20:46.932 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:24:46.915 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:26:46.930 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:28:46.929 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:30:46.944 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:32:46.924 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:36:46.934 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:38:46.938 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:40:46.935 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:42:46.941 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:44:46.935 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:48:46.928 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:50:46.946 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:52:46.943 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:54:46.940 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:56:46.944 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:58:46.928 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:00:46.932 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:08:46.937 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:09:29.713 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:10:28.609 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:11:19.600 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 12:11:22.227 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 12:11:22.236 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 12:11:23.267 NotebookApp] Replaying 3 buffered messages +[I 12:12:46.951 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:06:19.736 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 13:06:27.124 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 13:06:27.285 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 13:06:48.378 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 13:06:51.698 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 13:06:59.744 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[I 13:07:13.304 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 13:08:52.216 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 13:09:04.032 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:09:20.165 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:09:20.713 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:09:21.012 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:09:24.714 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e +[W 13:09:30.030 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 13:11:11.169 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f39c9d5f301a4841b3479acb50ad1d93 +[I 13:11:11.424 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 13:11:11.483 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:f39c9d5f301a4841b3479acb50ad1d93 +[I 13:11:12.528 NotebookApp] Replaying 3 buffered messages +[I 13:11:30.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:13:30.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:13:32.423 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 13:13:41.943 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f39c9d5f301a4841b3479acb50ad1d93 +[I 13:14:20.553 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[I 13:14:20.821 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 13:14:20.825 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[I 13:14:21.851 NotebookApp] Replaying 3 buffered messages +[I 13:16:15.178 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:18:15.956 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:20:15.193 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:20:23.282 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:21:05.740 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[I 13:21:06.297 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 13:21:06.304 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[I 13:21:07.824 NotebookApp] Replaying 3 buffered messages +[I 13:21:37.809 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:22:15.973 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:28:15.190 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:30:15.180 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:32:15.180 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:34:15.183 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:36:15.181 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:38:15.179 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:40:15.190 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:42:15.179 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:44:15.184 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:46:15.196 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:48:15.196 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:50:15.201 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:52:15.187 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:54:15.185 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:56:15.189 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:56:29.258 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:58:15.187 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:59:57.413 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:00:15.184 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:02:15.188 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:02:46.651 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[I 14:02:47.222 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 14:02:47.230 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[I 14:02:48.755 NotebookApp] Replaying 3 buffered messages +[I 14:04:15.184 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:04:38.713 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:06:15.185 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:10:15.185 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:12:15.186 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:14:15.189 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:16:05.738 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:16:15.187 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:18:15.190 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:20:15.203 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:26:15.202 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:28:15.221 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:30:15.196 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:19.312 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:19.876 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:20.450 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:20.488 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:20.647 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:20.831 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:21.031 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:21.477 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:32.233 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 14:39:37.041 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:38.138 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:38.929 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:39:45.003 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 +[W 14:39:50.054 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 14:40:39.724 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 14:40:39.740 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 14:41:19.912 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 14:41:19.912 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 14:41:30.182 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:1b01dcd84282431c8d555e2224d6fe9d +[I 14:41:30.457 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 14:41:30.505 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:1b01dcd84282431c8d555e2224d6fe9d +[I 14:41:31.540 NotebookApp] Replaying 3 buffered messages +[I 14:41:50.406 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:43:50.401 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:00:21.864 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:00:24.094 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 15:00:33.458 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 15:00:40.518 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:1b01dcd84282431c8d555e2224d6fe9d +[I 15:00:51.372 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:c804636ad4a344da831d77a13892fa0f +[I 15:00:51.636 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 15:00:51.662 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:c804636ad4a344da831d77a13892fa0f +[I 15:00:52.678 NotebookApp] Replaying 3 buffered messages +[I 15:01:11.505 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:01:14.540 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:02:46.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:04:46.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:16:45.635 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 15:17:02.422 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:c804636ad4a344da831d77a13892fa0f +[W 15:26:51.997 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 15:26:56.457 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[I 15:26:56.745 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 15:26:56.865 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[I 15:26:57.895 NotebookApp] Replaying 3 buffered messages +[I 15:27:25.573 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 15:28:52.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:30:52.326 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:32:52.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:36:52.345 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:38:52.340 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:46:52.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:48:52.364 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:51:33.774 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[I 15:51:34.573 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 15:51:34.725 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[I 15:51:35.755 NotebookApp] Replaying 3 buffered messages +[I 15:52:01.578 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:52:52.347 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:54:52.345 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:56:06.543 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:56:52.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 15:59:09.058 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:00:52.343 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:02:52.353 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:03:05.992 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[I 16:03:06.466 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 16:03:06.472 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[I 16:03:07.509 NotebookApp] Replaying 3 buffered messages +[I 16:04:52.344 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:14:52.352 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:16:52.344 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:18:53.035 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:20:52.333 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:22:52.353 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:28:09.080 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:28:11.476 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to +[W 16:28:11.483 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[W 16:28:11.485 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted +[W 16:28:14.005 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted +[I 16:28:14.369 NotebookApp] Kernel started: 9293def2-127e-47b0-a884-858267c38a6f, name: python3 +[I 16:28:16.699 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb +[W 16:28:16.700 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted +[I 16:28:18.021 NotebookApp] Starting buffering for 9293def2-127e-47b0-a884-858267c38a6f:3173bac4ed4644e586605f299df80666 +[I 16:35:42.591 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 16:36:52.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:56:52.370 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:58:53.031 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:00:52.362 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:02:52.359 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:04:52.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:06:52.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:08:52.368 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:10:53.038 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:12:52.357 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:14:52.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:16:03.788 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:16:52.373 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:18:12.087 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:19:30.490 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb +[W 17:20:06.792 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 17:20:08.741 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:4073e4c8024c4f54aed5556a95a5c941 +[I 17:21:39.451 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +[W 17:21:45.042 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 17:22:29.826 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 17:22:30.093 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 17:22:30.229 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 17:22:31.258 NotebookApp] Replaying 3 buffered messages +[I 17:23:45.383 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:25:45.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:27:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:29:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:31:45.377 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:33:45.395 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:35:45.386 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:37:45.395 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:39:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:41:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:43:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:45:45.381 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:49:45.384 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:51:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:53:45.399 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:57:45.389 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:59:45.396 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:01:12.577 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:01:45.397 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:03:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:05:45.391 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:07:45.408 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:09:45.396 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:15:45.386 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:17:45.387 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:19:45.393 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:21:45.404 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 18:22:36.430 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted +[I 18:23:12.089 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 18:23:13.018 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:23:13.025 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 18:23:14.051 NotebookApp] Replaying 3 buffered messages +[I 18:23:15.023 NotebookApp] Starting buffering for 9293def2-127e-47b0-a884-858267c38a6f:92c5707dc0524407a1bd5f99a982098a +[I 18:23:45.400 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:25:45.397 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:27:45.399 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:28:29.380 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:29:45.394 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:31:45.395 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:33:45.400 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:35:45.398 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:36:06.875 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 18:36:07.348 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:36:07.355 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 18:36:08.380 NotebookApp] Replaying 3 buffered messages +[W 18:36:18.441 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted +[I 18:37:45.410 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:39:45.412 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:44:21.746 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 18:44:22.333 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:44:22.342 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 18:44:23.874 NotebookApp] Replaying 3 buffered messages +[I 18:46:31.053 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:51:45.393 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:55:00.979 NotebookApp] Starting buffering for 9293def2-127e-47b0-a884-858267c38a6f:82e7cef8a758407e8254464f1eb4836e +[I 18:55:45.409 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:57:45.398 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:23:47.505 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 19:23:55.335 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 19:23:58.242 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:24:08.607 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 19:24:08.887 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 19:24:08.899 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 19:24:09.937 NotebookApp] Replaying 3 buffered messages +[I 19:24:17.214 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 19:24:17.574 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 19:24:17.579 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 19:24:18.618 NotebookApp] Replaying 3 buffered messages +[I 19:25:45.416 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:37:45.420 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:39:45.422 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:41:45.428 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:43:45.426 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:45:45.430 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:57:29.984 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:59:45.431 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:01:45.424 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:03:45.430 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:04:17.081 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:04:17.532 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 20:07:14.305 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 20:07:50.913 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 20:07:57.904 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 20:08:11.663 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 20:08:14.600 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 07:48:04.710 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 07:52:33.238 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 07:52:34.276 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 07:52:34.468 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 07:52:35.497 NotebookApp] Replaying 3 buffered messages +[I 07:52:54.795 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 07:53:45.415 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 07:55:46.010 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 08:07:45.273 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 08:09:45.270 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:27:45.966 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:29:45.976 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:31:45.306 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:35:39.965 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:35:41.646 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to +[W 09:35:41.652 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[W 09:35:41.654 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy2.ipynb is not trusted +[W 09:35:43.333 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy2.ipynb is not trusted +[I 09:35:43.720 NotebookApp] Kernel started: 17bdfebc-5481-4eee-8ed7-cad512fb7ce6, name: python3 +[I 09:35:57.927 NotebookApp] Starting buffering for 17bdfebc-5481-4eee-8ed7-cad512fb7ce6:232616bc88a3469c890340617c6b4dd0 +[I 09:36:09.440 NotebookApp] Kernel shutdown: 9293def2-127e-47b0-a884-858267c38a6f +[I 09:36:12.528 NotebookApp] Kernel shutdown: 17bdfebc-5481-4eee-8ed7-cad512fb7ce6 +[I 09:37:45.306 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:39:45.293 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:41:45.320 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:43:45.305 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:45:45.308 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:50:36.985 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:51:45.307 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:53:45.302 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:55:45.300 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:57:45.967 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 09:59:45.301 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:00:43.391 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 10:00:44.530 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 10:00:44.598 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 10:00:46.143 NotebookApp] Replaying 3 buffered messages +[I 10:01:45.311 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:03:45.301 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:05:45.318 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:07:45.309 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:11:18.028 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:13:19.714 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:13:20.135 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:13:25.690 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 10:13:26.268 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 10:13:26.291 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 10:13:27.794 NotebookApp] Replaying 3 buffered messages +[I 10:13:45.310 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:15:45.306 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:17:45.328 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:19:45.303 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:29:45.318 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:33:45.311 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:35:45.322 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:37:45.328 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:39:45.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:41:45.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:43:45.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:45:45.327 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:47:45.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:49:45.316 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:51:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:53:45.329 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:55:45.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:57:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:59:45.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:00:15.646 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:01:45.320 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:05:00.330 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:07:45.325 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:09:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:39:45.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:39:58.795 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:41:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:41:53.055 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 11:41:53.757 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 11:41:53.763 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 11:41:55.306 NotebookApp] Replaying 3 buffered messages +[I 11:43:45.338 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:44:20.524 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:45:45.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:51:45.337 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:52:21.738 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 11:53:45.536 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 11:53:46.121 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 11:53:46.135 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 11:53:47.644 NotebookApp] Replaying 3 buffered messages +[I 11:55:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:57:45.365 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 12:59:45.357 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:01:45.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 13:28:01.936 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 13:28:02.512 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 13:28:02.519 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 13:28:04.042 NotebookApp] Replaying 3 buffered messages +[I 13:29:45.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:10:26.350 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:10:33.749 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:10:45.450 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 14:10:45.905 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 14:10:45.911 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 14:10:46.948 NotebookApp] Replaying 3 buffered messages +[I 14:11:46.033 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:13:45.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:15:45.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:21:45.381 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:23:45.374 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:25:45.371 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:27:45.367 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:28:59.903 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:29:34.026 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:30:05.558 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:31:45.370 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:33:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:34:36.616 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 14:34:37.982 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to +[W 14:34:37.984 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[W 14:34:37.986 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb is not trusted +[W 14:34:39.612 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb is not trusted +[I 14:34:39.872 NotebookApp] Kernel started: 7a602e50-a4c8-40f8-b051-3c640784f554, name: python3 +[I 14:34:46.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb +[W 14:34:46.385 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb is not trusted +[I 14:34:47.812 NotebookApp] Starting buffering for 7a602e50-a4c8-40f8-b051-3c640784f554:ef83fc089c5d484a86c2d9ddeb5a083e +[I 14:35:45.373 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:00:02.864 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 16:00:18.753 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 16:07:03.351 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 16:07:03.894 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 16:07:03.902 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 16:07:05.437 NotebookApp] Replaying 3 buffered messages +[I 16:07:46.043 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:08:55.206 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:08:57.339 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to +[W 16:08:57.340 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 16:08:59.086 NotebookApp] Kernel started: 2d55f666-8afd-41fc-8cf3-f36f2d4e5ce6, name: python3 +[I 16:09:00.710 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb +[I 16:09:01.500 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb +[I 16:09:02.911 NotebookApp] Starting buffering for 2d55f666-8afd-41fc-8cf3-f36f2d4e5ce6:da9f611659054b4b8a2ddedfb684c4b4 +[I 16:09:45.404 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:12:31.209 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:33:45.909 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 16:33:50.530 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 +[I 16:33:56.849 NotebookApp] Kernel shutdown: 7a602e50-a4c8-40f8-b051-3c640784f554 +[I 16:33:56.850 NotebookApp] Kernel shutdown: 2d55f666-8afd-41fc-8cf3-f36f2d4e5ce6 +[W 16:34:00.830 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 16:36:51.851 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:808d68c0d6b84c568bb654ffc98c5894 +[I 16:36:52.100 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 16:36:52.112 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:808d68c0d6b84c568bb654ffc98c5894 +[I 16:36:53.133 NotebookApp] Replaying 3 buffered messages +[I 16:38:01.045 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:40:01.027 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:42:01.079 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:44:01.045 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:48:01.047 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:50:01.040 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:51:19.435 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:52:01.037 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:54:01.038 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:56:01.058 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 16:58:01.051 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:00:01.044 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:07:34.747 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:14:01.049 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:16:01.042 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:18:01.060 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:20:01.037 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:22:01.046 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:24:01.053 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:26:31.068 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:28:01.051 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:30:01.042 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:32:01.054 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:32:36.361 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:34:01.059 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:36:01.066 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:38:01.055 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:40:01.049 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:40:51.868 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:42:01.061 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:42:49.279 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:44:01.060 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:44:13.978 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:44:23.707 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:45:01.874 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:45:02.609 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:46:01.052 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:48:01.063 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:50:01.067 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:50:05.488 NotebookApp] Kernel started: c550f1b2-b9ef-4f7a-a257-491e36fffe2a, name: python3 +[I 17:50:23.864 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:52:01.056 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:55:03.569 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:55:04.090 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 17:55:08.097 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 17:55:11.376 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:808d68c0d6b84c568bb654ffc98c5894 +[I 17:55:14.497 NotebookApp] Starting buffering for c550f1b2-b9ef-4f7a-a257-491e36fffe2a:bfd505f5c62c4acc86f76af7da4d1916 +[I 17:55:16.516 NotebookApp] Kernel shutdown: c550f1b2-b9ef-4f7a-a257-491e36fffe2a +[W 17:55:20.092 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 17:55:42.353 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 17:55:42.354 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 17:55:55.075 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[W 17:55:55.075 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted +[I 17:56:02.840 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:806be7e4aa6a476d8cb32e39457515ed +[I 17:56:03.125 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 17:56:03.175 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:806be7e4aa6a476d8cb32e39457515ed +[I 17:56:04.208 NotebookApp] Replaying 3 buffered messages +[I 17:57:20.356 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:01:31.793 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:01:45.110 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 18:01:52.153 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:806be7e4aa6a476d8cb32e39457515ed +[I 18:02:17.907 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:02:35.044 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:03:57.290 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:04:12.950 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:04:20.118 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:003dc2874ccc45c68eda190ebda6d948 +[I 18:04:20.392 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:04:20.399 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:003dc2874ccc45c68eda190ebda6d948 +[W 18:04:21.439 NotebookApp] Got events for closed stream +[I 18:04:21.441 NotebookApp] Replaying 3 buffered messages +[I 18:05:57.294 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:14:08.392 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 18:14:13.342 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:003dc2874ccc45c68eda190ebda6d948 +[I 18:14:30.260 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:15:11.245 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:16:17.837 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:16:49.961 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:17:30.827 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:17:41.277 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:82fcabf8915449b3acb748bc583008ac +[I 18:17:41.532 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:17:41.567 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:82fcabf8915449b3acb748bc583008ac +[W 18:17:42.617 NotebookApp] Got events for closed stream +[W 18:17:42.617 NotebookApp] Got events for closed stream +[I 18:17:42.618 NotebookApp] Replaying 3 buffered messages +[I 18:17:46.326 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:18:17.828 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:20:17.850 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:32:39.031 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:36:19.077 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:36:35.540 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 18:36:40.975 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:36:44.070 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:82fcabf8915449b3acb748bc583008ac +[I 18:38:47.998 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:38:54.504 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:39:26.428 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:e2e4e0a72bc248738480f64a8a432d21 +[I 18:39:26.699 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:39:26.706 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:e2e4e0a72bc248738480f64a8a432d21 +[I 18:39:27.734 NotebookApp] Replaying 3 buffered messages +[I 18:40:48.002 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:45:59.699 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 18:46:05.638 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:e2e4e0a72bc248738480f64a8a432d21 +[I 18:46:39.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:47:13.271 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f58786d145214fe2ab864d429eda1327 +[I 18:47:13.536 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:47:13.542 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:f58786d145214fe2ab864d429eda1327 +[I 18:47:14.589 NotebookApp] Replaying 3 buffered messages +[I 18:48:09.840 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:52:11.080 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:52:16.512 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 18:52:19.544 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f58786d145214fe2ab864d429eda1327 +[I 18:52:42.955 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:53:24.128 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 18:53:31.808 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:8a39b473737e4efb8c91dd2d8d5c8a9e +[I 18:53:32.063 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce +[I 18:53:32.070 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:8a39b473737e4efb8c91dd2d8d5c8a9e +[I 18:53:33.105 NotebookApp] Replaying 3 buffered messages +[I 18:54:23.310 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:06:43.313 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 19:06:53.048 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports +WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted +[I 19:06:58.883 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:8a39b473737e4efb8c91dd2d8d5c8a9e +[I 2024-02-15 10:32:38.931 LabApp] JupyterLab extension loaded from C:\Users\pratama\Anaconda3\lib\site-packages\jupyterlab +[I 2024-02-15 10:32:38.931 LabApp] JupyterLab application directory is C:\Users\pratama\Anaconda3\share\jupyter\lab +[I 10:32:38.947 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag +[I 10:32:38.947 NotebookApp] Jupyter Notebook 6.4.8 is running at: +[I 10:32:38.947 NotebookApp] http://localhost:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 +[I 10:32:38.947 NotebookApp] or http://127.0.0.1:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 +[I 10:32:38.947 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[C 10:32:39.101 NotebookApp] + + To access the notebook, open this file in a browser: + file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-1176-open.html + Or copy and paste one of these URLs: + http://localhost:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 + or http://127.0.0.1:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 +[I 10:42:03.847 NotebookApp] Kernel started: d9d68c56-94c3-431c-87ce-5a5b94bf715a, name: python3 +[I 10:42:08.629 NotebookApp] Starting buffering for d9d68c56-94c3-431c-87ce-5a5b94bf715a:f5eea4b5c15b4e8b8d4b1e5b310f1385 +[I 10:42:08.855 NotebookApp] Kernel restarted: d9d68c56-94c3-431c-87ce-5a5b94bf715a +[I 10:42:08.863 NotebookApp] Restoring connection for d9d68c56-94c3-431c-87ce-5a5b94bf715a:f5eea4b5c15b4e8b8d4b1e5b310f1385 +[I 10:42:09.887 NotebookApp] Replaying 3 buffered messages +[I 10:42:57.803 NotebookApp] Kernel started: 589de64a-edb7-4489-95da-e02afee79343, name: python3 +[I 10:43:21.800 NotebookApp] Starting buffering for 589de64a-edb7-4489-95da-e02afee79343:bbc508fb1f9c4b4486747d585b46468c +[I 10:44:03.809 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:45:14.211 NotebookApp] Starting buffering for 589de64a-edb7-4489-95da-e02afee79343:ef9227ca5c114931b0a85a0fb572b7f6 +[I 10:46:03.810 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:46:54.876 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb +[I 10:46:55.758 NotebookApp] Starting buffering for d9d68c56-94c3-431c-87ce-5a5b94bf715a:f5eea4b5c15b4e8b8d4b1e5b310f1385 +[I 10:47:01.255 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb +[I 10:47:01.274 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb to +[I 10:47:03.139 NotebookApp] Kernel started: 3f2b62f5-4a67-4a70-9c58-ccada69e0f82, name: python3 +[I 10:47:04.277 NotebookApp] Starting buffering for 589de64a-edb7-4489-95da-e02afee79343:cd2364d9e0424e038d64b19f0735f544 +[I 10:47:09.194 NotebookApp] Kernel shutdown: 3f2b62f5-4a67-4a70-9c58-ccada69e0f82 +[I 10:47:09.311 NotebookApp] Kernel shutdown: d9d68c56-94c3-431c-87ce-5a5b94bf715a +[W 10:47:09.781 NotebookApp] 404 DELETE /api/sessions/057a3387-6433-4d32-aacb-4b2f83aee5ae (::1): Session not found: session_id='057a3387-6433-4d32-aacb-4b2f83aee5ae' +[W 10:47:09.781 NotebookApp] Session not found: session_id='057a3387-6433-4d32-aacb-4b2f83aee5ae' +[W 10:47:09.781 NotebookApp] 404 DELETE /api/sessions/057a3387-6433-4d32-aacb-4b2f83aee5ae (::1) 0.920000ms referer=http://localhost:8888/notebooks/%5BPROTOTYPE%5D%20Matrix%20Rescale%20Tool-Copy5.ipynb +[I 10:47:18.628 NotebookApp] Kernel shutdown: 589de64a-edb7-4489-95da-e02afee79343 +[I 10:47:24.933 NotebookApp] Kernel started: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a, name: python3 +[I 10:47:30.143 NotebookApp] Starting buffering for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 +[I 10:47:30.363 NotebookApp] Kernel restarted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 10:47:30.501 NotebookApp] Restoring connection for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 +[I 10:47:32.530 NotebookApp] Replaying 3 buffered messages +[I 10:49:25.695 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 10:51:23.291 NotebookApp] Starting buffering for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 +[I 10:51:23.739 NotebookApp] Kernel restarted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 10:51:23.749 NotebookApp] Restoring connection for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 +[I 10:51:25.267 NotebookApp] Replaying 3 buffered messages +[I 10:53:24.947 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 10:55:24.950 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:03:25.716 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:09:25.707 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:09:58.585 NotebookApp] Starting buffering for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 +[I 11:09:59.024 NotebookApp] Kernel restarted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 11:09:59.034 NotebookApp] Restoring connection for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 +[I 11:10:00.557 NotebookApp] Replaying 3 buffered messages +[I 11:11:25.711 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:21:24.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:23:24.963 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:23:42.631 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 11:25:24.963 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:27:25.700 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:31:25.722 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:32:29.900 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:33:48.763 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:39:24.975 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:43:24.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:45:18.736 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:45:41.670 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:45:53.167 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:47:26.276 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:50:46.604 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 11:51:07.352 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 11:53:25.076 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 12:09:19.100 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 12:09:31.963 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 12:09:32.316 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 12:11:25.029 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 12:13:24.981 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 12:17:24.996 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 12:17:27.689 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 12:19:25.862 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb +[I 12:31:40.127 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb to +[W 12:31:40.283 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb is not trusted +[W 12:31:40.285 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[W 12:31:42.716 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 12:31:43.142 NotebookApp] Kernel started: 6174e01d-98ff-4110-b742-89423036f02d, name: python3 +[I 12:33:42.009 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 12:33:42.011 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:21:43.143 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:21:43.149 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:23:43.549 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:23:43.597 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:25:43.260 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:25:43.282 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:26:32.132 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:26:32.132 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:27:43.103 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:27:43.106 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:29:43.741 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:29:43.742 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:31:43.109 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:31:43.110 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:33:43.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:33:43.410 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:34:15.383 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb +[W 13:34:15.385 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:35:02.364 NotebookApp] Creating new notebook in +[I 13:35:07.707 NotebookApp] Kernel started: 34fb97db-e849-4790-a4a6-da2ebd9315e4, name: python3 +[I 13:35:11.018 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:11.644 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:12.011 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:12.219 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:12.507 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:12.779 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:12.970 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:35:13.291 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:37:06.848 NotebookApp] Saving file at /Untitled.ipynb +[I 13:43:12.860 NotebookApp] Starting buffering for 6174e01d-98ff-4110-b742-89423036f02d:be7c5a5fa8c640ca89adb8ef01fceee1 +[W 13:43:22.933 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted +[I 13:43:28.067 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:43:28.132 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:43:28.331 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:43:28.789 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:43:28.793 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[I 13:43:35.176 NotebookApp] Kernel shutdown: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a +[W 13:43:40.017 NotebookApp] 404 DELETE /api/sessions/ff27ede1-dce1-40e9-a7a3-b00150ba634c (::1): Session not found: session_id='ff27ede1-dce1-40e9-a7a3-b00150ba634c' +[W 13:43:40.018 NotebookApp] Session not found: session_id='ff27ede1-dce1-40e9-a7a3-b00150ba634c' +[W 13:43:40.018 NotebookApp] 404 DELETE /api/sessions/ff27ede1-dce1-40e9-a7a3-b00150ba634c (::1) 2.000000ms referer=http://localhost:8888/tree +[I 13:45:07.766 NotebookApp] Saving file at /Untitled.ipynb +[I 13:46:47.249 NotebookApp] Starting buffering for 6174e01d-98ff-4110-b742-89423036f02d:3184662dfb584e21837cd9541f08a27e +[I 13:46:47.814 NotebookApp] Starting buffering for 34fb97db-e849-4790-a4a6-da2ebd9315e4:aa83cceddffc41648ca5ba0420a85323 +[I 13:46:52.639 NotebookApp] Kernel shutdown: 6174e01d-98ff-4110-b742-89423036f02d +[I 13:47:00.878 NotebookApp] Kernel shutdown: 34fb97db-e849-4790-a4a6-da2ebd9315e4 diff --git a/message_ix/tools/lp_diag/scale_trial.gms b/message_ix/tools/lp_diag/scale_trial.gms new file mode 100644 index 000000000..58aea03c3 --- /dev/null +++ b/message_ix/tools/lp_diag/scale_trial.gms @@ -0,0 +1,64 @@ +$ontext + +Illustrate user defined scaling by GAMS + +$offtext + sets items names of variables /x1*x4/ + resources names of constraints /r1*r4/ + + parameter objcoef(items) objective function coeficients + /x1 100000, + x2 -50000000 + x3 -40000000 + x4 -50000000/ +* + rhs(resources) resource availabilities + /r3 1200 + r4 60/; + + Table amatrix(resources,items) aij matrix + x1 x2 x3 x4 + r1 1 -10000 -8000 + r2 1 4 -50 + r3 1500 2000 + r4 50 45 ; + + variables z objective function; + positive variables xvar(items) variables; + equations objfun objective function + avail(resources) resource limits; + + objfun.. z =e= sum(items,objcoef(items)*xvar(items)); + avail(resources).. sum(items,amatrix(resources,items)*xvar(items)) + =l= rhs(resources); +model scalemod /all/; +avail.scale('r2')= 0.001311; +avail.scale('r1')= 0.020972; +avail.scale('r3')= 0.005243; +objfun.scale= 1.0; +avail.scale('r4')= 0.003906; +xvar.scale('x2')= 5e-06; +xvar.scale('x4')= 0.000244; +z.scale= 1.0; +xvar.scale('x1')= 0.001311; +xvar.scale('x3')= 5e-06; + +scalemod.scaleopt=1; +scalemod.OptFile = 1; +solve scalemod using lp maximizing z; + +$ontext +DO NOT DELETE THIS BLOCK +This is the scaling factor from GAMS documentation +================================================== +avail.scale('r1')= 1000; +avail.scale('r2')= 5; +avail.scale('r3')= 1500; +avail.scale('r4')= 50; +objfun.scale=50; +xvar.scale('x1')= 1000; +xvar.scale('x2')= 1; +xvar.scale('x3')= 1.25; +xvar.scale('x4')= 1/10; +z.scale= 1.0; +$offtext diff --git a/message_ix/tools/lp_diag/transport_mpstest_mps b/message_ix/tools/lp_diag/transport_mpstest_mps new file mode 100644 index 000000000..00e6310e8 --- /dev/null +++ b/message_ix/tools/lp_diag/transport_mpstest_mps @@ -0,0 +1,38 @@ +* ENCODING=ISO-8859-1 +NAME gamsmodel +ROWS + N _obj + L supply(seattle) + L supply(san-diego) + G demand(new-york) + G demand(chicago) + G demand(topeka) +COLUMNS + x(seattle,new-york) _obj 2.5 + x(seattle,new-york) supply(seattle) 1 + x(seattle,new-york) demand(new-york) 1 + x(seattle,chicago) _obj 1.7 + x(seattle,chicago) supply(seattle) 1 + x(seattle,chicago) demand(chicago) 1 + x(seattle,topeka) _obj 1.8 + x(seattle,topeka) supply(seattle) 1 + x(seattle,topeka) demand(topeka) 1 + x(san-diego,new-york) _obj 2.5e-9 + x(san-diego,new-york) supply(san-diego) 1 + x(san-diego,new-york) demand(new-york) 1 + x(san-diego,chicago) _obj 1.8 + x(san-diego,chicago) supply(san-diego) 1 + x(san-diego,chicago) demand(chicago) 1 + x(san-diego,topeka) _obj 1.4e-8 + x(san-diego,topeka) supply(san-diego) 1 + x(san-diego,topeka) demand(topeka) 1 + constobj _obj 1 +RHS + rhs supply(seattle) 350 + rhs supply(san-diego) 600 + rhs demand(new-york) 325 + rhs demand(chicago) 300 + rhs demand(topeka) 275 +BOUNDS + FX bnd constobj 0 +ENDATA diff --git a/message_ix/tools/lp_diag/transport_mpstest_scaled_mps b/message_ix/tools/lp_diag/transport_mpstest_scaled_mps new file mode 100644 index 000000000..00ba5bf1a --- /dev/null +++ b/message_ix/tools/lp_diag/transport_mpstest_scaled_mps @@ -0,0 +1,38 @@ +* ENCODING=ISO-8859-1 +NAME gamsmodel +ROWS + N _obj + L supply(seattle) + L supply(san-diego) + G demand(new-york) + G demand(chicago) + G demand(topeka) +COLUMNS + x(seattle,new-york) _obj 0.0324675324675325 + x(seattle,new-york) supply(seattle) 1 + x(seattle,new-york) demand(new-york) 1 + x(seattle,chicago) _obj 0.0220779220779221 + x(seattle,chicago) supply(seattle) 1 + x(seattle,chicago) demand(chicago) 1 + x(seattle,topeka) _obj 0.0233766233766234 + x(seattle,topeka) supply(seattle) 1 + x(seattle,topeka) demand(topeka) 1 + x(san-diego,new-york) _obj 4.22077922077922e-10 + x(san-diego,new-york) supply(san-diego) 13 + x(san-diego,new-york) demand(new-york) 13 + x(san-diego,chicago) _obj 0.0233766233766234 + x(san-diego,chicago) supply(san-diego) 1 + x(san-diego,chicago) demand(chicago) 1 + x(san-diego,topeka) _obj 1.81818181818182e-9 + x(san-diego,topeka) supply(san-diego) 10 + x(san-diego,topeka) demand(topeka) 10 + constobj _obj 1 +RHS + rhs supply(seattle) 350 + rhs supply(san-diego) 600 + rhs demand(new-york) 325 + rhs demand(chicago) 300 + rhs demand(topeka) 275 +BOUNDS + FX bnd constobj 0 +ENDATA diff --git a/message_ix/tools/lp_diag/transport_original_mps b/message_ix/tools/lp_diag/transport_original_mps new file mode 100644 index 000000000..568c4b73d --- /dev/null +++ b/message_ix/tools/lp_diag/transport_original_mps @@ -0,0 +1,38 @@ +* ENCODING=ISO-8859-1 +NAME gamsmodel +ROWS + N _obj + L supply(seattle) + L supply(san-diego) + G demand(new-york) + G demand(chicago) + G demand(topeka) +COLUMNS + x(seattle,new-york) _obj 2.5 + x(seattle,new-york) supply(seattle) 1 + x(seattle,new-york) demand(new-york) 1 + x(seattle,chicago) _obj 1.7 + x(seattle,chicago) supply(seattle) 1 + x(seattle,chicago) demand(chicago) 1 + x(seattle,topeka) _obj 1.8 + x(seattle,topeka) supply(seattle) 1 + x(seattle,topeka) demand(topeka) 1 + x(san-diego,new-york) _obj 2.5 + x(san-diego,new-york) supply(san-diego) 1 + x(san-diego,new-york) demand(new-york) 1 + x(san-diego,chicago) _obj 1.8 + x(san-diego,chicago) supply(san-diego) 1 + x(san-diego,chicago) demand(chicago) 1 + x(san-diego,topeka) _obj 1.4 + x(san-diego,topeka) supply(san-diego) 1 + x(san-diego,topeka) demand(topeka) 1 + constobj _obj 1 +RHS + rhs supply(seattle) 350 + rhs supply(san-diego) 600 + rhs demand(new-york) 325 + rhs demand(chicago) 300 + rhs demand(topeka) 275 +BOUNDS + FX bnd constobj 0 +ENDATA diff --git a/message_ix/tools/lp_diag/transport_problem_mpstest.gms b/message_ix/tools/lp_diag/transport_problem_mpstest.gms new file mode 100644 index 000000000..73e4039d2 --- /dev/null +++ b/message_ix/tools/lp_diag/transport_problem_mpstest.gms @@ -0,0 +1,67 @@ +$title A Transportation Problem (TRNSPORT,SEQ=1) + +$onText +This problem finds a least cost shipping schedule that meets +requirements at markets and supplies at factories. + + +Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. +Princeton University Press, Princeton, New Jersey, 1963. + +This formulation is described in detail in: +Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. +The Scientific Press, Redwood City, California, 1988. + +The line numbers will not match those in the book because of these +comments. + +Keywords: linear programming, transportation problem, scheduling +$offText + +Set + i 'canning plants' / seattle, san-diego / + j 'markets' / new-york, chicago, topeka /; + +Parameter + a(i) 'capacity of plant i in cases' + / seattle 350 + san-diego 600 / + + b(j) 'demand at market j in cases' + / new-york 325 + chicago 300 + topeka 275 /; + +Table d(i,j) 'distance in thousands of miles' + new-york chicago topeka + seattle 2.5 1.7 1.8 + san-diego 0.0000000025 1.8 0.000000014; + +Scalar f 'freight in dollars per case per thousand miles' / 1000 /; + +Parameter c(i,j) 'transport cost in thousands of dollars per case'; +c(i,j) = f*d(i,j)/1000; + +Variable + x(i,j) 'shipment quantities in cases' + z 'total transportation costs in thousands of dollars'; + +Positive Variable x; + +Equation + cost 'define objective function' + supply(i) 'observe supply limit at plant i' + demand(j) 'satisfy demand at market j'; + +cost.. z =e= sum((i,j), c(i,j)*x(i,j)); + +supply(i).. sum(j, x(i,j)) =l= a(i); + +demand(j).. sum(i, x(i,j)) =g= b(j); + +Model transport_mpstest / all /; +*x.scale('san-diego',j)=10000; +*transport.scaleopt=1; +transport_mpstest.OptFile = 1; +solve transport_mpstest using lp minimizing z; +display x.l, x.m, c; diff --git a/message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms b/message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms new file mode 100644 index 000000000..7861a4f28 --- /dev/null +++ b/message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms @@ -0,0 +1,70 @@ +$title A Transportation Problem (TRNSPORT,SEQ=1) + +$onText +This problem finds a least cost shipping schedule that meets +requirements at markets and supplies at factories. + + +Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. +Princeton University Press, Princeton, New Jersey, 1963. + +This formulation is described in detail in: +Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. +The Scientific Press, Redwood City, California, 1988. + +The line numbers will not match those in the book because of these +comments. + +Keywords: linear programming, transportation problem, scheduling +$offText + +Set + i 'canning plants' / seattle, san-diego / + j 'markets' / new-york, chicago, topeka /; + +Parameter + a(i) 'capacity of plant i in cases' + / seattle 350 + san-diego 600 / + + b(j) 'demand at market j in cases' + / new-york 325 + chicago 300 + topeka 275 /; + +Table d(i,j) 'distance in thousands of miles' + new-york chicago topeka + seattle 2.5 1.7 1.8 + san-diego 0.0000000025 1.8 0.000000014; + +Scalar f 'freight in dollars per case per thousand miles' / 1000 /; + +Parameter c(i,j) 'transport cost in thousands of dollars per case'; +c(i,j) = f*d(i,j)/1000; + +Variable + x(i,j) 'shipment quantities in cases' + z 'total transportation costs in thousands of dollars'; + +Positive Variable x; + +Equation + cost 'define objective function' + supply(i) 'observe supply limit at plant i' + demand(j) 'satisfy demand at market j'; + +cost.. z =e= sum((i,j), c(i,j)*x(i,j)); + +supply(i).. sum(j, x(i,j)) =l= a(i); + +demand(j).. sum(i, x(i,j)) =g= b(j); + +Model transport_mpstest / all /; +x.scale('san-diego','new-york') = 13.0; +x.scale('san-diego','topeka') = 10.0; +cost.scale = 77.0; +z.scale = cost.scale ; +transport_mpstest.scaleopt=1; +transport_mpstest.OptFile = 1; +solve transport_mpstest using lp minimizing z; +display x.l, x.m, c; diff --git a/message_ix/tools/lp_diag/transport_problem_original.gms b/message_ix/tools/lp_diag/transport_problem_original.gms new file mode 100644 index 000000000..5beef59ff --- /dev/null +++ b/message_ix/tools/lp_diag/transport_problem_original.gms @@ -0,0 +1,65 @@ +$title A Transportation Problem (TRNSPORT,SEQ=1) + +$onText +This problem finds a least cost shipping schedule that meets +requirements at markets and supplies at factories. + + +Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. +Princeton University Press, Princeton, New Jersey, 1963. + +This formulation is described in detail in: +Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. +The Scientific Press, Redwood City, California, 1988. + +The line numbers will not match those in the book because of these +comments. + +Keywords: linear programming, transportation problem, scheduling +$offText + +Set + i 'canning plants' / seattle, san-diego / + j 'markets' / new-york, chicago, topeka /; + +Parameter + a(i) 'capacity of plant i in cases' + / seattle 350 + san-diego 600 / + + b(j) 'demand at market j in cases' + / new-york 325 + chicago 300 + topeka 275 /; + +Table d(i,j) 'distance in thousands of miles' + new-york chicago topeka + seattle 2.5 1.7 1.8 + san-diego 2.5 1.8 1.4; + +Scalar f 'freight in dollars per case per thousand miles' / 1000 /; + +Parameter c(i,j) 'transport cost in thousands of dollars per case'; +c(i,j) = f*d(i,j)/1000; + +Variable + x(i,j) 'shipment quantities in cases' + z 'total transportation costs in thousands of dollars'; + +Positive Variable x; + +Equation + cost 'define objective function' + supply(i) 'observe supply limit at plant i' + demand(j) 'satisfy demand at market j'; + +cost.. z =e= sum((i,j), c(i,j)*x(i,j)); + +supply(i).. sum(j, x(i,j)) =l= a(i); + +demand(j).. sum(i, x(i,j)) =g= b(j); + +Model transport_original / all /; +transport_original.OptFile = 1; +solve transport_original using lp minimizing z; +display x.l, x.m, c; From 284a95ebc3cf4765f08c9006e46f95ca2db02d3f Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 10:39:45 +0200 Subject: [PATCH 12/25] Working prototype of looping method --- message_ix/model/MESSAGE_master.gms | 4 +- ...x Rescale Tool-Loop method-Transport.ipynb | 1295 +++++++++++++++++ ...YPE] Matrix Rescale Tool-Loop method.ipynb | 987 ++++++------- message_ix/tools/lp_diag/coeff_matrix.xlsx | Bin 7326 -> 0 bytes message_ix/tools/lp_diag/cplex.opt | 2 +- .../tools/lp_diag/transport_mpstest_mps | 38 - .../lp_diag/transport_mpstest_scaled_mps | 38 - .../tools/lp_diag/transport_original_mps | 38 - 8 files changed, 1708 insertions(+), 694 deletions(-) create mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb delete mode 100644 message_ix/tools/lp_diag/coeff_matrix.xlsx delete mode 100644 message_ix/tools/lp_diag/transport_mpstest_mps delete mode 100644 message_ix/tools/lp_diag/transport_mpstest_scaled_mps delete mode 100644 message_ix/tools/lp_diag/transport_original_mps diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index 8dcab16ec..b29b1feeb 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -45,8 +45,8 @@ $ONGLOBAL *----------------------------------------------------------------------------------------------------------------------* ** scenario/case selection - this must match the name of the MsgData_<%%%>.gdx input data file ** -$SETGLOBAL data "" -*$SETGLOBAL data "Westeros_Electrified_baseline" +*$SETGLOBAL data "" +$SETGLOBAL data "mps_test_baseline" ** MACRO mode * "none": MESSAGEix is run in stand-alone mode diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb new file mode 100644 index 000000000..1eb51802a --- /dev/null +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb @@ -0,0 +1,1295 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fdbea0ef", + "metadata": {}, + "source": [ + "# MESSAGE-ix matrix improvement tool\n", + "\n", + "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", + "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", + "\n", + "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", + "\n", + "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", + "\n", + "$\n", + "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", + "$\n", + "\n", + "with $v$ is an acceptable matrix quality criteria.\n", + "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a771a522", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyomo.environ import *\n", + "from datetime import datetime\n", + "import xarray as xr\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def showme(df):\n", + " return df[\"val\"].unstack()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "afc2eec6", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the whole matrix\n", + "matrix = (pd.read_csv('data/matrix_transport.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "\n", + "# create a binary matrix for optimization coefficient\n", + "matrix_sbin = matrix.copy()\n", + "matrix_sbin.loc[matrix_sbin['val']!=0,'val'] = 1\n", + "matrix_sbin = matrix_sbin.astype(int)\n", + "\n", + "## converting matrix_sbin to dictiony\n", + "dict_matrix_sbin = matrix_sbin['val'].to_dict()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9903afb9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matrix[\"val\"].unstack()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6948f8fb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "66e003c3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.01.01.01.01.01.0
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.0NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.0NaNNaN1.0
supply(san-diego)NaN1.01.01.0NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.0 1.0 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.0 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.0 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.0 1.0 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.0 NaN \n", + "supply(san-diego) 1.0 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 1.0 1.0 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix_sbin)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "92838309", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj0.00.847997-28.575425-26.0899980.7655351.3219280.847997
demand(chicago)NaN0.000000NaNNaN0.000000NaNNaN
demand(new-york)NaNNaN0.000000NaNNaN0.000000NaN
demand(topeka)NaNNaNNaN0.000000NaNNaN0.000000
supply(san-diego)NaN0.0000000.0000000.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0000000.0000000.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 0.0 0.847997 -28.575425 \n", + "demand(chicago) NaN 0.000000 NaN \n", + "demand(new-york) NaN NaN 0.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.000000 0.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj -26.089998 0.765535 \n", + "demand(chicago) NaN 0.000000 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 0.000000 NaN \n", + "supply(san-diego) 0.000000 NaN \n", + "supply(seattle) NaN 0.000000 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 1.321928 0.847997 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.000000 NaN \n", + "demand(topeka) NaN 0.000000 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 0.000000 0.000000 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# calculate log base 2 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", + " np.absolute(\n", + " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "\n", + "log_absmatrix = showme(log_absmatrix)\n", + "log_absmatrix" + ] + }, + { + "cell_type": "markdown", + "id": "a4435293", + "metadata": {}, + "source": [ + "## Start Looping" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6dbeb665", + "metadata": {}, + "outputs": [], + "source": [ + "RSFs = []\n", + "for row in log_absmatrix.index:\n", + " rval = log_absmatrix.loc[row].fillna(0)\n", + " lb,ub = min(rval),max(rval)\n", + " mid = np.mean([lb,ub])\n", + " RSFs += [2**(-mid)]\n", + "\n", + "matrix0 = showme(matrix).mul(RSFs,axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e0e3dd97", + "metadata": {}, + "outputs": [], + "source": [ + "log_absmatrix0 = np.log2(matrix0)\n", + "CSFs = []\n", + "for col in log_absmatrix0.columns:\n", + " cval = log_absmatrix0[col].fillna(0)\n", + " lb,ub = min(cval),max(cval)\n", + " mid = np.mean([lb,ub])\n", + " CSFs += [2**(-mid)]\n", + "new_matrix = showme(matrix).mul(RSFs,axis=0).mul(CSFs,axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2e5a0796", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original value: [ -8 , 0 ]\n", + "Row scaling val: [ -4 , 4 ]\n", + "New Matrix: [ -2 , 2 ]\n" + ] + } + ], + "source": [ + "def report(text,df):\n", + " print(f\"{text}:\",\"[\",np.int32(np.min(np.log10(df))),\",\",np.int32(np.max(np.log10(df))),\"]\")\n", + "report(\"Original value\",showme(matrix))\n", + "report(\"Row scaling val\",matrix0)\n", + "report(\"New Matrix\",new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c33ccdcf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0d1675e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 12649.110641 22768.399153 0.000032 \n", + "demand(chicago) NaN 1.000000 NaN \n", + "demand(new-york) NaN NaN 1.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.000000 1.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.000177 21503.488089 \n", + "demand(chicago) NaN 1.000000 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000 NaN \n", + "supply(san-diego) 1.000000 NaN \n", + "supply(seattle) NaN 1.000000 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 31622.776602 22768.399153 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.000000 NaN \n", + "demand(topeka) NaN 1.000000 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.000000 1.000000 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matrix0" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3596c26a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj112.468265150.8920120.0056230.013307146.640677177.827941150.892012
demand(chicago)NaN0.006627NaNNaN0.006819NaNNaN
demand(new-york)NaNNaN177.827941NaNNaN0.005623NaN
demand(topeka)NaNNaNNaN75.146020NaNNaN0.006627
supply(san-diego)NaN0.006627177.82794175.146020NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0068190.0056230.006627
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 112.468265 150.892012 0.005623 \n", + "demand(chicago) NaN 0.006627 NaN \n", + "demand(new-york) NaN NaN 177.827941 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.006627 177.827941 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.013307 146.640677 \n", + "demand(chicago) NaN 0.006819 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 75.146020 NaN \n", + "supply(san-diego) 75.146020 NaN \n", + "supply(seattle) NaN 0.006819 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 177.827941 150.892012 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.005623 NaN \n", + "demand(topeka) NaN 0.006627 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 0.005623 0.006627 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_matrix" + ] + }, + { + "cell_type": "raw", + "id": "d7025869", + "metadata": {}, + "source": [ + "scalers = [RSFs,CSFs]\n", + "prescale_args = {}\n", + "for s in scalers:\n", + " for k,v in s.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v})\n", + "\n", + "gams_args = (str(prescale_args)\n", + " .replace('{','')\n", + " .replace('}','')\n", + " .replace('\"','')\n", + " .replace(':','=')\n", + " .replace(', ',';\\n')\n", + " +';'\n", + " )" + ] + }, + { + "cell_type": "raw", + "id": "3c833ec0", + "metadata": { + "scrolled": true + }, + "source": [ + "print(gams_args)" + ] + }, + { + "cell_type": "markdown", + "id": "a400585c", + "metadata": {}, + "source": [ + "np.log2(524288.0)" + ] + }, + { + "cell_type": "raw", + "id": "b971c49c", + "metadata": {}, + "source": [ + "# Printing stats\n", + "\n", + "matrices_dict = {'Old Matrix':matrix,\n", + " 'New Matrix':new_matrix,\n", + " } \n", + "\n", + "for k,v in matrices_dict.items():\n", + " print(f'{k} stats:')\n", + " print('>> log10 coefficient range:',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", + " print('')\n", + "\n", + "# TO DO:\n", + "# 1. plot histogram of log10 distribution of those matrix\n" + ] + }, + { + "cell_type": "raw", + "id": "b8ca4e72", + "metadata": {}, + "source": [ + "plt.hist(np.log10(matrix))" + ] + }, + { + "cell_type": "raw", + "id": "f3a37aba", + "metadata": {}, + "source": [ + "plt.hist(np.log10(new_matrix))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c483f4d9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index c8b6760f8..eb535c5f3 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "a771a522", "metadata": {}, "outputs": [], @@ -43,28 +43,241 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "afc2eec6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\pratama\\AppData\\Local\\Temp\\ipykernel_20164\\176877734.py:9: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", + " matrix_solv = pd.concat([matrix_lo,matrix_up])\n" + ] + } + ], "source": [ "# Load the whole matrix\n", - "matrix = (pd.read_csv('matrix_transport problem.csv')\n", + "matrix = (pd.read_csv('data/matrix_transport.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "# Load and create matrix with small and large coefficient\n", + "matrix_up = (pd.read_csv('data/matrix_transport_prob_upper.csv')\n", " .set_index(['row','col'],drop=True)[['val']])\n", + "matrix_lo = (pd.read_csv('data/matrix_transport_prob_lower.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "matrix_solv = pd.concat([matrix_lo,matrix_up])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "989325af", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
val
rowcol
_objx(san-diego,new-york)2.500000e-09
x(san-diego,topeka)1.400000e-08
\n", + "
" + ], + "text/plain": [ + " val\n", + "row col \n", + "_obj x(san-diego,new-york) 2.500000e-09\n", + " x(san-diego,topeka) 1.400000e-08" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matrix_solv" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "92838309", + "metadata": {}, + "outputs": [], + "source": [ + "# calculate log base 10 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", + " np.absolute(\n", + " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "#log_absmatrix = log_absmatrix.astype(int)\n", + "\n", + "# calculate log base 10 of the absolute value of the matrix\n", + "log_absmatrix_solv = matrix_solv.copy()\n", + "log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val']=(np.log2(\n", + " np.absolute(\n", + " log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val'])))\n", + "#log_absmatrix_solv = log_absmatrix_solv.astype(int)" + ] + }, + { + "cell_type": "raw", + "id": "002ae57a", + "metadata": {}, + "source": [ + "# this is dummy\n", + "matrix = new_matrix.copy()\n", + "# calculate log base 2 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "\n", + "# calculate log base 2 of the absolute value of the matrix\n", + "log_absmatrix_solv = matrix_solv.copy()\n", + "log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val'])))\n" + ] + }, + { + "cell_type": "markdown", + "id": "a4435293", + "metadata": {}, + "source": [ + "## Start Looping" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99703146", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6dbeb665", + "metadata": {}, + "outputs": [], + "source": [ + "# SCALE BY ROW\n", + "# Populating row scaler\n", + "RSFs = {row:[] for row in set(log_absmatrix_solv.index.get_level_values(0))}\n", + "for k in RSFs.keys():\n", + " rval = log_absmatrix.loc[(k),\"val\"]\n", + " lb,ub = min(rval),max(rval)\n", + " mid = np.mean([lb,ub])\n", + " RSFs[k] = 2**(-mid)\n", "\n", - "# create a binary matrix for optimization coefficient\n", - "matrix_sbin = matrix.copy()\n", - "matrix_sbin.loc[matrix_sbin['val']!=0,'val'] = 1\n", - "matrix_sbin = matrix_sbin.astype(int)\n", + "# Create DataFrame of row scaler\n", + "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", + "row_scaler.index.name = 'row'\n", "\n", - "## converting matrix_sbin to dictiony\n", - "dict_matrix_sbin = matrix_sbin['val'].to_dict()\n" + "# Create new matrix with scaled rows\n", + "matrix0 = matrix.copy()\n", + "matrix0.loc[row_scaler.index] = matrix0.loc[row_scaler.index].mul(row_scaler)" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "6948f8fb", + "execution_count": 6, + "id": "d2b00ab0", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# SCALE BY COL\n", + "# Populating col scaler\n", + "log_absmatrix0 = np.log2(matrix0)\n", + "CSFs = {col:[] for col in set(log_absmatrix_solv.index.get_level_values(1))}\n", + "for k in CSFs.keys():\n", + " cval = log_absmatrix0.loc[(log_absmatrix0.index.get_level_values('col') == k),\"val\"]\n", + " lb,ub = min(cval),max(cval)\n", + " mid = np.mean([lb,ub])\n", + " CSFs[k] = 2**(-mid)\n", + "\n", + "# Create DataFrame of col scaler\n", + "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", + "col_scaler.index.name = 'col'\n", + "\n", + "# Create new matrix with scaled rows\n", + "new_matrix = matrix0.copy()\n", + "new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))] = new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))].mul(col_scaler)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2a19622e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original value: [ -8 , 0 ]\n", + "Row scaling val: [ -4 , 4 ]\n", + "New Matrix: [ -2 , 4 ]\n" + ] + } + ], + "source": [ + "def report(text,df):\n", + " log_absdf = df.copy()\n", + " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", + " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", + "\n", + "report(\"Original value\",matrix)\n", + "report(\"Row scaling val\",matrix0)\n", + "report(\"New Matrix\",new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ae88a4f2", "metadata": {}, "outputs": [ { @@ -201,7 +414,7 @@ "supply(seattle) 1.0 1.0 " ] }, - "execution_count": 4, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -212,8 +425,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "66e003c3", + "execution_count": 9, + "id": "2dc3412b", "metadata": {}, "outputs": [ { @@ -259,21 +472,21 @@ " \n", " \n", " _obj\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", + " 12649.110641\n", + " 22768.399153\n", + " 0.000032\n", + " 0.000177\n", + " 21503.488089\n", + " 31622.776602\n", + " 22768.399153\n", " \n", " \n", " demand(chicago)\n", " NaN\n", - " 1.0\n", + " 1.000000\n", " NaN\n", " NaN\n", - " 1.0\n", + " 1.000000\n", " NaN\n", " NaN\n", " \n", @@ -281,10 +494,10 @@ " demand(new-york)\n", " NaN\n", " NaN\n", - " 1.0\n", + " 1.000000\n", " NaN\n", " NaN\n", - " 1.0\n", + " 1.000000\n", " NaN\n", " \n", " \n", @@ -292,17 +505,17 @@ " NaN\n", " NaN\n", " NaN\n", - " 1.0\n", + " 1.000000\n", " NaN\n", " NaN\n", - " 1.0\n", + " 1.000000\n", " \n", " \n", " supply(san-diego)\n", " NaN\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", + " 1.000000\n", + " 1.000000\n", + " 1.000000\n", " NaN\n", " NaN\n", " NaN\n", @@ -313,56 +526,56 @@ " NaN\n", " NaN\n", " NaN\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", + " 1.000000\n", + " 1.000000\n", + " 1.000000\n", " \n", " \n", "\n", "" ], "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.0 1.0 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.0 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.0 \n", - "supply(seattle) NaN NaN NaN \n", + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 12649.110641 22768.399153 0.000032 \n", + "demand(chicago) NaN 1.000000 NaN \n", + "demand(new-york) NaN NaN 1.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.000000 1.000000 \n", + "supply(seattle) NaN NaN NaN \n", "\n", "col x(san-diego,topeka) x(seattle,chicago) \\\n", "row \n", - "_obj 1.0 1.0 \n", - "demand(chicago) NaN 1.0 \n", + "_obj 0.000177 21503.488089 \n", + "demand(chicago) NaN 1.000000 \n", "demand(new-york) NaN NaN \n", - "demand(topeka) 1.0 NaN \n", - "supply(san-diego) 1.0 NaN \n", - "supply(seattle) NaN 1.0 \n", + "demand(topeka) 1.000000 NaN \n", + "supply(san-diego) 1.000000 NaN \n", + "supply(seattle) NaN 1.000000 \n", "\n", "col x(seattle,new-york) x(seattle,topeka) \n", "row \n", - "_obj 1.0 1.0 \n", + "_obj 31622.776602 22768.399153 \n", "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", + "demand(new-york) 1.000000 NaN \n", + "demand(topeka) NaN 1.000000 \n", "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " + "supply(seattle) 1.000000 1.000000 " ] }, - "execution_count": 5, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "showme(matrix_sbin)" + "showme(matrix0)" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "92838309", + "execution_count": 10, + "id": "79e389c1", "metadata": {}, "outputs": [ { @@ -408,21 +621,21 @@ " \n", " \n", " _obj\n", - " 0.0\n", - " 0.847997\n", - " -28.575425\n", - " -26.089998\n", - " 0.765535\n", - " 1.321928\n", - " 0.847997\n", + " 12649.110641\n", + " 22768.399153\n", + " 0.005623\n", + " 0.013307\n", + " 21503.488089\n", + " 31622.776602\n", + " 22768.399153\n", " \n", " \n", " demand(chicago)\n", " NaN\n", - " 0.000000\n", + " 1.000000\n", " NaN\n", " NaN\n", - " 0.000000\n", + " 1.000000\n", " NaN\n", " NaN\n", " \n", @@ -430,10 +643,10 @@ " demand(new-york)\n", " NaN\n", " NaN\n", - " 0.000000\n", + " 177.827941\n", " NaN\n", " NaN\n", - " 0.000000\n", + " 1.000000\n", " NaN\n", " \n", " \n", @@ -441,18 +654,18 @@ " NaN\n", " NaN\n", " NaN\n", - " 0.000000\n", + " 75.146020\n", " NaN\n", " NaN\n", - " 0.000000\n", + " 1.000000\n", " \n", " \n", " supply(san-diego)\n", " NaN\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", + " 1.000000\n", + " 177.827941\n", + " 75.146020\n", + " NaN\n", " NaN\n", " NaN\n", " \n", @@ -462,129 +675,56 @@ " NaN\n", " NaN\n", " NaN\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", + " 1.000000\n", + " 1.000000\n", + " 1.000000\n", " \n", " \n", "\n", "" ], "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 0.0 0.847997 -28.575425 \n", - "demand(chicago) NaN 0.000000 NaN \n", - "demand(new-york) NaN NaN 0.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.000000 0.000000 \n", - "supply(seattle) NaN NaN NaN \n", + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 12649.110641 22768.399153 0.005623 \n", + "demand(chicago) NaN 1.000000 NaN \n", + "demand(new-york) NaN NaN 177.827941 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.000000 177.827941 \n", + "supply(seattle) NaN NaN NaN \n", "\n", "col x(san-diego,topeka) x(seattle,chicago) \\\n", "row \n", - "_obj -26.089998 0.765535 \n", - "demand(chicago) NaN 0.000000 \n", + "_obj 0.013307 21503.488089 \n", + "demand(chicago) NaN 1.000000 \n", "demand(new-york) NaN NaN \n", - "demand(topeka) 0.000000 NaN \n", - "supply(san-diego) 0.000000 NaN \n", - "supply(seattle) NaN 0.000000 \n", + "demand(topeka) 75.146020 NaN \n", + "supply(san-diego) 75.146020 NaN \n", + "supply(seattle) NaN 1.000000 \n", "\n", "col x(seattle,new-york) x(seattle,topeka) \n", "row \n", - "_obj 1.321928 0.847997 \n", + "_obj 31622.776602 22768.399153 \n", "demand(chicago) NaN NaN \n", - "demand(new-york) 0.000000 NaN \n", - "demand(topeka) NaN 0.000000 \n", + "demand(new-york) 1.000000 NaN \n", + "demand(topeka) NaN 1.000000 \n", "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.000000 0.000000 " + "supply(seattle) 1.000000 1.000000 " ] }, - "execution_count": 7, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# calculate log base 2 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", - " np.absolute(\n", - " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", - "\n", - "log_absmatrix = showme(log_absmatrix)\n", - "log_absmatrix" - ] - }, - { - "cell_type": "markdown", - "id": "a4435293", - "metadata": {}, - "source": [ - "## Start Looping" + "showme(new_matrix)" ] }, { "cell_type": "code", - "execution_count": 66, - "id": "6dbeb665", - "metadata": {}, - "outputs": [], - "source": [ - "RSFs = []\n", - "for row in log_absmatrix.index:\n", - " rval = log_absmatrix.loc[row].fillna(0)\n", - " lb,ub = min(rval),max(rval)\n", - " mid = np.mean([lb,ub])\n", - " RSFs += [2**(-mid)]\n", - "\n", - "matrix0 = showme(matrix).mul(RSFs,axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "e0e3dd97", - "metadata": {}, - "outputs": [], - "source": [ - "log_absmatrix0 = np.log2(matrix0)\n", - "CSFs = []\n", - "for col in log_absmatrix0.columns:\n", - " cval = log_absmatrix0[col].fillna(0)\n", - " lb,ub = min(cval),max(cval)\n", - " mid = np.mean([lb,ub])\n", - " CSFs += [2**(-mid)]\n", - "new_matrix = showme(matrix).mul(row_scaler,axis=0).mul(CSFs,axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "2e5a0796", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original value: [ -8 , 0 ]\n", - "Row scaling val: [ -4 , 4 ]\n", - "New Matrix: [ -2 , 2 ]\n" - ] - } - ], - "source": [ - "def report(text,df):\n", - " print(f\"{text}:\",\"[\",np.int32(np.min(np.log10(df))),\",\",np.int32(np.max(np.log10(df))),\"]\")\n", - "report(\"Original value\",showme(matrix))\n", - "report(\"Row scaling val\",matrix0)\n", - "report(\"New Matrix\",new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "c33ccdcf", + "execution_count": 11, + "id": "72997b6c", "metadata": {}, "outputs": [ { @@ -607,282 +747,77 @@ "\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)val
rowcol
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaNx(san-diego,new-york)177.827941
supply(seattle)NaNNaNNaNNaN1.01.01.0x(san-diego,topeka)75.146020
\n", "" ], "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " + " val\n", + "col \n", + "x(san-diego,new-york) 177.827941\n", + "x(san-diego,topeka) 75.146020" ] }, - "execution_count": 69, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "showme(matrix)" + "col_scaler" ] }, { "cell_type": "code", - "execution_count": 70, - "id": "0d1675e0", + "execution_count": 12, + "id": "1405bae8", "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 12649.110641 22768.399153 0.000032 \n", - "demand(chicago) NaN 1.000000 NaN \n", - "demand(new-york) NaN NaN 1.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.000000 1.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.000177 21503.488089 \n", - "demand(chicago) NaN 1.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000 NaN \n", - "supply(san-diego) 1.000000 NaN \n", - "supply(seattle) NaN 1.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 31622.776602 22768.399153 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.000000 NaN \n", - "demand(topeka) NaN 1.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.000000 1.000000 " - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "x(san-diego,new-york)\n", + "-28.575424759098897 -14.287712379549449 0.0\n", + "19999.99999999999\n", + "x(san-diego,topeka)\n", + "-26.089997931928657 -13.044998965964329 0.0\n", + "8451.542547285166\n" + ] } ], "source": [ - "matrix0" + "for k in CSFs.keys():\n", + " print(k)\n", + " cval = log_absmatrix.loc[(log_absmatrix.index.get_level_values('col') == k),\"val\"]\n", + " lb,ub = min(cval),max(cval)\n", + " mid = np.mean([lb,ub])\n", + " print(lb,mid,ub)\n", + " print(2**(-mid))\n", + " " ] }, { "cell_type": "code", - "execution_count": 71, - "id": "3596c26a", + "execution_count": 13, + "id": "90c6a12e", "metadata": {}, "outputs": [ { @@ -928,21 +863,21 @@ " \n", " \n", " _obj\n", - " 112.468265\n", - " 150.892012\n", - " 0.005623\n", - " 0.013307\n", - " 146.640677\n", - " 177.827941\n", - " 150.892012\n", + " 0.0\n", + " 0.847997\n", + " -28.575425\n", + " -26.089998\n", + " 0.765535\n", + " 1.321928\n", + " 0.847997\n", " \n", " \n", " demand(chicago)\n", " NaN\n", - " 0.006627\n", + " 0.000000\n", " NaN\n", " NaN\n", - " 0.006819\n", + " 0.000000\n", " NaN\n", " NaN\n", " \n", @@ -950,10 +885,10 @@ " demand(new-york)\n", " NaN\n", " NaN\n", - " 177.827941\n", + " 0.000000\n", " NaN\n", " NaN\n", - " 0.005623\n", + " 0.000000\n", " NaN\n", " \n", " \n", @@ -961,17 +896,17 @@ " NaN\n", " NaN\n", " NaN\n", - " 75.146020\n", + " 0.000000\n", " NaN\n", " NaN\n", - " 0.006627\n", + " 0.000000\n", " \n", " \n", " supply(san-diego)\n", " NaN\n", - " 0.006627\n", - " 177.827941\n", - " 75.146020\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", " NaN\n", " NaN\n", " NaN\n", @@ -982,70 +917,72 @@ " NaN\n", " NaN\n", " NaN\n", - " 0.006819\n", - " 0.005623\n", - " 0.006627\n", + " 0.000000\n", + " 0.000000\n", + " 0.000000\n", " \n", " \n", "\n", "" ], "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 112.468265 150.892012 0.005623 \n", - "demand(chicago) NaN 0.006627 NaN \n", - "demand(new-york) NaN NaN 177.827941 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.006627 177.827941 \n", - "supply(seattle) NaN NaN NaN \n", + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 0.0 0.847997 -28.575425 \n", + "demand(chicago) NaN 0.000000 NaN \n", + "demand(new-york) NaN NaN 0.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.000000 0.000000 \n", + "supply(seattle) NaN NaN NaN \n", "\n", "col x(san-diego,topeka) x(seattle,chicago) \\\n", "row \n", - "_obj 0.013307 146.640677 \n", - "demand(chicago) NaN 0.006819 \n", + "_obj -26.089998 0.765535 \n", + "demand(chicago) NaN 0.000000 \n", "demand(new-york) NaN NaN \n", - "demand(topeka) 75.146020 NaN \n", - "supply(san-diego) 75.146020 NaN \n", - "supply(seattle) NaN 0.006819 \n", + "demand(topeka) 0.000000 NaN \n", + "supply(san-diego) 0.000000 NaN \n", + "supply(seattle) NaN 0.000000 \n", "\n", "col x(seattle,new-york) x(seattle,topeka) \n", "row \n", - "_obj 177.827941 150.892012 \n", + "_obj 1.321928 0.847997 \n", "demand(chicago) NaN NaN \n", - "demand(new-york) 0.005623 NaN \n", - "demand(topeka) NaN 0.006627 \n", + "demand(new-york) 0.000000 NaN \n", + "demand(topeka) NaN 0.000000 \n", "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.005623 0.006627 " + "supply(seattle) 0.000000 0.000000 " ] }, - "execution_count": 71, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "new_matrix" + "showme(log_absmatrix)" ] }, { "cell_type": "code", - "execution_count": 72, - "id": "85bc031e", + "execution_count": null, + "id": "fa0b3167", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "fcd62647", + "metadata": {}, + "source": [ + "## Modify below later" + ] + }, + { + "cell_type": "raw", + "id": "18e32bfb", "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'list' object has no attribute 'items'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[72], line 4\u001b[0m\n\u001b[0;32m 2\u001b[0m prescale_args \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m s \u001b[38;5;129;01min\u001b[39;00m scalers:\n\u001b[1;32m----> 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k,v \u001b[38;5;129;01min\u001b[39;00m \u001b[43ms\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m():\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_obj\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 6\u001b[0m k_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_obj.scale\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", - "\u001b[1;31mAttributeError\u001b[0m: 'list' object has no attribute 'items'" - ] - } - ], "source": [ "scalers = [RSFs,CSFs]\n", "prescale_args = {}\n", @@ -1072,77 +1009,27 @@ ] }, { - "cell_type": "code", - "execution_count": 12, - "id": "2751f1ad", + "cell_type": "raw", + "id": "bf27ab32", "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "demand.scale('new-york')= 2048.0;\n", - "'_obj.scale'= 1.0;\n", - "supply.scale('seattle')= 8.0;\n", - "supply.scale('san-diego')= 32768.0;\n", - "demand.scale('topeka')= 1024.0;\n", - "demand.scale('chicago')= 32.0;\n", - "x.scale('seattle','new-york')= 8.0;\n", - "x.scale('san-diego','topeka')= 262144.0;\n", - "x.scale('seattle','chicago')= 8.0;\n", - "x.scale('seattle','topeka')= 8.0;\n", - "x.scale('san-diego','chicago')= 128.0;\n", - "x.scale('san-diego','new-york')= 524288.0;\n", - "'constobj.scale'= 1.0;\n" - ] - } - ], "source": [ "print(gams_args)" ] }, { - "cell_type": "code", - "execution_count": 13, - "id": "656dbd7b", + "cell_type": "markdown", + "id": "136d1806", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19.0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "np.log2(524288.0)" + "np.log10(524288.0)" ] }, { - "cell_type": "code", - "execution_count": 14, - "id": "9a9a3956", + "cell_type": "raw", + "id": "6aa9b84d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Old Matrix stats:\n", - ">> log10 coefficient range: -9.0 -- 0.0\n", - "\n", - "New Matrix stats:\n", - ">> log10 coefficient range: -3.0 -- 2.0\n", - "\n" - ] - } - ], "source": [ "# Printing stats\n", "\n", @@ -1162,71 +1049,17 @@ ] }, { - "cell_type": "code", - "execution_count": 19, - "id": "62a7999e", + "cell_type": "raw", + "id": "ceeb7057", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([ 2., 0., 0., 0., 0., 0., 0., 0., 0., 17.]),\n", - " array([-8.60205999, -7.70205999, -6.80205999, -5.90205999, -5.00205999,\n", - " -4.10205999, -3.20205999, -2.30205999, -1.40205999, -0.50205999,\n", - " 0.39794001]),\n", - " )" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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//645JJL4iUveUkceeSR0djYGO94xzti586dWc4MANSwHsdHZ2dnTJw4MVasWHHQY48//nhs2rQplixZEps2bYrvfe97sWXLlnjDG96QybAAQO2r6+kTmpubo7m5+ZCPNTQ0xB133NHt2Be+8IU47bTT4tFHH42xY8c+uykBgD6jx/HRUx0dHZHL5eIFL3jBIR8vFotRLBbL+4VCodIjAQBVVNEPnP773/+OSy65JN761rdGfX39Ic9pa2uLhoaG8tbU1FTJkQCAKqtYfOzfvz/OPffcKJVKcd111z3lea2trdHR0VHe2tvbKzUSANALVORtl/+Gx5///Oe48847n/KuR0REPp+PfD5fiTEAgF4o8/j4b3g88sgjcdddd8WIESOyXgIAqGE9jo99+/bF1q1by/vbtm2LzZs3x/Dhw2PMmDHx5je/OTZt2hS33XZbHDhwIHbt2hUREcOHD49BgwZlNzkAUJN6HB8bNmyIGTNmlPdbWloiImL+/PnxiU98Ir7//e9HRMSkSZO6Pe+uu+6K6dOnP/tJAYA+ocfxMX369CiVSk/5+NM9BgDgu10AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASfU4PtavXx9z586NxsbGyOVysWbNmm6Pl0qlWLp0aYwZMyaGDBkSM2fOjEceeSSreQGAGtfj+Ojs7IyJEyfGihUrDvn41VdfHZ///Odj5cqV8atf/SqOPPLImDVrVvz73/9+zsMCALWvrqdPaG5ujubm5kM+ViqVYvny5fHxj388zjzzzIiI+OpXvxqjRo2KNWvWxFve8pbnNi0AUPMy/czHtm3bYteuXTFz5szysYaGhpg6dWrce++9h3xOsViMQqHQbQMA+q5M42PXrl0RETFq1Khux0eNGlV+7Mna2tqioaGhvDU1NWU5EgDQy1T9t11aW1ujo6OjvLW3t1d7JACggjKNj9GjR0dExO7du7sd3717d/mxJ8vn81FfX99tAwD6rkzjY8KECTF69OhYt25d+VihUIhf/epXcfrpp2e5FABQo3r82y779u2L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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "plt.hist(np.log10(matrix))" ] }, { - "cell_type": "code", - "execution_count": 20, - "id": "1f49d32f", + "cell_type": "raw", + "id": "e869652f", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([4., 1., 0., 0., 1., 4., 1., 5., 0., 3.]),\n", - " array([-2.88249007, -2.35341707, -1.82434407, -1.29527106, -0.76619806,\n", - " -0.23712505, 0.29194795, 0.82102095, 1.35009396, 1.87916696,\n", - " 2.40823997]),\n", - " )" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUIUlEQVR4nO3dbYxU9dnA4XuBMqDurvIOYRHUqFUCTREIaAy0VEsMLU1qGmMqJca0ZiEl2zayTVrkg1mSNtZGCdKmxS8SaNMgjY1aSwQ+1FWEkooNpFAJK8iLJe7CPulg2Hk+POk+pQI6yz0MA9eVTOKcPbPnzp9l+XnmzExdqVQqBQBAgn7VHgAAuHwICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgzYCLfcCenp44dOhQ1NfXR11d3cU+PADQB6VSKU6cOBFjxoyJfv3OfV7ioofFoUOHoqmp6WIfFgBI0NHREWPHjj3n1y96WNTX10fE/w3W0NBwsQ8PAPRBV1dXNDU19f47fi4XPSz+/fRHQ0ODsACAGvNJlzG4eBMASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0ZYXF448/HnV1dWfcbr311krNBgDUmLI/K+T222+PP/3pT///DQZc9I8bAQAuUWVXwYABA2LUqFGVmAUAqHFlX2Px97//PcaMGRM33HBDPPjgg3HgwIHz7l8sFqOrq+uMGwBweaorlUqlT7vzSy+9FCdPnoxbbrkl3n///Vi+fHkcPHgwdu3adc7PZ3/88cdj+fLlH9ve2dnpY9MB+mj80j9Ue4Sy7V9xX7VH4AJ0dXVFY2PjJ/77XVZY/LcPP/wwrr/++njyySfj4YcfPus+xWIxisXiGYM1NTUJC4ALICy42D5tWFzQlZfXXntt3HzzzbF3795z7lMoFKJQKFzIYQCAGnFB72Nx8uTJ2LdvX4wePTprHgCghpUVFt///vdjy5YtsX///vjzn/8cX/va16J///7xwAMPVGo+AKCGlPVUyHvvvRcPPPBA/POf/4zhw4fHXXfdFe3t7TF8+PBKzQcA1JCywmLdunWVmgMAuAz4rBAAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSXFBYrFixIurq6mLJkiVJ4wAAtazPYbFt27ZYvXp1TJo0KXMeAKCG9SksTp48GQ8++GD88pe/jOuuuy57JgCgRvUpLJqbm+O+++6LOXPmfOK+xWIxurq6zrgBAJenAeU+YN26dbFjx47Ytm3bp9q/ra0tli9fXvZgfTF+6R8uynEy7V9xX7VHgFT+HsKVrawzFh0dHfHd7343nn/++Rg0aNCnekxra2t0dnb23jo6Ovo0KABw6SvrjMX27dvj6NGj8fnPf7532+nTp2Pr1q3xzDPPRLFYjP79+5/xmEKhEIVCIWdaAOCSVlZYfPGLX4y33377jG0LFy6MW2+9NR577LGPRQUAcGUpKyzq6+tj4sSJZ2y7+uqrY+jQoR/bDgBcebzzJgCQpuxXhfy3zZs3J4wBAFwOnLEAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANKUFRarVq2KSZMmRUNDQzQ0NMSMGTPipZdeqtRsAECNKSssxo4dGytWrIjt27fHW2+9FV/4whfiq1/9arzzzjuVmg8AqCEDytl53rx5Z9x/4oknYtWqVdHe3h6333576mAAQO0pKyz+0+nTp+O3v/1tdHd3x4wZM865X7FYjGKx2Hu/q6urr4cEAC5xZYfF22+/HTNmzIh//etfcc0118SGDRvitttuO+f+bW1tsXz58gsaEgCqYfzSP1R7hLLtX3FfVY9f9qtCbrnllti5c2e88cYb8eijj8aCBQvib3/72zn3b21tjc7Ozt5bR0fHBQ0MAFy6yj5jMXDgwLjpppsiImLKlCmxbdu2+PnPfx6rV68+6/6FQiEKhcKFTQkA1IQLfh+Lnp6eM66hAACuXGWdsWhtbY25c+fGuHHj4sSJE7F27drYvHlzvPLKK5WaDwCoIWWFxdGjR+Ohhx6K999/PxobG2PSpEnxyiuvxJe+9KVKzQcA1JCywuJXv/pVpeYAAC4DPisEAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEhTVli0tbXF1KlTo76+PkaMGBHz58+PPXv2VGo2AKDGlBUWW7Zsiebm5mhvb49XX301Pvroo7jnnnuiu7u7UvMBADVkQDk7v/zyy2fcf+6552LEiBGxffv2uPvuu1MHAwBqT1lh8d86OzsjImLIkCHn3KdYLEaxWOy939XVdSGHBAAuYX2+eLOnpyeWLFkSd955Z0ycOPGc+7W1tUVjY2Pvrampqa+HBAAucX0Oi+bm5ti1a1esW7fuvPu1trZGZ2dn762jo6OvhwQALnF9eipk0aJF8eKLL8bWrVtj7Nix5923UChEoVDo03AAQG0pKyxKpVIsXrw4NmzYEJs3b44JEyZUai4AoAaVFRbNzc2xdu3a2LhxY9TX18fhw4cjIqKxsTEGDx5ckQEBgNpR1jUWq1atis7Ozpg1a1aMHj2697Z+/fpKzQcA1JCynwoBADgXnxUCAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "plt.hist(np.log10(new_matrix))" ] diff --git a/message_ix/tools/lp_diag/coeff_matrix.xlsx b/message_ix/tools/lp_diag/coeff_matrix.xlsx deleted file mode 100644 index a65b48f127829125dbb2fc4c89df77232f23b156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7326 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 diff --git a/message_ix/tools/lp_diag/cplex.opt b/message_ix/tools/lp_diag/cplex.opt index 195baf34c..569f4249d 100644 --- a/message_ix/tools/lp_diag/cplex.opt +++ b/message_ix/tools/lp_diag/cplex.opt @@ -1 +1 @@ -writemps=scalemod_mps.mps +writemps=transport diff --git a/message_ix/tools/lp_diag/transport_mpstest_mps b/message_ix/tools/lp_diag/transport_mpstest_mps deleted file mode 100644 index 00e6310e8..000000000 --- a/message_ix/tools/lp_diag/transport_mpstest_mps +++ /dev/null @@ -1,38 +0,0 @@ -* ENCODING=ISO-8859-1 -NAME gamsmodel -ROWS - N _obj - L supply(seattle) - L supply(san-diego) - G demand(new-york) - G demand(chicago) - G demand(topeka) -COLUMNS - x(seattle,new-york) _obj 2.5 - x(seattle,new-york) supply(seattle) 1 - x(seattle,new-york) demand(new-york) 1 - x(seattle,chicago) _obj 1.7 - x(seattle,chicago) supply(seattle) 1 - x(seattle,chicago) demand(chicago) 1 - x(seattle,topeka) _obj 1.8 - x(seattle,topeka) supply(seattle) 1 - x(seattle,topeka) demand(topeka) 1 - x(san-diego,new-york) _obj 2.5e-9 - x(san-diego,new-york) supply(san-diego) 1 - x(san-diego,new-york) demand(new-york) 1 - x(san-diego,chicago) _obj 1.8 - x(san-diego,chicago) supply(san-diego) 1 - x(san-diego,chicago) demand(chicago) 1 - x(san-diego,topeka) _obj 1.4e-8 - x(san-diego,topeka) supply(san-diego) 1 - x(san-diego,topeka) demand(topeka) 1 - constobj _obj 1 -RHS - rhs supply(seattle) 350 - rhs supply(san-diego) 600 - rhs demand(new-york) 325 - rhs demand(chicago) 300 - rhs demand(topeka) 275 -BOUNDS - FX bnd constobj 0 -ENDATA diff --git a/message_ix/tools/lp_diag/transport_mpstest_scaled_mps b/message_ix/tools/lp_diag/transport_mpstest_scaled_mps deleted file mode 100644 index 00ba5bf1a..000000000 --- a/message_ix/tools/lp_diag/transport_mpstest_scaled_mps +++ /dev/null @@ -1,38 +0,0 @@ -* ENCODING=ISO-8859-1 -NAME gamsmodel -ROWS - N _obj - L supply(seattle) - L supply(san-diego) - G demand(new-york) - G demand(chicago) - G demand(topeka) -COLUMNS - x(seattle,new-york) _obj 0.0324675324675325 - x(seattle,new-york) supply(seattle) 1 - x(seattle,new-york) demand(new-york) 1 - x(seattle,chicago) _obj 0.0220779220779221 - x(seattle,chicago) supply(seattle) 1 - x(seattle,chicago) demand(chicago) 1 - x(seattle,topeka) _obj 0.0233766233766234 - x(seattle,topeka) supply(seattle) 1 - x(seattle,topeka) demand(topeka) 1 - x(san-diego,new-york) _obj 4.22077922077922e-10 - x(san-diego,new-york) supply(san-diego) 13 - x(san-diego,new-york) demand(new-york) 13 - x(san-diego,chicago) _obj 0.0233766233766234 - x(san-diego,chicago) supply(san-diego) 1 - x(san-diego,chicago) demand(chicago) 1 - x(san-diego,topeka) _obj 1.81818181818182e-9 - x(san-diego,topeka) supply(san-diego) 10 - x(san-diego,topeka) demand(topeka) 10 - constobj _obj 1 -RHS - rhs supply(seattle) 350 - rhs supply(san-diego) 600 - rhs demand(new-york) 325 - rhs demand(chicago) 300 - rhs demand(topeka) 275 -BOUNDS - FX bnd constobj 0 -ENDATA diff --git a/message_ix/tools/lp_diag/transport_original_mps b/message_ix/tools/lp_diag/transport_original_mps deleted file mode 100644 index 568c4b73d..000000000 --- a/message_ix/tools/lp_diag/transport_original_mps +++ /dev/null @@ -1,38 +0,0 @@ -* ENCODING=ISO-8859-1 -NAME gamsmodel -ROWS - N _obj - L supply(seattle) - L supply(san-diego) - G demand(new-york) - G demand(chicago) - G demand(topeka) -COLUMNS - x(seattle,new-york) _obj 2.5 - x(seattle,new-york) supply(seattle) 1 - x(seattle,new-york) demand(new-york) 1 - x(seattle,chicago) _obj 1.7 - x(seattle,chicago) supply(seattle) 1 - x(seattle,chicago) demand(chicago) 1 - x(seattle,topeka) _obj 1.8 - x(seattle,topeka) supply(seattle) 1 - x(seattle,topeka) demand(topeka) 1 - x(san-diego,new-york) _obj 2.5 - x(san-diego,new-york) supply(san-diego) 1 - x(san-diego,new-york) demand(new-york) 1 - x(san-diego,chicago) _obj 1.8 - x(san-diego,chicago) supply(san-diego) 1 - x(san-diego,chicago) demand(chicago) 1 - x(san-diego,topeka) _obj 1.4 - x(san-diego,topeka) supply(san-diego) 1 - x(san-diego,topeka) demand(topeka) 1 - constobj _obj 1 -RHS - rhs supply(seattle) 350 - rhs supply(san-diego) 600 - rhs demand(new-york) 325 - rhs demand(chicago) 300 - rhs demand(topeka) 275 -BOUNDS - FX bnd constobj 0 -ENDATA From a132de3fa31d1751837b5f5732710e0402f46d7e Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 12:37:51 +0200 Subject: [PATCH 13/25] finalized prototype - need clean up --- ...atrix Rescale Tool-Loop method-Copy1.ipynb | 910 ++++++++++++++++++ ...YPE] Matrix Rescale Tool-Loop method.ipynb | 898 +---------------- 2 files changed, 961 insertions(+), 847 deletions(-) create mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb new file mode 100644 index 000000000..af61b3ad8 --- /dev/null +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb @@ -0,0 +1,910 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fdbea0ef", + "metadata": {}, + "source": [ + "# MESSAGE-ix matrix improvement tool\n", + "\n", + "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", + "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", + "\n", + "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", + "\n", + "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", + "\n", + "$\n", + "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", + "$\n", + "\n", + "with $v$ is an acceptable matrix quality criteria.\n", + "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a771a522", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyomo.environ import *\n", + "from datetime import datetime\n", + "import xarray as xr\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def showme(df):\n", + " return df[\"val\"].unstack()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "afc2eec6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\pratama\\AppData\\Local\\Temp\\ipykernel_3996\\176877734.py:9: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", + " matrix_solv = pd.concat([matrix_lo,matrix_up])\n" + ] + } + ], + "source": [ + "# Load the whole matrix\n", + "matrix = (pd.read_csv('data/matrix_transport.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "# Load and create matrix with small and large coefficient\n", + "matrix_up = (pd.read_csv('data/matrix_transport_prob_upper.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "matrix_lo = (pd.read_csv('data/matrix_transport_prob_lower.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "matrix_solv = pd.concat([matrix_lo,matrix_up])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c8c05538", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
val
rowcol
_objx(san-diego,new-york)2.500000e-09
x(san-diego,topeka)1.400000e-08
\n", + "
" + ], + "text/plain": [ + " val\n", + "row col \n", + "_obj x(san-diego,new-york) 2.500000e-09\n", + " x(san-diego,topeka) 1.400000e-08" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "matrix_solv" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "92838309", + "metadata": {}, + "outputs": [], + "source": [ + "# calculate log base 10 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "#log_absmatrix = log_absmatrix.astype(int)\n", + "\n", + "# calculate log base 10 of the absolute value of the matrix\n", + "log_absmatrix_solv = matrix_solv.copy()\n", + "log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val'])))\n", + "#log_absmatrix_solv = log_absmatrix_solv.astype(int)" + ] + }, + { + "cell_type": "markdown", + "id": "a4435293", + "metadata": {}, + "source": [ + "## Start Looping" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6dbeb665", + "metadata": {}, + "outputs": [], + "source": [ + "# SCALE BY ROW\n", + "# Populating row scaler\n", + "RSFs = {row:[] for row in set(log_absmatrix_solv.index.get_level_values(0))}\n", + "for k in RSFs.keys():\n", + " rval = log_absmatrix.loc[(k),\"val\"]\n", + " lb,ub = min(rval),max(rval)\n", + " mid = np.mean([lb,ub])\n", + " RSFs[k] = 10**(-mid)\n", + "\n", + "# Create DataFrame of row scaler\n", + "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", + "row_scaler.index.name = 'row'\n", + "\n", + "# Create new matrix with scaled rows\n", + "matrix0 = matrix.copy()\n", + "matrix0.loc[row_scaler.index] = matrix0.loc[row_scaler.index].mul(row_scaler)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3855a334", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# SCALE BY COL\n", + "# Populating col scaler\n", + "log_absmatrix0 = np.log10(matrix0)\n", + "log_absmatrix0_solv = log_absmatrix0.loc[(log_absmatrix0[\"val\"] >= 2) | \n", + " (log_absmatrix0[\"val\"] <= -2)]\n", + "\n", + "CSFs = {col:[] for col in set(log_absmatrix0_solv.index.get_level_values(1))}\n", + "for k in CSFs.keys():\n", + " cval = log_absmatrix0.loc[(log_absmatrix0.index.get_level_values('col') == k),\"val\"]\n", + " lb,ub = min(cval),max(cval)\n", + " mid = np.mean([lb,ub])\n", + " CSFs[k] = 10**(-mid)\n", + "\n", + "# Create DataFrame of col scaler\n", + "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", + "col_scaler.index.name = 'col'\n", + "\n", + "# Create new matrix with scaled rows\n", + "new_matrix = matrix0.copy()\n", + "new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))] = new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))].mul(col_scaler)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "71b37ee7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original value: [ -8 , 0 ]\n", + "Row scaling val: [ -4 , 4 ]\n", + "New Matrix: [ -2 , 2 ]\n" + ] + } + ], + "source": [ + "def report(text,df):\n", + " log_absdf = df.copy()\n", + " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", + " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", + "\n", + "report(\"Original value\",matrix)\n", + "report(\"Row scaling val\",matrix0)\n", + "report(\"New Matrix\",new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0ba72b75", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 1.8 2.500000e-09 \n", + "demand(chicago) NaN 1.0 NaN \n", + "demand(new-york) NaN NaN 1.000000e+00 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.0 1.000000e+00 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 1.400000e-08 1.7 \n", + "demand(chicago) NaN 1.0 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000e+00 NaN \n", + "supply(san-diego) 1.000000e+00 NaN \n", + "supply(seattle) NaN 1.0 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 2.5 1.8 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.0 NaN \n", + "demand(topeka) NaN 1.0 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.0 1.0 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4b5e02f1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 12649.110641 22768.399153 0.000032 \n", + "demand(chicago) NaN 1.000000 NaN \n", + "demand(new-york) NaN NaN 1.000000 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 1.000000 1.000000 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.000177 21503.488089 \n", + "demand(chicago) NaN 1.000000 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 1.000000 NaN \n", + "supply(san-diego) 1.000000 NaN \n", + "supply(seattle) NaN 1.000000 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 31622.776602 22768.399153 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 1.000000 NaN \n", + "demand(topeka) NaN 1.000000 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 1.000000 1.000000 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(matrix0)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "96420c06", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.0150.8920120.0056230.013307146.640677177.827941150.892012
demand(chicago)NaN0.006627NaNNaN0.006819NaNNaN
demand(new-york)NaNNaN177.827941NaNNaN0.005623NaN
demand(topeka)NaNNaNNaN75.146020NaNNaN0.006627
supply(san-diego)NaN0.006627177.82794175.146020NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0068190.0056230.006627
\n", + "
" + ], + "text/plain": [ + "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", + "row \n", + "_obj 1.0 150.892012 0.005623 \n", + "demand(chicago) NaN 0.006627 NaN \n", + "demand(new-york) NaN NaN 177.827941 \n", + "demand(topeka) NaN NaN NaN \n", + "supply(san-diego) NaN 0.006627 177.827941 \n", + "supply(seattle) NaN NaN NaN \n", + "\n", + "col x(san-diego,topeka) x(seattle,chicago) \\\n", + "row \n", + "_obj 0.013307 146.640677 \n", + "demand(chicago) NaN 0.006819 \n", + "demand(new-york) NaN NaN \n", + "demand(topeka) 75.146020 NaN \n", + "supply(san-diego) 75.146020 NaN \n", + "supply(seattle) NaN 0.006819 \n", + "\n", + "col x(seattle,new-york) x(seattle,topeka) \n", + "row \n", + "_obj 177.827941 150.892012 \n", + "demand(chicago) NaN NaN \n", + "demand(new-york) 0.005623 NaN \n", + "demand(topeka) NaN 0.006627 \n", + "supply(san-diego) NaN NaN \n", + "supply(seattle) 0.005623 0.006627 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "showme(new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ebe59cc4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
val
col
x(seattle,topeka)0.006627
constobj0.000079
x(san-diego,new-york)177.827941
x(seattle,chicago)0.006819
x(seattle,new-york)0.005623
x(san-diego,chicago)0.006627
x(san-diego,topeka)75.146020
\n", + "
" + ], + "text/plain": [ + " val\n", + "col \n", + "x(seattle,topeka) 0.006627\n", + "constobj 0.000079\n", + "x(san-diego,new-york) 177.827941\n", + "x(seattle,chicago) 0.006819\n", + "x(seattle,new-york) 0.005623\n", + "x(san-diego,chicago) 0.006627\n", + "x(san-diego,topeka) 75.146020" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "col_scaler" + ] + }, + { + "cell_type": "markdown", + "id": "8b1f0009", + "metadata": {}, + "source": [ + "## Modify below later" + ] + }, + { + "cell_type": "raw", + "id": "83311e10", + "metadata": {}, + "source": [ + "scalers = [RSFs,CSFs]\n", + "prescale_args = {}\n", + "for s in scalers:\n", + " for k,v in s.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v})\n", + "\n", + "gams_args = (str(prescale_args)\n", + " .replace('{','')\n", + " .replace('}','')\n", + " .replace('\"','')\n", + " .replace(':','=')\n", + " .replace(', ',';\\n')\n", + " +';'\n", + " )" + ] + }, + { + "cell_type": "raw", + "id": "57398ef7", + "metadata": { + "scrolled": true + }, + "source": [ + "print(gams_args)" + ] + }, + { + "cell_type": "markdown", + "id": "42c09b85", + "metadata": {}, + "source": [ + "np.log10(524288.0)" + ] + }, + { + "cell_type": "raw", + "id": "54c88f5a", + "metadata": {}, + "source": [ + "# Printing stats\n", + "\n", + "matrices_dict = {'Old Matrix':matrix,\n", + " 'New Matrix':new_matrix,\n", + " } \n", + "\n", + "for k,v in matrices_dict.items():\n", + " print(f'{k} stats:')\n", + " print('>> log10 coefficient range:',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", + " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", + " print('')\n", + "\n", + "# TO DO:\n", + "# 1. plot histogram of log10 distribution of those matrix\n" + ] + }, + { + "cell_type": "raw", + "id": "353bf8c2", + "metadata": {}, + "source": [ + "plt.hist(np.log10(matrix))" + ] + }, + { + "cell_type": "raw", + "id": "3637a9ab", + "metadata": {}, + "source": [ + "plt.hist(np.log10(new_matrix))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c483f4d9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index eb535c5f3..a73808c77 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -46,134 +46,36 @@ "execution_count": 2, "id": "afc2eec6", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\pratama\\AppData\\Local\\Temp\\ipykernel_20164\\176877734.py:9: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", - " matrix_solv = pd.concat([matrix_lo,matrix_up])\n" - ] - } - ], + "outputs": [], "source": [ + "# determine absolute bound of exponent in matrix coeff\n", + "bound = 4 \n", + "\n", + "def solv(df, bound):\n", + " \"\"\"\n", + " this function filters matrix coefficient\n", + " dataframe in which the log of the coefficient \n", + " is lower or higher than the bound\n", + " \"\"\"\n", + " df_solv = df.loc[(df[\"val\"] >= bound) |\n", + " (df[\"val\"] <= -bound)]\n", + " return df_solv\n", + "\n", + "def make_logdf(df):\n", + " df.loc[df['val']!=0,'val'] = np.log10(np.absolute(df.loc[df['val']!=0,'val']))\n", + " return df\n", + " \n", + "\n", "# Load the whole matrix\n", - "matrix = (pd.read_csv('data/matrix_transport.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "# Load and create matrix with small and large coefficient\n", - "matrix_up = (pd.read_csv('data/matrix_transport_prob_upper.csv')\n", + "matrix = (pd.read_csv('data/matrix.csv')\n", " .set_index(['row','col'],drop=True)[['val']])\n", - "matrix_lo = (pd.read_csv('data/matrix_transport_prob_lower.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "matrix_solv = pd.concat([matrix_lo,matrix_up])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "989325af", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
rowcol
_objx(san-diego,new-york)2.500000e-09
x(san-diego,topeka)1.400000e-08
\n", - "
" - ], - "text/plain": [ - " val\n", - "row col \n", - "_obj x(san-diego,new-york) 2.500000e-09\n", - " x(san-diego,topeka) 1.400000e-08" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matrix_solv" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "92838309", - "metadata": {}, - "outputs": [], - "source": [ - "# calculate log base 10 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", - " np.absolute(\n", - " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", - "#log_absmatrix = log_absmatrix.astype(int)\n", "\n", "# calculate log base 10 of the absolute value of the matrix\n", - "log_absmatrix_solv = matrix_solv.copy()\n", - "log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val']=(np.log2(\n", - " np.absolute(\n", - " log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val'])))\n", - "#log_absmatrix_solv = log_absmatrix_solv.astype(int)" - ] - }, - { - "cell_type": "raw", - "id": "002ae57a", - "metadata": {}, - "source": [ - "# this is dummy\n", - "matrix = new_matrix.copy()\n", - "# calculate log base 2 of the absolute value of the matrix\n", "log_absmatrix = matrix.copy()\n", - "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", + "log_absmatrix = make_logdf(log_absmatrix)\n", "\n", - "# calculate log base 2 of the absolute value of the matrix\n", - "log_absmatrix_solv = matrix_solv.copy()\n", - "log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val'])))\n" + "# Create matrix with small and large coefficient\n", + "log_absmatrix_solv = solv(log_absmatrix,bound=bound)\n" ] }, { @@ -186,27 +88,19 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "99703146", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "6dbeb665", "metadata": {}, "outputs": [], "source": [ "# SCALE BY ROW\n", "# Populating row scaler\n", - "RSFs = {row:[] for row in set(log_absmatrix_solv.index.get_level_values(0))}\n", + "RSFs = {row:[] for row in set(log_absmatrix_solv.index.get_level_values(0))-set([\"_obj\"])}\n", "for k in RSFs.keys():\n", " rval = log_absmatrix.loc[(k),\"val\"]\n", " lb,ub = min(rval),max(rval)\n", " mid = np.mean([lb,ub])\n", - " RSFs[k] = 2**(-mid)\n", + " RSFs[k] = 10**(-mid)\n", "\n", "# Create DataFrame of row scaler\n", "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", @@ -214,13 +108,15 @@ "\n", "# Create new matrix with scaled rows\n", "matrix0 = matrix.copy()\n", - "matrix0.loc[row_scaler.index] = matrix0.loc[row_scaler.index].mul(row_scaler)" + "index_mod = matrix0.index.get_level_values('row').isin(row_scaler.index)\n", + "\n", + "matrix0.loc[index_mod] = matrix0.loc[index_mod].mul(row_scaler)" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "d2b00ab0", + "execution_count": 4, + "id": "351a01f9", "metadata": { "scrolled": false }, @@ -228,13 +124,16 @@ "source": [ "# SCALE BY COL\n", "# Populating col scaler\n", - "log_absmatrix0 = np.log2(matrix0)\n", - "CSFs = {col:[] for col in set(log_absmatrix_solv.index.get_level_values(1))}\n", + "log_absmatrix0 = matrix0.copy()\n", + "log_absmatrix0 = make_logdf(log_absmatrix0)\n", + "log_absmatrix0_solv = solv(log_absmatrix0,bound=bound)\n", + "\n", + "CSFs = {col:[] for col in set(log_absmatrix0_solv.index.get_level_values(1))-set([\"constobj\"])}\n", "for k in CSFs.keys():\n", " cval = log_absmatrix0.loc[(log_absmatrix0.index.get_level_values('col') == k),\"val\"]\n", " lb,ub = min(cval),max(cval)\n", " mid = np.mean([lb,ub])\n", - " CSFs[k] = 2**(-mid)\n", + " CSFs[k] = 10**(-mid)\n", "\n", "# Create DataFrame of col scaler\n", "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", @@ -242,22 +141,23 @@ "\n", "# Create new matrix with scaled rows\n", "new_matrix = matrix0.copy()\n", - "new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))] = new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))].mul(col_scaler)" + "index_mod = new_matrix.index.get_level_values('col').isin(col_scaler.index)\n", + "new_matrix.loc[index_mod] = new_matrix.loc[index_mod].mul(col_scaler)" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "2a19622e", + "execution_count": 5, + "id": "652c1c7d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Original value: [ -8 , 0 ]\n", + "Original value: [ -6 , 6 ]\n", "Row scaling val: [ -4 , 4 ]\n", - "New Matrix: [ -2 , 4 ]\n" + "New Matrix: [ -3 , 3 ]\n" ] } ], @@ -267,6 +167,7 @@ " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", " np.absolute(\n", " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", + " \n", " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", "\n", "report(\"Original value\",matrix)\n", @@ -274,706 +175,9 @@ "report(\"New Matrix\",new_matrix)" ] }, - { - "cell_type": "code", - "execution_count": 8, - "id": "ae88a4f2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "2dc3412b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 12649.110641 22768.399153 0.000032 \n", - "demand(chicago) NaN 1.000000 NaN \n", - "demand(new-york) NaN NaN 1.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.000000 1.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.000177 21503.488089 \n", - "demand(chicago) NaN 1.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000 NaN \n", - "supply(san-diego) 1.000000 NaN \n", - "supply(seattle) NaN 1.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 31622.776602 22768.399153 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.000000 NaN \n", - "demand(topeka) NaN 1.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.000000 1.000000 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix0)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "79e389c1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0056230.01330721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN177.827941NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN75.146020NaNNaN1.000000
supply(san-diego)NaN1.000000177.82794175.146020NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 12649.110641 22768.399153 0.005623 \n", - "demand(chicago) NaN 1.000000 NaN \n", - "demand(new-york) NaN NaN 177.827941 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.000000 177.827941 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.013307 21503.488089 \n", - "demand(chicago) NaN 1.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 75.146020 NaN \n", - "supply(san-diego) 75.146020 NaN \n", - "supply(seattle) NaN 1.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 31622.776602 22768.399153 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.000000 NaN \n", - "demand(topeka) NaN 1.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.000000 1.000000 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "72997b6c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
col
x(san-diego,new-york)177.827941
x(san-diego,topeka)75.146020
\n", - "
" - ], - "text/plain": [ - " val\n", - "col \n", - "x(san-diego,new-york) 177.827941\n", - "x(san-diego,topeka) 75.146020" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "col_scaler" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "1405bae8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "x(san-diego,new-york)\n", - "-28.575424759098897 -14.287712379549449 0.0\n", - "19999.99999999999\n", - "x(san-diego,topeka)\n", - "-26.089997931928657 -13.044998965964329 0.0\n", - "8451.542547285166\n" - ] - } - ], - "source": [ - "for k in CSFs.keys():\n", - " print(k)\n", - " cval = log_absmatrix.loc[(log_absmatrix.index.get_level_values('col') == k),\"val\"]\n", - " lb,ub = min(cval),max(cval)\n", - " mid = np.mean([lb,ub])\n", - " print(lb,mid,ub)\n", - " print(2**(-mid))\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "90c6a12e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj0.00.847997-28.575425-26.0899980.7655351.3219280.847997
demand(chicago)NaN0.000000NaNNaN0.000000NaNNaN
demand(new-york)NaNNaN0.000000NaNNaN0.000000NaN
demand(topeka)NaNNaNNaN0.000000NaNNaN0.000000
supply(san-diego)NaN0.0000000.0000000.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0000000.0000000.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 0.0 0.847997 -28.575425 \n", - "demand(chicago) NaN 0.000000 NaN \n", - "demand(new-york) NaN NaN 0.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.000000 0.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj -26.089998 0.765535 \n", - "demand(chicago) NaN 0.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 0.000000 NaN \n", - "supply(san-diego) 0.000000 NaN \n", - "supply(seattle) NaN 0.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 1.321928 0.847997 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 0.000000 NaN \n", - "demand(topeka) NaN 0.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.000000 0.000000 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(log_absmatrix)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fa0b3167", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", - "id": "fcd62647", + "id": "afabf47e", "metadata": {}, "source": [ "## Modify below later" @@ -981,7 +185,7 @@ }, { "cell_type": "raw", - "id": "18e32bfb", + "id": "b717d3b8", "metadata": {}, "source": [ "scalers = [RSFs,CSFs]\n", @@ -1010,7 +214,7 @@ }, { "cell_type": "raw", - "id": "bf27ab32", + "id": "f953f972", "metadata": { "scrolled": true }, @@ -1020,7 +224,7 @@ }, { "cell_type": "markdown", - "id": "136d1806", + "id": "24163828", "metadata": {}, "source": [ "np.log10(524288.0)" @@ -1028,7 +232,7 @@ }, { "cell_type": "raw", - "id": "6aa9b84d", + "id": "8598c36d", "metadata": {}, "source": [ "# Printing stats\n", @@ -1050,7 +254,7 @@ }, { "cell_type": "raw", - "id": "ceeb7057", + "id": "6190999a", "metadata": {}, "source": [ "plt.hist(np.log10(matrix))" @@ -1058,7 +262,7 @@ }, { "cell_type": "raw", - "id": "e869652f", + "id": "2363475f", "metadata": {}, "source": [ "plt.hist(np.log10(new_matrix))" From 936d4dd1bd319efeef2084838ca062121c529582 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 17:42:17 +0200 Subject: [PATCH 14/25] data handling improvement --- ...atrix Rescale Tool-Loop method-Copy1.ipynb | 90 ++- ...YPE] Matrix Rescale Tool-Loop method.ipynb | 600 ++++++++++++++++-- 2 files changed, 618 insertions(+), 72 deletions(-) diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb index af61b3ad8..460618bb7 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb @@ -51,7 +51,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\pratama\\AppData\\Local\\Temp\\ipykernel_3996\\176877734.py:9: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", + "C:\\Users\\pratama\\AppData\\Local\\Temp\\ipykernel_21808\\176877734.py:9: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", " matrix_solv = pd.concat([matrix_lo,matrix_up])\n" ] } @@ -696,6 +696,64 @@ "showme(new_matrix)" ] }, + { + "cell_type": "code", + "execution_count": 12, + "id": "121c0138", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
val
row
_obj12649.110641
\n", + "
" + ], + "text/plain": [ + " val\n", + "row \n", + "_obj 12649.110641" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "row_scaler" + ] + }, { "cell_type": "code", "execution_count": 11, @@ -732,33 +790,33 @@ " \n", " \n", " \n", - " x(seattle,topeka)\n", - " 0.006627\n", + " x(san-diego,topeka)\n", + " 75.146020\n", " \n", " \n", " constobj\n", " 0.000079\n", " \n", " \n", - " x(san-diego,new-york)\n", - " 177.827941\n", - " \n", - " \n", " x(seattle,chicago)\n", " 0.006819\n", " \n", " \n", + " x(san-diego,chicago)\n", + " 0.006627\n", + " \n", + " \n", + " x(san-diego,new-york)\n", + " 177.827941\n", + " \n", + " \n", " x(seattle,new-york)\n", " 0.005623\n", " \n", " \n", - " x(san-diego,chicago)\n", + " x(seattle,topeka)\n", " 0.006627\n", " \n", - " \n", - " x(san-diego,topeka)\n", - " 75.146020\n", - " \n", " \n", "\n", "" @@ -766,13 +824,13 @@ "text/plain": [ " val\n", "col \n", - "x(seattle,topeka) 0.006627\n", + "x(san-diego,topeka) 75.146020\n", "constobj 0.000079\n", - "x(san-diego,new-york) 177.827941\n", "x(seattle,chicago) 0.006819\n", - "x(seattle,new-york) 0.005623\n", "x(san-diego,chicago) 0.006627\n", - "x(san-diego,topeka) 75.146020" + "x(san-diego,new-york) 177.827941\n", + "x(seattle,new-york) 0.005623\n", + "x(seattle,topeka) 0.006627" ] }, "execution_count": 11, diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index a73808c77..31c79a35d 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -5,26 +5,510 @@ "id": "fdbea0ef", "metadata": {}, "source": [ - "# MESSAGE-ix matrix improvement tool\n", + "# MESSAGE-ix matrix improvement tool" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c5db0ec5", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyomo.environ import *\n", + "from datetime import datetime\n", + "import xarray as xr\n", "\n", - "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", - "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", + "import matplotlib.pyplot as plt\n", "\n", - "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", + "def showme(df):\n", + " return df[\"val\"].unstack()\n", "\n", - "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", + "path = 'data/matrix_transport.csv'\n", + "bound = 2\n", + "steps = 1\n", "\n", - "$\n", - "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", - "$\n", + "def solv(df, bound):\n", + " \"\"\"\n", + " this function filters matrix coefficient\n", + " dataframe in which the log of the coefficient \n", + " is lower or higher than the bound\n", + " \"\"\"\n", + " df_solv = df.loc[(df[\"val\"] >= bound) |\n", + " (df[\"val\"] <= -bound)]\n", + " return df_solv\n", + "\n", + "def make_logdf(df):\n", + " df.loc[df['val']!=0,'val'] = np.log10(np.absolute(df.loc[df['val']!=0,'val']))\n", + " return df\n", + "\n", + "def read_ix(df, lvl):\n", + " return df.index.get_level_values(lvl)\n", + " \n", + "def show_range(text,df):\n", + " log_absdf = df.copy()\n", + " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", + " np.absolute(\n", + " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", + " \n", + " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", + "\n", + "def make_scale(path, bound, steps):\n", + " # Load the matrix coefficient\n", + " data = (pd.read_csv(path)\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "\n", + " matrix = data\n", + " # TODO: show_range(\"Unscaled range\",matrix)\n", + " show_range(\"Unscaled range\",matrix)\n", + " \n", + " scalers = {\"row\":[], \"col\":[]}\n", + " counter = 0\n", + " while counter < steps:\n", + " for s in scalers.keys():\n", + " # calculate log base 10 of the absolute value of the matrix\n", + " log_absmatrix = matrix.copy()\n", + " log_absmatrix = make_logdf(log_absmatrix)\n", "\n", - "with $v$ is an acceptable matrix quality criteria.\n", - "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" + " # Create matrix with small and large coefficient\n", + " log_absmatrix_solv = solv(log_absmatrix, bound=bound)\n", + "\n", + " # Populating row scaler\n", + " objective_ix = \"_obj\" if s == \"row\" else \"constobj\"\n", + " index_solv = [e for e in read_ix(log_absmatrix_solv,s) if e != objective_ix] # \n", + " #print(index_solv)\n", + "\n", + " SFs = {k:[] for k in index_solv}\n", + " for k in SFs.keys():\n", + " index_val = (read_ix(log_absmatrix,s) == k)\n", + " dflog_val = log_absmatrix.loc[index_val,\"val\"]\n", + " lb,ub = np.int32(min(dflog_val)),np.int32(max(dflog_val))\n", + " mid = np.int32(np.mean([lb,ub]))\n", + " SFs[k] = 10.0**(-mid)\n", + " #print(SFs)\n", + "\n", + " # Create DataFrame of row scaler\n", + " scalers[s] = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", + " scalers[s].index.name = s\n", + "\n", + " # Create new matrix with scaled rows\n", + " index_mod = read_ix(matrix,s).isin(scalers[s].index)\n", + " matrix.loc[index_mod] = matrix.loc[index_mod].mul(scalers[s])\n", + "\n", + " # generating prescaler arguments for GAMS\n", + " prescale_args = {}\n", + " for key,val in scalers.items():\n", + " scaler_dict = val[\"val\"].to_dict()\n", + " for k,v in scaler_dict.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v}) \n", + "\n", + " # TODO: show_range(\"Scaled range \",matrix)\n", + " show_range(\"Scaled range \",matrix)\n", + " # Increment the counter\n", + " counter += 1\n", + "\n", + " return(prescale_args)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, + "id": "4a27c67c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unscaled range: [ -8 , 0 ]\n", + "Scaled range : [ -4 , 4 ]\n", + "Scaled range : [ -3 , 3 ]\n", + "Scaled range : [ -3 , 2 ]\n" + ] + }, + { + "data": { + "text/plain": [ + "{\"supply.scale('san-diego')\": 0.1,\n", + " \"demand.scale('new-york')\": 0.1,\n", + " \"demand.scale('topeka')\": 0.1,\n", + " \"x.scale('seattle','new-york')\": 1.0,\n", + " \"x.scale('seattle','topeka')\": 10.0,\n", + " \"x.scale('san-diego','new-york')\": 1.0,\n", + " \"x.scale('san-diego','chicago')\": 1.0,\n", + " \"x.scale('san-diego','topeka')\": 1.0}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "make_scale(path,bound,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "44652dda", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'scaler' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[5], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mscaler\u001b[49m[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrow\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;31mNameError\u001b[0m: name 'scaler' is not defined" + ] + } + ], + "source": [ + "scaler[\"row\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a36151be", + "metadata": {}, + "outputs": [], + "source": [ + "make_scale(path,bound,steps)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "572b9c01", + "metadata": {}, + "outputs": [], + "source": [ + "showme(matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "faaa2c35", + "metadata": {}, + "source": [ + "**Prototype - Dev**" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "667fd58c", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from pyomo.environ import *\n", + "from datetime import datetime\n", + "import xarray as xr\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def showme(df):\n", + " return df[\"val\"].unstack()\n", + "\n", + "# determine absolute bound of exponent in matrix coeff\n", + "bound = 4 \n", + "\n", + "def solv(df, bound):\n", + " \"\"\"\n", + " this function filters matrix coefficient\n", + " dataframe in which the log of the coefficient \n", + " is lower or higher than the bound\n", + " \"\"\"\n", + " df_solv = df.loc[(df[\"val\"] >= bound) |\n", + " (df[\"val\"] <= -bound)]\n", + " return df_solv\n", + "\n", + "def make_logdf(df):\n", + " df.loc[df['val']!=0,'val'] = np.log10(np.absolute(df.loc[df['val']!=0,'val']))\n", + " return df\n", + " \n", + "\n", + "# Load the whole matrix\n", + "matrix = (pd.read_csv('data/matrix_transport.csv')\n", + " .set_index(['row','col'],drop=True)[['val']])\n", + "\n", + "# calculate log base 10 of the absolute value of the matrix\n", + "log_absmatrix = matrix.copy()\n", + "log_absmatrix = make_logdf(log_absmatrix)\n", + "\n", + "# Create matrix with small and large coefficient\n", + "log_absmatrix_solv = solv(log_absmatrix,bound=bound)\n", + "\n", + "# SCALE BY ROW\n", + "# Populating row scaler\n", + "rows_solv = list(set(log_absmatrix_solv.index.get_level_values(\"row\"))\n", + " -set([\"_obj\"]))\n", + "\n", + "RSFs = {row:[] for row in rows_solv}\n", + "for k in RSFs.keys():\n", + " index_row = (log_absmatrix.index.get_level_values('row') == k)\n", + " rval = log_absmatrix.loc[index_row,\"val\"]\n", + " lb,ub = min(rval),max(rval)\n", + " mid = np.mean([lb,ub])\n", + " RSFs[k] = 10**(-mid)\n", + "\n", + "# Create DataFrame of row scaler\n", + "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", + "row_scaler.index.name = 'row'\n", + "\n", + "# Create new matrix with scaled rows\n", + "matrix0 = matrix.copy()\n", + "index_mod = matrix0.index.get_level_values('row').isin(row_scaler.index)\n", + "matrix0.loc[index_mod] = matrix0.loc[index_mod].mul(row_scaler)\n", + "\n", + "# SCALE BY COL\n", + "# Populating col scaler\n", + "log_absmatrix0 = matrix0.copy()\n", + "log_absmatrix0 = make_logdf(log_absmatrix0)\n", + "log_absmatrix0_solv = solv(log_absmatrix0,bound=bound)\n", + "\n", + "cols_solv = list(set(log_absmatrix_solv.index.get_level_values(\"col\"))\n", + " -set([\"constobj\"]))\n", + "CSFs = {col:[] for col in cols_solv}\n", + "for k in CSFs.keys():\n", + " index_col = (log_absmatrix0.index.get_level_values('col') == k)\n", + " cval = log_absmatrix0.loc[index_col,\"val\"]\n", + " lb,ub = min(cval),max(cval)\n", + " mid = np.mean([lb,ub])\n", + " CSFs[k] = 10**(-mid)\n", + "\n", + "# Create DataFrame of col scaler\n", + "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", + "col_scaler.index.name = 'col'\n", + "\n", + "# Create new matrix with scaled rows\n", + "new_matrix = matrix0.copy()\n", + "index_mod = new_matrix.index.get_level_values('col').isin(col_scaler.index)\n", + "new_matrix.loc[index_mod] = new_matrix.loc[index_mod].mul(col_scaler)\n", + "\n", + "scalers = [RSFs,CSFs]\n", + "prescale_args = {}\n", + "for s in scalers:\n", + " for k,v in s.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v})\n", + "\n", + "gams_args = (str(prescale_args)\n", + " .replace('{','')\n", + " .replace('}','')\n", + " .replace('\"','')\n", + " .replace(':','=')\n", + " .replace(', ',';\\n')\n", + " +';'\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "abbfa58f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
val
col
x(san-diego,new-york)20000.000000
x(san-diego,topeka)8451.542547
\n", + "
" + ], + "text/plain": [ + " val\n", + "col \n", + "x(san-diego,new-york) 20000.000000\n", + "x(san-diego,topeka) 8451.542547" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "col_scaler" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "eacf37eb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
val
col
x(san-diego,new-york)20000.0
\n", + "
" + ], + "text/plain": [ + " val\n", + "col \n", + "x(san-diego,new-york) 20000.0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "col_scaler2 = col_scaler.loc[[(\"x(san-diego,new-york)\")]]\n", + "col_scaler2" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "4fed41e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " val\n", + "col \n", + "x(san-diego,new-york) 4.000000e+08\n", + "x(san-diego,topeka) 8.451543e+03\n" + ] + } + ], + "source": [ + "final_scaler = col_scaler.mul(col_scaler2.reindex(col_scaler.index).fillna(1))\n", + "print(final_scaler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c662aa00", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3476533", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6974599c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1f8e88f", + "metadata": {}, + "outputs": [], + "source": [ + "report(\"Original value\",matrix)\n", + "report(\"Row scaling val\",matrix0)\n", + "report(\"New Matrix\",new_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "a771a522", "metadata": {}, "outputs": [], @@ -43,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "afc2eec6", "metadata": {}, "outputs": [], @@ -83,12 +567,12 @@ "id": "a4435293", "metadata": {}, "source": [ - "## Start Looping" + "**Start Looping**" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "6dbeb665", "metadata": {}, "outputs": [], @@ -115,8 +599,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "351a01f9", + "execution_count": null, + "id": "e36a578d", "metadata": { "scrolled": false }, @@ -147,20 +631,10 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "652c1c7d", + "execution_count": null, + "id": "ecdde9ae", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original value: [ -6 , 6 ]\n", - "Row scaling val: [ -4 , 4 ]\n", - "New Matrix: [ -3 , 3 ]\n" - ] - } - ], + "outputs": [], "source": [ "def report(text,df):\n", " log_absdf = df.copy()\n", @@ -177,16 +651,18 @@ }, { "cell_type": "markdown", - "id": "afabf47e", + "id": "18f6abac", "metadata": {}, "source": [ - "## Modify below later" + "**Modify below later**" ] }, { - "cell_type": "raw", - "id": "b717d3b8", + "cell_type": "code", + "execution_count": null, + "id": "6a2977c2", "metadata": {}, + "outputs": [], "source": [ "scalers = [RSFs,CSFs]\n", "prescale_args = {}\n", @@ -213,27 +689,23 @@ ] }, { - "cell_type": "raw", - "id": "f953f972", + "cell_type": "code", + "execution_count": null, + "id": "a6036657", "metadata": { - "scrolled": true + "scrolled": false }, + "outputs": [], "source": [ - "print(gams_args)" - ] - }, - { - "cell_type": "markdown", - "id": "24163828", - "metadata": {}, - "source": [ - "np.log10(524288.0)" + "# print(gams_args)" ] }, { - "cell_type": "raw", - "id": "8598c36d", + "cell_type": "code", + "execution_count": null, + "id": "e2470d75", "metadata": {}, + "outputs": [], "source": [ "# Printing stats\n", "\n", @@ -244,8 +716,8 @@ "for k,v in matrices_dict.items():\n", " print(f'{k} stats:')\n", " print('>> log10 coefficient range:',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", + " np.int32(np.log10(np.abs(v['val']).fillna(1)).min(axis=None)),'--',\n", + " np.int32(np.log10(np.abs(v['val']).fillna(1)).max(axis=None)))\n", " print('')\n", "\n", "# TO DO:\n", @@ -253,25 +725,41 @@ ] }, { - "cell_type": "raw", - "id": "6190999a", + "cell_type": "code", + "execution_count": null, + "id": "bdb8af8b", "metadata": {}, + "outputs": [], "source": [ - "plt.hist(np.log10(matrix))" + "fig, axs = plt.subplots(nrows=2, sharex=True)\n", + "axs[0].hist(make_logdf(matrix))\n", + "axs[1].hist(make_logdf(new_matrix))\n", + "axs[0].set_title(\"Unscaled\")\n", + "axs[1].set_title(\"Scaled\")\n", + "plt.tight_layout()\n", + "plt.show()" ] }, { - "cell_type": "raw", - "id": "2363475f", + "cell_type": "markdown", + "id": "2a598bf5", "metadata": {}, "source": [ - "plt.hist(np.log10(new_matrix))" + "# Finalized Prototype" ] }, { "cell_type": "code", "execution_count": null, - "id": "c483f4d9", + "id": "72632fc6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64d3bad7", "metadata": {}, "outputs": [], "source": [] From 1fcae7444c1e3e64cc61bf9dbb66e1d053da2405 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 18:21:26 +0200 Subject: [PATCH 15/25] Pre-cleanup --- ...YPE] Matrix Rescale Tool-Loop method.ipynb | 370 +++++++++++------- 1 file changed, 221 insertions(+), 149 deletions(-) diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index 31c79a35d..4423c22a8 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -10,8 +10,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "c5db0ec5", + "execution_count": 25, + "id": "c05c440f", "metadata": {}, "outputs": [], "source": [ @@ -77,7 +77,7 @@ "\n", " # Populating row scaler\n", " objective_ix = \"_obj\" if s == \"row\" else \"constobj\"\n", - " index_solv = [e for e in read_ix(log_absmatrix_solv,s) if e != objective_ix] # \n", + " index_solv = [e for e in read_ix(log_absmatrix_solv,s) if e != objective_ix] \n", " #print(index_solv)\n", "\n", " SFs = {k:[] for k in index_solv}\n", @@ -87,16 +87,26 @@ " lb,ub = np.int32(min(dflog_val)),np.int32(max(dflog_val))\n", " mid = np.int32(np.mean([lb,ub]))\n", " SFs[k] = 10.0**(-mid)\n", - " #print(SFs)\n", - "\n", + " \n", " # Create DataFrame of row scaler\n", + " if counter == 0:\n", + " multiplier = 1\n", + " else:\n", + " return_index = list(set(read_ix(log_absmatrix,s)))\n", + " multiplier = scalers[s].reindex(return_index).fillna(1)\n", " scalers[s] = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", + " scalers[s] = scalers[s].reindex(read_ix(log_absmatrix,s)).fillna(1)\n", " scalers[s].index.name = s\n", - "\n", + " scalers[s] = scalers[s].mul(multiplier)\n", + " \n", + " print(scalers[s])\n", + " \n", " # Create new matrix with scaled rows\n", " index_mod = read_ix(matrix,s).isin(scalers[s].index)\n", + " print(index_mod)\n", + " print(matrix.loc[index_mod])\n", " matrix.loc[index_mod] = matrix.loc[index_mod].mul(scalers[s])\n", - "\n", + " print(\"marker1\")\n", " # generating prescaler arguments for GAMS\n", " prescale_args = {}\n", " for key,val in scalers.items():\n", @@ -122,70 +132,85 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "4a27c67c", - "metadata": {}, + "execution_count": 26, + "id": "e6529d47", + "metadata": { + "scrolled": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unscaled range: [ -8 , 0 ]\n", - "Scaled range : [ -4 , 4 ]\n", - "Scaled range : [ -3 , 3 ]\n", - "Scaled range : [ -3 , 2 ]\n" + " val\n", + "row \n", + "_obj 1.0\n", + "supply(seattle) 1.0\n", + "demand(new-york) 1.0\n", + "_obj 1.0\n", + "supply(seattle) 1.0\n", + "demand(chicago) 1.0\n", + "_obj 1.0\n", + "supply(seattle) 1.0\n", + "demand(topeka) 1.0\n", + "_obj 1.0\n", + "supply(san-diego) 1.0\n", + "demand(new-york) 1.0\n", + "_obj 1.0\n", + "supply(san-diego) 1.0\n", + "demand(chicago) 1.0\n", + "_obj 1.0\n", + "supply(san-diego) 1.0\n", + "demand(topeka) 1.0\n", + "_obj 1.0\n", + "[ True True True True True True True True True True True True\n", + " True True True True True True True]\n", + " val\n", + "row col \n", + "_obj x(seattle,new-york) 2.500000e+00\n", + "supply(seattle) x(seattle,new-york) 1.000000e+00\n", + "demand(new-york) x(seattle,new-york) 1.000000e+00\n", + "_obj x(seattle,chicago) 1.700000e+00\n", + "supply(seattle) x(seattle,chicago) 1.000000e+00\n", + "demand(chicago) x(seattle,chicago) 1.000000e+00\n", + "_obj x(seattle,topeka) 1.800000e+00\n", + "supply(seattle) x(seattle,topeka) 1.000000e+00\n", + "demand(topeka) x(seattle,topeka) 1.000000e+00\n", + "_obj x(san-diego,new-york) 2.500000e-09\n", + "supply(san-diego) x(san-diego,new-york) 1.000000e+00\n", + "demand(new-york) x(san-diego,new-york) 1.000000e+00\n", + "_obj x(san-diego,chicago) 1.800000e+00\n", + "supply(san-diego) x(san-diego,chicago) 1.000000e+00\n", + "demand(chicago) x(san-diego,chicago) 1.000000e+00\n", + "_obj x(san-diego,topeka) 1.400000e-08\n", + "supply(san-diego) x(san-diego,topeka) 1.000000e+00\n", + "demand(topeka) x(san-diego,topeka) 1.000000e+00\n", + "_obj constobj 1.000000e+00\n" ] }, { - "data": { - "text/plain": [ - "{\"supply.scale('san-diego')\": 0.1,\n", - " \"demand.scale('new-york')\": 0.1,\n", - " \"demand.scale('topeka')\": 0.1,\n", - " \"x.scale('seattle','new-york')\": 1.0,\n", - " \"x.scale('seattle','topeka')\": 10.0,\n", - " \"x.scale('san-diego','new-york')\": 1.0,\n", - " \"x.scale('san-diego','chicago')\": 1.0,\n", - " \"x.scale('san-diego','topeka')\": 1.0}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "make_scale(path,bound,3)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "44652dda", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'scaler' is not defined", + "ename": "NotImplementedError", + "evalue": "Index._join_level on non-unique index is not implemented", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[5], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mscaler\u001b[49m[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrow\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;31mNameError\u001b[0m: name 'scaler' is not defined" + "\u001b[1;31mNotImplementedError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[26], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mmake_scale\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43mbound\u001b[49m\u001b[43m,\u001b[49m\u001b[43msteps\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[25], line 92\u001b[0m, in \u001b[0;36mmake_scale\u001b[1;34m(path, bound, steps)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[38;5;28mprint\u001b[39m(index_mod)\n\u001b[0;32m 91\u001b[0m \u001b[38;5;28mprint\u001b[39m(matrix\u001b[38;5;241m.\u001b[39mloc[index_mod])\n\u001b[1;32m---> 92\u001b[0m matrix\u001b[38;5;241m.\u001b[39mloc[index_mod] \u001b[38;5;241m=\u001b[39m \u001b[43mmatrix\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43mindex_mod\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmul\u001b[49m\u001b[43m(\u001b[49m\u001b[43mscalers\u001b[49m\u001b[43m[\u001b[49m\u001b[43ms\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 93\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarker1\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 94\u001b[0m \u001b[38;5;66;03m# generating prescaler arguments for GAMS\u001b[39;00m\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\frame.py:8104\u001b[0m, in \u001b[0;36mDataFrame.mul\u001b[1;34m(self, other, axis, level, fill_value)\u001b[0m\n\u001b[0;32m 8102\u001b[0m \u001b[38;5;129m@Appender\u001b[39m(ops\u001b[38;5;241m.\u001b[39mmake_flex_doc(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmul\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[0;32m 8103\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmul\u001b[39m(\u001b[38;5;28mself\u001b[39m, other, axis: Axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcolumns\u001b[39m\u001b[38;5;124m\"\u001b[39m, level\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, fill_value\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m-> 8104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_flex_arith_method\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 8105\u001b[0m \u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmul\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\n\u001b[0;32m 8106\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\frame.py:7995\u001b[0m, in \u001b[0;36mDataFrame._flex_arith_method\u001b[1;34m(self, other, op, axis, level, fill_value)\u001b[0m\n\u001b[0;32m 7992\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfill_value \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfill_value\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m not supported.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 7994\u001b[0m other \u001b[38;5;241m=\u001b[39m ops\u001b[38;5;241m.\u001b[39mmaybe_prepare_scalar_for_op(other, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m-> 7995\u001b[0m \u001b[38;5;28mself\u001b[39m, other \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_align_for_op\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mflex\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7997\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m np\u001b[38;5;241m.\u001b[39merrstate(\u001b[38;5;28mall\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m 7998\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, DataFrame):\n\u001b[0;32m 7999\u001b[0m \u001b[38;5;66;03m# Another DataFrame\u001b[39;00m\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\frame.py:7923\u001b[0m, in \u001b[0;36mDataFrame._align_for_op\u001b[1;34m(self, other, axis, flex, level)\u001b[0m\n\u001b[0;32m 7921\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m left\u001b[38;5;241m.\u001b[39m_indexed_same(right):\n\u001b[0;32m 7922\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flex:\n\u001b[1;32m-> 7923\u001b[0m left, right \u001b[38;5;241m=\u001b[39m \u001b[43mleft\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43malign\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 7924\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mouter\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[0;32m 7925\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7926\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 7927\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 7928\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan only compare identically-labeled (both index and columns) \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 7929\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDataFrame objects\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 7930\u001b[0m )\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\generic.py:10082\u001b[0m, in \u001b[0;36mNDFrame.align\u001b[1;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis, broadcast_axis)\u001b[0m\n\u001b[0;32m 10080\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n\u001b[0;32m 10081\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, ABCDataFrame):\n\u001b[1;32m> 10082\u001b[0m left, _right, join_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_align_frame\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 10083\u001b[0m \u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10084\u001b[0m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10085\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10086\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10087\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10088\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10089\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10090\u001b[0m \u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10091\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_axis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_axis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10092\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10094\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, ABCSeries):\n\u001b[0;32m 10095\u001b[0m left, _right, join_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_align_series(\n\u001b[0;32m 10096\u001b[0m other,\n\u001b[0;32m 10097\u001b[0m join\u001b[38;5;241m=\u001b[39mjoin,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 10104\u001b[0m fill_axis\u001b[38;5;241m=\u001b[39mfill_axis,\n\u001b[0;32m 10105\u001b[0m )\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\generic.py:10148\u001b[0m, in \u001b[0;36mNDFrame._align_frame\u001b[1;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis)\u001b[0m\n\u001b[0;32m 10145\u001b[0m is_series \u001b[38;5;241m=\u001b[39m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m, ABCSeries)\n\u001b[0;32m 10147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (axis \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m axis \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mequals(other\u001b[38;5;241m.\u001b[39mindex):\n\u001b[1;32m> 10148\u001b[0m join_index, ilidx, iridx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 10149\u001b[0m \u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreturn_indexers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\n\u001b[0;32m 10150\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10152\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m 10153\u001b[0m (axis \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m axis \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 10154\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_series\n\u001b[0;32m 10155\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mequals(other\u001b[38;5;241m.\u001b[39mcolumns)\n\u001b[0;32m 10156\u001b[0m ):\n\u001b[0;32m 10157\u001b[0m join_columns, clidx, cridx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mjoin(\n\u001b[0;32m 10158\u001b[0m other\u001b[38;5;241m.\u001b[39mcolumns, how\u001b[38;5;241m=\u001b[39mjoin, level\u001b[38;5;241m=\u001b[39mlevel, return_indexers\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 10159\u001b[0m )\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:266\u001b[0m, in \u001b[0;36m_maybe_return_indexers..join\u001b[1;34m(self, other, how, level, return_indexers, sort)\u001b[0m\n\u001b[0;32m 256\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(meth)\n\u001b[0;32m 257\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mjoin\u001b[39m(\n\u001b[0;32m 258\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 264\u001b[0m sort: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 265\u001b[0m ):\n\u001b[1;32m--> 266\u001b[0m join_index, lidx, ridx \u001b[38;5;241m=\u001b[39m \u001b[43mmeth\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 267\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m return_indexers:\n\u001b[0;32m 268\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m join_index\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:4621\u001b[0m, in \u001b[0;36mIndex.join\u001b[1;34m(self, other, how, level, return_indexers, sort)\u001b[0m\n\u001b[0;32m 4619\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[0;32m 4620\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 4621\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_join_multi\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4623\u001b[0m \u001b[38;5;66;03m# join on the level\u001b[39;00m\n\u001b[0;32m 4624\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m level \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_multi \u001b[38;5;129;01mor\u001b[39;00m other\u001b[38;5;241m.\u001b[39m_is_multi):\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:4804\u001b[0m, in \u001b[0;36mIndex._join_multi\u001b[1;34m(self, other, how)\u001b[0m\n\u001b[0;32m 4801\u001b[0m how \u001b[38;5;241m=\u001b[39m flip\u001b[38;5;241m.\u001b[39mget(how, how)\n\u001b[0;32m 4803\u001b[0m level \u001b[38;5;241m=\u001b[39m other\u001b[38;5;241m.\u001b[39mnames\u001b[38;5;241m.\u001b[39mindex(jl)\n\u001b[1;32m-> 4804\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_join_level\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4806\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flip_order:\n\u001b[0;32m 4807\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result[\u001b[38;5;241m0\u001b[39m], result[\u001b[38;5;241m2\u001b[39m], result[\u001b[38;5;241m1\u001b[39m]\n", + "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:4891\u001b[0m, in \u001b[0;36mIndex._join_level\u001b[1;34m(self, other, level, how, keep_order)\u001b[0m\n\u001b[0;32m 4888\u001b[0m old_level \u001b[38;5;241m=\u001b[39m left\u001b[38;5;241m.\u001b[39mlevels[level]\n\u001b[0;32m 4890\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m right\u001b[38;5;241m.\u001b[39mis_unique:\n\u001b[1;32m-> 4891\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[0;32m 4892\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIndex._join_level on non-unique index is not implemented\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 4893\u001b[0m )\n\u001b[0;32m 4895\u001b[0m new_level, left_lev_indexer, right_lev_indexer \u001b[38;5;241m=\u001b[39m old_level\u001b[38;5;241m.\u001b[39mjoin(\n\u001b[0;32m 4896\u001b[0m right, how\u001b[38;5;241m=\u001b[39mhow, return_indexers\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 4897\u001b[0m )\n\u001b[0;32m 4899\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m left_lev_indexer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[1;31mNotImplementedError\u001b[0m: Index._join_level on non-unique index is not implemented" ] } ], - "source": [ - "scaler[\"row\"]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a36151be", - "metadata": {}, - "outputs": [], "source": [ "make_scale(path,bound,steps)" ] @@ -193,7 +218,7 @@ { "cell_type": "code", "execution_count": null, - "id": "572b9c01", + "id": "c0fc60d0", "metadata": {}, "outputs": [], "source": [ @@ -202,7 +227,7 @@ }, { "cell_type": "markdown", - "id": "faaa2c35", + "id": "e2e41b4f", "metadata": {}, "source": [ "**Prototype - Dev**" @@ -210,8 +235,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "667fd58c", + "execution_count": 14, + "id": "36c9103e", "metadata": {}, "outputs": [], "source": [ @@ -328,8 +353,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "abbfa58f", + "execution_count": 2, + "id": "864af8e3", "metadata": {}, "outputs": [ { @@ -353,96 +378,154 @@ " \n", " \n", " \n", + " \n", " val\n", " \n", " \n", + " row\n", " col\n", " \n", " \n", " \n", " \n", " \n", + " _obj\n", + " x(seattle,new-york)\n", + " 2.500000e+00\n", + " \n", + " \n", + " supply(seattle)\n", + " x(seattle,new-york)\n", + " 1.000000e+00\n", + " \n", + " \n", + " demand(new-york)\n", + " x(seattle,new-york)\n", + " 1.000000e+00\n", + " \n", + " \n", + " _obj\n", + " x(seattle,chicago)\n", + " 1.700000e+00\n", + " \n", + " \n", + " supply(seattle)\n", + " x(seattle,chicago)\n", + " 1.000000e+00\n", + " \n", + " \n", + " demand(chicago)\n", + " x(seattle,chicago)\n", + " 1.000000e+00\n", + " \n", + " \n", + " _obj\n", + " x(seattle,topeka)\n", + " 1.800000e+00\n", + " \n", + " \n", + " supply(seattle)\n", + " x(seattle,topeka)\n", + " 1.000000e+00\n", + " \n", + " \n", + " demand(topeka)\n", + " x(seattle,topeka)\n", + " 1.000000e+00\n", + " \n", + " \n", + " _obj\n", + " x(san-diego,new-york)\n", + " 2.500000e-09\n", + " \n", + " \n", + " supply(san-diego)\n", + " x(san-diego,new-york)\n", + " 1.000000e+00\n", + " \n", + " \n", + " demand(new-york)\n", " x(san-diego,new-york)\n", - " 20000.000000\n", + " 1.000000e+00\n", + " \n", + " \n", + " _obj\n", + " x(san-diego,chicago)\n", + " 1.800000e+00\n", + " \n", + " \n", + " supply(san-diego)\n", + " x(san-diego,chicago)\n", + " 1.000000e+00\n", + " \n", + " \n", + " demand(chicago)\n", + " x(san-diego,chicago)\n", + " 1.000000e+00\n", " \n", " \n", + " _obj\n", " x(san-diego,topeka)\n", - " 8451.542547\n", + " 1.400000e-08\n", + " \n", + " \n", + " supply(san-diego)\n", + " x(san-diego,topeka)\n", + " 1.000000e+00\n", + " \n", + " \n", + " demand(topeka)\n", + " x(san-diego,topeka)\n", + " 1.000000e+00\n", + " \n", + " \n", + " _obj\n", + " constobj\n", + " 1.000000e+00\n", " \n", " \n", "\n", "" ], "text/plain": [ - " val\n", - "col \n", - "x(san-diego,new-york) 20000.000000\n", - "x(san-diego,topeka) 8451.542547" + " val\n", + "row col \n", + "_obj x(seattle,new-york) 2.500000e+00\n", + "supply(seattle) x(seattle,new-york) 1.000000e+00\n", + "demand(new-york) x(seattle,new-york) 1.000000e+00\n", + "_obj x(seattle,chicago) 1.700000e+00\n", + "supply(seattle) x(seattle,chicago) 1.000000e+00\n", + "demand(chicago) x(seattle,chicago) 1.000000e+00\n", + "_obj x(seattle,topeka) 1.800000e+00\n", + "supply(seattle) x(seattle,topeka) 1.000000e+00\n", + "demand(topeka) x(seattle,topeka) 1.000000e+00\n", + "_obj x(san-diego,new-york) 2.500000e-09\n", + "supply(san-diego) x(san-diego,new-york) 1.000000e+00\n", + "demand(new-york) x(san-diego,new-york) 1.000000e+00\n", + "_obj x(san-diego,chicago) 1.800000e+00\n", + "supply(san-diego) x(san-diego,chicago) 1.000000e+00\n", + "demand(chicago) x(san-diego,chicago) 1.000000e+00\n", + "_obj x(san-diego,topeka) 1.400000e-08\n", + "supply(san-diego) x(san-diego,topeka) 1.000000e+00\n", + "demand(topeka) x(san-diego,topeka) 1.000000e+00\n", + "_obj constobj 1.000000e+00" ] }, - "execution_count": 11, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "col_scaler" + "matrix" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "eacf37eb", + "execution_count": null, + "id": "bd0eb37d", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
col
x(san-diego,new-york)20000.0
\n", - "
" - ], - "text/plain": [ - " val\n", - "col \n", - "x(san-diego,new-york) 20000.0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "col_scaler2 = col_scaler.loc[[(\"x(san-diego,new-york)\")]]\n", "col_scaler2" @@ -450,21 +533,10 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "4fed41e6", + "execution_count": null, + "id": "bbc7fb1b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " val\n", - "col \n", - "x(san-diego,new-york) 4.000000e+08\n", - "x(san-diego,topeka) 8.451543e+03\n" - ] - } - ], + "outputs": [], "source": [ "final_scaler = col_scaler.mul(col_scaler2.reindex(col_scaler.index).fillna(1))\n", "print(final_scaler)" @@ -473,7 +545,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c662aa00", + "id": "f75b746f", "metadata": {}, "outputs": [], "source": [] @@ -481,7 +553,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d3476533", + "id": "ff541b19", "metadata": {}, "outputs": [], "source": [] @@ -489,7 +561,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6974599c", + "id": "a92b2145", "metadata": {}, "outputs": [], "source": [] @@ -497,7 +569,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a1f8e88f", + "id": "02f298ea", "metadata": {}, "outputs": [], "source": [ @@ -600,7 +672,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e36a578d", + "id": "848f3fa4", "metadata": { "scrolled": false }, @@ -632,7 +704,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ecdde9ae", + "id": "45dc82aa", "metadata": {}, "outputs": [], "source": [ @@ -651,7 +723,7 @@ }, { "cell_type": "markdown", - "id": "18f6abac", + "id": "75adc75d", "metadata": {}, "source": [ "**Modify below later**" @@ -660,7 +732,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6a2977c2", + "id": "f4ca62e9", "metadata": {}, "outputs": [], "source": [ @@ -691,7 +763,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a6036657", + "id": "3d6af1b0", "metadata": { "scrolled": false }, @@ -703,7 +775,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e2470d75", + "id": "fa31c42b", "metadata": {}, "outputs": [], "source": [ @@ -727,7 +799,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bdb8af8b", + "id": "6f95317c", "metadata": {}, "outputs": [], "source": [ @@ -742,7 +814,7 @@ }, { "cell_type": "markdown", - "id": "2a598bf5", + "id": "e5ad15e7", "metadata": {}, "source": [ "# Finalized Prototype" @@ -751,7 +823,7 @@ { "cell_type": "code", "execution_count": null, - "id": "72632fc6", + "id": "dc2418f0", "metadata": {}, "outputs": [], "source": [] @@ -759,7 +831,7 @@ { "cell_type": "code", "execution_count": null, - "id": "64d3bad7", + "id": "3835197c", "metadata": {}, "outputs": [], "source": [] From 72373fee4e8ba858f7d55d6a62e917422671fd69 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 18:58:16 +0200 Subject: [PATCH 16/25] For internal review and check --- ...YPE] Matrix Rescale Tool-Loop method.ipynb | 397 +++++------------- 1 file changed, 108 insertions(+), 289 deletions(-) diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index 4423c22a8..d89a30fea 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -5,13 +5,14 @@ "id": "fdbea0ef", "metadata": {}, "source": [ - "# MESSAGE-ix matrix improvement tool" + "# MESSAGE-ix matrix improvement tool\n", + "Need to investigate why more steps worsen the results" ] }, { "cell_type": "code", - "execution_count": 25, - "id": "c05c440f", + "execution_count": 1, + "id": "d5271360", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +48,7 @@ "def read_ix(df, lvl):\n", " return df.index.get_level_values(lvl)\n", " \n", - "def show_range(text,df):\n", + "def disp_range(text,df):\n", " log_absdf = df.copy()\n", " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", " np.absolute(\n", @@ -55,19 +56,21 @@ " \n", " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", "\n", - "def make_scale(path, bound, steps):\n", + "def make_scale(path, bound, steps, show_range=True):\n", " # Load the matrix coefficient\n", " data = (pd.read_csv(path)\n", " .set_index(['row','col'],drop=True)[['val']])\n", "\n", " matrix = data\n", - " # TODO: show_range(\"Unscaled range\",matrix)\n", - " show_range(\"Unscaled range\",matrix)\n", + " \n", + " if show_range == True:\n", + " disp_range(\"Unscaled range \",matrix)\n", " \n", " scalers = {\"row\":[], \"col\":[]}\n", " counter = 0\n", " while counter < steps:\n", " for s in scalers.keys():\n", + " # print(matrix)\n", " # calculate log base 10 of the absolute value of the matrix\n", " log_absmatrix = matrix.copy()\n", " log_absmatrix = make_logdf(log_absmatrix)\n", @@ -89,51 +92,47 @@ " SFs[k] = 10.0**(-mid)\n", " \n", " # Create DataFrame of row scaler\n", + " return_index = list(set(read_ix(log_absmatrix,s)))\n", " if counter == 0:\n", " multiplier = 1\n", " else:\n", - " return_index = list(set(read_ix(log_absmatrix,s)))\n", " multiplier = scalers[s].reindex(return_index).fillna(1)\n", " scalers[s] = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", - " scalers[s] = scalers[s].reindex(read_ix(log_absmatrix,s)).fillna(1)\n", " scalers[s].index.name = s\n", - " scalers[s] = scalers[s].mul(multiplier)\n", - " \n", - " print(scalers[s])\n", + " scalers[s] = scalers[s].reindex(return_index).fillna(1)\n", + " scalers[s] = scalers[s].mul(multiplier) # <--- this summarize multipliers from previous steps\n", " \n", " # Create new matrix with scaled rows\n", - " index_mod = read_ix(matrix,s).isin(scalers[s].index)\n", - " print(index_mod)\n", - " print(matrix.loc[index_mod])\n", - " matrix.loc[index_mod] = matrix.loc[index_mod].mul(scalers[s])\n", - " print(\"marker1\")\n", - " # generating prescaler arguments for GAMS\n", - " prescale_args = {}\n", - " for key,val in scalers.items():\n", - " scaler_dict = val[\"val\"].to_dict()\n", - " for k,v in scaler_dict.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v}) \n", - "\n", - " # TODO: show_range(\"Scaled range \",matrix)\n", - " show_range(\"Scaled range \",matrix)\n", + " matrix = matrix.mul(scalers[s]) # <--- remember that this matrix is already changed, so double counting\n", + " \n", + " if show_range == True:\n", + " disp_range(f\"Scaled range step {counter}\",matrix)\n", + " \n", " # Increment the counter\n", " counter += 1\n", + " # generating prescaler arguments for GAMS\n", + " prescale_args = {}\n", + " for key,df_scaler in scalers.items():\n", + " df_scaler = df_scaler.loc[df_scaler[\"val\"] != 1]\n", + " scaler_dict = df_scaler[\"val\"].to_dict()\n", + " for k,v in scaler_dict.items():\n", + " if k == '_obj':\n", + " k_ = \"_obj.scale\"\n", + " elif k == 'constobj':\n", + " k_ = \"constobj.scale\"\n", + " else:\n", + " k_ = k.replace(\"(\", \".scale('\")\n", + " k_ = k_.replace(\")\", \"')\")\n", + " k_ = k_.replace(\",\", \"','\")\n", + " prescale_args.update({k_:v}) \n", "\n", " return(prescale_args)" ] }, { "cell_type": "code", - "execution_count": 26, - "id": "e6529d47", + "execution_count": 2, + "id": "1dd0f34c", "metadata": { "scrolled": false }, @@ -142,92 +141,72 @@ "name": "stdout", "output_type": "stream", "text": [ - "Unscaled range: [ -8 , 0 ]\n", - " val\n", - "row \n", - "_obj 1.0\n", - "supply(seattle) 1.0\n", - "demand(new-york) 1.0\n", - "_obj 1.0\n", - "supply(seattle) 1.0\n", - "demand(chicago) 1.0\n", - "_obj 1.0\n", - "supply(seattle) 1.0\n", - "demand(topeka) 1.0\n", - "_obj 1.0\n", - "supply(san-diego) 1.0\n", - "demand(new-york) 1.0\n", - "_obj 1.0\n", - "supply(san-diego) 1.0\n", - "demand(chicago) 1.0\n", - "_obj 1.0\n", - "supply(san-diego) 1.0\n", - "demand(topeka) 1.0\n", - "_obj 1.0\n", - "[ True True True True True True True True True True True True\n", - " True True True True True True True]\n", - " val\n", - "row col \n", - "_obj x(seattle,new-york) 2.500000e+00\n", - "supply(seattle) x(seattle,new-york) 1.000000e+00\n", - "demand(new-york) x(seattle,new-york) 1.000000e+00\n", - "_obj x(seattle,chicago) 1.700000e+00\n", - "supply(seattle) x(seattle,chicago) 1.000000e+00\n", - "demand(chicago) x(seattle,chicago) 1.000000e+00\n", - "_obj x(seattle,topeka) 1.800000e+00\n", - "supply(seattle) x(seattle,topeka) 1.000000e+00\n", - "demand(topeka) x(seattle,topeka) 1.000000e+00\n", - "_obj x(san-diego,new-york) 2.500000e-09\n", - "supply(san-diego) x(san-diego,new-york) 1.000000e+00\n", - "demand(new-york) x(san-diego,new-york) 1.000000e+00\n", - "_obj x(san-diego,chicago) 1.800000e+00\n", - "supply(san-diego) x(san-diego,chicago) 1.000000e+00\n", - "demand(chicago) x(san-diego,chicago) 1.000000e+00\n", - "_obj x(san-diego,topeka) 1.400000e-08\n", - "supply(san-diego) x(san-diego,topeka) 1.000000e+00\n", - "demand(topeka) x(san-diego,topeka) 1.000000e+00\n", - "_obj constobj 1.000000e+00\n" + "Unscaled range : [ -8 , 0 ]\n", + "Scaled range step 0: [ -4 , 4 ]\n", + "Scaled range step 1: [ -1 , 7 ]\n", + "Scaled range step 2: [ -3 , 6 ]\n", + "Scaled range step 3: [ -4 , 9 ]\n", + "Scaled range step 4: [ -3 , 14 ]\n" ] }, { - "ename": "NotImplementedError", - "evalue": "Index._join_level on non-unique index is not implemented", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNotImplementedError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[26], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mmake_scale\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43mbound\u001b[49m\u001b[43m,\u001b[49m\u001b[43msteps\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[1;32mIn[25], line 92\u001b[0m, in \u001b[0;36mmake_scale\u001b[1;34m(path, bound, steps)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[38;5;28mprint\u001b[39m(index_mod)\n\u001b[0;32m 91\u001b[0m \u001b[38;5;28mprint\u001b[39m(matrix\u001b[38;5;241m.\u001b[39mloc[index_mod])\n\u001b[1;32m---> 92\u001b[0m matrix\u001b[38;5;241m.\u001b[39mloc[index_mod] \u001b[38;5;241m=\u001b[39m \u001b[43mmatrix\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43mindex_mod\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmul\u001b[49m\u001b[43m(\u001b[49m\u001b[43mscalers\u001b[49m\u001b[43m[\u001b[49m\u001b[43ms\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 93\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarker1\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 94\u001b[0m \u001b[38;5;66;03m# generating prescaler arguments for GAMS\u001b[39;00m\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\frame.py:8104\u001b[0m, in \u001b[0;36mDataFrame.mul\u001b[1;34m(self, other, axis, level, fill_value)\u001b[0m\n\u001b[0;32m 8102\u001b[0m \u001b[38;5;129m@Appender\u001b[39m(ops\u001b[38;5;241m.\u001b[39mmake_flex_doc(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmul\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[0;32m 8103\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmul\u001b[39m(\u001b[38;5;28mself\u001b[39m, other, axis: Axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcolumns\u001b[39m\u001b[38;5;124m\"\u001b[39m, level\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, fill_value\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m-> 8104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_flex_arith_method\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 8105\u001b[0m \u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmul\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\n\u001b[0;32m 8106\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\frame.py:7995\u001b[0m, in \u001b[0;36mDataFrame._flex_arith_method\u001b[1;34m(self, other, op, axis, level, fill_value)\u001b[0m\n\u001b[0;32m 7992\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfill_value \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfill_value\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m not supported.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 7994\u001b[0m other \u001b[38;5;241m=\u001b[39m ops\u001b[38;5;241m.\u001b[39mmaybe_prepare_scalar_for_op(other, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m-> 7995\u001b[0m \u001b[38;5;28mself\u001b[39m, other \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_align_for_op\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mflex\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7997\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m np\u001b[38;5;241m.\u001b[39merrstate(\u001b[38;5;28mall\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m 7998\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, DataFrame):\n\u001b[0;32m 7999\u001b[0m \u001b[38;5;66;03m# Another DataFrame\u001b[39;00m\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\frame.py:7923\u001b[0m, in \u001b[0;36mDataFrame._align_for_op\u001b[1;34m(self, other, axis, flex, level)\u001b[0m\n\u001b[0;32m 7921\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m left\u001b[38;5;241m.\u001b[39m_indexed_same(right):\n\u001b[0;32m 7922\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flex:\n\u001b[1;32m-> 7923\u001b[0m left, right \u001b[38;5;241m=\u001b[39m \u001b[43mleft\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43malign\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 7924\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mouter\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[0;32m 7925\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7926\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 7927\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 7928\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan only compare identically-labeled (both index and columns) \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 7929\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDataFrame objects\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 7930\u001b[0m )\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\generic.py:10082\u001b[0m, in \u001b[0;36mNDFrame.align\u001b[1;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis, broadcast_axis)\u001b[0m\n\u001b[0;32m 10080\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n\u001b[0;32m 10081\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, ABCDataFrame):\n\u001b[1;32m> 10082\u001b[0m left, _right, join_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_align_frame\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 10083\u001b[0m \u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10084\u001b[0m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10085\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10086\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10087\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10088\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10089\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10090\u001b[0m \u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10091\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_axis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_axis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10092\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10094\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, ABCSeries):\n\u001b[0;32m 10095\u001b[0m left, _right, join_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_align_series(\n\u001b[0;32m 10096\u001b[0m other,\n\u001b[0;32m 10097\u001b[0m join\u001b[38;5;241m=\u001b[39mjoin,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 10104\u001b[0m fill_axis\u001b[38;5;241m=\u001b[39mfill_axis,\n\u001b[0;32m 10105\u001b[0m )\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\generic.py:10148\u001b[0m, in \u001b[0;36mNDFrame._align_frame\u001b[1;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis)\u001b[0m\n\u001b[0;32m 10145\u001b[0m is_series \u001b[38;5;241m=\u001b[39m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m, ABCSeries)\n\u001b[0;32m 10147\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (axis \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m axis \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mequals(other\u001b[38;5;241m.\u001b[39mindex):\n\u001b[1;32m> 10148\u001b[0m join_index, ilidx, iridx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 10149\u001b[0m \u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreturn_indexers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\n\u001b[0;32m 10150\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10152\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m 10153\u001b[0m (axis \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m axis \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 10154\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_series\n\u001b[0;32m 10155\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mequals(other\u001b[38;5;241m.\u001b[39mcolumns)\n\u001b[0;32m 10156\u001b[0m ):\n\u001b[0;32m 10157\u001b[0m join_columns, clidx, cridx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mjoin(\n\u001b[0;32m 10158\u001b[0m other\u001b[38;5;241m.\u001b[39mcolumns, how\u001b[38;5;241m=\u001b[39mjoin, level\u001b[38;5;241m=\u001b[39mlevel, return_indexers\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 10159\u001b[0m )\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:266\u001b[0m, in \u001b[0;36m_maybe_return_indexers..join\u001b[1;34m(self, other, how, level, return_indexers, sort)\u001b[0m\n\u001b[0;32m 256\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(meth)\n\u001b[0;32m 257\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mjoin\u001b[39m(\n\u001b[0;32m 258\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 264\u001b[0m sort: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 265\u001b[0m ):\n\u001b[1;32m--> 266\u001b[0m join_index, lidx, ridx \u001b[38;5;241m=\u001b[39m \u001b[43mmeth\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 267\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m return_indexers:\n\u001b[0;32m 268\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m join_index\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:4621\u001b[0m, in \u001b[0;36mIndex.join\u001b[1;34m(self, other, how, level, return_indexers, sort)\u001b[0m\n\u001b[0;32m 4619\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[0;32m 4620\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 4621\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_join_multi\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4623\u001b[0m \u001b[38;5;66;03m# join on the level\u001b[39;00m\n\u001b[0;32m 4624\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m level \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_multi \u001b[38;5;129;01mor\u001b[39;00m other\u001b[38;5;241m.\u001b[39m_is_multi):\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:4804\u001b[0m, in \u001b[0;36mIndex._join_multi\u001b[1;34m(self, other, how)\u001b[0m\n\u001b[0;32m 4801\u001b[0m how \u001b[38;5;241m=\u001b[39m flip\u001b[38;5;241m.\u001b[39mget(how, how)\n\u001b[0;32m 4803\u001b[0m level \u001b[38;5;241m=\u001b[39m other\u001b[38;5;241m.\u001b[39mnames\u001b[38;5;241m.\u001b[39mindex(jl)\n\u001b[1;32m-> 4804\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_join_level\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 4806\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flip_order:\n\u001b[0;32m 4807\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result[\u001b[38;5;241m0\u001b[39m], result[\u001b[38;5;241m2\u001b[39m], result[\u001b[38;5;241m1\u001b[39m]\n", - "File \u001b[1;32m~\\Anaconda3\\envs\\message_env\\lib\\site-packages\\pandas\\core\\indexes\\base.py:4891\u001b[0m, in \u001b[0;36mIndex._join_level\u001b[1;34m(self, other, level, how, keep_order)\u001b[0m\n\u001b[0;32m 4888\u001b[0m old_level \u001b[38;5;241m=\u001b[39m left\u001b[38;5;241m.\u001b[39mlevels[level]\n\u001b[0;32m 4890\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m right\u001b[38;5;241m.\u001b[39mis_unique:\n\u001b[1;32m-> 4891\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[0;32m 4892\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIndex._join_level on non-unique index is not implemented\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 4893\u001b[0m )\n\u001b[0;32m 4895\u001b[0m new_level, left_lev_indexer, right_lev_indexer \u001b[38;5;241m=\u001b[39m old_level\u001b[38;5;241m.\u001b[39mjoin(\n\u001b[0;32m 4896\u001b[0m right, how\u001b[38;5;241m=\u001b[39mhow, return_indexers\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 4897\u001b[0m )\n\u001b[0;32m 4899\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m left_lev_indexer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "\u001b[1;31mNotImplementedError\u001b[0m: Index._join_level on non-unique index is not implemented" - ] + "data": { + "text/plain": [ + "{\"demand.scale('new-york')\": 1.0000000000000003e-05,\n", + " \"supply.scale('san-diego')\": 1.0000000000000003e-05,\n", + " \"demand.scale('topeka')\": 1e-05,\n", + " \"supply.scale('seattle')\": 1e-05,\n", + " \"demand.scale('chicago')\": 1e-05,\n", + " \"x.scale('san-diego','chicago')\": 100000.0,\n", + " \"x.scale('san-diego','new-york')\": 10.0,\n", + " \"x.scale('seattle','new-york')\": 100000.0,\n", + " \"x.scale('seattle','topeka')\": 100000.0,\n", + " \"x.scale('san-diego','topeka')\": 1000.0,\n", + " \"x.scale('seattle','chicago')\": 1000.0}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "make_scale(path,bound,steps)" + "make_scale(path,bound,5,show_range=True)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "c0fc60d0", + "execution_count": 3, + "id": "06cb8817", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unscaled range : [ -8 , 0 ]\n", + "Scaled range step 0: [ -4 , 4 ]\n" + ] + }, + { + "data": { + "text/plain": [ + "{\"x.scale('san-diego','new-york')\": 10000.0,\n", + " \"x.scale('san-diego','topeka')\": 1000.0}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "showme(matrix)" + "make_scale(path,bound,1,show_range=True)" ] }, { "cell_type": "markdown", - "id": "e2e41b4f", + "id": "bd05c345", "metadata": {}, "source": [ "**Prototype - Dev**" @@ -235,8 +214,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "36c9103e", + "execution_count": null, + "id": "fbf8ecd2", "metadata": {}, "outputs": [], "source": [ @@ -353,188 +332,28 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "864af8e3", + "execution_count": null, + "id": "947dc97b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
rowcol
_objx(seattle,new-york)2.500000e+00
supply(seattle)x(seattle,new-york)1.000000e+00
demand(new-york)x(seattle,new-york)1.000000e+00
_objx(seattle,chicago)1.700000e+00
supply(seattle)x(seattle,chicago)1.000000e+00
demand(chicago)x(seattle,chicago)1.000000e+00
_objx(seattle,topeka)1.800000e+00
supply(seattle)x(seattle,topeka)1.000000e+00
demand(topeka)x(seattle,topeka)1.000000e+00
_objx(san-diego,new-york)2.500000e-09
supply(san-diego)x(san-diego,new-york)1.000000e+00
demand(new-york)x(san-diego,new-york)1.000000e+00
_objx(san-diego,chicago)1.800000e+00
supply(san-diego)x(san-diego,chicago)1.000000e+00
demand(chicago)x(san-diego,chicago)1.000000e+00
_objx(san-diego,topeka)1.400000e-08
supply(san-diego)x(san-diego,topeka)1.000000e+00
demand(topeka)x(san-diego,topeka)1.000000e+00
_objconstobj1.000000e+00
\n", - "
" - ], - "text/plain": [ - " val\n", - "row col \n", - "_obj x(seattle,new-york) 2.500000e+00\n", - "supply(seattle) x(seattle,new-york) 1.000000e+00\n", - "demand(new-york) x(seattle,new-york) 1.000000e+00\n", - "_obj x(seattle,chicago) 1.700000e+00\n", - "supply(seattle) x(seattle,chicago) 1.000000e+00\n", - "demand(chicago) x(seattle,chicago) 1.000000e+00\n", - "_obj x(seattle,topeka) 1.800000e+00\n", - "supply(seattle) x(seattle,topeka) 1.000000e+00\n", - "demand(topeka) x(seattle,topeka) 1.000000e+00\n", - "_obj x(san-diego,new-york) 2.500000e-09\n", - "supply(san-diego) x(san-diego,new-york) 1.000000e+00\n", - "demand(new-york) x(san-diego,new-york) 1.000000e+00\n", - "_obj x(san-diego,chicago) 1.800000e+00\n", - "supply(san-diego) x(san-diego,chicago) 1.000000e+00\n", - "demand(chicago) x(san-diego,chicago) 1.000000e+00\n", - "_obj x(san-diego,topeka) 1.400000e-08\n", - "supply(san-diego) x(san-diego,topeka) 1.000000e+00\n", - "demand(topeka) x(san-diego,topeka) 1.000000e+00\n", - "_obj constobj 1.000000e+00" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "matrix" + "new_matrix.loc[index_mod]" ] }, { "cell_type": "code", "execution_count": null, - "id": "bd0eb37d", + "id": "28baf41e", "metadata": {}, "outputs": [], "source": [ - "col_scaler2 = col_scaler.loc[[(\"x(san-diego,new-york)\")]]\n", - "col_scaler2" + "col_scaler" ] }, { "cell_type": "code", "execution_count": null, - "id": "bbc7fb1b", + "id": "c9402bdb", "metadata": {}, "outputs": [], "source": [ @@ -545,7 +364,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f75b746f", + "id": "f590d064", "metadata": {}, "outputs": [], "source": [] @@ -553,7 +372,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ff541b19", + "id": "2d8c2afd", "metadata": {}, "outputs": [], "source": [] @@ -561,7 +380,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a92b2145", + "id": "073e9e21", "metadata": {}, "outputs": [], "source": [] @@ -569,7 +388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "02f298ea", + "id": "a9a4b0a3", "metadata": {}, "outputs": [], "source": [ @@ -672,7 +491,7 @@ { "cell_type": "code", "execution_count": null, - "id": "848f3fa4", + "id": "c873a4f8", "metadata": { "scrolled": false }, @@ -704,7 +523,7 @@ { "cell_type": "code", "execution_count": null, - "id": "45dc82aa", + "id": "fd32226c", "metadata": {}, "outputs": [], "source": [ @@ -723,7 +542,7 @@ }, { "cell_type": "markdown", - "id": "75adc75d", + "id": "af15cef2", "metadata": {}, "source": [ "**Modify below later**" @@ -732,7 +551,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4ca62e9", + "id": "b2d59ae7", "metadata": {}, "outputs": [], "source": [ @@ -763,7 +582,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3d6af1b0", + "id": "ffe68313", "metadata": { "scrolled": false }, @@ -775,7 +594,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fa31c42b", + "id": "b56feb0d", "metadata": {}, "outputs": [], "source": [ @@ -799,7 +618,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6f95317c", + "id": "0419fb2a", "metadata": {}, "outputs": [], "source": [ @@ -814,7 +633,7 @@ }, { "cell_type": "markdown", - "id": "e5ad15e7", + "id": "1ddec7f4", "metadata": {}, "source": [ "# Finalized Prototype" @@ -823,7 +642,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dc2418f0", + "id": "053f6a87", "metadata": {}, "outputs": [], "source": [] @@ -831,7 +650,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3835197c", + "id": "b4b7f4d8", "metadata": {}, "outputs": [], "source": [] From 501ac205c15551491aff0083c36fa10a6bcb42fe Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 19:01:30 +0200 Subject: [PATCH 17/25] Fixed bug and introduce step_scaler --- ...YPE] Matrix Rescale Tool-Loop method.ipynb | 98 ++++++++++--------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index d89a30fea..fabe1d725 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -11,8 +11,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "d5271360", + "execution_count": 4, + "id": "b1995512", "metadata": {}, "outputs": [], "source": [ @@ -97,13 +97,13 @@ " multiplier = 1\n", " else:\n", " multiplier = scalers[s].reindex(return_index).fillna(1)\n", - " scalers[s] = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", - " scalers[s].index.name = s\n", - " scalers[s] = scalers[s].reindex(return_index).fillna(1)\n", - " scalers[s] = scalers[s].mul(multiplier) # <--- this summarize multipliers from previous steps\n", + " step_scaler = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", + " step_scaler.index.name = s\n", + " step_scaler = step_scaler.reindex(return_index).fillna(1)\n", + " scalers[s] = step_scaler.mul(multiplier) # <--- this summarize multipliers from previous steps\n", " \n", " # Create new matrix with scaled rows\n", - " matrix = matrix.mul(scalers[s]) # <--- remember that this matrix is already changed, so double counting\n", + " matrix = matrix.mul(step_scaler) # <--- remember that this matrix is already changed, so double counting\n", " \n", " if show_range == True:\n", " disp_range(f\"Scaled range step {counter}\",matrix)\n", @@ -131,8 +131,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "1dd0f34c", + "execution_count": 7, + "id": "cf81812c", "metadata": { "scrolled": false }, @@ -143,41 +143,43 @@ "text": [ "Unscaled range : [ -8 , 0 ]\n", "Scaled range step 0: [ -4 , 4 ]\n", - "Scaled range step 1: [ -1 , 7 ]\n", - "Scaled range step 2: [ -3 , 6 ]\n", - "Scaled range step 3: [ -4 , 9 ]\n", - "Scaled range step 4: [ -3 , 14 ]\n" + "Scaled range step 1: [ -3 , 3 ]\n", + "Scaled range step 2: [ -3 , 2 ]\n", + "Scaled range step 3: [ -3 , 2 ]\n", + "Scaled range step 4: [ -3 , 2 ]\n", + "Scaled range step 5: [ -3 , 2 ]\n", + "Scaled range step 6: [ -3 , 2 ]\n", + "Scaled range step 7: [ -3 , 2 ]\n", + "Scaled range step 8: [ -3 , 2 ]\n", + "Scaled range step 9: [ -3 , 2 ]\n" ] }, { "data": { "text/plain": [ - "{\"demand.scale('new-york')\": 1.0000000000000003e-05,\n", - " \"supply.scale('san-diego')\": 1.0000000000000003e-05,\n", - " \"demand.scale('topeka')\": 1e-05,\n", - " \"supply.scale('seattle')\": 1e-05,\n", - " \"demand.scale('chicago')\": 1e-05,\n", - " \"x.scale('san-diego','chicago')\": 100000.0,\n", - " \"x.scale('san-diego','new-york')\": 10.0,\n", - " \"x.scale('seattle','new-york')\": 100000.0,\n", - " \"x.scale('seattle','topeka')\": 100000.0,\n", - " \"x.scale('san-diego','topeka')\": 1000.0,\n", - " \"x.scale('seattle','chicago')\": 1000.0}" + "{\"demand.scale('new-york')\": 0.001,\n", + " \"supply.scale('san-diego')\": 0.001,\n", + " \"demand.scale('topeka')\": 0.0010000000000000002,\n", + " \"x.scale('san-diego','chicago')\": 10.0,\n", + " \"x.scale('san-diego','new-york')\": 100000.0,\n", + " \"x.scale('seattle','new-york')\": 10.0,\n", + " \"x.scale('seattle','topeka')\": 10.0,\n", + " \"x.scale('san-diego','topeka')\": 100000.0}" ] }, - "execution_count": 2, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "make_scale(path,bound,5,show_range=True)" + "make_scale(path,bound,10,show_range=True)" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "06cb8817", + "execution_count": 6, + "id": "502045dd", "metadata": {}, "outputs": [ { @@ -195,7 +197,7 @@ " \"x.scale('san-diego','topeka')\": 1000.0}" ] }, - "execution_count": 3, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -206,7 +208,7 @@ }, { "cell_type": "markdown", - "id": "bd05c345", + "id": "e69f8e4a", "metadata": {}, "source": [ "**Prototype - Dev**" @@ -215,7 +217,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fbf8ecd2", + "id": "e8717ea5", "metadata": {}, "outputs": [], "source": [ @@ -333,7 +335,7 @@ { "cell_type": "code", "execution_count": null, - "id": "947dc97b", + "id": "76fec713", "metadata": {}, "outputs": [], "source": [ @@ -343,7 +345,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28baf41e", + "id": "8d56701f", "metadata": {}, "outputs": [], "source": [ @@ -353,7 +355,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c9402bdb", + "id": "3d70aace", "metadata": {}, "outputs": [], "source": [ @@ -364,7 +366,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f590d064", + "id": "a1c331e0", "metadata": {}, "outputs": [], "source": [] @@ -372,7 +374,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d8c2afd", + "id": "f198f534", "metadata": {}, "outputs": [], "source": [] @@ -380,7 +382,7 @@ { "cell_type": "code", "execution_count": null, - "id": "073e9e21", + "id": "d1e55cc0", "metadata": {}, "outputs": [], "source": [] @@ -388,7 +390,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a9a4b0a3", + "id": "b02c0d29", "metadata": {}, "outputs": [], "source": [ @@ -491,7 +493,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c873a4f8", + "id": "a73a4d5b", "metadata": { "scrolled": false }, @@ -523,7 +525,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fd32226c", + "id": "18535f7e", "metadata": {}, "outputs": [], "source": [ @@ -542,7 +544,7 @@ }, { "cell_type": "markdown", - "id": "af15cef2", + "id": "cd86620e", "metadata": {}, "source": [ "**Modify below later**" @@ -551,7 +553,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b2d59ae7", + "id": "9029af68", "metadata": {}, "outputs": [], "source": [ @@ -582,7 +584,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ffe68313", + "id": "28cd4eda", "metadata": { "scrolled": false }, @@ -594,7 +596,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b56feb0d", + "id": "e2036ae8", "metadata": {}, "outputs": [], "source": [ @@ -618,7 +620,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0419fb2a", + "id": "cddfec07", "metadata": {}, "outputs": [], "source": [ @@ -633,7 +635,7 @@ }, { "cell_type": "markdown", - "id": "1ddec7f4", + "id": "cc8f6890", "metadata": {}, "source": [ "# Finalized Prototype" @@ -642,7 +644,7 @@ { "cell_type": "code", "execution_count": null, - "id": "053f6a87", + "id": "289eceed", "metadata": {}, "outputs": [], "source": [] @@ -650,7 +652,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b4b7f4d8", + "id": "229b1c56", "metadata": {}, "outputs": [], "source": [] From a03f6827e3afe550f3ce39d82d73893f17e1c452 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 8 Apr 2024 19:02:21 +0200 Subject: [PATCH 18/25] Clean up for review and test --- ...YPE] Matrix Rescale Tool-Loop method.ipynb | 335 +----------------- 1 file changed, 5 insertions(+), 330 deletions(-) diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index fabe1d725..1ad649a91 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -12,7 +12,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "b1995512", + "id": "1e4b0b81", "metadata": {}, "outputs": [], "source": [ @@ -132,7 +132,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "cf81812c", + "id": "0a4e6ae0", "metadata": { "scrolled": false }, @@ -179,7 +179,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "502045dd", + "id": "ee70fdd0", "metadata": {}, "outputs": [ { @@ -208,7 +208,7 @@ }, { "cell_type": "markdown", - "id": "e69f8e4a", + "id": "170415f4", "metadata": {}, "source": [ "**Prototype - Dev**" @@ -217,7 +217,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e8717ea5", + "id": "786a19a9", "metadata": {}, "outputs": [], "source": [ @@ -331,331 +331,6 @@ " +';'\n", " )" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "76fec713", - "metadata": {}, - "outputs": [], - "source": [ - "new_matrix.loc[index_mod]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d56701f", - "metadata": {}, - "outputs": [], - "source": [ - "col_scaler" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d70aace", - "metadata": {}, - "outputs": [], - "source": [ - "final_scaler = col_scaler.mul(col_scaler2.reindex(col_scaler.index).fillna(1))\n", - "print(final_scaler)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a1c331e0", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f198f534", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d1e55cc0", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b02c0d29", - "metadata": {}, - "outputs": [], - "source": [ - "report(\"Original value\",matrix)\n", - "report(\"Row scaling val\",matrix0)\n", - "report(\"New Matrix\",new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a771a522", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from pyomo.environ import *\n", - "from datetime import datetime\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def showme(df):\n", - " return df[\"val\"].unstack()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "afc2eec6", - "metadata": {}, - "outputs": [], - "source": [ - "# determine absolute bound of exponent in matrix coeff\n", - "bound = 4 \n", - "\n", - "def solv(df, bound):\n", - " \"\"\"\n", - " this function filters matrix coefficient\n", - " dataframe in which the log of the coefficient \n", - " is lower or higher than the bound\n", - " \"\"\"\n", - " df_solv = df.loc[(df[\"val\"] >= bound) |\n", - " (df[\"val\"] <= -bound)]\n", - " return df_solv\n", - "\n", - "def make_logdf(df):\n", - " df.loc[df['val']!=0,'val'] = np.log10(np.absolute(df.loc[df['val']!=0,'val']))\n", - " return df\n", - " \n", - "\n", - "# Load the whole matrix\n", - "matrix = (pd.read_csv('data/matrix.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "\n", - "# calculate log base 10 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix = make_logdf(log_absmatrix)\n", - "\n", - "# Create matrix with small and large coefficient\n", - "log_absmatrix_solv = solv(log_absmatrix,bound=bound)\n" - ] - }, - { - "cell_type": "markdown", - "id": "a4435293", - "metadata": {}, - "source": [ - "**Start Looping**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6dbeb665", - "metadata": {}, - "outputs": [], - "source": [ - "# SCALE BY ROW\n", - "# Populating row scaler\n", - "RSFs = {row:[] for row in set(log_absmatrix_solv.index.get_level_values(0))-set([\"_obj\"])}\n", - "for k in RSFs.keys():\n", - " rval = log_absmatrix.loc[(k),\"val\"]\n", - " lb,ub = min(rval),max(rval)\n", - " mid = np.mean([lb,ub])\n", - " RSFs[k] = 10**(-mid)\n", - "\n", - "# Create DataFrame of row scaler\n", - "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", - "row_scaler.index.name = 'row'\n", - "\n", - "# Create new matrix with scaled rows\n", - "matrix0 = matrix.copy()\n", - "index_mod = matrix0.index.get_level_values('row').isin(row_scaler.index)\n", - "\n", - "matrix0.loc[index_mod] = matrix0.loc[index_mod].mul(row_scaler)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a73a4d5b", - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# SCALE BY COL\n", - "# Populating col scaler\n", - "log_absmatrix0 = matrix0.copy()\n", - "log_absmatrix0 = make_logdf(log_absmatrix0)\n", - "log_absmatrix0_solv = solv(log_absmatrix0,bound=bound)\n", - "\n", - "CSFs = {col:[] for col in set(log_absmatrix0_solv.index.get_level_values(1))-set([\"constobj\"])}\n", - "for k in CSFs.keys():\n", - " cval = log_absmatrix0.loc[(log_absmatrix0.index.get_level_values('col') == k),\"val\"]\n", - " lb,ub = min(cval),max(cval)\n", - " mid = np.mean([lb,ub])\n", - " CSFs[k] = 10**(-mid)\n", - "\n", - "# Create DataFrame of col scaler\n", - "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", - "col_scaler.index.name = 'col'\n", - "\n", - "# Create new matrix with scaled rows\n", - "new_matrix = matrix0.copy()\n", - "index_mod = new_matrix.index.get_level_values('col').isin(col_scaler.index)\n", - "new_matrix.loc[index_mod] = new_matrix.loc[index_mod].mul(col_scaler)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18535f7e", - "metadata": {}, - "outputs": [], - "source": [ - "def report(text,df):\n", - " log_absdf = df.copy()\n", - " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", - " \n", - " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", - "\n", - "report(\"Original value\",matrix)\n", - "report(\"Row scaling val\",matrix0)\n", - "report(\"New Matrix\",new_matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "cd86620e", - "metadata": {}, - "source": [ - "**Modify below later**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9029af68", - "metadata": {}, - "outputs": [], - "source": [ - "scalers = [RSFs,CSFs]\n", - "prescale_args = {}\n", - "for s in scalers:\n", - " for k,v in s.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v})\n", - "\n", - "gams_args = (str(prescale_args)\n", - " .replace('{','')\n", - " .replace('}','')\n", - " .replace('\"','')\n", - " .replace(':','=')\n", - " .replace(', ',';\\n')\n", - " +';'\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28cd4eda", - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# print(gams_args)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e2036ae8", - "metadata": {}, - "outputs": [], - "source": [ - "# Printing stats\n", - "\n", - "matrices_dict = {'Old Matrix':matrix,\n", - " 'New Matrix':new_matrix,\n", - " } \n", - "\n", - "for k,v in matrices_dict.items():\n", - " print(f'{k} stats:')\n", - " print('>> log10 coefficient range:',\n", - " np.int32(np.log10(np.abs(v['val']).fillna(1)).min(axis=None)),'--',\n", - " np.int32(np.log10(np.abs(v['val']).fillna(1)).max(axis=None)))\n", - " print('')\n", - "\n", - "# TO DO:\n", - "# 1. plot histogram of log10 distribution of those matrix\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cddfec07", - "metadata": {}, - "outputs": [], - "source": [ - "fig, axs = plt.subplots(nrows=2, sharex=True)\n", - "axs[0].hist(make_logdf(matrix))\n", - "axs[1].hist(make_logdf(new_matrix))\n", - "axs[0].set_title(\"Unscaled\")\n", - "axs[1].set_title(\"Scaled\")\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "cc8f6890", - "metadata": {}, - "source": [ - "# Finalized Prototype" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "289eceed", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "229b1c56", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 750f69779cc70ec18b2309480d757ed54be505c7 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Tue, 9 Apr 2024 17:59:53 +0200 Subject: [PATCH 19/25] Make tool and scaling tutorial --- message_ix/model/MESSAGE/model_solve.gms | 1 + message_ix/model/MESSAGE_master.gms | 2 +- message_ix/model/cplex.op2 | 1 + ...YPE] Matrix Rescale Tool-Loop method.ipynb | 221 +++++++++++++----- message_ix/tools/lp_diag/__init__.py | 28 +++ 5 files changed, 192 insertions(+), 61 deletions(-) diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index cd20e2bf4..83fd68e5d 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -30,6 +30,7 @@ if (%foresight% = 0, * write a status update to the log file, solve the model put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; option threads = 4 ; + MESSAGE_LP.scaleopt = 1 ; Solve MESSAGE_LP using LP minimizing OBJ ; * write model status summary diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index b29b1feeb..16a4cd684 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -46,7 +46,7 @@ $ONGLOBAL ** scenario/case selection - this must match the name of the MsgData_<%%%>.gdx input data file ** *$SETGLOBAL data "" -$SETGLOBAL data "mps_test_baseline" +$SETGLOBAL data "Westeros_Electrified_emission_bound_scaled" ** MACRO mode * "none": MESSAGEix is run in stand-alone mode diff --git a/message_ix/model/cplex.op2 b/message_ix/model/cplex.op2 index db3d36b8b..e165f1bdf 100644 --- a/message_ix/model/cplex.op2 +++ b/message_ix/model/cplex.op2 @@ -2,4 +2,5 @@ advind = 0 lpmethod = 4 threads = 4 epopt = 1e-06 +writemps = C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\make_prescaler\Westeros Electrified_emission_bound_scaled.mps barcrossalg = 2 \ No newline at end of file diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb index 1ad649a91..3279b17e2 100644 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "id": "1e4b0b81", "metadata": {}, "outputs": [], @@ -28,71 +28,158 @@ " return df[\"val\"].unstack()\n", "\n", "path = 'data/matrix_transport.csv'\n", - "bound = 2\n", + "bounds = 2\n", "steps = 1\n", "\n", - "def solv(df, bound):\n", + "def filter_df(data, bounds):\n", + " \"\"\"Extracts matrix elements with coefficient outliers.\n", + "\n", + " This function extracts elements from a matrix where \n", + " the coefficients deviate from a specified threshold.\n", + "\n", + " Parameters:\n", + " -----------\n", + " data : pandas DataFrame\n", + " The coefficient matrix, typically generated by \n", + " the mps_sum function in LPDiag.\n", + " bounds: int or list of 2 integers\n", + " Exponent threshold used to identify outlier coefficients. \n", + " If a single integer is provided, the bounds are set to +/- that value. \n", + " If a list of 2 integers is provided, they represent the lower and \n", + " upper bounds of the threshold.\n", + "\n", + " Examples:\n", + " ---------\n", + " # Extract elements with coefficient exponents deviating beyond +/-3\n", + " extracted_data = filter_df(data_matrix, 3)\n", + "\n", + " # Extract elements with coefficients exponents deviating \n", + " # beyond the range of -2 to 2\n", + " extracted_data = extract_outliers(data_matrix, [-2, 2])\n", " \"\"\"\n", - " this function filters matrix coefficient\n", - " dataframe in which the log of the coefficient \n", - " is lower or higher than the bound\n", + " \n", + " if isinstance(bounds, int):\n", + " lo_bound = -bounds\n", + " up_bound = bounds\n", + " else:\n", + " lo_bound = bounds[0]\n", + " up_bound = bounds[1]\n", + " \n", + " df_filtered = data.loc[(data[\"val\"] <= lo_bound) |\n", + " (data[\"val\"] >= up_bound)]\n", + " \n", + " return df_filtered\n", + "\n", + "def make_logdf(data):\n", " \"\"\"\n", - " df_solv = df.loc[(df[\"val\"] >= bound) |\n", - " (df[\"val\"] <= -bound)]\n", - " return df_solv\n", + " Make log10 of the absolute non zero value element of dataframe.\n", "\n", - "def make_logdf(df):\n", - " df.loc[df['val']!=0,'val'] = np.log10(np.absolute(df.loc[df['val']!=0,'val']))\n", - " return df\n", + " \"\"\"\n", + " log_absdf = data.copy()\n", + " \n", + " log_absdf.loc[log_absdf['val']!=0,'val'] = (\n", + " np.log10(np.absolute(\n", + " log_absdf.loc[log_absdf['val']!=0,'val'])\n", + " )\n", + " )\n", + " \n", + " return log_absdf\n", "\n", - "def read_ix(df, lvl):\n", - " return df.index.get_level_values(lvl)\n", + "def get_lvl_ix(data, lvl):\n", + " \"\"\"\n", + " To get level index from coefficient matrix.\n", " \n", - "def disp_range(text,df):\n", - " log_absdf = df.copy()\n", - " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", + " Parameters:\n", + " -----------\n", + " data : pandas DataFrame\n", + " The coefficient matrix, typically generated by \n", + " the mps_sum function in LPDiag.\n", + " lvl : int or str\n", + " 0 or \"row\" for rows and 1 or \"col\" for columns \n", + "\n", + " \"\"\"\n", + " return data.index.get_level_values(lvl)\n", " \n", - " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", + "def disp_range(data,pretext):\n", + " \"\"\"\n", + " To displace coefficient exponents range.\n", + "\n", + " \"\"\"\n", + " \n", + " log_absdf = make_logdf(data)\n", + " \n", + " print(f\"{pretext}:\",\n", + " \"[\",np.int32(np.min(log_absdf)), # lower bound\n", + " \"-\",\n", + " np.int32(np.max(log_absdf)),\"]\") # upper bound\n", + "\n", + "def make_prescaler(path, bounds, steps, show_range=True):\n", + " \"\"\"\n", + " Process to generate prescale_args in GAMS to improve \n", + " matrix coefficients.\n", + "\n", + " This function shifts matrix coefficient exponents to improve \n", + " the scaling properties of the matrix. The function returns \n", + " prescale arguments (prescale_args) to be passed to the GAMS model.\n", + "\n", + " Parameters:\n", + " -----------\n", + " path: str\n", + " Pathways to locate the mps file.\n", + " bounds: int or list of 2 integers\n", + " Exponent threshold used to identify outlier coefficients. \n", + " If a single integer is provided, the bounds are set to +/- that value. \n", + " If a list of 2 integers is provided, they represent \n", + " the lower and upper bounds of the threshold.\n", + " steps: int\n", + " Number of times the prescaler generation process is repeated.\n", + " Larger values may lead to more refined prescale_args but \n", + " also increase computation time.\n", + " show_range: boolean\n", + " Option to show the coefficient exponents range before and after scaling.\n", + " If True, the function will display the range; otherwise, it will not.\n", + "\n", + " Returns:\n", + " --------\n", + " prescale_args: dict\n", + " A dictionary of prescale arguments to be passed to the GAMS model.\n", + " \"\"\"\n", "\n", - "def make_scale(path, bound, steps, show_range=True):\n", - " # Load the matrix coefficient\n", " data = (pd.read_csv(path)\n", - " .set_index(['row','col'],drop=True)[['val']])\n", + " .set_index(['row','col'], drop=True)[['val']])\n", "\n", " matrix = data\n", " \n", " if show_range == True:\n", - " disp_range(\"Unscaled range \",matrix)\n", + " disp_range(matrix, \"Unscaled range \")\n", " \n", " scalers = {\"row\":[], \"col\":[]}\n", + " \n", " counter = 0\n", " while counter < steps:\n", " for s in scalers.keys():\n", " # print(matrix)\n", " # calculate log base 10 of the absolute value of the matrix\n", - " log_absmatrix = matrix.copy()\n", - " log_absmatrix = make_logdf(log_absmatrix)\n", + " log_absmatrix = make_logdf(matrix)\n", "\n", " # Create matrix with small and large coefficient\n", - " log_absmatrix_solv = solv(log_absmatrix, bound=bound)\n", + " log_absmatrix_solv = filter_df(log_absmatrix, bounds=bounds)\n", "\n", " # Populating row scaler\n", " objective_ix = \"_obj\" if s == \"row\" else \"constobj\"\n", - " index_solv = [e for e in read_ix(log_absmatrix_solv,s) if e != objective_ix] \n", - " #print(index_solv)\n", - "\n", + " index_solv = [e for e in get_lvl_ix(log_absmatrix_solv,s) if e != objective_ix] \n", + " \n", + " \n", " SFs = {k:[] for k in index_solv}\n", " for k in SFs.keys():\n", - " index_val = (read_ix(log_absmatrix,s) == k)\n", + " index_val = (get_lvl_ix(log_absmatrix,s) == k)\n", " dflog_val = log_absmatrix.loc[index_val,\"val\"]\n", " lb,ub = np.int32(min(dflog_val)),np.int32(max(dflog_val))\n", " mid = np.int32(np.mean([lb,ub]))\n", " SFs[k] = 10.0**(-mid)\n", " \n", " # Create DataFrame of row scaler\n", - " return_index = list(set(read_ix(log_absmatrix,s)))\n", + " return_index = list(set(get_lvl_ix(log_absmatrix,s)))\n", " if counter == 0:\n", " multiplier = 1\n", " else:\n", @@ -100,16 +187,19 @@ " step_scaler = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", " step_scaler.index.name = s\n", " step_scaler = step_scaler.reindex(return_index).fillna(1)\n", - " scalers[s] = step_scaler.mul(multiplier) # <--- this summarize multipliers from previous steps\n", + " \n", + " # summarize multipliers from previous steps\n", + " scalers[s] = step_scaler.mul(multiplier)\n", " \n", " # Create new matrix with scaled rows\n", - " matrix = matrix.mul(step_scaler) # <--- remember that this matrix is already changed, so double counting\n", + " matrix = matrix.mul(step_scaler)\n", " \n", " if show_range == True:\n", - " disp_range(f\"Scaled range step {counter}\",matrix)\n", + " disp_range(matrix, f\"Scaled range step {counter}\")\n", " \n", " # Increment the counter\n", " counter += 1\n", + " \n", " # generating prescaler arguments for GAMS\n", " prescale_args = {}\n", " for key,df_scaler in scalers.items():\n", @@ -131,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "0a4e6ae0", "metadata": { "scrolled": false @@ -141,44 +231,44 @@ "name": "stdout", "output_type": "stream", "text": [ - "Unscaled range : [ -8 , 0 ]\n", - "Scaled range step 0: [ -4 , 4 ]\n", - "Scaled range step 1: [ -3 , 3 ]\n", - "Scaled range step 2: [ -3 , 2 ]\n", - "Scaled range step 3: [ -3 , 2 ]\n", - "Scaled range step 4: [ -3 , 2 ]\n", - "Scaled range step 5: [ -3 , 2 ]\n", - "Scaled range step 6: [ -3 , 2 ]\n", - "Scaled range step 7: [ -3 , 2 ]\n", - "Scaled range step 8: [ -3 , 2 ]\n", - "Scaled range step 9: [ -3 , 2 ]\n" + "Unscaled range : [ -8 - 0 ]\n", + "Scaled range step 0: [ -4 - 4 ]\n", + "Scaled range step 1: [ -3 - 3 ]\n", + "Scaled range step 2: [ -3 - 2 ]\n", + "Scaled range step 3: [ -3 - 2 ]\n", + "Scaled range step 4: [ -3 - 2 ]\n", + "Scaled range step 5: [ -3 - 2 ]\n", + "Scaled range step 6: [ -3 - 2 ]\n", + "Scaled range step 7: [ -3 - 2 ]\n", + "Scaled range step 8: [ -3 - 2 ]\n", + "Scaled range step 9: [ -3 - 2 ]\n" ] }, { "data": { "text/plain": [ - "{\"demand.scale('new-york')\": 0.001,\n", + "{\"demand.scale('topeka')\": 0.0010000000000000002,\n", " \"supply.scale('san-diego')\": 0.001,\n", - " \"demand.scale('topeka')\": 0.0010000000000000002,\n", - " \"x.scale('san-diego','chicago')\": 10.0,\n", + " \"demand.scale('new-york')\": 0.001,\n", " \"x.scale('san-diego','new-york')\": 100000.0,\n", - " \"x.scale('seattle','new-york')\": 10.0,\n", " \"x.scale('seattle','topeka')\": 10.0,\n", - " \"x.scale('san-diego','topeka')\": 100000.0}" + " \"x.scale('seattle','new-york')\": 10.0,\n", + " \"x.scale('san-diego','topeka')\": 100000.0,\n", + " \"x.scale('san-diego','chicago')\": 10.0}" ] }, - "execution_count": 7, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "make_scale(path,bound,10,show_range=True)" + "make_prescaler(path,bounds,10,show_range=True)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "ee70fdd0", "metadata": {}, "outputs": [ @@ -186,10 +276,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "Unscaled range : [ -8 , 0 ]\n", - "Scaled range step 0: [ -4 , 4 ]\n" + "Unscaled range : [ -8 - 0 ]\n", + "Scaled range step 0: [ -4 - 4 ]\n" ] - }, + } + ], + "source": [ + "prescale = make_prescaler(path,bounds,1,show_range=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "367593f8", + "metadata": {}, + "outputs": [ { "data": { "text/plain": [ @@ -197,13 +298,13 @@ " \"x.scale('san-diego','topeka')\": 1000.0}" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "make_scale(path,bound,1,show_range=True)" + "prescale" ] }, { diff --git a/message_ix/tools/lp_diag/__init__.py b/message_ix/tools/lp_diag/__init__.py index 37714c204..a178049d2 100644 --- a/message_ix/tools/lp_diag/__init__.py +++ b/message_ix/tools/lp_diag/__init__.py @@ -226,6 +226,34 @@ def mps_sum(self): ) print(f"Distribution of the GF (objective) values:\n{df.describe()}") + def read_matrix(self): + # check, if there was at least one N row + # (the first N row assumed to be the objective): + assert self.gf_seq != -1, "objective (goal function) row is undefined." + + # create a df with the matrix coefficients + self.mat = pd.DataFrame( + {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} + ) + self.mat["abs_val"] = abs( + self.mat["val"] + ) # add column with absolute values of coeff. + self.mat["log"] = np.log10(self.mat["abs_val"]).astype( + int + ) # add col with int(log10(coeffs)) + + # recreate all matrix dataframe for rescaler + row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() + col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() + matrix = self.mat.copy() + matrix = ( + matrix.set_index(["row", "col"], drop=True)[["val"]] + .rename(index=row_name, level="row") + .rename(index=col_name, level="col") + ) + + return matrix + def add_row(self, words: List[str], n_line: int): """Process current line of the ROWS section. From 3fa16fe2aad4b2882114e32972fef4b314506c2e Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Thu, 11 Apr 2024 18:31:21 +0200 Subject: [PATCH 20/25] Prepare tutorial --- message_ix/model/MESSAGE/model_core.gms | 2 +- message_ix/model/MESSAGE/model_setup.gms | 10 + message_ix/model/MESSAGE/model_solve.gms | 7 +- message_ix/model/MESSAGE_master.gms | 4 +- message_ix/model/MESSAGE_project.gpr | 33 +- .../model/prescaler/MsgPrescaler_Default.gms | 1 + ...os Electrified_emission_bound_unscaled.gms | 6 + message_ix/models.py | 22 ++ .../Tranport Scaling/MGLogs 1.0 | 229 ++++++++++++ .../Tranport Scaling/MGLogs 1.gms | 229 ++++++++++++ .../Tranport Scaling/Savepoint.gms | 10 + .../Tranport Scaling/Transport Export.gms | 57 +++ .../Tranport Scaling/trnsport.gms | 69 ++++ ...os Electrified_emission_bound_unscaled.mps | 283 ++++++++++++++ message_ix/tools/make_prescaler/__init__.py | 234 ++++++++++++ .../make_prescaler/westeros_scaling.ipynb | 292 +++++++++++++++ tutorial/westeros/westeros_baseline.ipynb | 346 ++++++++++++++---- 17 files changed, 1752 insertions(+), 82 deletions(-) create mode 100644 message_ix/model/prescaler/MsgPrescaler_Default.gms create mode 100644 message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms create mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 create mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms create mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms create mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms create mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms create mode 100644 message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps create mode 100644 message_ix/tools/make_prescaler/__init__.py create mode 100644 message_ix/tools/make_prescaler/westeros_scaling.ipynb diff --git a/message_ix/model/MESSAGE/model_core.gms b/message_ix/model/MESSAGE/model_core.gms index e549c7fb1..462fa8f4b 100644 --- a/message_ix/model/MESSAGE/model_core.gms +++ b/message_ix/model/MESSAGE/model_core.gms @@ -142,7 +142,7 @@ Variables * =========================================================================== ====================================================================================================== * * .. warning:: -* Please be aware that transitioning from one period length to another for consecutive periods may result in false values of :math:`\text{PRICE_EMISSION}`. +* Please be aware that transitioning from one period length to another for consecutive periods may result in false values of :math:`\text{PRICE_EMISSION}`. * Please see `this issue `_ for further information. We are currently working on a fix. *** diff --git a/message_ix/model/MESSAGE/model_setup.gms b/message_ix/model/MESSAGE/model_setup.gms index bab699280..d7df10907 100644 --- a/message_ix/model/MESSAGE/model_setup.gms +++ b/message_ix/model/MESSAGE/model_setup.gms @@ -21,6 +21,11 @@ $IF NOT SET out $SETGLOBAL out "output/MsgOutput.gdx" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $IF NOT SET foresight $SETGLOBAL foresight "0" + +*$IF NOT SET scaler +$SETGLOBAL scaler "MsgPrescaler_Westeros Electrified_emission_bound_unscaled" + + ** define learning mode (active / inactive) ** * deactivate - 0 (assumed as default if not specified) * activate - 1 @@ -89,4 +94,9 @@ $INCLUDE MESSAGE/scaling_investment_costs.gms *----------------------------------------------------------------------------------------------------------------------* $INCLUDE MESSAGE/model_core.gms + +*$OFFLISTING +$INCLUDE prescaler/%scaler%.gms +*$ONLISTING + $INCLUDE MESSAGE/model_learningeos.gms diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index 83fd68e5d..563a06bb8 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -28,9 +28,14 @@ if (%foresight% = 0, year(year_all)$( model_horizon(year_all) ) = yes ; * write a status update to the log file, solve the model + put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; option threads = 4 ; - MESSAGE_LP.scaleopt = 1 ; +* COST_ACCOUNTING_NODAL.scale('Westeros','710')=10.0; +* COST_ACCOUNTING_NODAL.scale('Westeros','700')=10.0; +* COST_ACCOUNTING_NODAL.scale('Westeros','720')=10.0; +* CAP_NEW.scale('Westeros','wind_ppl','700')=0.1; +* CAP_NEW.scale('Westeros','wind_ppl','710')=0.1; Solve MESSAGE_LP using LP minimizing OBJ ; * write model status summary diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index 16a4cd684..202794337 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -46,7 +46,7 @@ $ONGLOBAL ** scenario/case selection - this must match the name of the MsgData_<%%%>.gdx input data file ** *$SETGLOBAL data "" -$SETGLOBAL data "Westeros_Electrified_emission_bound_scaled" +$SETGLOBAL data "Westeros_Electrified_emission_bound_unscaled" ** MACRO mode * "none": MESSAGEix is run in stand-alone mode @@ -64,6 +64,8 @@ $SETGLOBAL foresight "0" * activate technology learning - 1 $SETGLOBAL learningmode "0" +** for recursive dynamic approach, this is to activate/deactivate technology learning module ** +*$SETGLOBAL scaler "" ** add a comment and name extension for model report files (e.g. run-specific info, calibration notes) - optional ** $SETGLOBAL comment "" diff --git a/message_ix/model/MESSAGE_project.gpr b/message_ix/model/MESSAGE_project.gpr index 63c28a2b2..976df4da4 100644 --- a/message_ix/model/MESSAGE_project.gpr +++ b/message_ix/model/MESSAGE_project.gpr @@ -738,29 +738,30 @@ PlaneRownr=-1 [RP:MODEL_LEARNINGEOS] 1= -[RP:MODEL_SOLVE] +[RP:MESSAGE_MASTER] 1= -[RP:MESSAGE_MASTER] +[RP:MODEL_SOLVE] 1= [MRUFILES] -1=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_setup.gms -2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\sets_maps_def.gms -3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE/data_load.gms -4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\data\MsgData_Westeros_Electrified_baseline.gdx -5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_run.lst -6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\output\MsgOutput_Westeros_Electrified_baseline.gdx -7=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\learningeos.gdx +1=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_run.lst +2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_setup.gms +3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\sets_maps_def.gms +4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE/data_load.gms +5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\data\MsgData_Westeros_Electrified_baseline.gdx +6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_run.lst +7=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\output\MsgOutput_Westeros_Electrified_baseline.gdx +8=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\learningeos.gdx [OPENWINDOW_1] -FILE0=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_core.gms -FILE1=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_learningeos.gms -FILE2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_solve.gms -FILE3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.gms -FILE4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.lst -FILE5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\model_solve.lst -FILE6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.gms +FILE0=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE\model_solve.gms +FILE1=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_master.gms +FILE2=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_master.lst +FILE3=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\Scale_test.mps +FILE4=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\make_prescaler\Westeros Electrified_emission_bound_scaled.mps +FILE5=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\make_prescaler\Westeros Electrified_emission_bound_unscaled.mps +FILE6=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_master.gms MAXIM=0 TOP=7 LEFT=50 diff --git a/message_ix/model/prescaler/MsgPrescaler_Default.gms b/message_ix/model/prescaler/MsgPrescaler_Default.gms new file mode 100644 index 000000000..77038c6ab --- /dev/null +++ b/message_ix/model/prescaler/MsgPrescaler_Default.gms @@ -0,0 +1 @@ +* This default prescaler is intentionally left empty \ No newline at end of file diff --git a/message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms b/message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms new file mode 100644 index 000000000..7be21d66f --- /dev/null +++ b/message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms @@ -0,0 +1,6 @@ +COST_ACCOUNTING_NODAL.scale('Westeros','710')=10.0; +COST_ACCOUNTING_NODAL.scale('Westeros','700')=10.0; +COST_ACCOUNTING_NODAL.scale('Westeros','720')=10.0; +CAP_NEW.scale('Westeros','wind_ppl','710')=0.1; +CAP_NEW.scale('Westeros','wind_ppl','700')=0.1; +MESSAGE_LP.scaleopt=1; \ No newline at end of file diff --git a/message_ix/models.py b/message_ix/models.py index 5c9253f71..95e1bafc7 100644 --- a/message_ix/models.py +++ b/message_ix/models.py @@ -211,6 +211,28 @@ def run(self, scenario): optfile.write_text("\n".join(lines)) log.info(f"Use CPLEX options {self.cplex_opts}") + """ + # removing prescaler arguments in options file + current_dir = os.getcwd() + prescale_args_dir = os.path.join(current_dir, "prescale_args.csv") + + if os.path.exists(prescale_args_dir): + prescale_args = pd.read_csv(prescale_args_dir) + keys2remove = list(prescale_args["key"]) + + for key in keys2remove: + del self.cplex_opts[key] + + if "writemps" in self.cplex_opts.keys(): + del self.cplex_opts["writemps"] + + # for k, v in self.cplex_opts.items(): + # print(k, v) + + print("opt1:", self.cplex_opts) + print("opt2:", self.cplex_opts) + """ + self.cplex_opts.update({"barcrossalg": 2}) optfile2 = Path(self.model_dir).joinpath("cplex.op2") lines2 = ("{} = {}".format(*kv) for kv in self.cplex_opts.items()) diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 b/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 new file mode 100644 index 000000000..09f43d756 --- /dev/null +++ b/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 @@ -0,0 +1,229 @@ +$ontext + == Model for Gas Logistics Systems (MGLogs) == +=============================== An MILP Model for Optimal Planning of Small-scale LNG Logistics Systems =============================== += (c) Yoga Wienda Pratama, Widodo Wahyu Purwanto = += Department of Chemical Engineering, Faculty of Engineering Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = += Sustainable Energy Systems & Policy Research Cluster (SESP - UI) Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = +======================================================================================================================================= +$offtext + +$set Data 'MGLogs_Input0' +*Read data from Excel and store in GDX file. +$call gdxxrw %Data%.xlsx skipempty=0 trace=2 index=Specs!A1 +$gdxin %Data%.gdx +*$gdxin MGLogs_Input.gdx + + +Sets + i locations + s storages + c vessels + r route slots + l frequency / 1*100 /; +$load i,s,c,r + +Alias (i,j,k) ; + +Parameters + di(i,i) distance between locations + d(i) demand of LNG at location i in m3 of LNG + capexc(c) capital expenditures of vessels (USD per unit) + capexs(s) capital expenditures of storage and FSRU (USD per unit) + capexns(s) capital expenditures of non storage facility and onshore interface for FSRU (USD per m3 per year) + fec(c) fuel economy of vessel (MMBTU per nautical mile) + ucc(c) unit capacity of vessel (m3) + ucs(s) unit capacity of storage or FSRU (m3) + vc(c) velocity of vessel (kn) + lurc(c) loading unloading rate of vessel (m3 per hr) + btc(c) berthing time of vessels + c_lp(j) liquefaction plant production capacity (m3 per year) + nTr(l) number of frequency in binary linearization + pg(i) price of LNG ($ p MMBTU) ; + +$load di,d,capexc,capexs,capexns,fec,ucc,ucs,vc,lurc,btc,c_lp, pg +nTr(l) = ord(l) ; + +SCALARS fomc fixed operating and maintenance carrier + fomr fixed operating and maintenance costs of regas + cgr cost of gas regasification ($ p m3) + svr coefficient for storage volume reserve + hvc heels volume of carrier + cbogc coefficient of BOG for vessels (LNG transported per day) + pd price of diessel fuel ($ p MMBTU) + crfc cost recovery factor + crfr cost recovery factor + ghv m3 to mmbtu + m any large number for number of storage + scur_up upper bound for storage capacity for vessel unloading + scsor_up upper bound for storage capacity for send out + sclr_up upper bound for storage capacity for vessel loading + itc Idle time of vessel (hr) + ; + +$load fomc,fomr,cgr,svr,hvc,cbogc,pd,crfc,crfr,ghv,m,scur_up,scsor_up,sclr_up,itc + +VARIABLES +*Objective Function + TASC Total annual systems cost US$ + CoG Cost in gas from liquefaction terminal + CoC Cost in vessels + CoR Cost in receiving terminal + ; + +POSITIVE VARIABLES +*Vessels + Lv(i,r,c,j) Volume of LNG from liquefaction terminal i loaded to vessel (m3 LNG) + Tv(i,r,c,j,k) Volume of LNG from liquefaction terminal i transported by vessel from terminals j to k (m3 LNG) + Uv(i,r,c,j) Volume of LNG from liquefaction terminal i unloaded from vessel to terminal j (m3 LNG) + Rv(i,r,c,j) Volume of LNG from liquefaction terminal i remains in vessel after unloading in terminal j (m3 LNG) + Bogv(i,r,c,j,k) Volume of LNG from liquefaction terminal i boiled off during travel from j to k + Dec(i,r,c,j,k) Diessel fuel consumption from j to k (MMBTU) + Hv(i) Heels' volume of carriers (m3 of LNG) + +*Receiving Terminals + Scr(j) Storage capacity of receiving terminal (m3 LNG) + Socr(j) Send-out capacity of receiving terminal (m3 LNG per year) + Scsor(l,i,r,c,k) Storage capacity for send out (m3 LNG) + Sclr(l,i,r,c,j) Storage capacity for vessels loading from receiving terminal (m3 LNG) + Scur(l,i,r,c,k) Storage capacity for unloading + Sorr(i,r,c,k) Send-out rate of receiving terminal (m3 LNG per year) + + ; +BINARY VARIABLES + Sb(s,j) Storage type selection + Rb(l,i,r,c,j,k) Route selection + ; + +INTEGER VARIABLES + Nc(i,r,c) + Nsr(s,j) + Tr(i,r,c,j,k) + ; + +EQUATIONS + EQ1 + EQ2 + EQ3 + EQ4 + EQ5(j) + EQ6(r,k) + EQ7(r,j) + EQ8(k) + EQ9(j) + EQ10(l,i,r,c,j,k) + EQ11(l,i,r,c,k) + EQ12(i,r,c,j,k) + EQ13(i,r,c,k) + EQ14(i,r,c,j) + EQ15(i,r,c,j,k) + EQ16(i,r,c,j) + EQ17(j) + EQ18(j) + EQ19(i,r,c,j,k) + EQ20(i,r,c,j,k) + EQ21(i,r,c,j,k) + EQ22(i,r,c) + EQ23(i) + EQ24(j) + EQ25(k) + EQ26(k) +** EQ27(i,r,c,j,k) + EQ27a(i,r,c,k) + EQ27b(l,i,r,c,k) +** EQ28(i,r,c,j,k) + EQ28a(i,r,c,j,k) + EQ28b(l,i,r,c,k) +** EQ29(i,r,c,j,k) + EQ29a(i,r,c,j) + EQ29b(l,i,r,c,j) + EQ30(s,j) + EQ31(s,j) + EQ32(j) + EQ33(j) + EQ34(i,r,c,j,k) + ; + +*Statement of Equations +*Objective Function + EQ1.. TASC =E= CoG + CoR + CoC ; + EQ2.. CoG =E= sum[i, pg(i) * ghv * (sum[(r,c,j), Lv(i,r,c,j)$(ord(i) < 3)] - sum[(r,c,j,k), Bogv(i,r,c,j,k)] - Hv(i))] ; + EQ3.. CoC =E= sum[(i,r,c), Nc(i,r,c) * (capexc(c) * (crfc + fomc))] + sum[(i,r,c,j,k), Dec(i,r,c,j,k) * pd + Bogv(i,r,c,j,k) * ghv * pg(i)] ; + EQ4.. CoR =E= (sum[(s,i)$(ord(s) = 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)] + sum[(s,i)$(ord(s) > 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)]) * (crfr + fomr) + sum[i, d(i) * cgr] ; + +*Constraints +*Supply Demand Balance + EQ5(j).. sum[(i,r,c), Sorr(i,r,c,j)] =E= d(j) ; +*Vehicle flow formulation +*--------untuk hub, untuk masing-masing rs, boleh didatangi dan ditinggal masing-masing sekali + EQ6(r,k).. sum[(l,i,c,j)$(ord(i) = ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; + EQ7(r,j).. sum[(l,i,c,k)$(ord(i) = ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; +*--------kalau bukan hub, hanya boleh didatangi dan ditinggal oleh 1 rute untuk semua slot + EQ8(k).. sum[(l,i,r,c,j)$(ord(i) <> ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; + EQ9(j).. sum[(l,i,r,c,k)$(ord(i) <> ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; + EQ10(l,i,r,c,j,k)$(ord(j) = ord(k)).. Rb(l,i,r,c,j,k) =E= 0 ; + EQ11(l,i,r,c,k).. sum[j, Rb(l,i,r,c,j,k)] =E= sum[j, Rb(l,i,r,c,k,j)] ; + +*LNG balance in Vessels + EQ12(i,r,c,j,k).. Tr(i,r,c,j,k) =E= sum[l, Rb(l,i,r,c,j,k) * nTR(l)] ; + EQ13(i,r,c,k).. sum[j, Tv(i,r,c,j,k)] =E= Uv(i,r,c,k) +Rv(i,r,c,k) ; + EQ14(i,r,c,j).. sum[k, Tv(i,r,c,j,k)] =E= Rv(i,r,c,j) + Lv(i,r,c,j) - sum[k, Bogv(i,r,c,j,k)] ; + EQ15(i,r,c,j,k).. Bogv(i,r,c,j,k) =E= cbogc * (di(j,k) / [vc(c) * 24]) * (Tv(i,r,c,j,k) + Bogv(i,r,c,j,k)) ; + EQ16(i,r,c,j)$(ord(i) <> ord(j)).. Lv(i,r,c,j) =E= 0 ; + EQ17(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) < 3)] =L= c_lp(j) ; + EQ18(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) > 2)] =L= sum[(i,r,c), Uv(i,r,c,j)] - sum[(i,r,c), Sorr(i,r,c,j)] ; + EQ19(i,r,c,j,k).. Tv(i,r,c,j,k) + Bogv(i,r,c,j,k) =L= Tr(i,r,c,j,k) * ucc(c) ; + EQ20(i,r,c,j,k).. Tv(i,r,c,j,k) =G= Tr(i,r,c,j,k) * hvc * ucc(c) ; + EQ21(i,r,c,j,k)$(ord(i) = ord(k)).. Tv(i,r,c,j,k) =E= Tr(i,r,c,j,k) * hvc * ucc(c) ; + EQ22(i,r,c).. Nc(i,r,c) * (8766 - itc) =G= sum[(j,k), Tr(i,r,c,j,k) * ([di(j,k)/vc(c)] + btc(c))] + sum[k, Uv(i,r,c,k)/lurc(c)] + sum[j, Lv(i,r,c,j)/lurc(c)] ; + +*Heels of Ship + EQ23(i).. Hv(i) =E= sum[(r,c), hvc * Nc(i,r,c) * ucc(c)] ; + +*Storage size constraints + EQ24(j).. Scr(j) =E= sum[s, Nsr(s,j) * ucs(s)] ; + EQ25(k).. Scr(k) =G= sum[(l,i,r,c), Scur(l,i,r,c,k)] ; + EQ26(k).. Scr(k) =G= sum[(l,i,r,c), Scsor(l,i,r,c,k)] + sum[(l,i,r,c), Sclr(l,i,r,c,k)] ; + +** Do not remove +** EQ27(i,r,c,j,k)$(ord(i) <> ord(k)).. Scur(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Uv(i,r,c,k) ; + EQ27a(i,r,c,k)$(ord(i) <> ord(k)).. svr * Uv(i,r,c,k) =L= sum[l, nTR(l) * Scur(l,i,r,c,k)] ; + EQ27b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scur(l,i,r,c,k) =L= scur_up * sum[j, Rb(l,i,r,c,j,k)] ; +** Do not remove +** EQ28(i,r,c,j,k)$(ord(i) <> ord(k)).. Scsor(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Sorr(i,r,c,k) ; + EQ28a(i,r,c,j,k)$(ord(i) <> ord(k)).. svr * Sorr(i,r,c,k) =L= sum[l, nTR(l) * Scsor(l,i,r,c,k)] ; + EQ28b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scsor(l,i,r,c,k) =L= scsor_up * sum[j, Rb(l,i,r,c,j,k)] ; +** Do not remove +** EQ29(i,r,c,j,k)$(ord(i) = ord(j) and ord(i) > 2).. Sclr(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Lv(i,r,c,j) ; + EQ29a(i,r,c,j)$(ord(i) > 2).. svr * Lv(i,r,c,j) =L= sum[l, nTR(l) * Sclr(l,i,r,c,j)] ; + EQ29b(l,i,r,c,j)$(ord(i) > 2).. Sclr(l,i,r,c,j) =L= sclr_up * sum[k, Rb(l,i,r,c,j,k)] ; + EQ30(s,j)$(ord(s) = 1).. Nsr(s,j) =L= Sb(s,j) * m ; + EQ31(s,j)$(ord(s) > 1).. Nsr(s,j) =L= Sb(s,j) ; + EQ32(j).. sum[s, Sb(s,j)] =L= 1 ; + EQ33(j).. Socr(j) =E= sum[(i,r,c), Sorr(i,r,c,j)] ; + +*Fuel Consumption for Shipping + EQ34(i,r,c,j,k).. Dec(i,r,c,j,k) + (BOGV(i,r,c,j,k) * ghv) =E= fec(c) * Tr(i,r,c,j,k) * di(j,k) ; + + Nc.up(i,r,c) = 3 ; + Nsr.up(s,j) = 10 ; + Tr.up(i,r,c,j,k) = card(l) ; + + + +MODEL MGLogs / all / +OPTION mip = CPLEX ; +OPTION reslim = 864000; +OPTION threads = 12; +OPTION optcr = 0.03 ; +MGLogs.nodlim = 10000000; +SOLVE MGLogs using MIP minimize TASC; + + +$set datatype Output +$set outputname (SESP-UI) +Execute_Unload "MGLogs_%datatype%_%outputname%.gdx"; + + +$ontext + +$offtext diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms b/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms new file mode 100644 index 000000000..09f43d756 --- /dev/null +++ b/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms @@ -0,0 +1,229 @@ +$ontext + == Model for Gas Logistics Systems (MGLogs) == +=============================== An MILP Model for Optimal Planning of Small-scale LNG Logistics Systems =============================== += (c) Yoga Wienda Pratama, Widodo Wahyu Purwanto = += Department of Chemical Engineering, Faculty of Engineering Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = += Sustainable Energy Systems & Policy Research Cluster (SESP - UI) Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = +======================================================================================================================================= +$offtext + +$set Data 'MGLogs_Input0' +*Read data from Excel and store in GDX file. +$call gdxxrw %Data%.xlsx skipempty=0 trace=2 index=Specs!A1 +$gdxin %Data%.gdx +*$gdxin MGLogs_Input.gdx + + +Sets + i locations + s storages + c vessels + r route slots + l frequency / 1*100 /; +$load i,s,c,r + +Alias (i,j,k) ; + +Parameters + di(i,i) distance between locations + d(i) demand of LNG at location i in m3 of LNG + capexc(c) capital expenditures of vessels (USD per unit) + capexs(s) capital expenditures of storage and FSRU (USD per unit) + capexns(s) capital expenditures of non storage facility and onshore interface for FSRU (USD per m3 per year) + fec(c) fuel economy of vessel (MMBTU per nautical mile) + ucc(c) unit capacity of vessel (m3) + ucs(s) unit capacity of storage or FSRU (m3) + vc(c) velocity of vessel (kn) + lurc(c) loading unloading rate of vessel (m3 per hr) + btc(c) berthing time of vessels + c_lp(j) liquefaction plant production capacity (m3 per year) + nTr(l) number of frequency in binary linearization + pg(i) price of LNG ($ p MMBTU) ; + +$load di,d,capexc,capexs,capexns,fec,ucc,ucs,vc,lurc,btc,c_lp, pg +nTr(l) = ord(l) ; + +SCALARS fomc fixed operating and maintenance carrier + fomr fixed operating and maintenance costs of regas + cgr cost of gas regasification ($ p m3) + svr coefficient for storage volume reserve + hvc heels volume of carrier + cbogc coefficient of BOG for vessels (LNG transported per day) + pd price of diessel fuel ($ p MMBTU) + crfc cost recovery factor + crfr cost recovery factor + ghv m3 to mmbtu + m any large number for number of storage + scur_up upper bound for storage capacity for vessel unloading + scsor_up upper bound for storage capacity for send out + sclr_up upper bound for storage capacity for vessel loading + itc Idle time of vessel (hr) + ; + +$load fomc,fomr,cgr,svr,hvc,cbogc,pd,crfc,crfr,ghv,m,scur_up,scsor_up,sclr_up,itc + +VARIABLES +*Objective Function + TASC Total annual systems cost US$ + CoG Cost in gas from liquefaction terminal + CoC Cost in vessels + CoR Cost in receiving terminal + ; + +POSITIVE VARIABLES +*Vessels + Lv(i,r,c,j) Volume of LNG from liquefaction terminal i loaded to vessel (m3 LNG) + Tv(i,r,c,j,k) Volume of LNG from liquefaction terminal i transported by vessel from terminals j to k (m3 LNG) + Uv(i,r,c,j) Volume of LNG from liquefaction terminal i unloaded from vessel to terminal j (m3 LNG) + Rv(i,r,c,j) Volume of LNG from liquefaction terminal i remains in vessel after unloading in terminal j (m3 LNG) + Bogv(i,r,c,j,k) Volume of LNG from liquefaction terminal i boiled off during travel from j to k + Dec(i,r,c,j,k) Diessel fuel consumption from j to k (MMBTU) + Hv(i) Heels' volume of carriers (m3 of LNG) + +*Receiving Terminals + Scr(j) Storage capacity of receiving terminal (m3 LNG) + Socr(j) Send-out capacity of receiving terminal (m3 LNG per year) + Scsor(l,i,r,c,k) Storage capacity for send out (m3 LNG) + Sclr(l,i,r,c,j) Storage capacity for vessels loading from receiving terminal (m3 LNG) + Scur(l,i,r,c,k) Storage capacity for unloading + Sorr(i,r,c,k) Send-out rate of receiving terminal (m3 LNG per year) + + ; +BINARY VARIABLES + Sb(s,j) Storage type selection + Rb(l,i,r,c,j,k) Route selection + ; + +INTEGER VARIABLES + Nc(i,r,c) + Nsr(s,j) + Tr(i,r,c,j,k) + ; + +EQUATIONS + EQ1 + EQ2 + EQ3 + EQ4 + EQ5(j) + EQ6(r,k) + EQ7(r,j) + EQ8(k) + EQ9(j) + EQ10(l,i,r,c,j,k) + EQ11(l,i,r,c,k) + EQ12(i,r,c,j,k) + EQ13(i,r,c,k) + EQ14(i,r,c,j) + EQ15(i,r,c,j,k) + EQ16(i,r,c,j) + EQ17(j) + EQ18(j) + EQ19(i,r,c,j,k) + EQ20(i,r,c,j,k) + EQ21(i,r,c,j,k) + EQ22(i,r,c) + EQ23(i) + EQ24(j) + EQ25(k) + EQ26(k) +** EQ27(i,r,c,j,k) + EQ27a(i,r,c,k) + EQ27b(l,i,r,c,k) +** EQ28(i,r,c,j,k) + EQ28a(i,r,c,j,k) + EQ28b(l,i,r,c,k) +** EQ29(i,r,c,j,k) + EQ29a(i,r,c,j) + EQ29b(l,i,r,c,j) + EQ30(s,j) + EQ31(s,j) + EQ32(j) + EQ33(j) + EQ34(i,r,c,j,k) + ; + +*Statement of Equations +*Objective Function + EQ1.. TASC =E= CoG + CoR + CoC ; + EQ2.. CoG =E= sum[i, pg(i) * ghv * (sum[(r,c,j), Lv(i,r,c,j)$(ord(i) < 3)] - sum[(r,c,j,k), Bogv(i,r,c,j,k)] - Hv(i))] ; + EQ3.. CoC =E= sum[(i,r,c), Nc(i,r,c) * (capexc(c) * (crfc + fomc))] + sum[(i,r,c,j,k), Dec(i,r,c,j,k) * pd + Bogv(i,r,c,j,k) * ghv * pg(i)] ; + EQ4.. CoR =E= (sum[(s,i)$(ord(s) = 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)] + sum[(s,i)$(ord(s) > 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)]) * (crfr + fomr) + sum[i, d(i) * cgr] ; + +*Constraints +*Supply Demand Balance + EQ5(j).. sum[(i,r,c), Sorr(i,r,c,j)] =E= d(j) ; +*Vehicle flow formulation +*--------untuk hub, untuk masing-masing rs, boleh didatangi dan ditinggal masing-masing sekali + EQ6(r,k).. sum[(l,i,c,j)$(ord(i) = ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; + EQ7(r,j).. sum[(l,i,c,k)$(ord(i) = ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; +*--------kalau bukan hub, hanya boleh didatangi dan ditinggal oleh 1 rute untuk semua slot + EQ8(k).. sum[(l,i,r,c,j)$(ord(i) <> ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; + EQ9(j).. sum[(l,i,r,c,k)$(ord(i) <> ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; + EQ10(l,i,r,c,j,k)$(ord(j) = ord(k)).. Rb(l,i,r,c,j,k) =E= 0 ; + EQ11(l,i,r,c,k).. sum[j, Rb(l,i,r,c,j,k)] =E= sum[j, Rb(l,i,r,c,k,j)] ; + +*LNG balance in Vessels + EQ12(i,r,c,j,k).. Tr(i,r,c,j,k) =E= sum[l, Rb(l,i,r,c,j,k) * nTR(l)] ; + EQ13(i,r,c,k).. sum[j, Tv(i,r,c,j,k)] =E= Uv(i,r,c,k) +Rv(i,r,c,k) ; + EQ14(i,r,c,j).. sum[k, Tv(i,r,c,j,k)] =E= Rv(i,r,c,j) + Lv(i,r,c,j) - sum[k, Bogv(i,r,c,j,k)] ; + EQ15(i,r,c,j,k).. Bogv(i,r,c,j,k) =E= cbogc * (di(j,k) / [vc(c) * 24]) * (Tv(i,r,c,j,k) + Bogv(i,r,c,j,k)) ; + EQ16(i,r,c,j)$(ord(i) <> ord(j)).. Lv(i,r,c,j) =E= 0 ; + EQ17(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) < 3)] =L= c_lp(j) ; + EQ18(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) > 2)] =L= sum[(i,r,c), Uv(i,r,c,j)] - sum[(i,r,c), Sorr(i,r,c,j)] ; + EQ19(i,r,c,j,k).. Tv(i,r,c,j,k) + Bogv(i,r,c,j,k) =L= Tr(i,r,c,j,k) * ucc(c) ; + EQ20(i,r,c,j,k).. Tv(i,r,c,j,k) =G= Tr(i,r,c,j,k) * hvc * ucc(c) ; + EQ21(i,r,c,j,k)$(ord(i) = ord(k)).. Tv(i,r,c,j,k) =E= Tr(i,r,c,j,k) * hvc * ucc(c) ; + EQ22(i,r,c).. Nc(i,r,c) * (8766 - itc) =G= sum[(j,k), Tr(i,r,c,j,k) * ([di(j,k)/vc(c)] + btc(c))] + sum[k, Uv(i,r,c,k)/lurc(c)] + sum[j, Lv(i,r,c,j)/lurc(c)] ; + +*Heels of Ship + EQ23(i).. Hv(i) =E= sum[(r,c), hvc * Nc(i,r,c) * ucc(c)] ; + +*Storage size constraints + EQ24(j).. Scr(j) =E= sum[s, Nsr(s,j) * ucs(s)] ; + EQ25(k).. Scr(k) =G= sum[(l,i,r,c), Scur(l,i,r,c,k)] ; + EQ26(k).. Scr(k) =G= sum[(l,i,r,c), Scsor(l,i,r,c,k)] + sum[(l,i,r,c), Sclr(l,i,r,c,k)] ; + +** Do not remove +** EQ27(i,r,c,j,k)$(ord(i) <> ord(k)).. Scur(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Uv(i,r,c,k) ; + EQ27a(i,r,c,k)$(ord(i) <> ord(k)).. svr * Uv(i,r,c,k) =L= sum[l, nTR(l) * Scur(l,i,r,c,k)] ; + EQ27b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scur(l,i,r,c,k) =L= scur_up * sum[j, Rb(l,i,r,c,j,k)] ; +** Do not remove +** EQ28(i,r,c,j,k)$(ord(i) <> ord(k)).. Scsor(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Sorr(i,r,c,k) ; + EQ28a(i,r,c,j,k)$(ord(i) <> ord(k)).. svr * Sorr(i,r,c,k) =L= sum[l, nTR(l) * Scsor(l,i,r,c,k)] ; + EQ28b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scsor(l,i,r,c,k) =L= scsor_up * sum[j, Rb(l,i,r,c,j,k)] ; +** Do not remove +** EQ29(i,r,c,j,k)$(ord(i) = ord(j) and ord(i) > 2).. Sclr(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Lv(i,r,c,j) ; + EQ29a(i,r,c,j)$(ord(i) > 2).. svr * Lv(i,r,c,j) =L= sum[l, nTR(l) * Sclr(l,i,r,c,j)] ; + EQ29b(l,i,r,c,j)$(ord(i) > 2).. Sclr(l,i,r,c,j) =L= sclr_up * sum[k, Rb(l,i,r,c,j,k)] ; + EQ30(s,j)$(ord(s) = 1).. Nsr(s,j) =L= Sb(s,j) * m ; + EQ31(s,j)$(ord(s) > 1).. Nsr(s,j) =L= Sb(s,j) ; + EQ32(j).. sum[s, Sb(s,j)] =L= 1 ; + EQ33(j).. Socr(j) =E= sum[(i,r,c), Sorr(i,r,c,j)] ; + +*Fuel Consumption for Shipping + EQ34(i,r,c,j,k).. Dec(i,r,c,j,k) + (BOGV(i,r,c,j,k) * ghv) =E= fec(c) * Tr(i,r,c,j,k) * di(j,k) ; + + Nc.up(i,r,c) = 3 ; + Nsr.up(s,j) = 10 ; + Tr.up(i,r,c,j,k) = card(l) ; + + + +MODEL MGLogs / all / +OPTION mip = CPLEX ; +OPTION reslim = 864000; +OPTION threads = 12; +OPTION optcr = 0.03 ; +MGLogs.nodlim = 10000000; +SOLVE MGLogs using MIP minimize TASC; + + +$set datatype Output +$set outputname (SESP-UI) +Execute_Unload "MGLogs_%datatype%_%outputname%.gdx"; + + +$ontext + +$offtext diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms b/message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms new file mode 100644 index 000000000..466d9ccea --- /dev/null +++ b/message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms @@ -0,0 +1,10 @@ +$ontext +This program illustrates the use savepoint. It writes +the current model solution to a log or GDX file. The option +values are: + 0: do not write a point file (default) + 1: write the solution to _p.gdx + 2: write the solution to _p.gdx +$offtext + +$call =gams trnsport savepoint=2 lo=%GAMS.lo% diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms b/message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms new file mode 100644 index 000000000..ea652c663 --- /dev/null +++ b/message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms @@ -0,0 +1,57 @@ +*$set Data 'var_scale' +*Read data from Excel and store in GDX file. +*$call gdxxrw %Data%.xlsx skipempty=0 trace=2 index=Scale!A1 +*$gdxin %Data%.gdx +*$gdxin MGLogs_Input.gdx + +Sets + i 'canning plants' / seattle, san-diego / + j 'markets' / new-york, chicago, topeka / ; + +Parameters + + a(i) 'capacity of plant i in cases' + / seattle 350 + san-diego 600 / + + b(j) 'demand at market j in cases' + / new-york 325 + chicago 300 + topeka 275 / +; + + +Table d(i,j) 'distance in thousands of miles' + new-york chicago topeka + seattle 2.5 1.7 1.8 + san-diego 2.5 1.8 1.4 ; + +Scalar f 'freight in dollars per case per thousand miles' /90/ ; + +Parameter c(i,j) 'transport cost in thousands of dollars per case' ; + + c(i,j) = f * d(i,j) / 1000 ; + +Variables + x(i,j) 'shipment quantities in cases' + z 'total transportation costs in thousands of dollars' ; + +Positive Variable x ; + +Equations + cost 'define objective function' + supply(i) 'observe supply limit at plant i' + demand(j) 'satisfy demand at market j' ; + +cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; + +supply(i) .. sum(j, x(i,j)) =l= a(i) ; + +demand(j) .. sum(i, x(i,j)) =g= b(j) ; + +Model transport /all/ ; +$include args.gms +Solve transport using lp minimizing z ; + +Display x.l, x.m ; + diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms b/message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms new file mode 100644 index 000000000..e6d98860f --- /dev/null +++ b/message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms @@ -0,0 +1,69 @@ +$Title A Transportation Problem (TRNSPORT,SEQ=1) +$Ontext + +This problem finds a least cost shipping schedule that meets +requirements at markets and supplies at factories. + + +Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. +Princeton University Press, Princeton, New Jersey, 1963. + +This formulation is described in detail in: +Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. +The Scientific Press, Redwood City, California, 1988. + +The line numbers will not match those in the book because of these +comments. + +$Offtext + + + Sets + i canning plants / seattle, san-diego / + j markets / new-york, chicago, topeka / ; + + Parameters + + a(i) capacity of plant i in cases + / seattle 350 + san-diego 600 / + + b(j) demand at market j in cases + / new-york 325 + chicago 300 + topeka 275 / ; + + Table d(i,j) distance in thousands of miles + new-york chicago topeka + seattle 2.5 1.7 1.8 + san-diego 2.5 1.8 1.4 ; + + Scalar f freight in dollars per case per thousand miles /90/ ; + + Parameter c(i,j) transport cost in thousands of dollars per case ; + + c(i,j) = f * d(i,j) / 1000 ; + + Variables + x(i,j) shipment quantities in cases + z total transportation costs in thousands of dollars ; + + Positive Variable x ; + + Equations + cost define objective function + supply(i) observe supply limit at plant i + demand(j) satisfy demand at market j ; + + cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; + + supply(i) .. sum(j, x(i,j)) =l= a(i) ; + + demand(j) .. sum(i, x(i,j)) =g= b(j) ; + + Model transport /all/ ; + + Solve transport using lp minimizing z ; + + Display x.l, x.m ; + diff --git a/message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps b/message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps new file mode 100644 index 000000000..f04b3652b --- /dev/null +++ b/message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps @@ -0,0 +1,283 @@ +* ENCODING=ISO-8859-1 +NAME gamsmodel +ROWS + N _obj + E COST_ACCOUNTING_NODAL(World,700) + E COST_ACCOUNTING_NODAL(World,710) + E COST_ACCOUNTING_NODAL(World,720) + E COST_ACCOUNTING_NODAL(Westeros,700) + E COST_ACCOUNTING_NODAL(Westeros,710) + E COST_ACCOUNTING_NODAL(Westeros,720) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) + L CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) + L CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) + L CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) + L CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) + L CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) + L CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) + E EMISSION_EQUIVALENCE(World,CO2,all,700) + E EMISSION_EQUIVALENCE(World,CO2,all,710) + E EMISSION_EQUIVALENCE(World,CO2,all,720) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,700) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,710) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,720) + L EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) +COLUMNS + CAP_NEW(Westeros,coal_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -500 + CAP_NEW(Westeros,coal_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) -10 + CAP_NEW(Westeros,coal_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -500 + CAP_NEW(Westeros,coal_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) -10 + CAP_NEW(Westeros,coal_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -304.023646636842 + CAP_NEW(Westeros,coal_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) -10 + CAP_NEW(Westeros,wind_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -1500 + CAP_NEW(Westeros,wind_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) -10 + CAP_NEW(Westeros,wind_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -1500 + CAP_NEW(Westeros,wind_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) -10 + CAP_NEW(Westeros,wind_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -912.070939910527 + CAP_NEW(Westeros,wind_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) -10 + CAP_NEW(Westeros,bulb,700) COST_ACCOUNTING_NODAL(Westeros,700) -5 + CAP_NEW(Westeros,bulb,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) -1 + CAP_NEW(Westeros,bulb,710) COST_ACCOUNTING_NODAL(Westeros,710) -5 + CAP_NEW(Westeros,bulb,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) -1 + CAP_NEW(Westeros,bulb,720) COST_ACCOUNTING_NODAL(Westeros,720) -5 + CAP_NEW(Westeros,bulb,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) -1 + CAP(Westeros,coal_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -30 + CAP(Westeros,coal_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) -1 + CAP(Westeros,coal_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 1 + CAP(Westeros,coal_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -30 + CAP(Westeros,coal_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) -1 + CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) 1 + CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) -1 + CAP(Westeros,coal_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -30 + CAP(Westeros,coal_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) -1 + CAP(Westeros,coal_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) 1 + CAP(Westeros,coal_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -30 + CAP(Westeros,coal_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) -1 + CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) 1 + CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) -1 + CAP(Westeros,coal_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -30 + CAP(Westeros,coal_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) -1 + CAP(Westeros,coal_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) 1 + CAP(Westeros,coal_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -30 + CAP(Westeros,coal_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) -1 + CAP(Westeros,coal_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) 1 + CAP(Westeros,wind_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -10 + CAP(Westeros,wind_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) -0.36 + CAP(Westeros,wind_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 1 + CAP(Westeros,wind_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -10 + CAP(Westeros,wind_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) -0.36 + CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) 1 + CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) -1 + CAP(Westeros,wind_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -10 + CAP(Westeros,wind_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) -0.36 + CAP(Westeros,wind_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) 1 + CAP(Westeros,wind_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -10 + CAP(Westeros,wind_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) -0.36 + CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) 1 + CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) -1 + CAP(Westeros,wind_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -10 + CAP(Westeros,wind_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) -0.36 + CAP(Westeros,wind_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) 1 + CAP(Westeros,wind_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -10 + CAP(Westeros,wind_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) -0.36 + CAP(Westeros,wind_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) 1 + CAP(Westeros,bulb,700,700) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) -1 + CAP(Westeros,bulb,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) 1 + CAP(Westeros,bulb,710,710) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) -1 + CAP(Westeros,bulb,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) 1 + CAP(Westeros,bulb,720,720) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) -1 + CAP(Westeros,bulb,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -30 + ACT(Westeros,coal_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 + ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -30 + ACT(Westeros,coal_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 + ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -30 + ACT(Westeros,coal_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 + ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -30 + ACT(Westeros,coal_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 + ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -30 + ACT(Westeros,coal_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -30 + ACT(Westeros,coal_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 + ACT(Westeros,wind_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 + ACT(Westeros,wind_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 + ACT(Westeros,wind_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 + ACT(Westeros,wind_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 + ACT(Westeros,wind_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 + ACT(Westeros,grid,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -50 + ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) -1 + ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) 0.9 + ACT(Westeros,grid,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) 1 + ACT(Westeros,grid,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -50 + ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) -1 + ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) 0.9 + ACT(Westeros,grid,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) 1 + ACT(Westeros,grid,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -50 + ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) -1 + ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) 0.9 + ACT(Westeros,grid,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) 1 + ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) -1 + ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 1 + ACT(Westeros,bulb,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) 1 + ACT(Westeros,bulb,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) 1 + ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) -1 + ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 1 + ACT(Westeros,bulb,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) 1 + ACT(Westeros,bulb,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) 1 + ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) -1 + ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 1 + ACT(Westeros,bulb,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) 1 + ACT(Westeros,bulb,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) 1 + COST_NODAL(World,700) _obj 7.72173492918481 + COST_NODAL(World,700) COST_ACCOUNTING_NODAL(World,700) 1 + COST_NODAL(World,710) _obj 4.74047541335517 + COST_NODAL(World,710) COST_ACCOUNTING_NODAL(World,710) 1 + COST_NODAL(World,720) _obj 2.91024068434285 + COST_NODAL(World,720) COST_ACCOUNTING_NODAL(World,720) 1 + COST_NODAL(Westeros,700) _obj 7.72173492918481 + COST_NODAL(Westeros,700) COST_ACCOUNTING_NODAL(Westeros,700) 1 + COST_NODAL(Westeros,710) _obj 4.74047541335517 + COST_NODAL(Westeros,710) COST_ACCOUNTING_NODAL(Westeros,710) 1 + COST_NODAL(Westeros,720) _obj 2.91024068434285 + COST_NODAL(Westeros,720) COST_ACCOUNTING_NODAL(Westeros,720) 1 + EMISS(World,CO2,all,700) EMISSION_EQUIVALENCE(World,CO2,all,700) 1 + EMISS(World,CO2,all,710) EMISSION_EQUIVALENCE(World,CO2,all,710) 1 + EMISS(World,CO2,all,720) EMISSION_EQUIVALENCE(World,CO2,all,720) 1 + EMISS(Westeros,CO2,all,700) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) 1 + EMISS(Westeros,CO2,all,700) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + EMISS(Westeros,CO2,all,710) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) 1 + EMISS(Westeros,CO2,all,710) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + EMISS(Westeros,CO2,all,720) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) 1 + EMISS(Westeros,CO2,all,720) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + constobj _obj 1 +RHS + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 55 + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 82 + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 104 + rhs CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 18.2648401826484 + rhs CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 33.8237781160156 + rhs ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 47.3742915086758 + rhs ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 31.5828610057839 + rhs EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 500 +BOUNDS + FR bnd COST_NODAL(World,700) + FR bnd COST_NODAL(World,710) + FR bnd COST_NODAL(World,720) + FR bnd COST_NODAL(Westeros,700) + FR bnd COST_NODAL(Westeros,710) + FR bnd COST_NODAL(Westeros,720) + FR bnd EMISS(World,CO2,all,700) + FR bnd EMISS(World,CO2,all,710) + FR bnd EMISS(World,CO2,all,720) + FR bnd EMISS(Westeros,CO2,all,700) + FR bnd EMISS(Westeros,CO2,all,710) + FR bnd EMISS(Westeros,CO2,all,720) + FX bnd constobj 0 +ENDATA diff --git a/message_ix/tools/make_prescaler/__init__.py b/message_ix/tools/make_prescaler/__init__.py new file mode 100644 index 000000000..2fface362 --- /dev/null +++ b/message_ix/tools/make_prescaler/__init__.py @@ -0,0 +1,234 @@ +import os + +import ixmp +import numpy as np +import pandas as pd + +from message_ix.tools.lp_diag import LPdiag + +lp = LPdiag() +mp = ixmp.Platform() + + +def filter_df(data, bounds): + """Extracts matrix elements with coefficient outliers. + + This function extracts elements from a matrix where + the coefficients deviate from a specified threshold. + + Parameters: + ----------- + data : pandas DataFrame + The coefficient matrix, typically generated by + the mps_sum function in LPDiag. + bounds: int or list of 2 integers + Exponent threshold used to identify outlier coefficients. + If a single integer is provided, the bounds are set to +/- that value. + If a list of 2 integers is provided, they represent the lower and + upper bounds of the threshold. + + Examples: + --------- + # Extract elements with coefficient exponents deviating beyond +/-3 + extracted_data = filter_df(data_matrix, 3) + + # Extract elements with coefficients exponents deviating + # beyond the range of -2 to 2 + extracted_data = extract_outliers(data_matrix, [-2, 2]) + """ + + if isinstance(bounds, int): + lo_bound = -bounds + up_bound = bounds + else: + lo_bound = bounds[0] + up_bound = bounds[1] + + df_filtered = data.loc[(data["val"] <= lo_bound) | (data["val"] >= up_bound)] + + return df_filtered + + +def make_logdf(data): + """ + Make log10 of the absolute non zero value element of dataframe. + + """ + log_absdf = data.copy() + + log_absdf.loc[log_absdf["val"] != 0, "val"] = np.log10( + np.absolute(log_absdf.loc[log_absdf["val"] != 0, "val"]) + ) + + return log_absdf + + +def get_lvl_ix(data, lvl): + """ + To get level index from coefficient matrix. + + Parameters: + ----------- + data : pandas DataFrame + The coefficient matrix, typically generated by + the mps_sum function in LPDiag. + lvl : int or str + 0 or "row" for rows and 1 or "col" for columns + + """ + return data.index.get_level_values(lvl) + + +def disp_range(data, pretext): + """ + To displace coefficient exponents range. + + """ + + log_absdf = make_logdf(data) + + print( + f"{pretext}:", + "[", + np.int32(np.min(log_absdf)), # lower bound + "|", + np.int32(np.max(log_absdf)), # upper bound + "]", + ) + + +def make_prescaler(path, scen, bounds=4, steps=1, show_range=True): + """ + Process to generate prescale_args in GAMS to improve + matrix coefficients. + + This function shifts matrix coefficient exponents to improve + the scaling properties of the matrix. The function returns + prescale arguments (prescale_args) to be passed to the GAMS model. + + Parameters: + ----------- + path: str + Pathways to locate the mps file. + bounds: int or list of 2 integers + Exponent threshold used to identify outlier coefficients. + If a single integer is provided, the bounds are set to +/- that value. + If a list of 2 integers is provided, they represent + the lower and upper bounds of the threshold. + steps: int + Number of times the prescaler generation process is repeated. + Larger values may lead to more refined prescale_args but + also increase computation time. + show_range: boolean + Option to show the coefficient exponents range before and after scaling. + If True, the function will display the range; otherwise, it will not. + + Returns: + -------- + prescale_args: dict + A dictionary of prescale arguments to be passed to the GAMS model. + """ + lp.read_mps(path) + + data = lp.read_matrix() + + matrix = data + + if show_range is True: + disp_range(matrix, "\nUnscaled range ") + + scalers = {"row": [], "col": []} + + counter = 0 + while counter < steps: + for s in scalers.keys(): + # print(matrix) + # calculate log base 10 of the absolute value of the matrix + log_absmatrix = make_logdf(matrix) + + # Create matrix with small and large coefficients + log_absmatrix_solv = filter_df(log_absmatrix, bounds=bounds) + + # Populating row scaler + objective_ix = "_obj" if s == "row" else "constobj" + index_solv = [ + e for e in get_lvl_ix(log_absmatrix_solv, s) if e != objective_ix + ] + + SFs = {k: [] for k in index_solv} + for k in SFs.keys(): + index_val = get_lvl_ix(log_absmatrix, s) == k + dflog_val = log_absmatrix.loc[index_val, "val"] + lb, ub = np.int32(min(dflog_val)), np.int32(max(dflog_val)) + mid = np.int32(np.mean([lb, ub])) + + exp = mid if s == "row" else -mid + + SFs[k] = 10.0 ** (exp) + + # Create DataFrame of row scaler + return_index = list(set(get_lvl_ix(log_absmatrix, s))) + if counter == 0: + multiplier = 1 + else: + multiplier = scalers[s].reindex(return_index).fillna(1) + step_scaler = pd.DataFrame(data=SFs, index=["val"]).transpose() + step_scaler.index.name = s + step_scaler = step_scaler.reindex(return_index).fillna(1) + + # summarize multipliers from previous steps + scalers[s] = step_scaler.mul(multiplier) + + # Create new matrix with scaled rows + matrix = matrix.div(step_scaler) if s == "row" else matrix.mul(step_scaler) + + if show_range is True: + disp_range(matrix, f"Scaled range step {counter + 1}") + + # Increment the counter + counter += 1 + + # generating prescaler arguments for GAMS + prescale_args = {} + for key, df_scaler in scalers.items(): + df_scaler = df_scaler.loc[df_scaler["val"] != 1] + scaler_dict = df_scaler["val"].to_dict() + for k, v in scaler_dict.items(): + if k == "_obj": + k_ = "_obj.scale" + elif k == "constobj": + k_ = "constobj.scale" + else: + k_ = k.replace("(", ".scale('") + k_ = k_.replace(")", "')") + k_ = k_.replace(",", "','") + prescale_args.update({k_: v}) + + prescale_args["MESSAGE_LP.scaleopt"] = 1 + + # prescale_args = {} # activate this for temporary test + + # prescale_args["MESSAGE_LP.OptFile"] = 1 + + current_directory = os.getcwd() + two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) + # args_name = os.path.join(two_levels_up, "prescale_args.csv") + prescale_args_df = pd.DataFrame(prescale_args, index=["val"]).transpose() + prescale_args_df.index = prescale_args_df.index.rename("key", inplace=False) + # args_df_temp.to_csv(args_name) + # print(args_name) + + prescale_args_list = [] + for k, v in prescale_args.items(): + prescale_args_list.append(f"{k}={v};") + prescale_args_txt = "\n".join(prescale_args_list) + + prescale_args_dir = os.path.join( + two_levels_up, f"model/prescaler/MsgPrescaler_{scen.model}_{scen.scenario}.gms" + ) + + with open(prescale_args_dir, "w") as txtfile: + # Write some text to the file + txtfile.write(prescale_args_txt) + + return prescale_args_df diff --git a/message_ix/tools/make_prescaler/westeros_scaling.ipynb b/message_ix/tools/make_prescaler/westeros_scaling.ipynb new file mode 100644 index 000000000..2e47555aa --- /dev/null +++ b/message_ix/tools/make_prescaler/westeros_scaling.ipynb @@ -0,0 +1,292 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Westeros Tutorial - Introducing emissions (part1/2): Adding emission bounds\n", + "\n", + "In the first part, the model chose not to base the power system on wind power as electricity from wind turbines was more expensive than electricity produced from coal. However, we now introduce emissions to investigate the impact of climate policy. Let's see what happens then.\n", + "\n", + "**Pre-requisites**\n", + "- You have the *MESSAGEix* framework installed and working\n", + "- You have run Westeros baseline scenario (``westeros_baseline.ipynb``) and solved it successfully" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "import os\n", + "\n", + "from message_ix.tools.lp_diag import LPdiag\n", + "from message_ix.tools.make_prescaler import make_prescaler\n", + "from message_ix.tools.make_prescaler import disp_range\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "lp = LPdiag()\n", + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "\n", + "scen_name = \"emission_bound_unscaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"introducing scaling tool for westeros tutorial\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing scaling tool\")\n", + "scen.set_as_default()\n", + "\n", + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{scen_name}.mps\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.solve(solve_options={\"writemps\": mps_dir,})\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the unscaled scenario above, we make scaler arguments to solve scenario with scaled matrix coefficients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "scale_args = make_prescaler(mps_dir, scen, bounds=2, steps=1)\n", + "scale_args" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run scenarios with scaled matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This Scenario has a solution, use `Scenario.remove_solution()` or `Scenario.clone(..., keep_solution=False)`\n" + ] + } + ], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "\n", + "sc_name = \"emission_bound_scaled\"\n", + "sc = base.clone(\n", + " model,\n", + " sc_name,\n", + " \"introducing scaling tool for westeros tutorial\",\n", + " keep_solution=False,\n", + ")\n", + "sc.check_out()\n", + "\n", + "sc.commit(comment=\"Introducing scaling tool\")\n", + "sc.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{sc_name}.mps\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "model = model\n", + "scenario_name = \"emission_bound_unscaled\"\n", + "\n", + "sc.solve(solve_options={\"writemps\": mps_dir},\n", + " #gams_args=[f\"--scaler='MsgPrescaler_Westeros Electrified_emission_bound_unscaled'\"]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "206280.0625" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sc.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Reading MPS-format file C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_prescaler\\Westeros Electrified_emission_bound_scaled.mps.\n", + "Next section found: NAME gamsmodel (line 1).\n", + "\tProblem name: gamsmodel.\n", + "Next section found: ROWS (line 2).\n", + "\tRow _obj (row_seq = 0) is the objective (goal function) row.\n", + "Next section found: COLUMNS (line 74).\n", + "Next section found: RHS (line 259).\n", + "\tId of RHS: rhs\n", + "Next section found: BOUNDS (line 268).\n", + "\tId of BOUNDS: bnd\n", + "Next section found: ENDATA (line 282).\n", + "\n", + "Finished processing 282 lines of the MPS file: C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_prescaler\\Westeros Electrified_emission_bound_scaled.mps.\n", + "LP has: 71 rows, 55 cols, 184 non-zeros, matrix density = 4.71e-02.\n", + "Numbers of redefined: RHS = 8, ranges = 0, bounds = 13.\n", + "\n", + "The GF (objective) row named \"_obj\" has 7 elements.\n", + "Distribution of the GF (objective) values:\n", + "count 7.000000\n", + "mean 4.534986\n", + "std 2.522265\n", + "min 1.000000\n", + "25% 2.910241\n", + "50% 4.740475\n", + "75% 6.231105\n", + "max 7.721735\n", + "Name: val, dtype: float64\n", + "\n", + "New exp range:: [ -1 | 1 ]\n" + ] + } + ], + "source": [ + "lp.read_mps(mps_dir)\n", + "data = lp.read_matrix()\n", + "disp_range(data,\"\\nNew exp range:\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorial/westeros/westeros_baseline.ipynb b/tutorial/westeros/westeros_baseline.ipynb index 20ec43406..41451d983 100644 --- a/tutorial/westeros/westeros_baseline.ipynb +++ b/tutorial/westeros/westeros_baseline.ipynb @@ -65,7 +65,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -121,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "slideshow": { "slide_type": "fragment" @@ -151,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "slideshow": { "slide_type": "fragment" @@ -175,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" @@ -219,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" @@ -250,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "slideshow": { "slide_type": "fragment" @@ -283,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" @@ -309,7 +308,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -324,13 +322,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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eXl5JCcnl/gYInKGZkZEXEjDhg355JNP6Nu3L40bNy74BlZjDHv37uWTTz7Bzc3tgms75s2bh7+/Pzk5OQXfwPr7778THR3N3LlzSz1rTk4O119/PXfeeSfbt29nypQpXH311ed8kuZinn32WT799FN69OjB8OHDCQkJYebMmezdu5f58+df8Evdiuq6665j8ODBjBs3jvj4eG644QY8PT3ZuXMnc+fOZdKkSfTp06fExxERlRERl9O7d282btzIm2++yXfffceHH36IzWajTp069OzZkyFDhhAdHX3efo888ghwZmFqaGgorVq14sMPP6Rfv354e3uXes533nmHOXPmMGbMGHJzc+nbty9vvfVWwReTXUpYWBgrV67kmWee4e233yYrK4uoqCi+/vprevbsWWoZ3333Xdq0acN7773Hc889h4eHB3Xr1uXee++lQ4cOpXYckYrOZoo6bysiUgIzZszg/vvvZ82aNcTGxlodR0QcgNaMiIiIiKVURkRERMRSKiMiIiJiKa0ZEREREUtpZkREREQspTIiIiIilnKK7xmx2+0cOXKEgICAQn0HgYiIiFjPGENaWhrh4eGX/DJCpygjR44cISIiwuoYIiIiUgwHDx685F/1dooycvZPlx88eJDAwECL04iIiEhhpKamEhERUfA6fjFOUUbOvjUTGBioMiIiIuJkLrfEQgtYRURExFIqIyIiImIplRERERGxlMqIiIiIWEplRERERCylMiIiIiKWUhkRERERS6mMiIiIiKVURkRERMRSKiMiIiJiKZURERERsZTKiIiIiFhKZURERKQCy8u38/P2Y5ZmUBkRERGpoHYkpXH71JXc/9EaVuz4y7IcHpYdWURERCyRl2/nvRV7mPTDTnLy7QT4eJCWlWdZHpURERGRCmTb0VRGzk1g4+EUADo3qcart7akepCPZZlURkRERCqA3Hw7U5fv5u2fdpKbbwjy9WRsr2bcGlMTm81maTaVERERERe35UgqI+dtYPORVAC6NA3j1VtbUC3QutmQv1MZERERcVE5eXYm/7yLyT/vIs9uCPbz5IWbm3NzdLjlsyF/pzIiIiLigjYdTuHpuRvYdjQNgO7Nq/PSLS2oGuBtcbLzqYyIiIi4kOy8fN75aRdTlu8m324IqeTFi72b07NlDYeaDfk7lREREREXkXAomafnbmBHUjoA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9etHnTp1CA8PJyEhgWeeeYbt27ezYMGCYh/7coo7vqI+36w6h6Vx/j744AO6det22T/casX5g8uP8fjx47z00ks8/PDDBbc5ymuhS5SRDz74gB49ehAeHm51lDJR0vFt2rSJ3r17M3bsWG644YZLbjtixIiC/46KisLLy4vBgwczbty4Mv2q4OKO8T//+U/Bf8fExJCRkcGECRMuWkasUtJzuGrVKrZu3crs2bMvu60V59DVfwah5GM8fPgw3bt354477mDQoEGX3PbvLxYtW7akRo0aXH/99ezevZv69esX6/iXU9zxWfU7o6hKev4OHTrEsmXL+OKLLy67rRXnDy49xtTUVHr27EmzZs14/vnnyyxDcTn92zT79+/nhx9+4KGHHiq4rXr16uTk5Jy3MjopKYnq1asXbPPP1dtnr5/d5p+qV69+3qcY8vLyOHny5EX3Kaniju+sLVu2cP311/Pwww/z73//u8jHb9u2LXl5eezbt6848QulpGP8u7Zt23Lo0CGys7MveL8znkOA6dOn06pVK9q0aVPk45f1ObzQ+AqjOOeiuM+LkiruGM86cuQInTp1on379kybNq3I+7dt2xY4M7NSFko6vr+73PPNinNYGuP76KOPqFKlCjfffHOR9y3r8weXHmNaWhrdu3cnICCAhQsX4unpWXCfw7wWFmuliQMZO3asqV69esFiHGP+b4HUvHnzCm7btm3bBRewJiUlFWzz3nvvmcDAQJOVlXXBY51dtBMXF1dw27Jly8p08WNxx2eMMZs2bTLVqlUzI0eOLPbxP/74Y+Pm5mZOnjxZ7Me4nJKM8Z9efvllU7ly5Yve72zn0Bhj0tLSjL+//2U/CXUxZX0OLzS+v7vcAtainIviPi9KqrhjNMaYQ4cOmYYNG5q7777b5OXlFev4v/32mwHMhg0birX/5ZRkfP90ueebFeewpOOz2+0mMjLysp+CupiyPn/GXHyMKSkp5qqrrjLXXXedycjIOG8/R3ktdOoykp+fb2rXrm2eeeaZ8+4bMmSIqV27tvnpp59MXFycadeunWnXrl3B/Wc/znTDDTeY+Ph4s3TpUlO1atVzPs70559/msaNG5tDhw4V3Na9e3cTExNj/vzzT/Pbb7+Zhg0blsnHQks6vo0bN5qqVauae++995yPfR07duyi41u5cqWZOHGiiY+PN7t37zYff/yxqVq1qhkwYECZjK+kY/zqq6/M+++/bzZu3Gh27txppkyZYvz8/MyYMWMuOkZjnOccnjV9+nTj4+NzwV+UVp/DS40vMTHRrF+/3rz//vsGMCtWrDDr1683J06cKNjmcufi0KFDpnHjxubPP/8suK2w/26OMMZDhw6ZBg0amOuvv94cOnTonJ/Fi41x165d5sUXXzRxcXFm79695ssvvzT16tUz1157rcONrzDPN6vPYUmfo8YY88MPPxjAbN269bzHsPr8GXPxMaakpJi2bduali1bml27dp3z/DtbjB3ltdCpy8iyZcsMYLZv337efadPnzZDhw41lStXNn5+fubWW2895xeAMcbs27fP9OjRw/j6+prQ0FDz1FNPndMqz7blvXv3Ftx24sQJ07dvX+Pv728CAwPN/fffb9LS0hxufGPHjjXAeZc6depcdHxr1641bdu2NUFBQcbHx8c0bdrUvPrqqxdtx1aP8dtvvzWtWrUy/v7+plKlSiY6Otq8++67Jj8//6JjNMZ5zuFZ7dq1M/369bvg41t9Di81vos9Bz/66KOCbS53Lvbu3XvO90IYU/h/N0cY40cffXTB+/8+Kf3PMR44cMBce+21JiQkxHh7e5sGDRqYkSNHltn3VJRkfIV5vll9Dkv6HDXGmL59+170e1CsPn/GXHyMZ38/XOjy99+JjvBaaDPmEp+DFBERESljTr+AVURERJybyoiIiIhYSmVERERELKUyIiIiIpZSGRERERFLqYyIiIiIpVRGRERExFIqIyJS5u677z5uueUWq2OIiINyib/aKyLWsdlsl7x/7NixTJo0CX2/oohcjMqIiJRIYmJiwX9//vnnjBkzhu3btxfc5u/vj7+/vxXRRMRJ6G0aESmR6tWrF1yCgoKw2Wzn3Obv73/e2zQdO3bkscce44knnqBy5cqEhYXx/vvvk5GRwf33309AQAANGjTg22+/PedYmzZtokePHvj7+xMWFkb//v05fvx4OY9YREqbyoiIWGLmzJmEhoayevVqHnvsMR555BHuuOMO2rdvz7p167jhhhvo378/mZmZACQnJ9O5c2diYmKIi4tj6dKlJCUlceedd1o8EhEpKZUREbFEdHQ0//73v2nYsCGjR4/Gx8eH0NBQBg0aRMOGDRkzZgwnTpwgISEBgHfeeYeYmBheffVVmjRpQkxMDB9++CE///wzO3bssHg0IlISWjMiIpaIiooq+G93d3eqVKlCy5YtC24LCwsD4NixYwBs2LCBn3/++YLrT3bv3k2jRo3KOLGIlBWVERGxhKen5znXbTbbObed/ZSO3W4HID09nV69evH666+f91g1atQow6QiUtZURkTEKbRu3Zr58+dTt25dPDz0q0vElWjNiIg4hWHDhnHy5En69u3LmjVr2L17N8uWLeP+++8nPz/f6ngiUgIqIyLiFMLDw/n999/Jz8/nhhtuoGXLljzxxBMEBwfj5qZfZSLOzGb0tYgiIiJiIf3vhIiIiFhKZUREREQspTIiIiIillIZEREREUupjIiIiIilVEZERETEUiojIiIiYimVEREREbGUyoiIiIhYSmVERERELKUyIiIiIpZSGRERERFL/T9tZkju3GUNmgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gdp_profile = pd.Series([1.0, 1.5, 1.9], index=pd.Index(model_horizon, name=\"Time\"))\n", "gdp_profile.plot(title=\"GDP profile\")" @@ -386,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { "slideshow": { "slide_type": "fragment" @@ -425,20 +444,108 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nodecommoditylevelyeartimevalueunit
Time
700Westeroslightuseful700year55.0GWa
710Westeroslightuseful710year82.0GWa
720Westeroslightuseful720year104.0GWa
\n", + "
" + ], + "text/plain": [ + " node commodity level year time value unit\n", + "Time \n", + "700 Westeros light useful 700 year 55.0 GWa\n", + "710 Westeros light useful 710 year 82.0 GWa\n", + "720 Westeros light useful 720 year 104.0 GWa" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "light_demand" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": { "slideshow": { "slide_type": "fragment" @@ -466,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": { "slideshow": { "slide_type": "skip" @@ -496,7 +603,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -516,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": { "slideshow": { "slide_type": "fragment" @@ -538,7 +644,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -547,9 +652,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['node_loc',\n", + " 'technology',\n", + " 'year_vtg',\n", + " 'year_act',\n", + " 'mode',\n", + " 'node_origin',\n", + " 'commodity',\n", + " 'level',\n", + " 'time',\n", + " 'time_origin']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "scenario.idx_names(\"input\")" ] @@ -572,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": { "slideshow": { "slide_type": "fragment" @@ -596,7 +721,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -609,7 +733,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { "slideshow": { "slide_type": "fragment" @@ -648,7 +772,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -678,7 +801,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "slideshow": { "slide_type": "fragment" @@ -707,7 +830,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -734,7 +856,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "slideshow": { "slide_type": "fragment" @@ -774,7 +896,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -801,7 +922,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "slideshow": { "slide_type": "fragment" @@ -850,7 +971,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "slideshow": { "slide_type": "fragment" @@ -876,7 +997,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "slideshow": { "slide_type": "fragment" @@ -904,7 +1025,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -929,7 +1049,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "slideshow": { "slide_type": "fragment" @@ -951,7 +1071,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -979,7 +1098,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1002,7 +1121,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1019,7 +1137,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1050,7 +1168,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1067,7 +1184,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1097,7 +1214,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1114,7 +1230,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1148,7 +1264,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1164,7 +1279,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1180,7 +1294,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1213,7 +1327,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1226,7 +1340,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1239,7 +1353,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "jupyter": { "name": "solve-objective-value" @@ -1248,13 +1362,23 @@ "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "173795.09375" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "scenario.var(\"OBJ\")[\"lvl\"]" ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1271,13 +1395,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create a Reporter object to describe and carry out reporting\n", "# calculations and operations (like plotting) based on `scenario`\n", @@ -1312,13 +1449,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Only show a subset of technologies in the following plots;\n", "# e.g. exclude \"bulb\" and \"grid\"\n", @@ -1343,13 +1501,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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/yyy33hFRETkaL/RGxwfHx9JUlpa2g1rla7NYZ42bZoqVKggq9WqwMBABQUF6fvvv8/130eFChXs7lssFpUvX95uDvfx48f1zDPPyN/fX15eXgoKCrK9ScjeZ3Ygr1at2k3VeTNu9xwCUDwwRxamU79+fa1YsUL79u3L8c3zunXr6uWXX9bJkye1ceNGhYeH65577pF07Y+wxWLRV199let8wL8uuTR16lQ988wz+uKLL/S///1P//rXvzRhwgRt3bpVpUuXzrO27FHHp556Ks/5l9lzI7P9dUQqvwYOHKg2bdpo+fLlWrNmjYYPH64JEyZo3bp1qlmz5i3v9+/ymj+ZPXqZ/bynTJmiGjVq5Nr370ta3c7zlq6N9i1evFibN29W9erV9eWXX+qFF17I14oPFotFFStWVMWKFdWqVStVqFBBcXFxevbZZyVdC+ytW7dWXFycRowYoSVLligzM9NuxM5isWjJkiXaunWrVqxYoTVr1qhnz56aOnWqtm7det2lvLJft8GDBys2NjbXPn8P9nn9LHJrN27wZa/o6GhJ0r59+25qGbnx48dr+PDh6tmzp8aOHSt/f385OTlp4MCBOUbcb8bVq1f1yCOP6Ny5cxoyZIiio6Pl6empkydP6plnnrmlfeZHQZxDAByLIAvT+et6sps2bbL78lStWrVktVoVHx+vhIQEtWzZ0ratXLlyMgxDUVFRqlix4g2PU716dVWvXl2vv/66Nm/erHr16mn27Nl64403JOX+kWZQUJC8vb119epVNWvW7JaeX9myZSVJhw4dyjEydOjQIdv2vz6vl156SS+99JIOHz6sGjVqaOrUqfrkk09u6fi3IvuLbj4+Prf9vI8cOWI3Wnv27NlcRxYfffRRBQUFKS4uTnXq1NHFixf19NNP39KxpWtfIitZsqT++OMPu/Zu3bqpbdu22r59u+Li4lSzZk1VrVo1x+MfeughPfTQQxo3bpwWLlyorl276tNPP9Wzzz6b58ff2W+yXF1db/l1ux3169dXyZIltWjRIr366qs3/MLXkiVL1LhxY7tRa0lKTk7OdRm37JH6bIZh6MiRI7Y3c/v27dNPP/2k+fPn230p7euvv7Z7XPbrtH///pt/cv/nelMPCvocAlD0eNsJ06ldu7ZtbtvJkyftRmStVqvuv/9+zZw5U+np6Xbrxz7++ONydnbW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ekm7d+9WTEyM2rRpo7Nnz+boM3XqVG3fvl1BQUFq06bNTa0De7v4shcAAEAxkZaWprffflvvvvuuunfvLkkqV66c6tevrw8++EAZGRn6+OOP5enpKUl699131aZNG02aNEkhISFq0qSJ3f7mzJkjPz8/bdiwQa1bt76lmvr166f27dtLkmbNmqXVq1frww8/1CuvvGLrM3LkSD3yyCOSpPnz56t06dJatmyZOnXqdEvHvFmMyAIAABQTBw8eVGZmppo2bZrrtvvuu88WYiWpXr16ysrK0qFDhyRJSUlJ6t27typUqCBfX1/5+PjowoULOn78+C3XFBMTY/t/FxcX1a5dWwcPHsyzj7+/vypVqpSjT2HI14hs2bJl1aRJEzVu3FiNGzdWREREYdUFAABw1/Hw8Litx3fv3l1nz57V22+/rbJly8pqtSomJkaXLl0qoAqLl3yNyPbo0UNHjx7Vc889p8jISJUvX169e/fWokWLlJiYWFg1AgAA3BUqVKggDw8PrV27Nse2ypUra+/evUpPT7e1bdq0SU5OTqpUqZLt/r/+9S+1bNlSVatWldVq1ZkzZ26rpq1bt9r+/8qVK9q5c6cqV66cZ5/z58/rp59+ytGnMORrRHbUqFGSpMzMTG3atEkbNmxQfHy8FixYoMuXL6tixYpq0qSJZs6cWRi1AgAA3NHc3d01ZMgQvfLKK3Jzc1O9evV0+vRpHThwQF27dtXIkSPVvXt3jRo1SqdPn1b//v319NNPKyQkRNK1ILxgwQLVrl1bqampevnll297lHfmzJmqUKGCKleurGnTpun8+fPq2bOnXZ8xY8YoICBAISEheu211xQYGFgkF1y4pS97Wa1WNWnSxDah+Pz585o6dareeecdzZ49myALAACKpeJ4pa2/Gz58uFxcXDRixAj9/vvvCgsL0/PPP68SJUpozZo1GjBggB544AGVKFFC7du311tvvWV77Icffqg+ffro/vvvV0REhMaPH6/BgwffVj0TJ07UxIkTtWfPHpUvX15ffvmlAgMDc/QZMGCADh8+rBo1amjFihVyc3O7rePejFsKspcuXdKWLVsUHx+v+Ph4JSQkqFSpUurQoYMaNmxY0DUCAADcNZycnPTaa6/ptddey7GtevXqWrduXZ6PrVmzprZv327X1qFDB7v7hmHkq57KlSsrISHhun3q16+f59qxzzzzjJ555pl8HfNm5SvIjhkzxhZcy5YtqwYNGqhPnz6Ki4tTeHh4oRQIAAAA5Cbfc2TLlCmjqVOnqmPHjgoICCisugAAAFCIxo8fr/Hjx+e67eGHH9asWbOKuKL8y1eQ/eqrr7R+/XrNmzdPAwYMUMWKFdWoUSM1bNhQDRs2VFBQUGHVCQAAgAL0/PPP53nBAg8PD5UqVeqG0xAaNWqU76kKBSlfy2/FxsZq4sSJ2rp1q86cOaNJkyapRIkSmjx5skqXLq2qVavaXSatIJw8eVJPPfWUAgIC5OHhoerVq2vHjh227YZhaMSIEQoLC5OHh4eaNWumw4cPF2gNAAAAdxp/f3+VL18+11upUqUcXd5NueUre3l7e6tly5YaP3683n77bQ0aNEi//fZbgQ5Dnz9/XvXq1ZOrq6u++uor/fDDD5o6dapKlixp6zN58mTNmDFDs2fPVkJCgjw9PRUbG6uMjIwCqwMAAADFT75XLcjKytKOHTu0fv16xcfHa9OmTUpPT1fp0qX12GOPqXHjxgVW3KRJkxQREaG5c+fa2qKiomz/bxiGpk+frtdff11t27aVJH388ccKCQnR8uXL1blz5wKrBQAAAMVLvoJsixYttHnzZqWlpSk8PFyNGzfWtGnT1LhxY91zzz0FXtyXX36p2NhYdezYURs2bFCpUqX0wgsvqHfv3pKko0ePKjExUc2aNbM9xtfXV3Xq1NGWLVvyDLKZmZnKzMy03U9NTS3w2gEAAFC48hVk/fz8NGXKFDVu3FgVKlQorJpsfvnlF82aNUuDBg3Sq6++qu3bt+tf//qX3Nzc1L17d9tlcbOvZpEtJCTkupfMnTBhgkaPHl2otQMAAKBw5SvIfvTRR1q7dq0txA4bNsxuZNPZ2Vljx46Vu7t7gRSXlZWl2rVr25aGqFmzpvbv36/Zs2ere/fut7zfYcOGadCgQbb7qampioiIuO16AQAAUHTyFWTnz5+vVatWqXXr1pKkd999V1WrVrVdw/fHH39UeHi4XnzxxQIpLiwsTFWqVLFrq1y5spYuXSpJCg0NlSQlJSUpLCzM1icpKUk1atTIc79Wq1VWq7VAagQAACYyyreIj5dSaLueN2+eBg4cqOTk5NvaT6NGjVSjRg1Nnz69QOq6kWPHjikqKkq7d+++bl67GflateCTTz5Rnz597NoWLlyo9evXa/369ZoyZYo+//zz2yror+rVq6dDhw7Ztf30008qW7aspGtf/AoNDdXatWtt21NTU5WQkKCYmJgCqwMAAKC4eeKJJ/TTTz85ugyHyleQ/fnnn1W9enXbfXd3dzk5/f9dPPjgg/rhhx8KrLgXX3xRW7du1fjx43XkyBEtXLhQc+bMUd++fSVJFotFAwcO1BtvvKEvv/xS+/btU7du3RQeHq527doVWB0AAADFjYeHh4KDgx1dhkPlK8gmJyfbzYk9ffq0IiMjbfezsrLstt+uBx54QMuWLdOiRYtUrVo1jR07VtOnT1fXrl1tfV555RX1799fffr00QMPPKALFy5o9erVBTZPFwAAoKisXLlSfn5+unr1qiRpz549slgsGjp0qK3Ps88+q6eeekrz5s2Tn5+frX3UqFGqUaOGFixYoMjISPn6+qpz585KS0uz9UlPT1e3bt3k5eWlsLAwTZ06NV/1RUZGauzYserSpYs8PT1VqlQpzZw5066PxWLRrFmz1KJFC3l4eOiee+7RkiVLbuHVuLF8BdnSpUtr//79eW7//vvvVbp06dsu6q9at26tffv2KSMjQwcPHrQtvZXNYrFozJgxSkxMVEZGhr755htVrFixQGsAAAAoCg8//LDS0tK0e/duSdKGDRsUGBio+Ph4W58NGzaoUaNGuT7+559/1vLly7Vy5UqtXLlSGzZs0MSJE23bX375ZW3YsEFffPGF/ve//yk+Pl67du3KV41TpkzRfffdp927d2vo0KEaMGCAvv76a7s+w4cPV/v27bV371517dpVnTt31sGDB/N1nJuRryDbsmVLjRgxIterZv35558aPXq0WrVqVWDFAQAA3E18fX1Vo0YNW3CNj4/Xiy++qN27d+vChQs6efKkjhw5ooYNG+b6+KysLM2bN0/VqlXTww8/rKefftr2XaILFy7oww8/1JtvvqmmTZuqevXqmj9/vq5cuZKvGuvVq6ehQ4eqYsWK6t+/vzp06KBp06bZ9enYsaOeffZZVaxYUWPHjlXt2rX1zjvv5P8FuYF8BdlXX31V586dU6VKlTRlyhR98cUX+uKLLzR58mRVqlRJ58+f16uvvlrgRQIAANwtGjZsqPj4eBmGoe+++06PP/64KleurI0bN2rDhg0KDw/Pcz3/yMhIeXt72+6HhYXp1KlTkq6N1l66dEl16tSxbff3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li1b2rV7eXlpzZo1euSRRxxUGXBnYI4sbktqaqp27NihpKQkSdeCQq1atWwjtABwNzt//rx+//13Va1aNdftaWlp2rVrV56fIgC4PoIsbkn//v3VqVMnPfzww44uBbDhvERxwzkJFC6CLG5J9rfDy5Urp169eql79+4KDQ11dFm4y3FeorjhnAQKFxd4xi373//+p5YtW+rNN99UmTJl1LZtW61cuVJZWVmOLg13Mc5LFDeck0DhIcjillWvXl3Tp0/X77//rk8++USZmZlq166dIiIi9Nprr+nIkSOOLhF3Ic5LFDeck0DhYWoBbomTk5MSExNzXIL2+PHj+uijjzRv3jydOHGCRb5RpDgvUdxwTgKFiyCLW5LXL+dshmHom2++YWkZFCnOSxQ3nJNA4WJqAW5J2bJl5ezsnOd2i8XCL2YUOc5LFDeck0DhYkQWAAAApsSILAAAAEyJIAsAAABTIsgCAADAlAiyAAAAMCWCLAAAAEyJIAvAFAzDULNmzRQbG5tj23vvvSc/Pz/99ttvDqgMAOAoBFkApmCxWDR37lwlJCTo/ffft7UfPXpUr7zyit555x2VLl26QI95+fLlAt0fAKBgEWQBmEZERITefvttDR48WEePHpVhGOrVq5eaN2+umjVrqkWLFvLy8lJISIiefvppnTlzxvbY1atXq379+vLz81NAQIBat26tn3/+2bb92LFjslgs+uyzz9SwYUO5u7srLi7OEU8TAHCTuCACANNp166dUlJS9Pjjj2vs2LE6cOCAqlatqmeffVbdunXTn3/+qSFDhujKlStat26dJGnp0qWyWCy69957deHCBY0YMULHjh3Tnj175OTkpGPHjikqKkqRkZGaOnWqatasKXd3d4WFhTn42QIA8kKQBWA6p06dUtWqVXXu3DktXbpU+/fv13fffac1a9bY+vz222+KiIjQoUOHVLFixRz7OHPmjIKCgrRv3z5Vq1bNFmSnT5+uAQMGFOXTAQDcIqYWADCd4OBgPffcc6pcubLatWunvXv3av369fLy8rLdoqOjJck2feDw4cPq0qWL7rnnHvn4+CgyMlKSdPz4cbt9165du0ifCwDg1rk4ugAAuBUuLi5ycbn2K+zChQtq06aNJk2alKNf9tSANm3aqGzZsvrggw8UHh6urKwsVatWTZcuXbLr7+npWfjFAwAKBEEWgOndf//9Wrp0qSIjI23h9q/Onj2rQ4cO6YMPPtDDDz8sSdq4cWNRlwkAKGBMLQBgen379tW5c+fUpUsXbd++XT///LPWrFmjHj166OrVqypZsqQCAgI0Z84cHTlyROvWrdOgQYMcXTYA4DYRZAGYXnh4uDZt2qSrV6+qefPmql69ugYOHCg/Pz85OTnJyclJn376qXbu3Klq1arpxRdf1JQpUxxdNgDgNrFqAQAAAEyJEVkAAACYEkEWAAAApkSQBQAAgCkRZAEAAGBKBFkAAACYEkEWAAAApkSQBQAAgCkRZAEAAGBKBFkAAACYEkEWAAAApkSQBQAAgCn9P1Ub0Z6zonJoAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create a different plot. The same filters are still active.\n", "rep.get(\"plot capacity\")" @@ -1366,16 +1545,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqAAAAHTCAYAAAD4Yqo3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDLElEQVR4nO3deVxUZf//8fcAMoDs4gKBYm64YJqaue+ZW2nlXppZtqhptph1u2C5ZWreabaZeptmqdlid1mZmHvuaZm58dU0cUNATEzm+v3hj7kdQQWFMxiv5+NxHnXOuTjnMzMXw9vrbDZjjBEAAABgEQ93FwAAAIDChQAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoA+Edq2rSpmjZt6u4yAGSDAIosPvnkE9lsNi1ZsiTLuttuu002m00rVqzIsq506dKqX79+ntczduxYffbZZ3m+XSuMGjVKNpvtitPRo0fdXWK+On78uAYNGqSYmBj5+vqqRIkSuuOOOzR06FCdOXMmz/d39uxZjRo1SvHx8Xm+7RvVtGlT2Ww2dejQIcu6hIQE2Ww2vf76626oLKuUlBTFxcXptttuk7+/v3x9fVWtWjUNHTpUR44ccXd51+3IkSMaNWqUtm3b5u5SgELPy90FoOBp2LChJGn16tXq1KmTc3lKSop27twpLy8vrVmzRs2aNXOuO3TokA4dOqRu3brleT1jx47VAw88oI4dO+b5tq0yY8YM+fv7Z1keHBxsfTEWOXXqlGrXrq2UlBQ98sgjiomJ0cmTJ/Xzzz9rxowZevLJJ7N9T27E2bNnFRcXJ0kFduRr6dKl2rx5s2rVquXuUrK1f/9+tWzZUgcPHlTnzp3Vr18/eXt76+eff9bMmTO1ZMkS/f777+4uM0e+/fZbl/kjR44oLi5O0dHRqlGjhnuKAiCJAIpsREREqGzZslq9erXL8nXr1skYo86dO2dZlzmfGV4LunPnzsnb21seHtYcBHjggQcUFhZmyb6uJi0tTUWLFrVkXzNnztTBgwe1Zs2aLCPjKSkp8vb2tqSOgqR06dJKTU1VXFycvvjiC3eXk8WFCxd03333KTExUfHx8Vl+n8eMGaMJEya4qbrcK4x9DLhZcAge2WrYsKG2bt2qv/76y7lszZo1qlq1qtq0aaP169fL4XC4rLPZbGrQoIFz2YcffqhatWrJ19dXoaGh6tatmw4dOuSynz179uj+++9XqVKl5OPjo8jISHXr1k3JycmSJJvNprS0NM2ZM8d52Prhhx92/vzhw4f1yCOPqGTJkrLb7apatao++OADl33Ex8fLZrNpwYIF+te//qVbbrlFfn5+SklJkSQtXLjQWWdYWJgefPBBHT582GUbR48eVZ8+fRQZGSm73a7w8HDde++9SkhIuKH3+fIaP/nkE40ZM0aRkZHy8fFRixYttHfv3iztN2zYoLvvvltBQUHy8/NTkyZNtGbNGpc2mYf/f/31V/Xo0UMhISHOQOFwODRq1ChFRETIz89PzZo106+//qro6Gjn+7t//37ZbDZNmTIly/7Xrl0rm82mjz766Iqvad++ffL09NSdd96ZZV1gYKB8fHwkSSNHjlSRIkV0/PjxLO369eun4OBgnTt3TpK0adMmtW7dWmFhYfL19VXZsmX1yCOPSLp4GLt48eKSpLi4OGd/GTVqlHN7v/32mx544AGFhobKx8dHtWvXzhIEZ8+eLZvNptWrV+vpp59W8eLFFRwcrMcff1znz5/X6dOn1atXL4WEhCgkJEQvvPCCjDFXfB8uFRAQoGeeeUZffvmltmzZcs32p0+f1uDBgxUVFSW73a7y5ctrwoQJLr97t99+u+677z6Xn4uNjZXNZtPPP//sXPbxxx/LZrNp165dV9zf4sWLtX37dr388svZ/mMyMDBQY8aMcc6vWrVKnTt3VunSpWW32xUVFaVnnnnG5XtDkh5++GH5+/tr//79at26tYoWLaqIiAiNHj06y3v3+uuvq379+ipWrJh8fX1Vq1YtLVq0KNt6P/zwQ91xxx3y8/NTSEiIGjdu7DLqeek5oPHx8apTp44kqU+fPs7+MXv27Fz1QQB5xADZeOedd4wks2LFCuey5s2bm379+pm9e/caSWb79u3OdTVq1DCVK1d2zr/66qvGZrOZrl27mrfeesvExcWZsLAwEx0dbZKSkowxxqSnp5uyZcuaiIgI8+qrr5r333/fxMXFmTp16piEhARjjDFz5841drvdNGrUyMydO9fMnTvXrF271hhjzNGjR01kZKSJiooyo0ePNjNmzDD33HOPkWSmTJnirGXFihVGkqlSpYqpUaOGmTx5shk3bpxJS0szs2bNMpJMnTp1zJQp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EhISsjwJrWPHjvLw8NDo0aOzjLRebTQ68x64l/ePTNfqgwDyDiOguCJvb2/VqVNHq1atkt1uz/Lklvr162vSpEmSXG9AX65cOb366qsaNmyYEhIS1LFjRwUEBOjAgQNasmSJ+vXrp+eee04//PCDBgwYoM6dO6tixYq6cOGC5s6d6wyXmWrVqqXvv/9ekydPdt4kv27duho/frxWrFihunXr6rHHHlOVKlV06tQpbdmyRd9//71OnTp11ddXpEgRTZgwQX369FGTJk3UvXt3JSYmaurUqYqOjtYzzzwj6eIoTYsWLdSlSxdVqVJFXl5eWrJkiRITE3P85KdFixZle4i4VatWKlmyZI62IV08j+79999XmzZtVLVqVfXp00e33HKLDh8+rBUrVigwMFBffvnlVbdRsmRJDRo0SJMmTdI999yju+++W9u3b9fXX3+tsLCwbEeJevXqpX//+99asWJFjm9EPnfuXM2bN0+dOnVSrVq15O3trV27dumDDz6Qj4+PXnrpJZf2RYoUUbdu3TRt2jR5enqqe/fuLuvnzJmjt956S506dVK5cuWUmpqq9957T4GBgc4ReF9fX1WpUkUff/yxKlasqNDQUFWrVk3VqlXT9OnT1bBhQ8XGxuqxxx7TrbfeqsTERK1bt05//PGHtm/fnqPXlZeCgoI0aNCgbC9Gev755/XFF1+offv2evjhh1WrVi2lpaVpx44dWrRokRISEpwPNyhfvrxKlSql3bt3u1xM1rhxYw0dOlSSchRAixQpok8//VQtW7ZU48aN1aVLFzVo0EBFihTRL7/8ovnz5yskJERjxoxRTEyMypUrp+eee06HDx9WYGCgFi9efMXzYX18fPTNN9+od+/eqlu3rr7++mt99dVXeumll5z3b23Xrp0mT56su+++Wz169NCxY8c0ffp0lS9f3uWepuXLl9fLL7+sV155RY0aNdJ9990nu92ujRs3KiIiQuPGjcu2hnLlyik4OFhvv/22AgICVLRoUdWtW9d5JOBafRBAHrL8unvcVIYNG+a8197lMm9REhAQYC5cuJBl/eLFi03Dhg1N0aJFTdGiRU1MTIzp37+/2b17tzHGmP3795tHHnnElCtXzvj4+JjQ0FDTrFkz8/3337ts57fffjONGzc2vr6+WW4TlJiYaPr372+ioqJMkSJFTKlSpUyLFi3Mu+++62yTeYujK93u6eOPPzY1a9Y0drvdhIaGmp49e5o//vjDuf7EiROmf//+JiYmxhQtWtQEBQWZunXrmk8++eSa79/VbsOkS27vcqUaM2/Pc/ltY7Zu3Wruu+8+U6xYMWO3202ZMmVMly5dzPLly7Ps+9Jb3GS6cOGCGT58uClVqpTx9fU1zZs3N7t27TLFihVzuc3QpapWrWo8PDxc3pur+fnnn83zzz9vbr/9dhMaGmq8vLxMeHi46dy5s9myZUu2P/PTTz8ZSeauu+7Ksm7Lli2me/fupnTp0sZut5sSJUqY9u3bm02bNrm0W7t2ralVq5bx9vbOckumffv2mV69eplSpUqZIkWKmFtuucW0b9/eLFq0yNkm8zZMl9/u6UrvZ+/evU3RokWv+X5cehumSyUlJZmgoKBsb/WVmppqhg0bZsqXL2+8vb1NWFiYqV+/vnn99dfN+fPnXdp27tzZSDIff/yxc9n58+eNn5+f8fb2drnV2LUkJSWZESNGmNjYWOPn52d8fHxMtWrVzLBhw8yff/7pbPfrr7+ali1bGn9/fxMWFmYee+wxs3379ix9NvM92rdvn7nrrruMn5+fKVmypBk5cmSW2yjNnDnTVKhQwdjtdhMTE2NmzZrlfO8v98EHHzh/d0NCQkyTJk3Md99951x/+W2YjDHm888/N1WqVDFeXl7Z/m5drQ8CyDs2Y67j7HkA/zinT59WSEiIXn31Vedh1kvVrFlToaGhWr58eb7VsH37dtWoUUP/+c9/bug8UxQsDz/8sBYtWpTtaSMFDX0QsAbngAKF0OWPSpTkvBI789GFl9q0aZO2bdvmcrFJfnjvvffk7++f5dGSgFXog4A1OAcUKIQ+/vhjzZ49W23btpW/v79Wr16tjz76SHfddZcaNGjgbLdz505t3rxZkyZNUnh4uLp27Zov9Xz55Zf69ddf9e6772rAgAHOi0UAq9AHAWsRQIFCqHr16vLy8tJrr72mlJQU54VJmbe+yrRo0SKNHj1alSpV0kcffeTyxKi8NHDgQCUmJqpt27ZXfToQkF/og4C1OAcUAAAAluIcUAAAAFiKAAoAAABL3dTngDocDh05ckQBAQHXfMQaAAAoGIwxSk1NVUREhDw8GAsrjG7qAHrkyBFFRUW5uwwAAHAdDh06pMjISHeXATe4qQNoQECApIsdODAw0M3VAACAnEhJSVFUVJTz7zgKn5s6gGYedg8MDCSAAgBwk+H0ucKLEy8AAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJZyewA9fPiwHnzwQRUrVky+vr6KjY3Vpk2b3F0WAAAA8omXO3eelJSkBg0aqFmzZvr6669VvHhx7dmzRyEhIe4sCygUol/8yt0l/CMkjG/n7hIA4Kbj1gA6YcIERUVFadasWc5lZcuWdWNFAAAAyG9uPQT/xRdfqHbt2urcubNKlCihmjVr6r333rti+/T0dKWkpLhMAAAAuLm4NYDu379fM2bMUIUKFbRs2TI9+eSTevrppzVnzpxs248bN05BQUHOKSoqyuKKAQAAcKNsxhjjrp17e3urdu3aWrt2rXPZ008/rY0bN2rdunVZ2qenpys9Pd05n5KSoqioKCUnJyswMNCSmoF/Cs4BzRucAwrkXkpKioKCgvj7XYi5dQQ0PDxcVapUcVlWuXJlHTx4MNv2drtdgYGBLhMAAABuLm4NoA0aNNDu3btdlv3+++8qU6aMmyoCAABAfnNrAH3mmWe0fv16jR07Vnv37tX8+fP17rvvqn///u4sCwAAAPnIrQG0Tp06WrJkiT766CNVq1ZNr7zyit544w317NnTnWUBAAAgH7n1PqCS1L59e7Vv397dZQAAAMAibn8UJwAAAAoXAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACW8nJ3AQAASFL0i1+5u4R/jITx7dxdAnBVjIACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUm4NoKNGjZLNZnOZYmJi3FkSAAAA8pmXuwuoWrWqvv/+e+e8l5fbSwIAAEA+cnva8/LyUqlSpdxdBgAAACzi9nNA9+zZo4iICN16663q2bOnDh48eMW26enpSklJcZkAAABwc3FrAK1bt65mz56tb775RjNmzNCBAwfUqFEjpaamZtt+3LhxCgoKck5RUVEWVwwAAIAb5dYA2qZNG3Xu3FnVq1dX69at9d///lenT5/WJ598km37YcOGKTk52TkdOnTI4ooBAABwo9x+DuilgoODVbFiRe3duzfb9Xa7XXa73eKqAAAAkJfcfg7opc6cOaN9+/YpPDzc3aUAAAAgn7g1gD733HNauXKlEhIStHbtWnXq1Emenp7q3r27O8sCAABAPnLrIfg//vhD3bt318mTJ1W8eHE1bNhQ69evV/Hixd1ZFgAAAPKRWwPoggUL3Ll7AAAAuEGBOgcUAAAA/3wEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwVIEJoOPHj5fNZtPgwYPdXQoAAADyUYEIoBs3btQ777yj6tWru7sUAAAA5DO3B9AzZ86oZ8+eeu+99xQSEuLucgAAAJDP3B5A+/fvr3bt2qlly5bXbJuenq6UlBSXCQAAADcXL3fufMGCBdqyZYs2btyYo/bjxo1TXFxcPlcFAACA/OS2EdBDhw5p0KBBmjdvnnx8fHL0M8OGDVNycrJzOnToUD5XCQAAgLzmthHQzZs369ixY7r99tudyzIyMvTjjz9q2rRpSk9Pl6enp8vP2O122e12q0sFAABAHnJbAG3RooV27NjhsqxPnz6KiYnR0KFDs4RPAAAA/DO4LYAGBASoWrVqLsuKFi2qYsWKZVkOAACAfw63XwUPAACAwsWtV8FfLj4+3t0lAAAAIJ8xAgoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAAS3m5uwAAAIDsZGRk6O+//3Z3GcihIkWKyNPTM0dtCaAAAKBAMcbo6NGjOn36tLtLQS4FBwerVKlSstlsV21HAAUAAAVKZvgsUaKE/Pz8rhlm4H7GGJ09e1bHjh2TJIWHh1+1PQEUAAAUGBkZGc7wWaxYMXeXg1zw9fWVJB07dkwlSpS46uF4LkICAAAFRuY5n35+fm6uBNcj83O71rm7BFAAAFDgcNj95pTTz40ACgAAAEsRQAEAAGApLkICAAA3hegXv7JsXwnj21m2r5yy2WxasmSJOnbsaMn+Zs+ercGDB+fL7bAYAQUAAIClCKAAAACwFAEUAAAgDzgcDr322msqX7687Ha7SpcurTFjxkiSduzYoebNm8vX11fFihVTv379dObMGefPbty4Ua1atVJYWJiCgoLUpEkTbdmy5brqSEhIkM1m04IFC1S/fn35+PioWrVqWrlypbNNfHy8bDabvvrqK1WvXl0+Pj668847tXPnzht7E3LougJoRkaGXn/9dd1xxx0qVaqUQkNDXSYAAIDCZtiwYRo/fryGDx+uX3/9VfPnz1fJkiWVlpam1q1bKyQkRBs3btTChQv1/fffa8CAAc6fTU1NVe/evbV69WqtX79eFSpUUNu2bZWamnrd9Tz//PN69tlntXXrVtWrV08dOnTQyZMns7SZNGmSNm7cqOLFi6tDhw7XvIdnXriuABoXF6fJkyera9euSk5O1pAhQ3TffffJw8NDo0aNyuMSAQAACrbU1FRNnTpVr732mnr37q1y5cqpYcOGevTRRzV//nydO3dO//nPf1StWjU1b95c06ZN09y5c5WYmChJat68uR588EHFxMSocuXKevfdd3X27FmXUcvcGjBggO6//35VrlxZM2bMUFBQkGbOnOnSZuTIkWrVqpViY2M1Z84cJSYmasmSJTf0XuTEdQXQefPm6b333tOzzz4rLy8vde/eXe+//75GjBih9evX53WN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K7az2+2y2+0WVgYAAIC85tYAaozRwIEDtWTJEsXHx6ts2bLuLAcAAAAWcGsA7d+/v+bPn6/PP/9cAQEBOnr0qCQpKChIvr6+7iwNAAAA+cSt54DOmDFDycnJatq0qcLDw53Txx9/7M6yAAAAkI/cfggeAAAAhUuBuQoeAAAAhQMBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAs5dYA+uOPP6pDhw6KiIiQzWbTZ5995s5yAAAAYAG3BtC0tDTddtttmj59ujvLAAAAgIW83LnzNm3aqE2bNu4sAQAAABZzawDNrfT0dKWnpzvnU1JS3FgNAAAArsdNdRHSuHHjFBQU5JyioqLcXRIAAABy6aYKoMOGDVNycrJzOnTokLtLAgAAQC7dVIfg7Xa77Ha7u8sAAADADbipRkABAABw83PrCOiZM2e0d+9e5/yBAwe0bds2hYaGqnTp0m6sDAAAAPnFrQF006ZNatasmXN+yJAhkqTevXtr9uzZbqoKAAAA+cmtAbRp06YyxrizBAAAAFiMc0ABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACAADAUgRQAAAAWIoACgAAAEsRQAEAAGApAigAAAAsRQAFAACApQigAAAAsBQBFAAAAJYigAIAAMBSBFAAAABYigAKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiqQATQ6dOnKzo6Wj4+Pqpbt65++uknd5cEAACAfOL2APrxxx9ryJAhGjlypLZs2aLbbrtNrVu31rFjx9xdGgAAAPKB2wPo5MmT9dhjj6lPnz6qUqWK3n77bfn5+emDDz5wd2kAAADIB17u3Pn58+e1efNmDRs2zLnMw8NDLVu21Lp167K0T09PV3p6unM+OTlZkpSSkpL/xd4AR/pZd5fwj1HQP+ubCf0yb9An8w59Mu8U9H6ZWZ8xxs2VwF3cGkBPnDihjIwMlSxZ0mV5yZIl9dtvv2VpP27cOMXFxWVZHhUVlW81omAJesPdFQCu6JMoiG6WfpmamqqgoCB3lwE3cGsAza1hw4ZpyJAhznmHw6FTp06pWLFistlsbqzs5peSkqKoqCgdOnRIgYGB7i4HoE+iwKFP5h1jjFJTUxUREeHuUuAmbg2gYWFh8vT0VGJiosvyxMRElSpVKkt7u90uu93usiw4ODg/Syx0AgMD+WJFgUKfREFDn8wbjHwWbm69CMnb21u1atXS8uXLncscDoeWL1+uevXqubEyAAAA5Be3H4IfMmSIevfurdq1a+uOO+7QG2+8obS0NPXp08fdpQEAACAfuD2Adu3aVcePH9eIESN09OhR1ahRQ998802WC5OQv+x2u0aOHJnlFAfAXeiTKGjok0DesRnugQAAAAALuf1G9AAAAChcCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKbffiB7uc+HCBf3yyy86evSoJKlUqVKqUqWKihQp4ubKUFgdPXpUGzZscOmTdevWValSpdxcGQozviuBvEcALYQcDodGjBih6dOnKzk52WVdUFCQBgwYoLi4OHl4MEAOa6Slpenxxx/XggULZLPZFBoaKkk6deqUjDHq3r273nnnHfn5+bm5UhQmfFcC+YffmkLoxRdf1Lvvvqvx48dr//79SktLU1pamvbv368JEybo3Xff1bBhw9xdJgqRQYMG6aefftJXX32lc+fOKTExUYmJiTp37pz++9//6qefftKgQYPcXSYKGb4rgfzDozgLoVKlSmnOnDlq3bp1tuuXLVumXr16KTEx0eLKUFiFhIToq6++Uv369bNdv2bNGrVv315JSUkWV4bCjO9KIP8wAloIpaamKiIi4orrw8PDlZaWZmFFKOwcDoe8vb2vuN7b21sOh8PCigC+K4H8RAAthJo2barnnntOJ06cyLLuxIkTGjp0qJo2bWp9YSi02rdvr379+mnr1q1Z1m3dulVPPvmkOnTo4IbKUJjxXQnkHw7BF0KHDh1S27Zt9dtvvyk2NlYlS5aUJCUmJmrHjh2qUqWKli5dqqioKDdXisIiKSlJPXr00LJlyxQSEqISJUpIko4dO6bTp0+rdevWmj9/voKDg91bKAoVviuB/EMALaQcDoeWLVum9evXu9xapF69errrrru4qhNu8dtvv2ndunVZ+mRMTIybK0NhxXclkD8IoAAAALAU9wEtxH766acso03169dXnTp13FwZ4CopKUlffvmlevXq5e5SUAg5HI5sRzodDof++OMPlS5d2g1VATc3RkALoWPHjun+++/XmjVrVLp0aZfzmg4ePKgGDRpo8eLFzvPwAHfbvn27br/9dmVkZLi7FBQiKSkpevTRR/Xll18qMDBQjz/+uEaOHClPT09JF78zIyIi6JfAdWAEtBB66qmnlJGRoV27dqlSpUou63bv3q1HHnlE/fv318KFC91UIQqblJSUq65PTU21qBLgf4YPH67t27dr7ty5On36tF599VVt2bJFn376qfO2YYzhANeHEdBCKCAgQD/++KNq1qyZ7frNmzeradOm/NGHZTw8PGSz2a643hgjm83GSBMsVaZMGc2ZM8d5q6UTJ06oXbt2Cg4O1hdffKHTp08zAgpcJ0ZACyG73X7VEafU1FTZ7XYLK0JhFxAQoJdffll169bNdv2ePXv0+OOPW1wVCrvjx4+rTJkyzvmwsDB9//33at26tdq2bav333/fjdUBNzcCaCHUtWtX9e7dW1OmTFGLFi0UGBgo6eJh0OXLl2vIkCHq3r27m6tEYXL77bdLkpo0aZLt+uDgYA51wnKlS5fWrl27VLZsWeeygIAAffvtt7rrrrvUqVMnN1YH3NwIoIXQ5MmT5XA41K1bN124cMF5LtP58+fl5eWlvn376vXXX3dzlShMevToobNnz15xfalSpTRy5EgLKwKkVq1aadasWWrbtq3Lcn9/fy1btkytWrVyU2XAzY9zQAuxlJQUbdq0SYmJiZIu/pGvVauWc0QUAAqzpKQkHTlyRFWrVs12fWpqqrZs2XLFkXsAV0YALYQGDhyoLl26qFGjRu4uBZBEn0TBRL8E8g8BtBDKvOK4XLly6tu3r3r37q1SpUq5uywUYvRJFET0SyD/8BDbQurbb79V27Zt9frrr6t06dK69957tXTpUjkcDneXhkKKPomCiH4J5A8CaCEVGxurN954Q0eOHNGHH36o9PR0dezYUVFRUXr55Ze1d+9ed5eIQoY+iYKIfgnkDw7BF0IeHh46evRolkdtHjx4UB988IFmz56tQ4cOcXNlWIY+iYKIfgnkHwJoIXSlL9VMxhh9//333GIElqFPoiCiXwL5h0PwhVCZMmXk6el5xfU2m40vVFiKPomCiH4J5B9GQAEAAGApRkABAABgKQIoAAAALEUABQAAgKUIoAAAALAUARQAAACWIoACyFfGGLVs2VKtW7fOsu6tt95ScHCw/vjjDzdUBgBwFwIogHxls9k0a9YsbdiwQe+8845z+YEDB/TCCy/ozTffVGRkZJ7u8++//87T7QEA8hYBFEC+i4qK0tSpU/Xcc8/pwIEDMsaob9++uuuuu1SzZk21adNG/v7+KlmypB566CGdOHHC+bPffPONGjZsqODgYBUrVkzt27fXvn37nOsTEhJks9n08ccfq0mTJvLx8dG8efPc8TIBADnEjegBWKZjx45KTk7Wfffdp1deeUW//PKLqlatqkcffVS9evXSX3/9paFDh+rChQv64YcfJEmLFy+WzWZT9erVdebMGY0YMUIJCQnatm2bPDw8lJCQoLJlyyo6OlqTJk1SzZo15ePjo/DwcDe/WgDAlRBAAVjm2LFjqlq1qk6dOqXFixdr586dWrVqlZYtW+Zs88cffygqKkq7d+9WxYoVs2zjxIkTKl68uHbs2KFq1ao5A+gbb7yhQYMGWflyAADXiUPwACxTokQJPf7446pcubI6duyo7du3a8WKFfL393dOMTExkuQ8zL5nzx51795dt956qwIDAxUdHS1JOnjwoMu2a9eubelrAQBcPy93FwCgcPHy8pKX18WvnjNnzqhDhw6aMGFClnaZh9A7dOigMmXK6L333lNERIQcDoeqVaum8+fPu7QvWrRo/hcPAMgTBFAAbnP77bdr8eLFio6OdobSS508eVK7d+/We++9p0aNGkmSVq9ebXWZAIA8xiF4AG7Tv39/nTp1St27d9fGjRu1b98+LVu2TH369FFGRoZCQkJUrFgxvfvuu9q7d69++OEHDRkyxN1lAwBuEAEUgNtERERozZo1ysjI0F133aXY2FgNHjxYwcHB8vDwkIeHhxYsWKDNmzerWrVqeuaZZzRx4kR3lw0AuEFcBQ8AAABLMQIKAAAASxFAAQAAYCkCKAAAACxFAAUAAIClCKAAAACwFAEUAAAAliKAAgAAwFIEUAAAAFiKAAoAAABLEUABAABgKQIoAAAALPX/AKRvfAT0tKz6AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create another plot. The same filters are still active.\n", "rep.get(\"plot new capacity\")" ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { @@ -1394,13 +1593,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "slideshow": { "slide_type": "fragment" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAAHTCAYAAABY/cLZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5k0lEQVR4nO3deXgUVd728buTkA6EbJCEEEnYBAIBlE0kIGERkO0RdURQJ8iioBFhkFF5lW1QNsXBUR4EHUExiCzCCIoRBGQIOyiDDiJbBFF2spBogHS9f3ClH9sEDCGkQs73c119jV11uupXlaL7nlNVpxyWZVkCAACAUbzsLgAAAAAljxAIAABgIEIgAACAgQiBAAAABiIEAgAAGIgQCAAAYCBCIAAAgIEIgQAAAAYiBAIAABiIEAgAKBSHw6Fx48bZXQaAYkIIRKmzcOFCORwOLV26NN+8W265RQ6HQ2vXrs03Lzo6WnFxccVez8SJE7Vs2bJiX25JGDdunBwOx2Vfx44ds7vE6+rkyZMaNmyYYmJiVL58eYWHh+u2227Ts88+q3PnzhX7+rKzszVu3DitW7eu2Jd9rdq1a+fxt69UqZJatGihd955Ry6Xy+7yANjAx+4CgN9r06aNJGnDhg2655573NMzMjL0zTffyMfHRykpKWrfvr173pEjR3TkyBH16dOn2OuZOHGi/vSnP6lXr17FvuySMnPmTFWsWDHf9ODg4JIvpoScOXNGzZs3V0ZGhgYMGKCYmBidPn1a//nPfzRz5kw9/vjjBe6Ta5Gdna3x48dLuhS6Sptq1app0qRJki4F5Pfee08DBw7U999/r8mTJ//h53/55Rf5+PCzAZQV/GtGqRMZGamaNWtqw4YNHtM3bdoky7J0//3355uX9z4vQJZ2v/76q3x9feXlVTKd8X/6058UGhpaIuu6kqysLPn7+5fIuv75z3/q8OHDSklJyddDnJGRIV9f3xKpozQJCgrSww8/7H4/ePBg1atXT2+88YYmTJigcuXK5fuMy+XS+fPn5efnJz8/v5IsF8B1xulglEpt2rTRV199pV9++cU9LSUlRbGxseratas2b97scQorJSVFDodDrVu3dk97//331axZM5UvX16VKlVSnz59dOTIEY/17Nu3T/fdd58iIiLk5+enatWqqU+fPkpPT5d06RqorKwsvfvuu+7TaI888oj780ePHtWAAQNUpUoVOZ1OxcbG6p133vFYx7p16+RwOLRgwQK98MILuummm1ShQgVlZGRIkhYtWuSuMzQ0VA8//LCOHj3qsYxjx46pf//+qlatmpxOp6pWraq7775bqamp17Sff1/jwoUL9dJLL6latWry8/NTx44dtX///nztt2zZorvuuktBQUGqUKGC4uPjlZKS4tEm71T0f//7Xz344IMKCQlxh3SXy6Vx48YpMjJSFSpUUPv27fXf//5XNWrUcO/fgwcPyuFw6O9//3u+9W/cuFEOh0MffPDBZbfpwIED8vb21u23355vXmBgoDvQjB07VuXKldPJkyfztXvssccUHBysX3/9VZK0fft2denSRaGhoSpfvrxq1qypAQMGSJJSU1MVFhYmSRo/frz7ePntNXTfffed/vSnP6lSpUry8/NT8+bN9fHHH3usc+7cuXI4HNqwYYOeeuophYWFKTg4WIMHD9b58+eVlpamhIQEhYSEKCQkRM8884wsy7rsfriSChUq6Pbbb1dWVpZ7+x0Oh5588kklJSUpNjZWTqdTn332mXve768JPHr0qAYOHKjIyEg5nU7VrFlTjz/+uM6fP+9uk5aWpuHDhysqKkpOp1M333yzpkyZku809IIFC9SsWTMFBAQoMDBQjRo10muvvVakbQPwx+gJRKnUpk0bzZs3T1u2bHGfVsvr0YmLi1N6erq++eYbNW7c2D0vJiZGlStXliS99NJLGj16tHr37q1Bgwbp5MmTev3119W2bVt99dVXCg4O1vnz59WlSxfl5ORo6NChioiI0NGjR7VixQqlpaUpKChI8+bN06BBg3TbbbfpsccekyTVrl1bknT8+HHdfvvt7h/NsLAwrVy5UgMHDlRGRoaGDx/usU0TJkyQr6+vRo4cqZycHPn6+mru3Lnq37+/WrRooUmTJun48eN67bXXlJKS4q5Tku677z59++23Gjp0qGrUqKETJ05o1apVOnz4sGrUqPGH+/PMmTP5pvn4+OQ7HTx58mR5eXlp5MiRSk9P19SpU/XQQw9py5Yt7jZr1qxR165d1axZM40dO1ZeXl6aM2eOOnTooH//+9+67bbbPJZ5//33q06dOpo4caI7rIwaNUpTp05Vz5491aVLF+3atUtdunRxhy1JqlWrllq3bq2kpCT95S9/8VhmUlKSAgICdPfdd192m6tXr67c3FzNmzdP/fr1u2y7P//5z/rb3/6mDz/8UE8++aR7+vnz57V48WLdd9998vPz04kTJ9S5c2eFhYXpueeeU3BwsFJTU/XRRx9JksLCwtynme+55x7de++9kuQ+Rr/99lu1bt1aN910k5577jn5+/tr4cKF6tWrl5YsWeJx6YMk9zE5fvx4bd68WbNnz1ZwcLA2btyo6OhoTZw4UZ9++qlefvllNWzYUAkJCZfdxis5ePCgvL29PY6FNWvWaOHChXryyScVGhp62WPsp59+0m233aa0tDQ99thjiomJ0dGjR7V48WJlZ2fL19dX2dnZio+P19GjRzV48GBFR0dr48aNGjVqlH7++WdNnz5dkrRq1Sr17dtXHTt21JQpUyRJe/bsUUpKioYNG1akbQPwByygFPr2228tSdaECRMsy7KsCxcuWP7+/ta7775rWZZlValSxZoxY4ZlWZaVkZFheXt7W48++qhlWZaVmppqeXt7Wy+99JLHMnfv3m35+Pi4p3/11VeWJGvRokVXrMXf39/q169fvukDBw60qlatap06dcpjep8+faygoCArOzvbsizLWrt2rSXJqlWrlnuaZVnW+fPnrfDwcKthw4bWL7/84p6+YsUKS5I1ZswYy7Is6+zZs5Yk6+WXX77yTivA2LFjLUkFvurVq+dul1dj/fr1rZycHPf01157zZJk7d6927Isy3K5XFadOnWsLl26WC6Xy90uOzvbqlmzptWpU6d86+7bt69HTceOHbN8fHysXr16eUwfN26cJcljX8+aNcuSZO3Zs8djv4WGhhb4N/n9esLCwixJVkxMjDVkyBBr/vz5VlpaWr62rVq1slq2bOkx7aOPPrIkWWvXrrUsy7KWLl1qSbK2bdt22XWePHnSkmSNHTs237yOHTtajRo1sn799Vf3NJfLZcXFxVl16tRxT5szZ44lKd8+btWqleVwOKwhQ4a4p128eNGqVq2aFR8ff8V9YVmWFR8fb8XExFgnT560Tp48ae3Zs8d66qmnLElWz5493e0kWV5eXta3336bbxm/37aEhATLy8urwH2SV/uECRMsf39/6/vvv/eY/9xzz1ne3t7W4cOHLcuyrGHDhlmBgYHWxYsX/3BbABQPTgejVKpfv74qV67svtZv165dysrKcl/bFRcX5z79uGnTJuXm5rpPNX700UdyuVzq3bu3Tp065X5FRESoTp067juLg4KCJEnJycnKzs6+qvosy9KSJUvUs2dPWZblsZ4uXbooPT1dO3fu9PhMv379VL58eff77du368SJE3riiSc8rrXq3r27YmJi9Mknn0iSypcvL19fX61bt05nz569qjrzLFmyRKtWrfJ4zZkzJ1+7/v37e1wrd8cdd0i61FskSV9//bX27dunBx98UKdPn3Zvc1ZWljp27Kj169fnO8U3ZMgQj/dffPGFLl68qCeeeMJj+tChQ/PV07t3b/n5+SkpKck9LTk5WadOnfK4tq0gVapU0a5duzRkyBCdPXtWb775ph588EGFh4drwoQJHqdQExIStGXLFh04cMA9LSkpSVFRUYqPj5f0fzfRrFixQhcuXLjiun/vzJkzWrNmjXr37q3MzEz3fjt9+rS6dOmiffv25bsEYODAgXI4HO73LVu2lGVZGjhwoHuat7e3mjdv7v77/JHvvvtOYWFhCgsLU/369fX666+re/fu+S5hiI+PV4MGDa64LJfLpWXLlqlnz55q3rx5vvl5tS9atEh33HGHQkJCPP6d3HnnncrNzdX69eslXdq/WVlZWrVqVaG2BcC1IwSiVHI4HIqLi3Nf+5eSkqLw8HDdfPPNkjxDYN7/5oXAffv2ybIs1alTx/2Dl/fas2ePTpw4IUmqWbOmRowYobfffluhoaHq0qWLZsyY4b4e8EpOnjyptLQ0zZ49O986+vfvL0nu9eSpWbOmx/sffvhBklSvXr18y4+JiXHPdzqdmjJlilauXKkqVaqobdu2mjp16lUN79K2bVvdeeedHq9WrVrlaxcdHe3xPiQkRJLc4XPfvn2SLgXa32/322+/rZycnHz773Lbnfe3zFOpUiX3+vIEBwerZ8+emj9/vntaUlKSbrrpJnXo0OEPt7tq1aqaOXOmfv75Z+3du1f/+Mc/FBYWpjFjxuif//ynu90DDzwgp9PpDpvp6elasWKFHnroIXeYiY+P13333afx48crNDRUd999t+bMmaOcnJw/rGP//v2yLEujR4/Ot9/Gjh0rKf/x8vu/Rd7/aYmKiso3vbD/56BGjRpatWqVVq9erQ0bNujYsWNasWJFvpuGfv83K8jJkyeVkZGhhg0bXrHdvn379Nlnn+Xb7jvvvFPS/233E088obp166pr166qVq2aBgwY4L4WEcD1wTWBKLXatGmj5cuXa/fu3fnu8IyLi9Nf//pXHT16VBs2bFBkZKRq1aol6VIPhcPh0MqVK+Xt7Z1vub8dFmTatGl65JFH9K9//Uuff/65nnrqKU2aNEmbN29WtWrVLltbXm/Xww8/fNnrzfKuBcvz217AqzV8+HD17NlTy5YtU3JyskaPHq1JkyZpzZo1atKkSZGX+3sF7S9J7l6zvO1++eWXdeuttxbY9vfDrlzLdkuXeukWLVqkjRs3qlGjRvr444/1xBNPXNWd1Q6HQ3Xr1lXdunXVvXt31alTR0lJSRo0aJCkS2G3R48eSkpK0pgxY7R48WLl5OR49DY6HA4tXrxYmzdv1vLly5WcnKwBAwZo2rRp2rx58xWHm8nbbyNHjlSXLl0KbPP7UHy5v0VB061C3hji7+/vDl9Xcq1/s99yuVzq1KmTnnnmmQLn161bV5IUHh6ur7/+WsnJyVq5cqVWrlypOXPmKCEhQe+++26x1QPg/xACUWr9drzAlJQUjxstmjVrJqfTqXXr1mnLli3q1q2be17t2rVlWZZq1qzp/oG5kkaNGqlRo0Z64YUXtHHjRrVu3VpvvvmmXnzxRUnyOCWXJywsTAEBAcrNzS3Uj2pBqlevLknau3dvvl6tvXv3uuf/druefvppPf3009q3b59uvfVWTZs2Te+//36R1l8UeTfFBAYGXvN279+/36PH6fTp0wX2aN11110KCwtTUlKSWrZsqezsbP35z38u0rqlSzechISE6Oeff/aYnpCQoLvvvlvbtm1TUlKSmjRpotjY2Hyfv/3223X77bfrpZde0vz58/XQQw9pwYIFGjRoUIHHSt46JalcuXJF3m+lTVhYmAIDA/XNN99csV3t2rV17ty5Qm23r6+vevbsqZ49e8rlcumJJ57QrFmzNHr06HwhGcC143QwSq3mzZu7rwc7evSoR0+g0+lU06ZNNWPGDGVlZXmMD3jvvffK29tb48ePz9dDYlmWTp8+LenSWHEXL170mN+oUSN5eXl5nOLz9/dXWlqaRztvb2/dd999WrJkSYE/ggUNN1LQ9oWHh+vNN9/0WN/KlSu1Z88ede/eXdKlAYh/e9esdOmHNSAgoFCnIotTs2bNVLt2bb3yyisFPnGjMNvdsWNH+fj4aObMmR7T33jjjQLb+/j4qG/fvlq4cKHmzp2rRo0a5etlLciWLVuUlZWVb/rWrVt1+vTpfKfhu3btqtDQUE2ZMkVffvllvmsOz549m+94yusNzfs7VKhQQZLyHS/h4eFq166dZs2alS98SoXbb6WNl5eXevXqpeXLl2v79u355uftq969e2vTpk1KTk7O1yYtLc39bzDv3+Vvl5/3dy7p4xwwBT2BKLV8fX3VokUL/fvf/5bT6VSzZs085sfFxWnatGmSPAeJrl27tl588UWNGjVKqamp6tWrlwICAnTo0CEtXbpUjz32mEaOHKk1a9boySef1P3336+6devq4sWLmjdvnjvg5WnWrJlWr16tV1991T2QdcuWLTV58mStXbtWLVu21KOPPqoGDRrozJkz2rlzp1avXl3gsCy/Va5cOU2ZMkX9+/dXfHy8+vbt6x4ipkaNGu5hUb7//nt17NhRvXv3VoMGDeTj46OlS5fq+PHjhX5CyuLFiws8XdmpUydVqVKlUMuQLv0wv/322+ratatiY2PVv39/3XTTTTp69KjWrl2rwMBALV++/IrLqFKlioYNG6Zp06bpf/7nf3TXXXdp165dWrlypUJDQwvsTUtISNA//vEPrV271j18yB+ZN2+ekpKSdM8996hZs2by9fXVnj179M4778jPz0//7//9P4/25cqVU58+ffTGG2/I29tbffv29Zj/7rvv6n//9391zz33qHbt2srMzNRbb72lwMBAd090+fLl1aBBA3344YeqW7euKlWqpIYNG6phw4aaMWOG2rRpo0aNGunRRx9VrVq1dPz4cW3atEk//vijdu3aVajtKk0mTpyozz//XPHx8XrsscdUv359/fzzz1q0aJE2bNig4OBg/fWvf9XHH3+sHj166JFHHlGzZs2UlZWl3bt3a/HixUpNTVVoaKgGDRqkM2fOqEOHDqpWrZp++OEHvf7667r11ltVv359uzcVKJtsuScZKKRRo0ZZkqy4uLh88/KG8AgICChwWIklS5ZYbdq0sfz9/S1/f38rJibGSkxMtPbu3WtZlmUdPHjQGjBggFW7dm3Lz8/PqlSpktW+fXtr9erVHsv57rvvrLZt21rly5fPN4TJ8ePHrcTERCsqKsoqV66cFRERYXXs2NGaPXu2u03e8CuXG4rmww8/tJo0aWI5nU6rUqVK1kMPPWT9+OOP7vmnTp2yEhMTrZiYGMvf398KCgqyWrZsaS1cuPAP99+VhojR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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Replace the technology filters with a commodity filter;\n", "# show only \"light\" and not e.g. \"electricity\".\n", @@ -1428,7 +1648,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "slideshow": { "slide_type": "skip" @@ -1460,7 +1680,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "message_ix", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1474,7 +1694,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.9" }, "vscode": { "interpreter": { From cdf93143ae6aa83e2e3a79eb402dc360a55744da Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Fri, 12 Apr 2024 18:22:03 +0200 Subject: [PATCH 21/25] Complete - save for testing --- message_ix/model/MESSAGE/model_setup.gms | 7 +- message_ix/model/MESSAGE/model_solve.gms | 5 - message_ix/model/MESSAGE_master.gms | 7 +- message_ix/model/MESSAGE_project.gpr | 769 -- message_ix/model/cplex.op2 | 7 +- .../MsgScaler_Default.gms} | 0 ...dbox_cb1000_splitCO2transdisp_unscaled.gms | 9260 +++++++++++++++++ ...s_Electrified_emission_bound_unscaled.gms} | 6 +- ...atrix Rescale Tool-Loop method-Copy1.ipynb | 968 -- ...x Rescale Tool-Loop method-Transport.ipynb | 1295 --- ...YPE] Matrix Rescale Tool-Loop method.ipynb | 458 - .../[PROTOTYPE] Matrix Rescale Tool.ipynb | 1230 --- message_ix/tools/lp_diag/cplex.opt | 1 - message_ix/tools/lp_diag/cplex_mpstest.opt | 1 - message_ix/tools/lp_diag/scale_trial.gms | 64 - .../lp_diag/transport_problem_mpstest.gms | 67 - .../transport_problem_mpstest_scaled.gms | 70 - .../lp_diag/transport_problem_original.gms | 65 - .../Tranport Scaling/MGLogs 1.0 | 229 - .../Tranport Scaling/MGLogs 1.gms | 229 - .../Tranport Scaling/Savepoint.gms | 10 - .../Tranport Scaling/Transport Export.gms | 57 - .../Tranport Scaling/trnsport.gms | 69 - ...os Electrified_emission_bound_unscaled.mps | 283 - .../make_prescaler/westeros_scaling.ipynb | 292 - .../tools/make_scaler/DACCS Scenario.ipynb | 506 + .../__init__.py | 80 +- 27 files changed, 9828 insertions(+), 6207 deletions(-) delete mode 100644 message_ix/model/MESSAGE_project.gpr rename message_ix/model/{prescaler/MsgPrescaler_Default.gms => scaler/MsgScaler_Default.gms} (100%) create mode 100644 message_ix/model/scaler/MsgScaler_GENIE_sandbox_cb1000_splitCO2transdisp_unscaled.gms rename message_ix/model/{prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms => scaler/MsgScaler_Westeros_Electrified_emission_bound_unscaled.gms} (100%) delete mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb delete mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb delete mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb delete mode 100644 message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb delete mode 100644 message_ix/tools/lp_diag/cplex.opt delete mode 100644 message_ix/tools/lp_diag/cplex_mpstest.opt delete mode 100644 message_ix/tools/lp_diag/scale_trial.gms delete mode 100644 message_ix/tools/lp_diag/transport_problem_mpstest.gms delete mode 100644 message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms delete mode 100644 message_ix/tools/lp_diag/transport_problem_original.gms delete mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 delete mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms delete mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms delete mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms delete mode 100644 message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms delete mode 100644 message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps delete mode 100644 message_ix/tools/make_prescaler/westeros_scaling.ipynb create mode 100644 message_ix/tools/make_scaler/DACCS Scenario.ipynb rename message_ix/tools/{make_prescaler => make_scaler}/__init__.py (75%) diff --git a/message_ix/model/MESSAGE/model_setup.gms b/message_ix/model/MESSAGE/model_setup.gms index d7df10907..1e522bac5 100644 --- a/message_ix/model/MESSAGE/model_setup.gms +++ b/message_ix/model/MESSAGE/model_setup.gms @@ -22,8 +22,7 @@ $IF NOT SET out $SETGLOBAL out "output/MsgOutput.gdx" $IF NOT SET foresight $SETGLOBAL foresight "0" -*$IF NOT SET scaler -$SETGLOBAL scaler "MsgPrescaler_Westeros Electrified_emission_bound_unscaled" +$IF NOT SET scaler $SETGLOBAL scaler "MsgScaler_Default" ** define learning mode (active / inactive) ** @@ -95,8 +94,6 @@ $INCLUDE MESSAGE/scaling_investment_costs.gms $INCLUDE MESSAGE/model_core.gms -*$OFFLISTING -$INCLUDE prescaler/%scaler%.gms -*$ONLISTING +$INCLUDE scaler/%scaler%.gms $INCLUDE MESSAGE/model_learningeos.gms diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index 563a06bb8..57a8afdec 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -31,11 +31,6 @@ if (%foresight% = 0, put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; option threads = 4 ; -* COST_ACCOUNTING_NODAL.scale('Westeros','710')=10.0; -* COST_ACCOUNTING_NODAL.scale('Westeros','700')=10.0; -* COST_ACCOUNTING_NODAL.scale('Westeros','720')=10.0; -* CAP_NEW.scale('Westeros','wind_ppl','700')=0.1; -* CAP_NEW.scale('Westeros','wind_ppl','710')=0.1; Solve MESSAGE_LP using LP minimizing OBJ ; * write model status summary diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index 202794337..995674e69 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -45,8 +45,7 @@ $ONGLOBAL *----------------------------------------------------------------------------------------------------------------------* ** scenario/case selection - this must match the name of the MsgData_<%%%>.gdx input data file ** -*$SETGLOBAL data "" -$SETGLOBAL data "Westeros_Electrified_emission_bound_unscaled" +$SETGLOBAL data "" ** MACRO mode * "none": MESSAGEix is run in stand-alone mode @@ -64,8 +63,8 @@ $SETGLOBAL foresight "0" * activate technology learning - 1 $SETGLOBAL learningmode "0" -** for recursive dynamic approach, this is to activate/deactivate technology learning module ** -*$SETGLOBAL scaler "" +** include scaler commands +$SETGLOBAL scaler "MsgScaler_Default" ** add a comment and name extension for model report files (e.g. run-specific info, calibration notes) - optional ** $SETGLOBAL comment "" diff --git a/message_ix/model/MESSAGE_project.gpr b/message_ix/model/MESSAGE_project.gpr deleted file mode 100644 index 976df4da4..000000000 --- a/message_ix/model/MESSAGE_project.gpr +++ /dev/null @@ -1,769 +0,0 @@ -[PROJECT] - -[RP:MESSAGE/MODEL_SOLVE] -1= - -[GDXDISP: CAP_NEW Var 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: CapexTec Var 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: abs_cost_activity_soft_lo Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: growth_activity_up Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: historical_gdp Par 2] -PlaneDim=0 -RowDim=2 -Squeeze=1 -SqTrail0=0 -Order=1,2 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: historical_land Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: historical_new_capacity Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_activity_lo Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_activity_up Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_land_lo Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_land_scen_lo Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_land_scen_up Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_land_up Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_new_capacity_lo Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: initial_new_capacity_up Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: input Par 10] -PlaneDim=0 -RowDim=10 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6,7,8,9,10 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: interestrate Par 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: inv_cost Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: inv_tec Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_activity_up Set 5] -PlaneDim=0 -RowDim=5 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_emission Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_extraction_up Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_new_capacity_lo Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_new_capacity_up Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_total_capacity_lo Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_bound_total_capacity_up Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_capacity_factor Set 5] -PlaneDim=0 -RowDim=5 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_activity_lo Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_activity_up Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_land_lo Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_land_scen_lo Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_land_scen_up Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_land_up Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_new_capacity_lo Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_dynamic_new_capacity_up Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_fixed_activity Set 6] -PlaneDim=0 -RowDim=6 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_fixed_capacity Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_fixed_extraction Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_fixed_land Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_fixed_new_capacity Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_fixed_stock Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_relation_lower Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: is_relation_upper Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_cost Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_emission Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_input Par 6] -PlaneDim=0 -RowDim=6 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_output Par 6] -PlaneDim=0 -RowDim=6 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_scenario Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_type Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: land_use Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_cost_activity_soft_lo Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_cost_activity_soft_up Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_cost_new_capacity_soft_lo Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_cost_new_capacity_soft_up Par 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_renewable Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_resource Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_stocks Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: level_storage Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: lvl_spatial Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: lvl_temporal Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_commodity Set 5] -PlaneDim=0 -RowDim=5 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_land Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_node Set 2] -PlaneDim=0 -RowDim=2 -Squeeze=1 -SqTrail0=0 -Order=1,2 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_relation Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_resource Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_shares_commodity_share Set 7] -PlaneDim=0 -RowDim=7 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6,7 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_shares_commodity_total Set 7] -PlaneDim=0 -RowDim=7 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6,7 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_spatial_hierarchy Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_stocks Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_tec Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_tec_addon Set 2] -PlaneDim=0 -RowDim=2 -Squeeze=1 -SqTrail0=0 -Order=1,2 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_tec_mode Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_tec_storage Set 8] -PlaneDim=0 -RowDim=8 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4,5,6,7,8 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_tec_time Set 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_temporal_hierarchy Set 3] -PlaneDim=0 -RowDim=3 -Squeeze=1 -SqTrail0=0 -Order=1,2,3 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: map_time Set 2] -PlaneDim=0 -RowDim=2 -Squeeze=1 -SqTrail0=0 -Order=1,2 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: MESSAGE_ix_version Par 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: min_utilization_factor Par 4] -PlaneDim=0 -RowDim=4 -Squeeze=1 -SqTrail0=0 -Order=1,2,3,4 -Decim=7 -PlaneRownr=-1 - -[GDXDISP: mode Set 1] -PlaneDim=0 -RowDim=1 -Squeeze=1 -SqTrail0=0 -Order=1 -Decim=7 -PlaneRownr=-1 - -[RP:MESSAGE/DATA_LOAD] -1= - -[RP:SETS_MAPS_DEF] -1= - -[RP:MODEL_SETUP] -1= - -[RP:MODEL_CORE] -1= - -[RP:MODEL_LEARNINGEOS] -1= - -[RP:MESSAGE_MASTER] -1= - -[RP:MODEL_SOLVE] -1= - -[MRUFILES] -1=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_run.lst -2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_setup.gms -3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\sets_maps_def.gms -4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE/data_load.gms -5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\data\MsgData_Westeros_Electrified_baseline.gdx -6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_run.lst -7=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\output\MsgOutput_Westeros_Electrified_baseline.gdx -8=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\learningeos.gdx - -[OPENWINDOW_1] -FILE0=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE\model_solve.gms -FILE1=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_master.gms -FILE2=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_master.lst -FILE3=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\Scale_test.mps -FILE4=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\make_prescaler\Westeros Electrified_emission_bound_scaled.mps -FILE5=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\make_prescaler\Westeros Electrified_emission_bound_unscaled.mps -FILE6=C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\model\MESSAGE_master.gms -MAXIM=0 -TOP=7 -LEFT=50 -HEIGHT=618 -WIDTH=1307 diff --git a/message_ix/model/cplex.op2 b/message_ix/model/cplex.op2 index e165f1bdf..70756bbe7 100644 --- a/message_ix/model/cplex.op2 +++ b/message_ix/model/cplex.op2 @@ -1,6 +1,5 @@ -advind = 0 -lpmethod = 4 +advind = determined by GAMS Bratio +lpmethod = 2 threads = 4 -epopt = 1e-06 -writemps = C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\make_prescaler\Westeros Electrified_emission_bound_scaled.mps +epopt = 1.0e-06 barcrossalg = 2 \ No newline at end of file diff --git a/message_ix/model/prescaler/MsgPrescaler_Default.gms b/message_ix/model/scaler/MsgScaler_Default.gms similarity index 100% rename from message_ix/model/prescaler/MsgPrescaler_Default.gms rename to message_ix/model/scaler/MsgScaler_Default.gms diff --git a/message_ix/model/scaler/MsgScaler_GENIE_sandbox_cb1000_splitCO2transdisp_unscaled.gms b/message_ix/model/scaler/MsgScaler_GENIE_sandbox_cb1000_splitCO2transdisp_unscaled.gms new file mode 100644 index 000000000..bfad05983 --- /dev/null +++ b/message_ix/model/scaler/MsgScaler_GENIE_sandbox_cb1000_splitCO2transdisp_unscaled.gms @@ -0,0 +1,9260 @@ +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2035')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2055')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2055')=10.0; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2110','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2050')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2060')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2050')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_SavanBurnEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2110')=0.001; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2070')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2080')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_low-carbon','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2055')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2025')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2100')=0.001; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2025')=0.001; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2110')=0.0001; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_enduse','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2030')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2100')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2100')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2030')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','VOC_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2070')=100.0; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_AFR','2055','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2025')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2025')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_low-carbon','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2030')=10.0; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2050','year')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2025','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2060')=0.001; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2090')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2050')=100.0; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2055','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2045')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2045')=0.001; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2025')=0.1; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','VOC_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2100')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2030')=0.1; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','share_low_lim_FEGas_total','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2040')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_NAM','coal_exp','2100','year')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2040')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2040')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_GLB','2070')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2100')=10.0; +RELATION_EQUIVALENCE.scale('SF6_mag_red','R11_EEU','2080')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2050')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2090')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2050')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2025')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2045')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2050')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2050')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2070')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2025')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2035')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2090','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2045')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2040')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2045')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2050')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2070')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2045')=100.0; +ACTIVITY_CONSTRAINT_LO.scale('R11_NAM','coal_exp','2070','year')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2045')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2110')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2100')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2025')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_low-carbon','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2045')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2050')=0.001; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2055')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2035')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2025')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2110')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2110')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2055')=0.1; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2070','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2060')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','share_low_lim_FEGas_total','2090')=0.1; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2025')=0.01; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2030')=0.001; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2060')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2060')=10.0; +RELATION_EQUIVALENCE.scale('SF6_Emission','R11_EEU','2100')=0.1; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2025')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2090','year')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2060','PltFor')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2070')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2030')=100.0; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2080')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2050')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2035')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2080')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2045')=0.001; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2060')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2025')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2050')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2100','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2090')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2100')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2040')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2030')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2080')=0.0001; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2040')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2030')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2100')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2050')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2100','year')=1e-05; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2110')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_low-carbon','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2035')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','transformation_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2055')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2080')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2050','year')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NOx','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2100')=0.001; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2060')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2060')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2055')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2040')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2055')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2045')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2055')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','share_low_lim_FEGas_total','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2060')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2045')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2100')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2080')=0.001; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2060')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2070')=0.0001; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','share_low_lim_FEGas_total','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2055')=0.001; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2040')=100.0; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2040','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2100')=0.001; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2080')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2045')=0.1; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2025','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2060')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2035')=0.001; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2090')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2100')=0.001; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2050')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2040')=0.1; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2040')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_low-carbon','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2070')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2025')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_NAM','coal_exp','2110','year')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2080')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2040')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2100')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2080')=10.0; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2035')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2025')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2055')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2040')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2045')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA_LandUseChangeEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2035')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2080')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_low-carbon','2100')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2080')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2055')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('SF6_mag_red','R11_EEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2045','year')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','share_low_lim_FEGas_total','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2050')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2025')=0.1; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2035')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2030','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2070','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2030')=10.0; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2030')=0.001; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('World','CO','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2025')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2030','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2110','year')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2055')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2050')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2050')=10.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2110','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_low-carbon','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2030')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2055')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2090')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2080')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2050')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2100')=10.0; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2070','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2055')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2040')=0.001; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2050')=10.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2090')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2050')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2070','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2100')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_supply','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2060')=0.01; +RELATION_EQUIVALENCE.scale('SF6_mag_red','R11_EEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2025')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2045')=0.001; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2040')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2060')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2090')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2060')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2050')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2110')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2080')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2090')=0.001; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2060')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2090','year')=1e-05; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2090')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2100','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2090')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2050')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2040')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2055')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2050')=10.0; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2060')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2040')=10.0; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2090')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2035')=100.0; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2060')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2030')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2060')=10.0; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2040')=10.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2035')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2055')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_low-carbon','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_low-carbon','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_low-carbon','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','VOC_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2045')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2055')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','extraction_fossil','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2055')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2110')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2050')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2110')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_LAM','2110')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2045')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2090')=0.1; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2055')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_other','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2060')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2045')=0.001; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2035')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2040')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2025')=0.1; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2110')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2110')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_enduse','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2040')=0.1; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2025','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2035')=0.01; +RELATION_EQUIVALENCE.scale('SF6_mag_red','R11_EEU','2060')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2090')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2060')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2025')=0.001; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2040')=100.0; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2100')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2060')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2110')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2035')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2035')=10.0; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_MEA','2080','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2110')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2055')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2070')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2035')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2040')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2035')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2070')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','share_low_lim_FEGas_total','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2090')=10.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2025')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2040')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2080','year')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2080')=100.0; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2080','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2110')=100.0; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_LAM','2100')=0.1; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2040')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2080')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2090')=10.0; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2050')=0.1; +RELATION_EQUIVALENCE.scale('SF6_mag_red','R11_EEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','transformation_enduse','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_other','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2060')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2110')=10.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2030')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2080')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2045')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_MEA','2030','PltFor')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2060')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2070')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2100')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2040')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2090','year')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2090')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_SavanBurnEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_LAM','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2060')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2040')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2070')=0.01; +RELATION_EQUIVALENCE.scale('SF6_Emission','R11_EEU','2110')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2035')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2045')=100.0; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2080')=10.0; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2055')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2080')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2080')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2035')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_low-carbon','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_low-carbon','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2040')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2030')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2055')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2090')=0.001; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2100')=0.01; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2070','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_GLB','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2110')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2055')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2060')=10.0; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2040')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_low-carbon','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2070','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2060')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2030')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2030')=10.0; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2025')=0.001; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2060')=10.0; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2060')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2050')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2090')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2045','year')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2070')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2080')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2090','year')=1e-05; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('SF6_mag_red','R11_EEU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_supply','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2070')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2080')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2055')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2100')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2055','year')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2045')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2090')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2030')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2040')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2025')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NOx','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2100','year')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_low-carbon','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','share_low_lim_FEGas_total','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2100')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2110')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2050')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2025')=10.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2055')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2070')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2090')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','share_low_lim_FEGas_total','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_MEA','2100')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2090')=0.001; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2060')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','transformation_enduse','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2070')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2040')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2050')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2045')=0.001; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2035')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','VOC_LandUseChangeEM','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2040')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2045')=0.001; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2030')=0.001; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','NOx','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2040')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2100')=0.001; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2040')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2035')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2050')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2055')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2100')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','transformation_enduse','2110')=0.01; +RELATION_EQUIVALENCE.scale('SF6_Emission','R11_EEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2045')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2055')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2110')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2055')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2055')=100.0; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2080')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','VOC_LandUseChangeEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2040')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2050')=0.001; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2080')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2045')=0.001; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2035')=0.001; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2055')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2110','year')=1e-05; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAS','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','transformation_enduse','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2040')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2040')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2100')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2055')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NOx','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2035')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2100')=10.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2100')=0.001; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2045')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2080')=10.0; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2060')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2110')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2040')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2030')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2045')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2040')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','share_low_lim_FEGas_total','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2050')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2110','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2100')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2090')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2055')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2025')=0.01; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2110')=0.1; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','transformation_enduse','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2100')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2100')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2045')=0.001; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2050')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2055')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2030')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2050')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2080')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('World','CO','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2080')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2050')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2060')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2055')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2025')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2070')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2055')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2040')=0.1; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2050')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2110')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2030')=0.001; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2055')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2055')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2025')=100.0; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2070','year')=1e-05; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2025')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2030')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2025')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2045')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2045')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2070')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2030')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2100')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2090')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2030')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2050')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2080')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2050')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2110','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2025')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2055')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','investment_supply','2110')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_low-carbon','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2055')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2050')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2050')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2070')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_NAM','coal_exp','2080','year')=0.001; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2030')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2025')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2110')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2100')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2050')=0.1; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2110','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_low-carbon','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2050')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2045')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2055')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2080')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2070','year')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2040')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2080')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2070')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2050')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2050')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2040')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2050')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2100')=0.1; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2110','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2045')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2100','year')=1e-05; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2080')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2110')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2060')=100.0; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2025')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('World','OCA_LandUseChangeEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2100')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2110','year')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2110')=0.001; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAS','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2035')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2100')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2030','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','VOC_LandUseChangeEM','all','2040')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2045')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2040','year')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2070')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2060')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','transformation_enduse','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2025','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2030')=10.0; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NOx','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2080')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2050')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA_LandUseChangeEM','all','2090')=100.0; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2100','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2090')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','transformation_enduse','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2080')=0.001; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2070','year')=1e-05; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2035')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2040')=0.1; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2080','year')=1e-05; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_low-carbon','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','share_low_lim_FEGas_total','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2035')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2070','year')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAS','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2070')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2080')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2070')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2100')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2100')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAO','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2025')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_NAM','coal_exp','2090','year')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2050')=100.0; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2110')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2055')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO','all','2100')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2110')=10.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2055')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2045')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2055')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2040')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_WEU','2070','PltFor')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2050')=100.0; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2040','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2110')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2035')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2080')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2035')=10.0; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2030')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2050')=100.0; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2110','year')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','VOC_LandUseChangeEM','all','2110')=100.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2045')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAS','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2050')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2070')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2040')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2080')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_supply','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2025')=0.001; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2055')=0.001; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2110')=0.001; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2100')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2080','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','VOC_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2035')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2100')=100.0; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2080','year')=1e-05; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2055')=0.1; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2080')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2045')=10.0; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2030','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2110')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_low-carbon','2070')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2050')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2070')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2055')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2035')=0.001; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2055')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2025')=0.01; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2110','year')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2050')=10.0; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2055')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2070')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2070')=10.0; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2090')=0.0001; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2050')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2035')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2025','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('SF6_Emission','R11_EEU','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2035')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2025')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2090')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2055')=10.0; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2100')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2055')=10.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2050')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','all','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2070')=0.001; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2030','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2030')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2055')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2100','year')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAO','2025')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2040')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_LAM','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2045')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2070')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2050')=0.001; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_EEU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2060')=0.1; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2070','year')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2055')=0.1; +EMISSION_EQUIVALENCE.scale('World','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','share_low_lim_FEGas_total','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2055')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2110')=0.1; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_WEU','2110','PltFor')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2030')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_WEU','2060','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2080')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_SavanBurnEM','all','2035')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2030')=100.0; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2070','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_low-carbon','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2110')=10.0; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_PAS','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2050')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2025')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2080')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2030')=0.001; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2110')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2070')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_FSU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2070')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2030')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2060')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2100')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2055')=10.0; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_low-carbon','2110')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2030')=10.0; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2025')=0.001; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2060')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2050')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2055')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2090')=0.001; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2070')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2110')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2030')=0.1; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_NAM','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SF6','share_low_lim_FEGas_total','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2080')=0.001; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2050','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','all','2035')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2050')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','extraction_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2030')=10.0; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2035')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2040')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2090')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2080')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2070')=0.001; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2090')=0.001; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2100')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2040')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2080')=0.001; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2030','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2060')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2040')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2090')=0.1; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2110','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_low-carbon','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2100')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2070')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2040')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2025')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2025')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2080')=0.1; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2070','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2080')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2045')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2035','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2100')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2045')=10.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2070')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_MEA','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_low-carbon','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','transformation_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2030')=0.001; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_FSU','2060')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_WEU','2110')=10.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2060')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2035')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2040')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2100')=0.1; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2080','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','investment_supply','2040')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_low-carbon','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2060')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_SavanBurnEM','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2100')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2100')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2090')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2050')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2030')=0.001; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc_ccs','2110','year')=1e-05; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2060')=0.01; +COMMODITY_BALANCE_GT.scale('R11_SAS','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_SAS','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2080')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2110')=0.1; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_electricity','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2030','year')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_GLB','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2100')=10.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_WEU','2055')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2070')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_AFR','2080')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2055')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2100')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2070')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2080')=100.0; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2040','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2070')=10.0; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_MEA','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_CPA','2070')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2030')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2045')=10.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2080')=10.0; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_WEU','2100','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','all','2035')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAO','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2045')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2045')=0.01; +ACTIVITY_CONSTRAINT_LO.scale('R11_LAM','gas_cc','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2070','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA_LandUseChangeEM','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2090')=0.1; +COMMODITY_BALANCE_GT.scale('R11_AFR','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2070')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2080')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2090')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_FSU','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_other','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','powerplant_fossil','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAO','2035')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','transformation_enduse','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2070')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2035')=10.0; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_GLB','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2035')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_GLB','2090')=100.0; +COST_ACCOUNTING_NODAL.scale('R11_FSU','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2040')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','transformation_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2025')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','CO_LandUseChangeEM','all','2110')=100.0; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2080')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2055','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_NAM','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2030')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_supply','2100')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_WEU','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_other','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2070')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_AFR','2040')=0.1; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2040')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2035')=0.1; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2100')=0.0001; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_low-carbon','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2055','year')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2055')=0.1; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2100','year')=0.01; +DYNAMIC_LAND_TYPE_CONSTRAINT_UP.scale('R11_FSU','2040','PltFor')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','CO_LandUseChangeEM','all','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_supply','2045')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2040')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2050')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2030')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','powerplant_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2060')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','investment_other','2090')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2025','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_other','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_SavanBurnEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','share_low_lim_FEGas_total','2090')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2045','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','transformation_enduse','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2100')=100.0; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_MEA','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2050')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_AFR','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2070')=0.001; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2050')=10.0; +COST_ACCOUNTING_NODAL.scale('R11_SAS','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_other','2045')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_LAM','2100')=10.0; +EMISSION_EQUIVALENCE.scale('World','SF6','transformation_enduse','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2050')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2070')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2080')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2030')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_electricity','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_EEU','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2110')=10.0; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','investment_supply','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','extraction_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2110')=100.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_supply','2080')=0.001; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','CO_SavanBurnEM','all','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','VOC_SavanBurnEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','all','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','all','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','all','2045')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','CO_LandUseChangeEM','all','2055')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2110')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2090')=100.0; +COMMODITY_BALANCE_GT.scale('R11_WEU','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','share_low_lim_FEGas_total','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2045')=10.0; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2110')=0.001; +RELATION_EQUIVALENCE.scale('SF6_Emission','R11_EEU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_NAM','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2030')=0.01; +COMMODITY_BALANCE_GT.scale('R11_MEA','hydrogen','final','2060','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','all','2035')=0.001; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2050')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_PAS','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','SF6','share_low_lim_FEGas_total','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2030')=0.001; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_FSU','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_CPA','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','powerplant_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','Agri_CH4','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','all','2025')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','all','2045')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2025')=10.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_supply','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_LAM','2030')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_SAS','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2080')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_FSU','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2080')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','all','2035')=0.1; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_share','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','all','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','powerplant_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','extraction_fossil','2090')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2045')=0.01; +NEW_CAPACITY_CONSTRAINT_UP.scale('R11_WEU','meth_coal_ccs','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','NH3','extraction_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2110')=10.0; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_low-carbon','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA_LandUseChangeEM','all','2100')=100.0; +EMISSION_EQUIVALENCE.scale('World','Agri_CH4','all','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','all','2090')=0.1; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_LAM','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','all','2110')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_EEU','SF6','share_low_lim_FEGas_total','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','powerplant_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2100')=0.1; +EMISSION_EQUIVALENCE.scale('World','BCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2030')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','all','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','Agri_CH4','all','2045')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_supply','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','investment_electricity','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_EEU','2030')=10.0; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_MEA','2080')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','share_low_lim_FEGas_total','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2045')=0.01; +COMMODITY_BALANCE_GT.scale('R11_EEU','hydrogen','final','2030','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','extraction_fossil','2055')=0.01; +RELATION_EQUIVALENCE.scale('NOx_Emission','R11_CPA','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','all','2050')=0.1; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2110')=100.0; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2090','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_fossil','2090')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2030')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAS','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_other','2070')=0.01; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2035','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','CO_SavanBurnEM','all','2080')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_AFR','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_low-carbon','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','investment_supply','2060')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_MEA','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2045')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_share','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','powerplant_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','extraction_fossil','2090')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_enduse','2110')=0.01; +COMMODITY_BALANCE_GT.scale('R11_NAM','hydrogen','final','2050','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_CPA','2090')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('World','NOx','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','investment_supply','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','all','2100')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','SO2','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2025')=10.0; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_CPA','2100')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_NAM','2040')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','extraction_fossil','2055')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2080')=100.0; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_PAO','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2055')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','investment_other','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','extraction_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('World','OCA','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','share_low_lim_FEGas_total','2070')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','investment_other','2025')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2060')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','powerplant_fossil','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','transformation_fossil','2045')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_EEU','2070')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','NH3','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2040')=0.001; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','share_low_lim_FEGas_total','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','investment_supply','2070')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_PAS','2035')=10.0; +EMISSION_EQUIVALENCE.scale('World','NH3','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_low-carbon','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2060')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_other','2025')=0.001; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_SAS','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','all','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','investment_supply','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_PAS','2035')=0.1; +COMMODITY_BALANCE_GT.scale('R11_CPA','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2060')=0.01; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_SavanBurnEM','all','2070')=100.0; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_LAM','2045')=10.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','all','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','OCA','transformation_enduse','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','all','2055')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAO','hydrogen','final','2110','year')=0.01; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_NAM','2100')=10.0; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','all','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2030')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAS','2040')=0.1; +EMISSION_EQUIVALENCE.scale('World','NH3','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2090')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_CPA','CO_LandUseChangeEM','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','CO_LandUseChangeEM','all','2060')=100.0; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2040')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','investment_electricity','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2055')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_AFR','2035')=10.0; +EMISSION_EQUIVALENCE.scale('World','SO2','investment_supply','2080')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_NAM','2045')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2090')=0.001; +EMISSION_EQUIVALENCE.scale('World','SO2','extraction_fossil','2090')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2080')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_PAO','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','NH3','investment_other','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_low-carbon','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_electricity','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','SO2','all','2080')=0.1; +COST_ACCOUNTING_NODAL.scale('R11_AFR','2045')=100.0; +COMMODITY_BALANCE_GT.scale('R11_LAM','hydrogen','final','2050','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NOx','extraction_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','investment_other','2110')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_SAS','2055')=0.1; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','investment_other','2035')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','transformation_fossil','2100')=0.001; +EMISSION_EQUIVALENCE.scale('World','CO_SavanBurnEM','all','2090')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','Agri_CH4','all','2025')=100.0; +EMISSION_EQUIVALENCE.scale('World','VOC_LandUseChangeEM','all','2035')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','OCA','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','investment_other','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2100')=0.001; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_electricity','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','transformation_fossil','2040')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2060')=100.0; +EMISSION_EQUIVALENCE.scale('World','BCA','extraction_fossil','2070')=0.001; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','transformation_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','all','2090')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','share_low_lim_FEGas_total','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','NH3','extraction_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_other','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','SO2','extraction_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','SO2','extraction_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','CO_LandUseChangeEM','all','2070')=100.0; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_LAM','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','investment_electricity','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','all','2110')=0.001; +COST_ACCOUNTING_NODAL.scale('R11_MEA','2100')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','BCA','investment_supply','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','BCA','transformation_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2090')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_CPA','2050')=100.0; +EMISSION_EQUIVALENCE.scale('R11_CPA','NOx','all','2070')=0.1; +COMMODITY_BALANCE_GT.scale('R11_FSU','hydrogen','final','2080','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','BCA','all','2025')=0.1; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','investment_electricity','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_other','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','transformation_fossil','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','NH3','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','Agri_CH4','all','2080')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','OCA','investment_electricity','2040')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_MEA','2030')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_SAS','2045')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','share_low_lim_FEGas_total','2045')=0.1; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','share_low_lim_FEGas_total','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SO2','extraction_fossil','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('World','OCA','powerplant_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','transformation_fossil','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','transformation_fossil','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_LAM','SF6','transformation_enduse','2060')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','transformation_fossil','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','transformation_fossil','2070')=0.001; +RELATION_EQUIVALENCE.scale('NH3_Emission','R11_CPA','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_AFR','BCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2025')=0.1; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_PAO','2080')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','NH3','extraction_fossil','2030')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_LAM','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','investment_electricity','2090')=0.01; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_EEU','2060')=0.1; +EMISSION_EQUIVALENCE.scale('R11_NAM','BCA','powerplant_fossil','2040')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_FSU','2100')=0.1; +EMISSION_EQUIVALENCE.scale('R11_EEU','OCA','investment_other','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_EEU','BCA','transformation_fossil','2045')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_AFR','2030')=10.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','extraction_fossil','2040')=0.01; +COST_ACCOUNTING_NODAL.scale('R11_WEU','2040')=100.0; +EMISSION_EQUIVALENCE.scale('R11_PAS','SF6','transformation_enduse','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAO','SF6','transformation_enduse','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_WEU','2040')=100.0; +RELATION_EQUIVALENCE.scale('SF6_Emission','R11_EEU','2070')=0.1; +EMISSION_EQUIVALENCE.scale('R11_LAM','NH3','extraction_fossil','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_PAS','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_supply','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','CO','investment_supply','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','transformation_fossil','2050')=0.01; +COMMODITY_BALANCE_GT.scale('R11_PAS','hydrogen','final','2040','year')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','investment_supply','2035')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','BCA','extraction_fossil','2040')=0.001; +RELATION_EQUIVALENCE.scale('BCA_Emission','R11_CPA','2025')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','NH3','transformation_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','SO2','all','2070')=0.1; +RELATION_EQUIVALENCE.scale('HFC_foam_red','R11_SAS','2035')=10.0; +EMISSION_EQUIVALENCE.scale('R11_SAS','OCA','transformation_fossil','2025')=0.001; +EMISSION_EQUIVALENCE.scale('R11_LAM','OCA','investment_electricity','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_NAM','2035')=0.1; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_supply','2090')=0.01; +EMISSION_EQUIVALENCE.scale('R11_WEU','OCA','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','transformation_fossil','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','SO2','investment_supply','2040')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','OCA','powerplant_fossil','2100')=0.01; +EMISSION_EQUIVALENCE.scale('R11_CPA','SO2','investment_supply','2110')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','BCA','powerplant_fossil','2030')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','BCA','extraction_fossil','2055')=0.01; +EMISSION_EQUIVALENCE.scale('World','BCA','all','2050')=0.01; +EMISSION_EQUIVALENCE.scale('R11_SAS','BCA','all','2050')=0.01; +RELATION_EQUIVALENCE.scale('HFC_mobile_red','R11_EEU','2025')=100.0; +EMISSION_EQUIVALENCE.scale('R11_AFR','OCA','investment_other','2035')=0.001; +EMISSION_EQUIVALENCE.scale('R11_WEU','NH3','extraction_fossil','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_FSU','OCA','investment_other','2110')=0.01; +EMISSION_EQUIVALENCE.scale('R11_MEA','SO2','extraction_fossil','2035')=0.01; +RELATION_EQUIVALENCE.scale('SO2_Emission','R11_MEA','2070')=0.01; +EMISSION_EQUIVALENCE.scale('R11_NAM','OCA','investment_electricity','2040')=0.01; +RELATION_EQUIVALENCE.scale('OCA_Emission','R11_WEU','2055')=0.1; +EXT.scale('R11_AFR','crude_1','a','2080')=10.0; +ACT.scale('R11_LAM','loil_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_WEU','crude_7','a','2045')=100.0; +ACT.scale('R11_EEU','elec_t_d','2050','2110','M1','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2070')=10.0; +LAND.scale('R11_AFR','BIO05GHG3000','2070')=0.1; +EXT.scale('R11_FSU','gas_5','a','2090')=10.0; +ACT.scale('R11_EEU','eth_ic_trp','2045','2045','M1','year')=10.0; +LAND.scale('R11_FSU','BIO06GHG1000','2110')=0.1; +ACT.scale('R11_MEA','meth_coal','2055','2070','M1','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2040','2040','M1','year')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2070')=0.01; +CAP_NEW.scale('R11_AFR','mvac_co2','2050')=0.01; +ACT.scale('R11_MEA','oil_extr_4','2110','2110','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG400','2080')=0.1; +ACT.scale('R11_CPA','oil_extr_3_ch4','2045','2050','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_MEA','h2_coal','2080','2090','M1','year')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2090')=0.01; +ACT.scale('R11_EEU','foil_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_MEA','gas_1','a','2030')=100.0; +EXT.scale('R11_LAM','crude_2','a','2090')=10.0; +LAND.scale('R11_NAM','BIO06GHG000','2070')=0.1; +EXT.scale('R11_MEA','crude_4','a','2030')=100.0; +LAND.scale('R11_NAM','BIO05GHG010','2110')=0.1; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2050','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2050','2050','M1','year')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2035')=0.01; +EXT.scale('R11_WEU','crude_2','a','2025')=100.0; +EXT.scale('R11_CPA','crude_6','a','2035')=100.0; +EXT.scale('R11_WEU','lignite','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_7','2050','2050','M1','year')=100.0; +ACT.scale('R11_PAS','foil_trp','2060','2060','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG1500','2080')=0.1; +LAND.scale('R11_LAM','BIO06GHG000','2050')=0.1; +EXT.scale('R11_SAS','crude_6','a','2110')=10.0; +EXT.scale('R11_LAM','crude_7','a','2060')=100.0; +ACT.scale('R11_AFR','coal_gas','2040','2045','M1','year')=100.0; +EXT.scale('R11_CPA','crude_2','a','2100')=10.0; +EXT.scale('R11_MEA','coal','a','2055')=100.0; +ACT.scale('R11_PAO','foil_trp','2110','2110','M1','year')=10.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_WEU','gas_1','a','2050')=100.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2090')=0.01; +ACT.scale('R11_PAO','meth_coal','2045','2070','M1','year')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2030','2030','M1','year')=100.0; +EXT.scale('R11_PAO','crude_5','a','2080')=10.0; +EXT.scale('R11_PAS','crude_6','a','2055')=100.0; +EXT.scale('R11_MEA','gas_1','a','2050')=100.0; +EXT.scale('R11_CPA','coal','a','2055')=100.0; +LAND.scale('R11_NAM','BIO05GHG020','2100')=0.1; +ACT.scale('R11_PAS','meth_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2055')=100.0; +EXT.scale('R11_FSU','gas_4','a','2080')=10.0; +EXT.scale('R11_PAS','gas_4','a','2110')=10.0; +ACT.scale('R11_AFR','syn_liq','2040','2045','M1','year')=100.0; +EXT.scale('R11_PAS','gas_5','a','2025')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2070','2070','M1','year')=100.0; +EXT.scale('R11_EEU','coal','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2070','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG3000','2090')=0.1; +EXT.scale('R11_LAM','gas_4','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal','2040','2060','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2045','2050','M1','year')=100.0; +ACT.scale('R11_EEU','recycling_gas1','2100','2100','M1','year')=0.01; +LAND.scale('R11_LAM','BIO05GHG1000','2070')=0.1; +ACT.scale('R11_MEA','meth_coal','2070','2090','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2070')=10.0; +EXT.scale('R11_FSU','gas_5','a','2070')=10.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2045','2070','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG600','2070')=0.1; +EXT.scale('R11_SAS','lignite','a','2025')=100.0; +EXT.scale('R11_SAS','gas_4','a','2055')=100.0; +ACT.scale('R11_PAO','h2_coal','2050','2060','M1','year')=100.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2035')=0.01; +EXT.scale('R11_CPA','gas_6','a','2060')=100.0; +EXT.scale('R11_PAS','crude_7','a','2055')=100.0; +LAND.scale('R11_AFR','BIO06GHG600','2100')=0.1; +CAP_NEW.scale('R11_PAS','mvac_co2','2110')=0.01; +EXT.scale('R11_EEU','gas_6','a','2070')=10.0; +EXT.scale('R11_AFR','gas_5','a','2055')=100.0; +EXT.scale('R11_NAM','lignite','a','2080')=10.0; +EXT.scale('R11_AFR','lignite','a','2040')=100.0; +EXT.scale('R11_MEA','crude_6','a','2035')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2030','2045','M1','year')=100.0; +EXT.scale('R11_FSU','gas_5','a','2100')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2080','2090','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2030','2040','M1','year')=100.0; +EXT.scale('R11_PAS','crude_4','a','2100')=10.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2080')=0.01; +ACT.scale('R11_PAO','syn_liq_ccs','2060','2080','M1','year')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2060','2060','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2035','2035','M1','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2070')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2080','2080','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2025')=100.0; +ACT.scale('R11_PAO','syn_liq','2035','2055','M1','year')=100.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2045','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2080','2080','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2040','2045','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG100','2090')=0.1; +LAND.scale('R11_AFR','BIO06GHG600','2050')=0.1; +CAP_NEW.scale('R11_LAM','mvac_co2','2045')=0.01; +EXT.scale('R11_FSU','gas_1','a','2110')=10.0; +ACT.scale('R11_EEU','elec_t_d','2025','2080','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG010','2060')=0.1; +EXT.scale('R11_PAO','crude_7','a','2035')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2090','2110','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2055','2060','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2035','2035','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG200','2090')=0.1; +EXT.scale('R11_NAM','crude_6','a','2060')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2055','2055','M1','year')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2045')=100.0; +EXT.scale('R11_SAS','gas_4','a','2090')=10.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2060')=100.0; +LAND.scale('R11_NAM','BIO06GHG400','2070')=0.1; +ACT.scale('R11_CPA','oil_extr_7','2050','2055','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG400','2050')=0.1; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2030')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2070','2090','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG020','2080')=0.1; +ACT.scale('R11_LAM','h2_coal','2030','2040','M1','year')=10.0; +EXT.scale('R11_NAM','gas_1','a','2100')=10.0; +EXT.scale('R11_PAO','crude_4','a','2070')=10.0; +EXT.scale('R11_WEU','gas_4','a','2055')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2045','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG050','2090')=0.1; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_PAO','crude_1','a','2080')=10.0; +ACT.scale('R11_AFR','meth_coal','2025','2030','M1','year')=100.0; +EXT.scale('R11_PAO','gas_5','a','2025')=100.0; +LAND.scale('R11_NAM','BIO05GHG1500','2100')=0.1; +EXT.scale('R11_CPA','gas_6','a','2035')=100.0; +EXT.scale('R11_AFR','crude_6','a','2025')=100.0; +ACT.scale('R11_EEU','loil_trp','2055','2055','M1','year')=10.0; +EXT.scale('R11_AFR','crude_2','a','2025')=100.0; +LAND.scale('R11_AFR','BIO05GHG3000','2100')=0.1; +CAP_NEW.scale('R11_FSU','mvac_co2','2090')=0.01; +ACT.scale('R11_LAM','h2_coal','2015','2025','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG600','2055')=0.1; +CAP_NEW.scale('R11_EEU','mvac_co2','2100')=0.01; +EXT.scale('R11_MEA','crude_1','a','2040')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2050','2055','M1','year')=100.0; +EXT.scale('R11_NAM','coal','a','2070')=10.0; +EXT.scale('R11_MEA','gas_1','a','2055')=100.0; +EXT.scale('R11_AFR','crude_5','a','2080')=10.0; +ACT.scale('R11_AFR','meth_coal','2035','2035','M1','year')=100.0; +EXT.scale('R11_SAS','crude_1','a','2040')=100.0; +EXT.scale('R11_SAS','gas_1','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2050','2055','M1','year')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_MEA','oil_extr_3_ch4','2100','2100','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2045','2050','M1','year')=100.0; +EXT.scale('R11_WEU','lignite','a','2110')=10.0; +EXT.scale('R11_PAO','lignite','a','2050')=100.0; +EXT.scale('R11_PAO','gas_4','a','2025')=100.0; +EXT.scale('R11_SAS','coal','a','2045')=100.0; +ACT.scale('R11_LAM','syn_liq','2035','2035','M1','year')=10.0; +ACT.scale('R11_LAM','meth_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2045','2045','M1','year')=100.0; +EXT.scale('R11_SAS','gas_3','a','2060')=100.0; +EXT.scale('R11_NAM','gas_1','a','2110')=10.0; +EXT.scale('R11_LAM','crude_6','a','2070')=10.0; +ACT.scale('R11_LAM','foil_trp','2055','2055','M1','year')=10.0; +EXT.scale('R11_MEA','gas_4','a','2045')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_WEU','crude_4','a','2100')=10.0; +ACT.scale('R11_PAO','foil_trp','2070','2070','M1','year')=10.0; +ACT.scale('R11_LAM','syn_liq','2020','2035','M1','year')=10.0; +ACT.scale('R11_AFR','syn_liq','2020','2030','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG200','2100')=0.1; +EXT.scale('R11_SAS','crude_3','a','2090')=10.0; +LAND.scale('R11_AFR','BIO05GHG600','2100')=0.1; +EXT.scale('R11_LAM','coal','a','2070')=10.0; +EXT.scale('R11_WEU','crude_6','a','2110')=10.0; +EXT.scale('R11_SAS','gas_6','a','2100')=10.0; +EXT.scale('R11_AFR','crude_5','a','2025')=100.0; +ACT.scale('R11_PAS','loil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_SAS','coal','a','2055')=100.0; +EXT.scale('R11_LAM','crude_1','a','2060')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2060','2070','M1','year')=100.0; +EXT.scale('R11_AFR','crude_6','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2030','2030','M1','year')=100.0; +ACT.scale('R11_MEA','h2_fc_trp','2090','2090','M1','year')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2055','2060','M1','year')=0.01; +ACT.scale('R11_PAO','syn_liq','2025','2045','M1','year')=100.0; +ACT_LO.scale('R11_LAM','gas_cc','2090','year')=0.01; +ACT.scale('R11_LAM','h2_coal_ccs','2040','2045','M1','year')=10.0; +EXT.scale('R11_NAM','gas_3','a','2070')=10.0; +EXT.scale('R11_SAS','gas_6','a','2025')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2035','2045','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2050')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_PAS','crude_3','a','2025')=100.0; +EXT.scale('R11_CPA','gas_2','a','2035')=100.0; +ACT.scale('R11_MEA','h2_coal','2070','2090','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG3000','2090')=0.1; +EXT.scale('R11_PAS','crude_7','a','2060')=100.0; +ACT.scale('R11_EEU','elec_t_d','2040','2080','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc_ccs','2090','2110','M1','year')=0.1; +EXT.scale('R11_SAS','gas_1','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2110')=0.1; +EXT.scale('R11_FSU','gas_1','a','2080')=10.0; +EXT.scale('R11_PAO','crude_7','a','2030')=100.0; +ACT.scale('R11_PAO','loil_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_EEU','recycling_gas1','2080','2080','M1','year')=0.01; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2035')=100.0; +LAND.scale('R11_SAS','BIO05GHG3000','2110')=0.1; +ACT.scale('R11_LAM','meth_ic_trp','2040','2040','M1','year')=10.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_4','2100','2100','M1','year')=100.0; +EXT.scale('R11_SAS','gas_6','a','2090')=10.0; +EXT.scale('R11_EEU','crude_2','a','2045')=100.0; +EXT.scale('R11_EEU','gas_3','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2035','2040','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2050')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2050')=0.01; +EXT.scale('R11_SAS','gas_3','a','2030')=100.0; +EXT.scale('R11_AFR','lignite','a','2055')=100.0; +EXT.scale('R11_FSU','crude_4','a','2055')=100.0; +LAND.scale('R11_AFR','BIO05GHG1000','2080')=0.1; +ACT.scale('R11_CPA','oil_extr_6','2050','2055','M1','year')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2060','2060','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG050','2090')=0.1; +ACT.scale('R11_PAO','coal_gas','2025','2035','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2070','2090','M1','year')=100.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2030','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAS','meth_ic_trp','2055','2055','M1','year')=10.0; +LAND.scale('R11_NAM','BIO06GHG600','2060')=0.1; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_WEU','crude_3','a','2030')=100.0; +EXT.scale('R11_WEU','gas_2','a','2035')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2055','2055','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG2000','2070')=0.1; +LAND.scale('R11_NAM','BIO06GHG100','2080')=0.1; +LAND.scale('R11_AFR','BIO05GHG400','2110')=0.1; +EXT.scale('R11_WEU','crude_7','a','2100')=10.0; +EXT.scale('R11_MEA','crude_7','a','2090')=10.0; +EXT.scale('R11_SAS','gas_4','a','2035')=100.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2025','year')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_NAM','crude_5','a','2090')=10.0; +ACT.scale('R11_WEU','eth_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_NAM','crude_2','a','2030')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2110')=0.1; +LAND.scale('R11_NAM','BIO06GHG020','2110')=0.1; +ACT.scale('R11_PAO','eth_ic_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_EEU','gas_5','a','2040')=100.0; +EXT.scale('R11_SAS','crude_1','a','2080')=10.0; +EXT.scale('R11_FSU','crude_7','a','2050')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2045','2070','M1','year')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2080','2080','M1','year')=0.01; +ACT.scale('R11_AFR','h2_coal_ccs','2055','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2045','2045','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2090','2100','M1','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_WEU','coal','a','2090')=10.0; +LAND.scale('R11_CPA','BIO06GHG000','2090')=0.1; +EXT.scale('R11_MEA','crude_7','a','2110')=10.0; +EXT.scale('R11_NAM','gas_2','a','2110')=10.0; +EXT.scale('R11_WEU','gas_4','a','2040')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2080','2090','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2025','2025','M1','year')=100.0; +EXT.scale('R11_PAO','crude_1','a','2055')=100.0; +EXT.scale('R11_EEU','gas_6','a','2055')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_EEU','gas_2','a','2100')=10.0; +EXT.scale('R11_WEU','crude_3','a','2100')=10.0; +ACT.scale('R11_LAM','foil_trp','2035','2035','M1','year')=10.0; +EXT.scale('R11_FSU','coal','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG020','2070')=0.1; +EXT.scale('R11_LAM','coal','a','2090')=10.0; +ACT.scale('R11_CPA','oil_extr_1','2090','2090','M1','year')=100.0; +EXT.scale('R11_NAM','gas_4','a','2080')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2070','2090','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2030','2030','M1','year')=100.0; +EXT.scale('R11_SAS','coal','a','2070')=10.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2045','2055','M1','year')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2080','year')=100.0; +ACT.scale('R11_AFR','eth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal','2080','2080','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc','2050','2060','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG1500','2110')=0.1; +EXT.scale('R11_EEU','crude_1','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal','2060','2060','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2060','2060','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2030','2035','M1','year')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2050')=0.01; +EXT.scale('R11_FSU','gas_6','a','2025')=100.0; +EXT.scale('R11_CPA','crude_5','a','2045')=100.0; +ACT.scale('R11_PAO','h2_coal','2060','2080','M1','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_CPA','gas_4','a','2050')=100.0; +EXT.scale('R11_MEA','crude_5','a','2055')=100.0; +ACT.scale('R11_AFR','coal_gas','2040','2060','M1','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2055')=100.0; +ACT.scale('R11_LAM','foil_trp','2050','2050','M1','year')=10.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2030')=0.01; +ACT.scale('R11_PAO','eth_fc_trp','2045','2045','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2035','2035','M1','year')=100.0; +EXT.scale('R11_PAO','coal','a','2030')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2060','2070','M1','year')=100.0; +EXT.scale('R11_PAO','coal','a','2090')=10.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2025','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2070')=0.1; +ACT.scale('R11_EEU','loil_trp','2070','2070','M1','year')=10.0; +LAND.scale('R11_LAM','BIO05GHG400','2100')=0.1; +LAND.scale('R11_LAM','BIO06GHG200','2055')=0.1; +EXT.scale('R11_AFR','gas_4','a','2050')=100.0; +ACT.scale('R11_AFR','meth_coal','2055','2070','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc','2100','2110','M1','year')=0.1; +EXT.scale('R11_EEU','crude_5','a','2100')=10.0; +EXT.scale('R11_WEU','gas_4','a','2110')=10.0; +EXT.scale('R11_SAS','crude_1','a','2055')=100.0; +EXT.scale('R11_SAS','crude_6','a','2040')=100.0; +ACT.scale('R11_PAO','h2_coal','2030','2035','M1','year')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2070','year')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2045')=0.01; +EXT.scale('R11_EEU','crude_3','a','2080')=10.0; +EXT.scale('R11_SAS','crude_2','a','2060')=100.0; +EXT.scale('R11_EEU','gas_4','a','2110')=10.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_MEA','gas_2','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2045','2050','M1','year')=100.0; +EXT.scale('R11_NAM','crude_7','a','2045')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2035')=100.0; +ACT.scale('R11_PAO','syn_liq','2045','2055','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG200','2050')=0.1; +EXT.scale('R11_MEA','gas_1','a','2090')=10.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2030')=100.0; +EXT.scale('R11_MEA','coal','a','2050')=100.0; +EXT.scale('R11_LAM','crude_4','a','2055')=100.0; +EXT.scale('R11_PAS','crude_1','a','2050')=100.0; +EXT.scale('R11_MEA','crude_1','a','2090')=10.0; +LAND.scale('R11_LAM','BIO05GHG1500','2080')=0.1; +EXT.scale('R11_EEU','crude_7','a','2080')=10.0; +LAND.scale('R11_LAM','BIO06GHG600','2060')=0.1; +ACT.scale('R11_CPA','oil_extr_7','2070','2070','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2025','2040','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2110')=10.0; +ACT.scale('R11_PAO','meth_coal','2080','2100','M1','year')=100.0; +EXT.scale('R11_PAS','gas_4','a','2055')=100.0; +EXT.scale('R11_AFR','crude_2','a','2090')=10.0; +ACT.scale('R11_AFR','h2_fc_trp','2110','2110','M1','year')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2050')=0.01; +EXT.scale('R11_LAM','crude_2','a','2030')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2040')=0.01; +LAND.scale('R11_AFR','BIO05GHG000','2090')=0.1; +EXT.scale('R11_WEU','crude_2','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2035','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2030','2030','M1','year')=100.0; +EXT.scale('R11_PAO','crude_7','a','2025')=100.0; +ACT.scale('R11_AFR','meth_coal','2020','2025','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc','2055','2060','M1','year')=10.0; +EXT.scale('R11_NAM','crude_5','a','2050')=100.0; +EXT.scale('R11_CPA','gas_6','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2100','2100','M1','year')=100.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_PAS','gas_1','a','2035')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2030','2035','M1','year')=100.0; +EXT.scale('R11_PAO','gas_5','a','2050')=100.0; +EXT.scale('R11_SAS','crude_6','a','2080')=10.0; +EXT.scale('R11_PAO','lignite','a','2080')=10.0; +EXT.scale('R11_MEA','gas_3','a','2035')=100.0; +ACT.scale('R11_AFR','meth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_EEU','crude_6','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2030','2035','M1','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2055','2060','M1','year')=100.0; +EXT.scale('R11_AFR','crude_1','a','2040')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2030','2045','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2020','2025','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG1000','2110')=0.1; +EXT.scale('R11_FSU','gas_5','a','2050')=100.0; +ACT.scale('R11_AFR','coal_gas','2025','2045','M1','year')=100.0; +ACT.scale('R11_PAS','eth_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2050','2050','M1','year')=10.0; +EXT.scale('R11_PAS','crude_3','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2050','2050','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2040','2045','M1','year')=100.0; +EXT.scale('R11_EEU','coal','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2100','2100','M1','year')=100.0; +EXT.scale('R11_SAS','crude_5','a','2035')=100.0; +EXT.scale('R11_MEA','crude_5','a','2035')=100.0; +ACT.scale('R11_AFR','meth_coal','2025','2035','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2050','2050','M1','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2080')=10.0; +EXT.scale('R11_SAS','lignite','a','2055')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_WEU','lignite','a','2055')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2040','2045','M1','year')=100.0; +ACT.scale('R11_LAM','coal_gas','2025','2045','M1','year')=10.0; +EXT.scale('R11_SAS','gas_3','a','2025')=100.0; +ACT.scale('R11_SAS','ref_lol','2015','2025','M1','year')=10.0; +EXT.scale('R11_AFR','crude_1','a','2060')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2050','2050','M1','year')=100.0; +EXT.scale('R11_EEU','gas_1','a','2035')=100.0; +EXT.scale('R11_PAS','crude_6','a','2040')=100.0; +EXT.scale('R11_PAO','coal','a','2110')=10.0; +ACT.scale('R11_WEU','h2_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_LAM','coal_gas','2035','2045','M1','year')=10.0; +EXT.scale('R11_WEU','crude_5','a','2040')=100.0; +LAND.scale('R11_LAM','BIO06GHG020','2080')=0.1; +ACT.scale('R11_PAO','syn_liq','2045','2070','M1','year')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2060')=100.0; +LAND.scale('R11_AFR','BIO06GHG2000','2070')=0.1; +EXT.scale('R11_PAS','crude_2','a','2050')=100.0; +EXT.scale('R11_FSU','lignite','a','2055')=100.0; +EXT.scale('R11_NAM','gas_1','a','2080')=10.0; +LAND.scale('R11_NAM','BIO06GHG050','2110')=0.1; +ACT.scale('R11_MEA','coal_gas','2090','2100','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2055','2055','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2040','2060','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG2000','2055')=0.1; +ACT.scale('R11_CPA','oil_extr_3_ch4','2035','2035','M1','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2060')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2045','2070','M1','year')=100.0; +EXT.scale('R11_CPA','crude_5','a','2025')=100.0; +EXT.scale('R11_WEU','crude_3','a','2060')=100.0; +ACT.scale('R11_LAM','h2_coal','2015','2035','M1','year')=10.0; +EXT.scale('R11_AFR','crude_3','a','2030')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2040','2040','M1','year')=10.0; +EXT.scale('R11_AFR','crude_7','a','2045')=100.0; +ACT.scale('R11_PAO','meth_coal','2040','2040','M1','year')=100.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_PAO','lignite','a','2110')=10.0; +EXT.scale('R11_PAO','crude_5','a','2050')=100.0; +EXT.scale('R11_SAS','gas_6','a','2060')=100.0; +EXT.scale('R11_PAS','coal','a','2070')=10.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_NAM','lignite','a','2030')=100.0; +ACT.scale('R11_PAO','meth_coal','2090','2090','M1','year')=100.0; +EXT.scale('R11_AFR','coal','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2080','2080','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG100','2100')=0.1; +EXT.scale('R11_PAS','crude_4','a','2035')=100.0; +EXT.scale('R11_MEA','crude_7','a','2050')=100.0; +EXT.scale('R11_AFR','gas_2','a','2025')=100.0; +EXT.scale('R11_CPA','gas_4','a','2080')=10.0; +LAND.scale('R11_LAM','BIO05GHG1000','2100')=0.1; +ACT.scale('R11_WEU','h2_fc_trp','2030','2035','M1','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2080')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2030','2030','M1','year')=100.0; +EXT.scale('R11_FSU','crude_1','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2030','2035','M1','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2035')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2050','year')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2070','year')=100.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2020','2025','M1','year')=10.0; +LAND.scale('R11_LAM','BIO05GHG1500','2070')=0.1; +EXT.scale('R11_EEU','crude_6','a','2110')=10.0; +ACT.scale('R11_MEA','coal_gas','2070','2090','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc','2090','2110','M1','year')=0.1; +EXT.scale('R11_CPA','crude_3','a','2110')=10.0; +EXT.scale('R11_CPA','gas_3','a','2100')=10.0; +EXT.scale('R11_WEU','crude_5','a','2090')=10.0; +EXT.scale('R11_MEA','gas_1','a','2025')=100.0; +EXT.scale('R11_SAS','crude_4','a','2080')=10.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2055','year')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2040','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG1500','2110')=0.1; +LAND.scale('R11_FSU','BIO06GHG1000','2100')=0.1; +EXT.scale('R11_LAM','gas_2','a','2040')=100.0; +LAND.scale('R11_NAM','BIO05GHG100','2110')=0.1; +EXT.scale('R11_WEU','gas_4','a','2090')=10.0; +EXT.scale('R11_NAM','lignite','a','2090')=10.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2070')=10.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_CPA','gas_5','a','2090')=10.0; +ACT.scale('R11_AFR','h2_coal','2035','2040','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG020','2110')=0.1; +CAP_NEW.scale('R11_SAS','mvac_co2','2100')=0.01; +EXT.scale('R11_SAS','gas_2','a','2035')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2055','2070','M1','year')=100.0; +EXT.scale('R11_SAS','crude_6','a','2045')=100.0; +EXT.scale('R11_PAO','gas_4','a','2060')=100.0; +EXT.scale('R11_CPA','gas_1','a','2030')=100.0; +EXT.scale('R11_PAS','gas_2','a','2045')=100.0; +EXT.scale('R11_WEU','gas_4','a','2045')=100.0; +EXT.scale('R11_WEU','crude_5','a','2055')=100.0; +EXT.scale('R11_CPA','gas_1','a','2055')=100.0; +EXT.scale('R11_WEU','gas_3','a','2045')=100.0; +EXT.scale('R11_MEA','crude_1','a','2045')=100.0; +ACT.scale('R11_AFR','h2_coal','2040','2050','M1','year')=100.0; +EXT.scale('R11_NAM','crude_7','a','2025')=100.0; +EXT.scale('R11_AFR','crude_1','a','2070')=10.0; +EXT.scale('R11_AFR','crude_1','a','2030')=100.0; +EXT.scale('R11_FSU','crude_6','a','2055')=100.0; +EXT.scale('R11_PAO','gas_3','a','2060')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2070','2070','M1','year')=100.0; +ACT.scale('R11_EEU','SF6_TCE','2090','2090','M1','year')=0.01; +ACT.scale('R11_PAS','eth_fc_trp','2055','2055','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG600','2055')=0.1; +LAND.scale('R11_NAM','BIO06GHG600','2070')=0.1; +LAND.scale('R11_LAM','BIO06GHG100','2080')=0.1; +ACT.scale('R11_PAO','meth_coal_ccs','2050','2070','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2070','2070','M1','year')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2070','2070','M1','year')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2025')=100.0; +ACT.scale('R11_EEU','SF6_TCE','2110','2110','M1','year')=0.01; +LAND.scale('R11_NAM','BIO06GHG2000','2055')=0.1; +EXT.scale('R11_FSU','crude_3','a','2040')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2100','2110','M1','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2050')=100.0; +EXT.scale('R11_LAM','gas_2','a','2100')=10.0; +ACT.scale('R11_MEA','meth_coal','2045','2070','M1','year')=100.0; +EXT.scale('R11_FSU','coal','a','2090')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2035','2040','M1','year')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2080','2100','M1','year')=100.0; +EXT.scale('R11_FSU','lignite','a','2110')=10.0; +ACT.scale('R11_AFR','syn_liq','2040','2060','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2035','2040','M1','year')=10.0; +EXT.scale('R11_PAS','crude_3','a','2070')=10.0; +EXT.scale('R11_AFR','lignite','a','2080')=10.0; +EXT.scale('R11_PAO','gas_4','a','2100')=10.0; +ACT.scale('R11_AFR','meth_coal_ccs','2050','2060','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2055','2060','M1','year')=100.0; +ACT.scale('R11_FSU','h2_fc_trp','2100','2100','M1','year')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2090','2090','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG000','2100')=0.1; +EXT.scale('R11_MEA','crude_3','a','2045')=100.0; +ACT.scale('R11_LAM','coal_gas','2025','2030','M1','year')=10.0; +EXT.scale('R11_NAM','crude_2','a','2090')=10.0; +ACT.scale('R11_MEA','h2_coal','2080','2100','M1','year')=100.0; +EXT.scale('R11_EEU','gas_6','a','2030')=100.0; +LAND.scale('R11_LAM','BIO05GHG2000','2100')=0.1; +EXT.scale('R11_LAM','gas_4','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2040','2045','M1','year')=100.0; +EXT.scale('R11_MEA','gas_3','a','2080')=10.0; +LAND.scale('R11_NAM','BIO05GHG400','2110')=0.1; +EXT.scale('R11_FSU','coal','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2050','2055','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq','2060','2070','M1','year')=100.0; +EXT.scale('R11_PAO','crude_6','a','2055')=100.0; +EXT.scale('R11_LAM','gas_4','a','2070')=10.0; +EXT.scale('R11_CPA','crude_7','a','2070')=10.0; +ACT.scale('R11_EEU','leak_repairsf6','2100','2100','M1','year')=0.01; +EXT.scale('R11_PAS','gas_6','a','2100')=10.0; +EXT.scale('R11_WEU','crude_2','a','2100')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2040','2045','M1','year')=100.0; +EXT.scale('R11_EEU','gas_4','a','2055')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_WEU','eth_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_PAS','gas_4','a','2025')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2060','2070','M1','year')=100.0; +EXT.scale('R11_MEA','crude_5','a','2070')=10.0; +ACT.scale('R11_PAO','h2_coal','2035','2040','M1','year')=100.0; +EXT.scale('R11_PAS','gas_3','a','2060')=100.0; +ACT.scale('R11_PAO','h2_coal','2045','2055','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2055','2055','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2035','2035','M1','year')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2090','2090','M1','year')=100.0; +EXT.scale('R11_AFR','crude_4','a','2070')=10.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2020','2030','M1','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2060')=100.0; +EXT.scale('R11_PAS','crude_2','a','2090')=10.0; +EXT.scale('R11_AFR','crude_5','a','2110')=10.0; +LAND.scale('R11_NAM','BIO05GHG050','2100')=0.1; +ACT.scale('R11_MEA','h2_coal_ccs','2060','2070','M1','year')=100.0; +EXT.scale('R11_SAS','crude_4','a','2025')=100.0; +EXT.scale('R11_AFR','coal','a','2090')=10.0; +EXT.scale('R11_SAS','gas_3','a','2055')=100.0; +ACT.scale('R11_AFR','meth_coal','2025','2025','M1','year')=100.0; +EXT.scale('R11_PAO','crude_1','a','2025')=100.0; +ACT.scale('R11_EEU','elec_t_d','2090','2100','M1','year')=100.0; +EXT.scale('R11_WEU','lignite','a','2040')=100.0; +ACT.scale('R11_AFR','syn_liq','2030','2045','M1','year')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2045','2045','M1','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_MEA','coal_gas','2080','2090','M1','year')=100.0; +EXT.scale('R11_LAM','crude_6','a','2100')=10.0; +ACT.scale('R11_PAS','foil_trp','2050','2050','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_5','2080','2080','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2030','2040','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG2000','2100')=0.1; +EXT.scale('R11_NAM','crude_7','a','2070')=10.0; +ACT.scale('R11_PAO','eth_ic_trp','2080','2080','M1','year')=10.0; +LAND.scale('R11_AFR','BIO05GHG1500','2100')=0.1; +EXT.scale('R11_PAS','gas_4','a','2045')=100.0; +EXT.scale('R11_CPA','gas_4','a','2060')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2050','2070','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2035','2050','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2055')=0.1; +EXT.scale('R11_PAS','gas_3','a','2035')=100.0; +EXT.scale('R11_FSU','gas_3','a','2070')=10.0; +EXT.scale('R11_PAS','gas_1','a','2070')=10.0; +ACT.scale('R11_AFR','syn_liq','2040','2050','M1','year')=100.0; +EXT.scale('R11_PAO','crude_4','a','2035')=100.0; +ACT.scale('R11_PAO','h2_coal','2055','2080','M1','year')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2060','2070','M1','year')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2090')=0.01; +LAND.scale('R11_CPA','BIO06GHG1000','2080')=0.1; +ACT.scale('R11_MEA','meth_coal_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_WEU','gas_3','a','2055')=100.0; +EXT.scale('R11_AFR','coal','a','2045')=100.0; +EXT.scale('R11_PAO','gas_2','a','2035')=100.0; +EXT.scale('R11_SAS','gas_4','a','2110')=10.0; +EXT.scale('R11_CPA','crude_6','a','2050')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2035','2035','M1','year')=100.0; +EXT.scale('R11_WEU','crude_1','a','2030')=100.0; +LAND.scale('R11_LAM','BIO06GHG010','2110')=0.1; +ACT.scale('R11_PAO','h2_fc_trp','2045','2050','M1','year')=100.0; +ACT.scale('R11_EEU','loil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_FSU','crude_7','a','2035')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_PAS','gas_2','a','2050')=100.0; +ACT.scale('R11_PAO','coal_gas','2070','2080','M1','year')=100.0; +LAND.scale('R11_FSU','BIO06GHG1500','2100')=0.1; +ACT.scale('R11_PAO','h2_coal','2035','2050','M1','year')=100.0; +EXT.scale('R11_PAS','lignite','a','2070')=10.0; +ACT.scale('R11_AFR','h2_coal','2025','2030','M1','year')=100.0; +EXT.scale('R11_WEU','gas_4','a','2100')=10.0; +ACT.scale('R11_CPA','oil_extr_4','2045','2050','M1','year')=100.0; +EXT.scale('R11_PAO','crude_2','a','2070')=10.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_MEA','oil_extr_5','2100','2100','M1','year')=100.0; +EXT.scale('R11_MEA','crude_7','a','2070')=10.0; +EXT.scale('R11_CPA','coal','a','2030')=100.0; +EXT.scale('R11_NAM','crude_2','a','2110')=10.0; +EXT.scale('R11_WEU','crude_2','a','2040')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2055','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG1000','2050')=0.1; +LAND.scale('R11_SAS','BIO06GHG1500','2090')=0.01; +LAND.scale('R11_NAM','BIO06GHG010','2100')=0.1; +ACT.scale('R11_PAO','h2_coal','2055','2070','M1','year')=100.0; +EXT.scale('R11_PAS','gas_5','a','2100')=10.0; +EXT.scale('R11_PAO','gas_6','a','2035')=100.0; +ACT.scale('R11_PAO','h2_coal','2025','2025','M1','year')=100.0; +EXT.scale('R11_LAM','gas_4','a','2090')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2080','2080','M1','year')=100.0; +EXT.scale('R11_WEU','gas_2','a','2045')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2060','2060','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2035','2040','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG000','2070')=0.1; +EXT.scale('R11_WEU','gas_3','a','2100')=10.0; +EXT.scale('R11_PAO','lignite','a','2055')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2070')=0.01; +EXT.scale('R11_CPA','gas_3','a','2080')=10.0; +EXT.scale('R11_EEU','lignite','a','2090')=10.0; +LAND.scale('R11_AFR','BIO06GHG600','2090')=0.1; +ACT.scale('R11_LAM','eth_fc_trp','2040','2040','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG3000','2110')=0.1; +LAND.scale('R11_NAM','BIO06GHG600','2110')=0.1; +ACT.scale('R11_LAM','syn_liq','2025','2030','M1','year')=10.0; +EXT.scale('R11_PAS','crude_7','a','2030')=100.0; +EXT.scale('R11_PAO','gas_2','a','2055')=100.0; +EXT.scale('R11_AFR','crude_5','a','2090')=10.0; +EXT.scale('R11_CPA','gas_6','a','2100')=10.0; +LAND.scale('R11_AFR','BIO05GHG000','2100')=0.1; +EXT.scale('R11_CPA','crude_3','a','2090')=10.0; +ACT.scale('R11_PAO','syn_liq','2020','2035','M1','year')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2045','year')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2090','2090','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2040','2055','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG000','2090')=0.1; +ACT.scale('R11_EEU','foil_trp','2035','2035','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2055','2060','M1','year')=100.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2035')=0.01; +EXT.scale('R11_EEU','gas_4','a','2080')=10.0; +ACT.scale('R11_WEU','foil_trp','2100','2100','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG000','2080')=0.1; +EXT.scale('R11_SAS','gas_5','a','2080')=10.0; +ACT.scale('R11_EEU','elec_t_d','2050','2070','M1','year')=100.0; +EXT.scale('R11_SAS','crude_6','a','2050')=100.0; +EXT.scale('R11_FSU','coal','a','2040')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2055')=100.0; +EXT.scale('R11_WEU','gas_1','a','2100')=10.0; +EXT.scale('R11_MEA','gas_4','a','2040')=100.0; +EXT.scale('R11_PAO','crude_4','a','2025')=100.0; +LAND.scale('R11_LAM','BIO06GHG010','2090')=0.1; +ACT.scale('R11_AFR','meth_coal','2025','2040','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2070')=10.0; +EXT.scale('R11_CPA','crude_7','a','2055')=100.0; +EXT.scale('R11_NAM','coal','a','2060')=100.0; +ACT.scale('R11_AFR','h2_coal','2050','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_3','a','2050')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2090','2090','M1','year')=0.01; +EXT.scale('R11_WEU','crude_6','a','2080')=10.0; +EXT.scale('R11_MEA','gas_5','a','2090')=10.0; +LAND.scale('R11_CPA','BIO06GHG1500','2100')=0.1; +EXT.scale('R11_AFR','gas_6','a','2080')=10.0; +EXT.scale('R11_AFR','crude_6','a','2040')=100.0; +EXT.scale('R11_WEU','crude_3','a','2055')=100.0; +EXT.scale('R11_FSU','gas_4','a','2110')=10.0; +LAND.scale('R11_LAM','BIO05GHG400','2110')=0.1; +EXT.scale('R11_CPA','crude_1','a','2110')=10.0; +EXT.scale('R11_CPA','gas_4','a','2025')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_MEA','coal','a','2070')=10.0; +EXT.scale('R11_CPA','crude_6','a','2090')=10.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_NAM','gas_2','a','2100')=10.0; +ACT.scale('R11_AFR','meth_coal_ccs','2035','2035','M1','year')=100.0; +EXT.scale('R11_AFR','gas_4','a','2100')=10.0; +LAND.scale('R11_CPA','BIO06GHG050','2110')=0.1; +LAND.scale('R11_LAM','BIO06GHG600','2100')=0.1; +ACT.scale('R11_AFR','coal_gas','2010','2030','M1','year')=100.0; +EXT.scale('R11_CPA','gas_4','a','2045')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2050','2055','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2045','2060','M1','year')=100.0; +EXT.scale('R11_PAS','crude_5','a','2025')=100.0; +EXT.scale('R11_AFR','crude_2','a','2100')=10.0; +EXT.scale('R11_LAM','crude_3','a','2035')=100.0; +EXT.scale('R11_WEU','crude_4','a','2055')=100.0; +EXT.scale('R11_PAO','crude_3','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_5','2025','2030','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1500','2055')=0.1; +ACT.scale('R11_PAO','meth_coal_ccs','2110','2110','M1','year')=100.0; +EXT.scale('R11_PAO','crude_2','a','2060')=100.0; +EXT.scale('R11_PAO','crude_7','a','2070')=10.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2080','2080','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal','2025','2030','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_4','2025','2025','M1','year')=100.0; +ACT.scale('R11_EEU','loil_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_PAO','gas_1','a','2045')=100.0; +ACT.scale('R11_LAM','coal_gas','2025','2025','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG200','2090')=0.1; +EXT.scale('R11_MEA','crude_2','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2040','2040','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG000','2080')=0.1; +ACT.scale('R11_PAO','h2_fc_trp','2070','2070','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG100','2055')=0.1; +ACT.scale('R11_CPA','oil_extr_3','2020','2025','M1','year')=100.0; +EXT.scale('R11_PAS','crude_5','a','2110')=10.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2045')=0.01; +ACT.scale('R11_LAM','coal_gas','2020','2030','M1','year')=10.0; +ACT.scale('R11_LAM','eth_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_MEA','crude_2','a','2100')=10.0; +EXT.scale('R11_NAM','crude_2','a','2080')=10.0; +EXT.scale('R11_SAS','crude_2','a','2040')=100.0; +EXT.scale('R11_CPA','crude_3','a','2070')=10.0; +ACT.scale('R11_MEA','meth_coal_ccs','2060','2080','M1','year')=100.0; +ACT.scale('R11_MEA','coal_gas','2070','2070','M1','year')=100.0; +EXT.scale('R11_PAS','crude_1','a','2030')=100.0; +ACT.scale('R11_AFR','h2_coal','2045','2070','M1','year')=100.0; +EXT.scale('R11_LAM','coal','a','2080')=10.0; +EXT.scale('R11_PAS','gas_2','a','2090')=10.0; +EXT.scale('R11_NAM','gas_5','a','2070')=10.0; +EXT.scale('R11_EEU','crude_2','a','2070')=10.0; +EXT.scale('R11_PAO','gas_3','a','2070')=10.0; +EXT.scale('R11_AFR','crude_2','a','2070')=10.0; +EXT.scale('R11_LAM','crude_3','a','2040')=100.0; +EXT.scale('R11_FSU','crude_3','a','2025')=100.0; +EXT.scale('R11_LAM','crude_4','a','2030')=100.0; +ACT.scale('R11_AFR','h2_coal','2045','2055','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2100','2100','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2030','2030','M1','year')=10.0; +LAND.scale('R11_LAM','BIO05GHG1500','2090')=0.1; +EXT.scale('R11_CPA','crude_1','a','2040')=100.0; +ACT.scale('R11_AFR','syn_liq','2030','2030','M1','year')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2030')=100.0; +EXT.scale('R11_PAS','gas_5','a','2080')=10.0; +LAND.scale('R11_LAM','BIO05GHG1500','2100')=0.1; +EXT.scale('R11_PAS','gas_5','a','2035')=100.0; +LAND.scale('R11_AFR','BIO05GHG400','2090')=0.1; +ACT.scale('R11_CPA','oil_extr_4_ch4','2045','2045','M1','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2040')=100.0; +EXT.scale('R11_LAM','crude_7','a','2025')=100.0; +EXT.scale('R11_MEA','gas_4','a','2030')=100.0; +EXT.scale('R11_CPA','crude_4','a','2100')=10.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_AFR','gas_6','a','2035')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2060','2080','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2025','2025','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG1000','2060')=0.1; +EXT.scale('R11_FSU','gas_6','a','2100')=10.0; +ACT.scale('R11_PAO','meth_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2040','2060','M1','year')=100.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2060')=0.01; +EXT.scale('R11_PAO','crude_3','a','2060')=100.0; +EXT.scale('R11_CPA','crude_3','a','2025')=100.0; +EXT.scale('R11_AFR','gas_5','a','2040')=100.0; +EXT.scale('R11_WEU','gas_4','a','2035')=100.0; +EXT.scale('R11_CPA','crude_7','a','2110')=10.0; +EXT.scale('R11_NAM','gas_4','a','2035')=100.0; +LAND.scale('R11_LAM','BIO06GHG100','2050')=0.1; +EXT.scale('R11_WEU','crude_3','a','2040')=100.0; +ACT.scale('R11_AFR','meth_coal','2020','2035','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2020','2025','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_6','2110','2110','M1','year')=100.0; +EXT.scale('R11_FSU','gas_3','a','2110')=10.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2045','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2080','2080','M1','year')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2045','2045','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2055','2055','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_5','2035','2035','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG010','2110')=0.1; +EXT.scale('R11_CPA','gas_3','a','2070')=10.0; +EXT.scale('R11_NAM','gas_2','a','2045')=100.0; +EXT.scale('R11_SAS','crude_5','a','2080')=10.0; +EXT.scale('R11_SAS','crude_5','a','2040')=100.0; +EXT.scale('R11_NAM','crude_7','a','2050')=100.0; +EXT.scale('R11_CPA','crude_6','a','2040')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2025','2025','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG200','2070')=0.1; +EXT.scale('R11_SAS','gas_4','a','2100')=10.0; +LAND.scale('R11_AFR','BIO06GHG1500','2090')=0.1; +ACT.scale('R11_AFR','meth_coal','2030','2035','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal_ccs','2030','2030','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2025','2025','M1','year')=100.0; +EXT.scale('R11_AFR','crude_7','a','2080')=10.0; +ACT.scale('R11_PAO','syn_liq','2090','2100','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2010','2025','M1','year')=100.0; +ACT.scale('R11_LAM','coal_gas','2035','2040','M1','year')=10.0; +EXT.scale('R11_MEA','crude_5','a','2110')=10.0; +EXT.scale('R11_CPA','crude_2','a','2035')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2045','2070','M1','year')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_WEU','eth_fc_trp','2060','2060','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG2000','2100')=0.1; +EXT.scale('R11_AFR','gas_5','a','2030')=100.0; +EXT.scale('R11_SAS','crude_2','a','2055')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2035','2035','M1','year')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2060')=0.01; +EXT.scale('R11_SAS','gas_2','a','2060')=100.0; +EXT.scale('R11_NAM','coal','a','2030')=100.0; +EXT.scale('R11_WEU','lignite','a','2070')=10.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_FSU','crude_6','a','2110')=10.0; +EXT.scale('R11_MEA','gas_5','a','2025')=100.0; +EXT.scale('R11_EEU','gas_2','a','2050')=100.0; +EXT.scale('R11_AFR','crude_3','a','2045')=100.0; +EXT.scale('R11_LAM','crude_1','a','2040')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2110')=0.01; +LAND.scale('R11_LAM','BIO06GHG050','2080')=0.1; +ACT.scale('R11_AFR','h2_coal_ccs','2040','2060','M1','year')=100.0; +EXT.scale('R11_EEU','gas_4','a','2045')=100.0; +EXT.scale('R11_NAM','crude_4','a','2060')=100.0; +ACT.scale('R11_MEA','syn_liq','2080','2100','M1','year')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2025','year')=100.0; +LAND.scale('R11_SAS','BIO06GHG2000','2110')=0.01; +EXT.scale('R11_WEU','crude_2','a','2050')=100.0; +EXT.scale('R11_FSU','gas_5','a','2080')=10.0; +EXT.scale('R11_NAM','gas_1','a','2030')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2055','2055','M1','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2055')=100.0; +EXT.scale('R11_CPA','crude_5','a','2110')=10.0; +ACT.scale('R11_PAS','meth_ic_trp','2070','2070','M1','year')=10.0; +EXT.scale('R11_PAS','gas_2','a','2030')=100.0; +ACT.scale('R11_WEU','eth_ic_trp','2110','2110','M1','year')=10.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2040','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2035','year')=100.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_PAO','coal','a','2045')=100.0; +ACT.scale('R11_AFR','syn_liq','2025','2045','M1','year')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2055')=100.0; +EXT.scale('R11_PAS','crude_2','a','2070')=10.0; +ACT.scale('R11_LAM','foil_trp','2025','2025','M1','year')=10.0; +EXT.scale('R11_AFR','gas_1','a','2050')=100.0; +EXT.scale('R11_SAS','gas_2','a','2040')=100.0; +ACT.scale('R11_MEA','oil_extr_2','2100','2100','M1','year')=100.0; +EXT.scale('R11_LAM','crude_7','a','2110')=10.0; +EXT.scale('R11_AFR','crude_5','a','2035')=100.0; +EXT.scale('R11_FSU','crude_1','a','2055')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_AFR','crude_1','a','2100')=10.0; +LAND.scale('R11_AFR','BIO06GHG200','2080')=0.1; +ACT.scale('R11_LAM','loil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_NAM','gas_3','a','2055')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2040','2045','M1','year')=100.0; +ACT.scale('R11_EEU','SF6_TCE','2060','2060','M1','year')=0.01; +ACT.scale('R11_AFR','syn_liq','2055','2060','M1','year')=100.0; +EXT.scale('R11_NAM','gas_3','a','2080')=10.0; +LAND.scale('R11_NAM','BIO06GHG000','2110')=0.1; +ACT.scale('R11_CPA','oil_extr_7','2020','2025','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2050','2050','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG000','2060')=0.1; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_CPA','crude_1','a','2045')=100.0; +EXT.scale('R11_PAS','gas_1','a','2030')=100.0; +EXT.scale('R11_EEU','crude_6','a','2035')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2110','2110','M1','year')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_LAM','loil_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2045','2050','M1','year')=100.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2090','year')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2025','year')=100.0; +EXT.scale('R11_WEU','crude_4','a','2080')=10.0; +EXT.scale('R11_AFR','crude_3','a','2035')=100.0; +EXT.scale('R11_EEU','gas_3','a','2055')=100.0; +EXT.scale('R11_SAS','lignite','a','2110')=10.0; +EXT.scale('R11_SAS','gas_3','a','2045')=100.0; +ACT.scale('R11_PAO','h2_coal','2035','2045','M1','year')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_PAO','gas_6','a','2050')=100.0; +ACT.scale('R11_AFR','coal_gas','2030','2030','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG600','2070')=0.1; +EXT.scale('R11_NAM','coal','a','2055')=100.0; +ACT.scale('R11_MEA','oil_extr_1','2110','2110','M1','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2100')=10.0; +ACT.scale('R11_PAO','coal_gas','2045','2060','M1','year')=100.0; +EXT.scale('R11_FSU','crude_7','a','2025')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2035','2035','M1','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2055')=100.0; +EXT.scale('R11_AFR','crude_7','a','2090')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2045','2050','M1','year')=100.0; +EXT.scale('R11_LAM','gas_1','a','2055')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_EEU','crude_1','a','2045')=100.0; +EXT.scale('R11_AFR','crude_7','a','2110')=10.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_MEA','meth_coal','2055','2080','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2035','2055','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_NAM','lignite','a','2055')=100.0; +ACT.scale('R11_PAS','eth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2110')=10.0; +EXT.scale('R11_MEA','crude_5','a','2100')=10.0; +ACT.scale('R11_EEU','meth_ic_trp','2110','2110','M1','year')=10.0; +EXT.scale('R11_SAS','gas_1','a','2110')=10.0; +ACT.scale('R11_EEU','elec_t_d','2070','2080','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2090')=10.0; +EXT.scale('R11_FSU','crude_5','a','2040')=100.0; +EXT.scale('R11_FSU','crude_4','a','2025')=100.0; +ACT.scale('R11_MEA','meth_coal','2070','2070','M1','year')=100.0; +EXT.scale('R11_LAM','gas_6','a','2045')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2060','2060','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2110')=10.0; +EXT.scale('R11_PAO','coal','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2055','2060','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2055','2060','M1','year')=100.0; +EXT.scale('R11_SAS','gas_4','a','2050')=100.0; +EXT.scale('R11_LAM','gas_5','a','2050')=100.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2040')=100.0; +ACT.scale('R11_PAO','meth_coal','2045','2055','M1','year')=100.0; +EXT.scale('R11_PAS','gas_5','a','2070')=10.0; +LAND.scale('R11_CPA','BIO06GHG010','2110')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2090','2090','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG010','2080')=0.1; +EXT.scale('R11_AFR','gas_6','a','2030')=100.0; +EXT.scale('R11_MEA','crude_2','a','2060')=100.0; +EXT.scale('R11_WEU','gas_5','a','2100')=10.0; +EXT.scale('R11_CPA','crude_1','a','2030')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2070')=0.01; +EXT.scale('R11_MEA','crude_7','a','2040')=100.0; +ACT.scale('R11_PAO','syn_liq','2045','2045','M1','year')=100.0; +EXT.scale('R11_FSU','gas_1','a','2050')=100.0; +LAND.scale('R11_NAM','BIO06GHG3000','2055')=0.1; +ACT.scale('R11_EEU','elec_t_d','2045','2070','M1','year')=100.0; +EXT.scale('R11_WEU','crude_6','a','2025')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2050','2055','M1','year')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2090','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG020','2090')=0.1; +LAND.scale('R11_NAM','BIO06GHG010','2060')=0.1; +EXT.scale('R11_PAS','gas_1','a','2055')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_AFR','lignite','a','2045')=100.0; +ACT.scale('R11_AFR','h2_coal','2040','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2020','2025','M1','year')=100.0; +EXT.scale('R11_EEU','gas_4','a','2025')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2060')=0.01; +EXT.scale('R11_CPA','crude_2','a','2025')=100.0; +EXT.scale('R11_NAM','crude_5','a','2100')=10.0; +ACT.scale('R11_LAM','coal_gas','2030','2045','M1','year')=10.0; +ACT.scale('R11_AFR','syn_liq_ccs','2030','2040','M1','year')=100.0; +EXT.scale('R11_EEU','crude_7','a','2055')=100.0; +EXT.scale('R11_EEU','crude_1','a','2025')=100.0; +EXT.scale('R11_WEU','crude_1','a','2100')=10.0; +ACT_LO.scale('R11_LAM','gas_cc_ccs','2070','year')=0.01; +ACT.scale('R11_PAO','meth_coal','2025','2025','M1','year')=100.0; +EXT.scale('R11_SAS','crude_7','a','2090')=10.0; +LAND.scale('R11_LAM','BIO06GHG3000','2055')=0.1; +EXT.scale('R11_NAM','crude_5','a','2030')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2100','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG1500','2110')=0.1; +ACT.scale('R11_CPA','oil_extr_7','2055','2060','M1','year')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2045')=100.0; +EXT.scale('R11_FSU','crude_6','a','2070')=10.0; +EXT.scale('R11_PAO','crude_6','a','2040')=100.0; +EXT.scale('R11_MEA','gas_3','a','2050')=100.0; +LAND.scale('R11_LAM','BIO06GHG200','2070')=0.1; +EXT.scale('R11_NAM','gas_4','a','2100')=10.0; +EXT.scale('R11_FSU','gas_4','a','2050')=100.0; +EXT.scale('R11_PAS','lignite','a','2045')=100.0; +EXT.scale('R11_NAM','coal','a','2045')=100.0; +LAND.scale('R11_AFR','BIO06GHG1500','2060')=0.1; +EXT.scale('R11_AFR','gas_6','a','2090')=10.0; +ACT.scale('R11_PAO','coal_gas','2040','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_2','a','2040')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2050','2050','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2025','2035','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG000','2100')=0.1; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2050','year')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2035','2040','M1','year')=10.0; +EXT.scale('R11_PAO','gas_2','a','2100')=10.0; +EXT.scale('R11_CPA','coal','a','2050')=100.0; +ACT.scale('R11_AFR','h2_coal','2050','2050','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2010','2030','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2035','2035','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq','2100','2100','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2040','2050','M1','year')=100.0; +EXT.scale('R11_CPA','gas_6','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2060','2060','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2060','2060','M1','year')=100.0; +EXT.scale('R11_FSU','crude_5','a','2025')=100.0; +EXT.scale('R11_FSU','gas_1','a','2045')=100.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2025','year')=100.0; +EXT.scale('R11_NAM','crude_3','a','2100')=10.0; +LAND.scale('R11_LAM','BIO06GHG600','2110')=0.1; +EXT.scale('R11_LAM','crude_3','a','2025')=100.0; +ACT.scale('R11_AFR','coal_gas','2025','2040','M1','year')=100.0; +EXT.scale('R11_LAM','crude_3','a','2090')=10.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2025')=0.01; +EXT.scale('R11_SAS','gas_6','a','2070')=10.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2050')=0.01; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2025','2030','M1','year')=100.0; +ACT.scale('R11_LAM','loil_trp','2045','2045','M1','year')=10.0; +EXT.scale('R11_PAS','crude_3','a','2090')=10.0; +LAND.scale('R11_LAM','BIO06GHG050','2060')=0.1; +ACT.scale('R11_PAS','h2_fc_trp','2070','2070','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG100','2060')=0.1; +ACT.scale('R11_PAS','eth_fc_trp','2030','2030','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG200','2100')=0.1; +ACT.scale('R11_LAM','coal_gas','2020','2035','M1','year')=10.0; +ACT.scale('R11_LAM','loil_trp','2110','2110','M1','year')=10.0; +EXT.scale('R11_SAS','gas_5','a','2035')=100.0; +ACT.scale('R11_EEU','elec_t_d','2040','2090','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2045','2050','M1','year')=100.0; +EXT.scale('R11_PAS','crude_1','a','2090')=10.0; +EXT.scale('R11_MEA','gas_6','a','2035')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2035','2035','M1','year')=10.0; +ACT.scale('R11_SAS','meth_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_NAM','gas_4','a','2025')=100.0; +ACT.scale('R11_LAM','gas_cc_ccs','2100','2110','M1','year')=0.1; +ACT.scale('R11_CPA','oil_extr_6','2060','2070','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_5','2110','2110','M1','year')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_EEU','gas_3','a','2080')=10.0; +ACT.scale('R11_EEU','elec_t_d','2050','2090','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG1000','2080')=0.1; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2080','2080','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2100','2100','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2030','2030','M1','year')=100.0; +EXT.scale('R11_PAO','gas_1','a','2055')=100.0; +LAND.scale('R11_SAS','BIO06GHG1500','2110')=0.01; +ACT.scale('R11_PAO','h2_coal','2015','2030','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2030','2050','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2060','2070','M1','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2060')=100.0; +EXT.scale('R11_LAM','crude_2','a','2060')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2025','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1000','2055')=0.1; +ACT.scale('R11_PAO','meth_coal','2055','2080','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG3000','2080')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2050','2060','M1','year')=100.0; +EXT.scale('R11_EEU','crude_1','a','2050')=100.0; +EXT.scale('R11_CPA','crude_7','a','2090')=10.0; +LAND.scale('R11_AFR','BIO05GHG050','2110')=0.1; +EXT.scale('R11_FSU','crude_1','a','2040')=100.0; +EXT.scale('R11_AFR','gas_2','a','2090')=10.0; +EXT.scale('R11_SAS','crude_7','a','2080')=10.0; +EXT.scale('R11_FSU','gas_6','a','2090')=10.0; +LAND.scale('R11_AFR','BIO06GHG100','2080')=0.1; +EXT.scale('R11_MEA','crude_6','a','2090')=10.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_LAM','gas_6','a','2055')=100.0; +ACT.scale('R11_AFR','coal_gas','2045','2060','M1','year')=100.0; +EXT.scale('R11_NAM','crude_3','a','2050')=100.0; +EXT.scale('R11_NAM','crude_5','a','2025')=100.0; +EXT.scale('R11_WEU','crude_3','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG1000','2060')=0.1; +ACT.scale('R11_LAM','coal_gas','2040','2045','M1','year')=10.0; +EXT.scale('R11_FSU','gas_1','a','2090')=10.0; +ACT.scale('R11_FSU','meth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal','2050','2070','M1','year')=100.0; +EXT.scale('R11_MEA','crude_6','a','2050')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2030','2035','M1','year')=10.0; +EXT.scale('R11_EEU','gas_1','a','2100')=10.0; +ACT.scale('R11_AFR','syn_liq_ccs','2035','2050','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2015','2025','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2055','2070','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2055','2060','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2090','2100','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2090','2090','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2090','2090','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG600','2080')=0.1; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_MEA','gas_2','a','2100')=10.0; +LAND.scale('R11_LAM','BIO06GHG050','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_5','2055','2055','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2070','2110','M1','year')=100.0; +EXT.scale('R11_PAS','crude_5','a','2055')=100.0; +LAND.scale('R11_AFR','BIO05GHG050','2100')=0.1; +LAND.scale('R11_AFR','BIO04GHG3000','2100')=0.1; +EXT.scale('R11_AFR','crude_6','a','2030')=100.0; +EXT.scale('R11_SAS','gas_2','a','2070')=10.0; +EXT.scale('R11_PAS','gas_1','a','2045')=100.0; +ACT.scale('R11_LAM','h2_coal','2010','2030','M1','year')=10.0; +EXT.scale('R11_SAS','lignite','a','2080')=10.0; +EXT.scale('R11_EEU','crude_3','a','2100')=10.0; +ACT.scale('R11_AFR','syn_liq','2035','2045','M1','year')=100.0; +EXT.scale('R11_WEU','coal','a','2035')=100.0; +ACT.scale('R11_PAO','coal_gas','2045','2045','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2090','2090','M1','year')=100.0; +EXT.scale('R11_FSU','lignite','a','2080')=10.0; +ACT.scale('R11_EEU','meth_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_PAO','gas_3','a','2025')=100.0; +EXT.scale('R11_AFR','gas_3','a','2040')=100.0; +EXT.scale('R11_PAS','lignite','a','2100')=10.0; +ACT.scale('R11_EEU','SF6_TCE','2080','2080','M1','year')=0.01; +ACT.scale('R11_EEU','eth_ic_trp','2055','2055','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2035','2040','M1','year')=100.0; +EXT.scale('R11_CPA','crude_7','a','2025')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2050','2050','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG2000','2110')=0.1; +EXT.scale('R11_PAS','gas_2','a','2025')=100.0; +EXT.scale('R11_AFR','gas_2','a','2080')=10.0; +ACT.scale('R11_AFR','coal_gas','2045','2045','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG2000','2110')=0.1; +EXT.scale('R11_MEA','coal','a','2080')=10.0; +EXT.scale('R11_CPA','lignite','a','2045')=100.0; +LAND.scale('R11_CPA','BIO06GHG3000','2080')=0.1; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2050')=100.0; +EXT.scale('R11_CPA','crude_5','a','2070')=10.0; +EXT.scale('R11_NAM','crude_3','a','2080')=10.0; +EXT.scale('R11_SAS','gas_5','a','2090')=10.0; +ACT.scale('R11_AFR','syn_liq','2030','2040','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2030','2050','M1','year')=100.0; +EXT.scale('R11_WEU','crude_7','a','2025')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2040')=0.01; +EXT.scale('R11_EEU','gas_5','a','2110')=10.0; +ACT.scale('R11_AFR','h2_coal_ccs','2060','2070','M1','year')=100.0; +EXT.scale('R11_FSU','gas_4','a','2070')=10.0; +ACT.scale('R11_PAO','eth_fc_trp','2030','2030','M1','year')=100.0; +EXT.scale('R11_CPA','gas_5','a','2045')=100.0; +EXT.scale('R11_PAS','crude_6','a','2025')=100.0; +ACT.scale('R11_PAO','coal_gas','2040','2045','M1','year')=100.0; +EXT.scale('R11_SAS','gas_2','a','2045')=100.0; +EXT.scale('R11_AFR','gas_2','a','2055')=100.0; +EXT.scale('R11_WEU','gas_5','a','2045')=100.0; +ACT.scale('R11_PAO','meth_ic_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_LAM','loil_trp','2070','2070','M1','year')=10.0; +LAND.scale('R11_SAS','BIO06GHG600','2100')=0.01; +ACT.scale('R11_WEU','h2_fc_trp','2050','2055','M1','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2110')=10.0; +EXT.scale('R11_WEU','lignite','a','2035')=100.0; +EXT.scale('R11_FSU','lignite','a','2060')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_EEU','gas_2','a','2035')=100.0; +EXT.scale('R11_LAM','crude_4','a','2025')=100.0; +EXT.scale('R11_LAM','crude_5','a','2030')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_AFR','meth_coal_ccs','2030','2040','M1','year')=100.0; +EXT.scale('R11_PAO','crude_7','a','2100')=10.0; +ACT.scale('R11_SAS','ref_hil','2005','2025','M1','year')=10.0; +ACT.scale('R11_LAM','coal_gas','2030','2035','M1','year')=10.0; +EXT.scale('R11_NAM','crude_6','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2020','2025','M1','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_LAM','gas_2','a','2030')=100.0; +EXT.scale('R11_SAS','gas_5','a','2070')=10.0; +ACT.scale('R11_LAM','gas_cc_ccs','2040','2060','M1','year')=10.0; +EXT.scale('R11_EEU','gas_3','a','2025')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2025')=0.01; +LAND.scale('R11_CPA','BIO06GHG010','2080')=0.1; +EXT.scale('R11_SAS','gas_5','a','2060')=100.0; +EXT.scale('R11_PAS','gas_3','a','2025')=100.0; +ACT.scale('R11_AFR','meth_coal','2030','2045','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG050','2080')=0.1; +CAP_NEW.scale('R11_LAM','mvac_co2','2055')=0.01; +EXT.scale('R11_WEU','gas_5','a','2025')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2040','2045','M1','year')=100.0; +EXT.scale('R11_PAO','gas_2','a','2090')=10.0; +LAND.scale('R11_AFR','BIO05GHG1500','2090')=0.1; +EXT.scale('R11_PAO','gas_4','a','2030')=100.0; +EXT.scale('R11_EEU','crude_6','a','2030')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_SAS','crude_6','a','2070')=10.0; +EXT.scale('R11_WEU','crude_3','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2050','2050','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2040')=100.0; +LAND.scale('R11_LAM','BIO06GHG050','2050')=0.1; +LAND.scale('R11_AFR','BIO06GHG400','2055')=0.1; +EXT.scale('R11_WEU','crude_7','a','2080')=10.0; +ACT.scale('R11_EEU','elec_t_d','2060','2110','M1','year')=100.0; +EXT.scale('R11_SAS','gas_1','a','2055')=100.0; +ACT.scale('R11_AFR','h2_coal','2015','2030','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_EEU','gas_2','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_1','2080','2080','M1','year')=100.0; +EXT.scale('R11_SAS','crude_1','a','2035')=100.0; +ACT.scale('R11_MEA','syn_liq','2080','2080','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2020','2040','M1','year')=10.0; +EXT.scale('R11_CPA','crude_2','a','2090')=10.0; +EXT.scale('R11_LAM','gas_4','a','2055')=100.0; +LAND.scale('R11_LAM','BIO05GHG600','2090')=0.1; +EXT.scale('R11_PAS','gas_4','a','2035')=100.0; +EXT.scale('R11_LAM','gas_6','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2030','2030','M1','year')=100.0; +ACT.scale('R11_FSU','eth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2020','2035','M1','year')=100.0; +EXT.scale('R11_MEA','crude_1','a','2025')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2040','2050','M1','year')=100.0; +EXT.scale('R11_PAO','crude_3','a','2050')=100.0; +EXT.scale('R11_LAM','gas_2','a','2050')=100.0; +EXT.scale('R11_WEU','gas_6','a','2110')=10.0; +EXT.scale('R11_PAO','crude_4','a','2055')=100.0; +EXT.scale('R11_SAS','crude_4','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG3000','2080')=0.1; +EXT.scale('R11_FSU','gas_3','a','2055')=100.0; +ACT_LO.scale('R11_LAM','gas_cc','2100','year')=0.01; +ACT.scale('R11_PAO','syn_liq_ccs','2090','2110','M1','year')=100.0; +EXT.scale('R11_NAM','crude_4','a','2090')=10.0; +EXT.scale('R11_AFR','crude_2','a','2045')=100.0; +ACT.scale('R11_EEU','elec_t_d','2110','2110','M1','year')=100.0; +EXT.scale('R11_FSU','crude_2','a','2055')=100.0; +EXT.scale('R11_FSU','crude_3','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2040','2045','M1','year')=100.0; +EXT.scale('R11_CPA','crude_3','a','2055')=100.0; +ACT.scale('R11_PAO','meth_coal','2020','2025','M1','year')=100.0; +EXT.scale('R11_SAS','gas_6','a','2045')=100.0; +LAND.scale('R11_NAM','BIO06GHG200','2060')=0.1; +LAND.scale('R11_NAM','BIO06GHG010','2080')=0.1; +ACT.scale('R11_PAO','meth_coal','2025','2030','M1','year')=100.0; +EXT.scale('R11_PAO','lignite','a','2025')=100.0; +ACT.scale('R11_SAS','ref_hil','2010','2025','M1','year')=10.0; +EXT.scale('R11_PAS','gas_3','a','2100')=10.0; +ACT.scale('R11_AFR','syn_liq_ccs','2040','2045','M1','year')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2100')=10.0; +EXT.scale('R11_MEA','crude_1','a','2060')=100.0; +EXT.scale('R11_WEU','gas_1','a','2070')=10.0; +EXT.scale('R11_PAO','crude_2','a','2100')=10.0; +EXT.scale('R11_EEU','crude_3','a','2070')=10.0; +EXT.scale('R11_WEU','crude_7','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2030','2035','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2055','2070','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2090','2090','M1','year')=100.0; +EXT.scale('R11_LAM','crude_2','a','2055')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_PAO','meth_ic_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal','2050','2055','M1','year')=100.0; +EXT.scale('R11_PAS','crude_6','a','2080')=10.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2025','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG050','2090')=0.1; +EXT.scale('R11_CPA','crude_3','a','2100')=10.0; +EXT.scale('R11_CPA','gas_5','a','2050')=100.0; +EXT.scale('R11_LAM','gas_1','a','2080')=10.0; +EXT.scale('R11_PAS','gas_1','a','2090')=10.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2045','2045','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2080')=0.1; +ACT.scale('R11_AFR','syn_liq','2045','2045','M1','year')=100.0; +EXT.scale('R11_EEU','crude_2','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2060','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2035','2035','M1','year')=100.0; +EXT.scale('R11_SAS','crude_5','a','2110')=10.0; +EXT.scale('R11_PAS','lignite','a','2060')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_AFR','crude_3','a','2040')=100.0; +ACT.scale('R11_PAO','meth_coal','2025','2035','M1','year')=100.0; +EXT.scale('R11_NAM','crude_5','a','2055')=100.0; +ACT.scale('R11_LAM','h2_coal','2020','2030','M1','year')=10.0; +EXT.scale('R11_NAM','gas_3','a','2100')=10.0; +EXT.scale('R11_WEU','gas_3','a','2030')=100.0; +ACT.scale('R11_PAO','eth_fc_trp','2080','2080','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2055')=100.0; +EXT.scale('R11_PAS','gas_4','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG010','2080')=0.1; +EXT.scale('R11_MEA','gas_5','a','2110')=10.0; +ACT.scale('R11_MEA','h2_coal_ccs','2080','2100','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG400','2055')=0.1; +LAND.scale('R11_AFR','BIO06GHG100','2110')=0.1; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_PAS','lignite','a','2025')=100.0; +EXT.scale('R11_EEU','crude_1','a','2090')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2060','2060','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG3000','2080')=0.1; +ACT.scale('R11_PAS','eth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2020','2040','M1','year')=100.0; +EXT.scale('R11_AFR','crude_5','a','2100')=10.0; +ACT.scale('R11_AFR','meth_coal','2035','2040','M1','year')=100.0; +ACT.scale('R11_NAM','h2_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2080','2080','M1','year')=10.0; +EXT.scale('R11_EEU','crude_3','a','2045')=100.0; +ACT.scale('R11_MEA','h2_coal','2090','2100','M1','year')=100.0; +ACT.scale('R11_PAS','eth_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_PAO','coal','a','2040')=100.0; +EXT.scale('R11_CPA','gas_3','a','2060')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2080')=0.01; +EXT.scale('R11_MEA','crude_7','a','2100')=10.0; +ACT.scale('R11_PAO','meth_ic_trp','2060','2060','M1','year')=10.0; +ACT.scale('R11_PAO','foil_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2060','2060','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2040')=100.0; +ACT.scale('R11_LAM','meth_coal','2030','2035','M1','year')=10.0; +EXT.scale('R11_LAM','crude_2','a','2045')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2045','2045','M1','year')=10.0; +EXT.scale('R11_CPA','gas_2','a','2045')=100.0; +EXT.scale('R11_LAM','crude_6','a','2045')=100.0; +EXT.scale('R11_CPA','crude_6','a','2025')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2100')=10.0; +EXT.scale('R11_WEU','gas_4','a','2025')=100.0; +EXT.scale('R11_EEU','crude_7','a','2060')=100.0; +EXT.scale('R11_PAS','crude_6','a','2100')=10.0; +EXT.scale('R11_WEU','coal','a','2050')=100.0; +EXT.scale('R11_EEU','gas_2','a','2055')=100.0; +EXT.scale('R11_PAS','crude_4','a','2050')=100.0; +ACT.scale('R11_PAO','h2_coal','2010','2025','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2035','2040','M1','year')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2045','year')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2055','2070','M1','year')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_EEU','gas_6','a','2040')=100.0; +ACT.scale('R11_PAO','eth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2025','2025','M1','year')=100.0; +EXT.scale('R11_FSU','crude_1','a','2080')=10.0; +EXT.scale('R11_NAM','crude_7','a','2060')=100.0; +EXT.scale('R11_EEU','gas_5','a','2050')=100.0; +EXT.scale('R11_PAS','crude_7','a','2090')=10.0; +ACT.scale('R11_MEA','syn_liq','2070','2070','M1','year')=100.0; +EXT.scale('R11_PAS','lignite','a','2080')=10.0; +ACT.scale('R11_EEU','elec_t_d','2035','2090','M1','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2070')=10.0; +EXT.scale('R11_FSU','crude_5','a','2060')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2060','2060','M1','year')=100.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_EEU','SF6_TCE','2070','2070','M1','year')=0.01; +ACT.scale('R11_LAM','foil_trp','2090','2090','M1','year')=10.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2045','2045','M1','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2040','year')=100.0; +LAND.scale('R11_AFR','BIO04GHG2000','2100')=0.1; +EXT.scale('R11_EEU','gas_2','a','2040')=100.0; +ACT.scale('R11_MEA','oil_extr_6','2100','2100','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2060','2070','M1','year')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2035')=0.01; +ACT.scale('R11_MEA','oil_extr_3','2110','2110','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG050','2090')=0.1; +EXT.scale('R11_WEU','crude_2','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2055','2060','M1','year')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2025','year')=100.0; +EXT.scale('R11_CPA','gas_5','a','2110')=10.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2030')=0.01; +EXT.scale('R11_AFR','coal','a','2060')=100.0; +EXT.scale('R11_LAM','crude_3','a','2055')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2045','2055','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2030')=100.0; +EXT.scale('R11_PAO','gas_1','a','2040')=100.0; +EXT.scale('R11_LAM','gas_3','a','2080')=10.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2040')=0.01; +EXT.scale('R11_PAO','crude_3','a','2100')=10.0; +EXT.scale('R11_AFR','crude_4','a','2045')=100.0; +EXT.scale('R11_MEA','crude_4','a','2025')=100.0; +EXT.scale('R11_PAO','gas_5','a','2035')=100.0; +EXT.scale('R11_AFR','gas_5','a','2025')=100.0; +LAND.scale('R11_NAM','BIO06GHG3000','2100')=0.1; +EXT.scale('R11_FSU','coal','a','2110')=10.0; +ACT.scale('R11_LAM','h2_coal','2035','2035','M1','year')=10.0; +EXT.scale('R11_WEU','crude_3','a','2070')=10.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2035','year')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_WEU','gas_2','a','2100')=10.0; +LAND.scale('R11_LAM','BIO06GHG010','2055')=0.1; +EXT.scale('R11_SAS','crude_2','a','2025')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2040','2055','M1','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2040','2045','M1','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2080')=10.0; +EXT.scale('R11_SAS','coal','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2025','2030','M1','year')=100.0; +EXT.scale('R11_NAM','crude_3','a','2070')=10.0; +ACT.scale('R11_AFR','h2_coal','2020','2025','M1','year')=100.0; +EXT.scale('R11_SAS','lignite','a','2035')=100.0; +EXT.scale('R11_FSU','gas_3','a','2030')=100.0; +EXT.scale('R11_PAO','gas_5','a','2070')=10.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2070','2090','M1','year')=100.0; +EXT.scale('R11_CPA','coal','a','2090')=10.0; +EXT.scale('R11_EEU','gas_5','a','2090')=10.0; +EXT.scale('R11_EEU','gas_1','a','2080')=10.0; +LAND.scale('R11_LAM','BIO05GHG200','2110')=0.1; +ACT.scale('R11_MEA','coal_gas','2090','2090','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2025','2040','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2045','2055','M1','year')=100.0; +EXT.scale('R11_PAS','crude_4','a','2045')=100.0; +EXT.scale('R11_FSU','crude_6','a','2025')=100.0; +ACT.scale('R11_MEA','h2_coal','2055','2080','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2030','2045','M1','year')=10.0; +ACT.scale('R11_EEU','replacement_so2','2060','2060','M1','year')=0.01; +LAND.scale('R11_CPA','BIO06GHG000','2100')=0.1; +LAND.scale('R11_AFR','BIO06GHG020','2080')=0.1; +EXT.scale('R11_FSU','crude_7','a','2110')=10.0; +EXT.scale('R11_AFR','crude_3','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_5','2060','2070','M1','year')=100.0; +EXT.scale('R11_AFR','gas_3','a','2090')=10.0; +EXT.scale('R11_NAM','crude_1','a','2025')=100.0; +EXT.scale('R11_SAS','lignite','a','2050')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2045','2055','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2040','2040','M1','year')=100.0; +LAND.scale('R11_FSU','BIO06GHG2000','2100')=0.1; +ACT.scale('R11_PAO','foil_trp','2060','2060','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG1500','2070')=0.1; +EXT.scale('R11_FSU','gas_2','a','2035')=100.0; +ACT.scale('R11_LAM','h2_coal_ccs','2045','2045','M1','year')=10.0; +EXT.scale('R11_NAM','crude_3','a','2055')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_PAO','crude_4','a','2060')=100.0; +EXT.scale('R11_FSU','gas_1','a','2100')=10.0; +EXT.scale('R11_PAS','crude_3','a','2035')=100.0; +LAND.scale('R11_AFR','BIO06GHG2000','2090')=0.1; +LAND.scale('R11_AFR','BIO06GHG1000','2045')=0.1; +EXT.scale('R11_WEU','coal','a','2055')=100.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2040')=0.01; +EXT.scale('R11_LAM','gas_1','a','2030')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2040','2040','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG200','2110')=0.1; +LAND.scale('R11_AFR','BIO06GHG200','2110')=0.1; +ACT.scale('R11_MEA','syn_liq','2050','2070','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2090')=10.0; +EXT.scale('R11_WEU','crude_2','a','2110')=10.0; +ACT.scale('R11_MEA','syn_liq_ccs','2090','2100','M1','year')=100.0; +EXT.scale('R11_AFR','gas_6','a','2040')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2055','2080','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2060')=0.1; +ACT.scale('R11_PAO','syn_liq_ccs','2050','2050','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_LAM','gas_4','a','2030')=100.0; +LAND.scale('R11_CPA','BIO06GHG010','2090')=0.1; +ACT.scale('R11_LAM','h2_coal','2025','2035','M1','year')=10.0; +LAND.scale('R11_AFR','BIO05GHG020','2110')=0.1; +ACT.scale('R11_PAO','meth_coal','2060','2070','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2030','2035','M1','year')=10.0; +EXT.scale('R11_LAM','crude_4','a','2045')=100.0; +ACT.scale('R11_MEA','meth_coal','2060','2080','M1','year')=100.0; +EXT.scale('R11_NAM','crude_5','a','2040')=100.0; +EXT.scale('R11_AFR','crude_6','a','2055')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2030','2035','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2055')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_PAS','gas_1','a','2110')=10.0; +EXT.scale('R11_LAM','crude_6','a','2050')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2035','2055','M1','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2055')=100.0; +ACT.scale('R11_LAM','gas_cc_ccs','2110','2110','M1','year')=0.1; +EXT.scale('R11_LAM','crude_1','a','2100')=10.0; +EXT.scale('R11_EEU','crude_4','a','2040')=100.0; +EXT.scale('R11_NAM','crude_1','a','2090')=10.0; +EXT.scale('R11_PAS','crude_6','a','2070')=10.0; +ACT.scale('R11_PAO','coal_gas','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2035','2045','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2040','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2090','2090','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG600','2080')=0.1; +EXT.scale('R11_PAS','crude_6','a','2030')=100.0; +EXT.scale('R11_WEU','crude_1','a','2040')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2025')=0.01; +EXT.scale('R11_AFR','lignite','a','2035')=100.0; +ACT.scale('R11_EEU','foil_trp','2080','2080','M1','year')=10.0; +EXT.scale('R11_WEU','crude_1','a','2035')=100.0; +ACT.scale('R11_AFR','syn_liq','2025','2040','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2040','2055','M1','year')=100.0; +EXT.scale('R11_SAS','coal','a','2100')=10.0; +ACT.scale('R11_PAO','coal_gas','2015','2030','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2020','2035','M1','year')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2035','2040','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2100','2100','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2025','2025','M1','year')=10.0; +EXT.scale('R11_WEU','gas_2','a','2060')=100.0; +EXT.scale('R11_PAS','crude_6','a','2035')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2100')=0.01; +ACT_LO.scale('R11_LAM','gas_cc_ccs','2110','year')=0.01; +LAND.scale('R11_NAM','BIO05GHG400','2100')=0.1; +ACT.scale('R11_PAO','coal_gas','2080','2080','M1','year')=100.0; +EXT.scale('R11_SAS','gas_5','a','2050')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2020','2025','M1','year')=100.0; +EXT.scale('R11_AFR','crude_7','a','2055')=100.0; +EXT.scale('R11_FSU','crude_4','a','2070')=10.0; +ACT.scale('R11_AFR','syn_liq_ccs','2035','2035','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_3','2100','2100','M1','year')=100.0; +EXT.scale('R11_SAS','crude_7','a','2045')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2050','2050','M1','year')=10.0; +EXT.scale('R11_SAS','crude_1','a','2110')=10.0; +ACT.scale('R11_LAM','eth_ic_trp','2045','2045','M1','year')=10.0; +EXT.scale('R11_NAM','lignite','a','2025')=100.0; +ACT.scale('R11_LAM','foil_trp','2030','2030','M1','year')=10.0; +ACT.scale('R11_PAS','meth_ic_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_FSU','crude_3','a','2050')=100.0; +ACT.scale('R11_PAO','syn_liq','2060','2080','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2050','2100','M1','year')=100.0; +EXT.scale('R11_AFR','crude_3','a','2080')=10.0; +ACT.scale('R11_PAO','h2_coal','2025','2045','M1','year')=100.0; +EXT.scale('R11_AFR','gas_3','a','2025')=100.0; +LAND.scale('R11_LAM','BIO06GHG020','2055')=0.1; +EXT.scale('R11_MEA','gas_2','a','2060')=100.0; +LAND.scale('R11_CPA','BIO06GHG1500','2110')=0.1; +EXT.scale('R11_WEU','crude_6','a','2070')=10.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2040','2040','M1','year')=100.0; +EXT.scale('R11_AFR','gas_6','a','2100')=10.0; +EXT.scale('R11_PAS','coal','a','2045')=100.0; +ACT.scale('R11_PAO','syn_liq','2040','2050','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2030','2030','M1','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2060')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2035','2035','M1','year')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2110')=0.01; +LAND.scale('R11_AFR','BIO05GHG100','2090')=0.1; +CAP_NEW.scale('R11_WEU','mvac_co2','2055')=0.01; +EXT.scale('R11_MEA','gas_5','a','2045')=100.0; +EXT.scale('R11_AFR','lignite','a','2025')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2040')=100.0; +EXT.scale('R11_PAO','gas_6','a','2110')=10.0; +ACT.scale('R11_PAO','h2_coal','2080','2090','M1','year')=100.0; +ACT.scale('R11_LAM','coal_gas','2040','2040','M1','year')=10.0; +ACT.scale('R11_EEU','elec_t_d','2055','2090','M1','year')=100.0; +EXT.scale('R11_NAM','gas_5','a','2025')=100.0; +EXT.scale('R11_NAM','gas_2','a','2030')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2060','2070','M1','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2025','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2060')=100.0; +EXT.scale('R11_NAM','crude_4','a','2035')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2060')=0.01; +ACT.scale('R11_AFR','coal_gas','2050','2050','M1','year')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2035','2035','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_SAS','gas_3','a','2050')=100.0; +EXT.scale('R11_FSU','crude_7','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2080','2080','M1','year')=100.0; +EXT.scale('R11_WEU','crude_1','a','2090')=10.0; +ACT.scale('R11_AFR','syn_liq','2030','2050','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq','2055','2070','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG2000','2080')=0.1; +ACT.scale('R11_LAM','coal_gas','2020','2025','M1','year')=10.0; +EXT.scale('R11_PAO','crude_2','a','2045')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2080','2080','M1','year')=10.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_SAS','gas_3','a','2100')=10.0; +ACT.scale('R11_EEU','meth_ic_trp','2025','2025','M1','year')=10.0; +LAND.scale('R11_NAM','BIO06GHG200','2080')=0.1; +ACT.scale('R11_LAM','gas_cc','2045','2060','M1','year')=10.0; +EXT.scale('R11_SAS','crude_7','a','2025')=100.0; +EXT.scale('R11_PAS','crude_2','a','2055')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2040','2050','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2050','2070','M1','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2035')=100.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2050','2055','M1','year')=100.0; +ACT.scale('R11_SAS','h2_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_EEU','crude_5','a','2035')=100.0; +EXT.scale('R11_FSU','crude_2','a','2025')=100.0; +EXT.scale('R11_CPA','gas_6','a','2090')=10.0; +EXT.scale('R11_PAO','gas_2','a','2045')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2040','2045','M1','year')=100.0; +EXT.scale('R11_EEU','crude_6','a','2025')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_PAS','crude_6','a','2110')=10.0; +EXT.scale('R11_NAM','crude_4','a','2070')=10.0; +EXT.scale('R11_CPA','gas_4','a','2100')=10.0; +ACT.scale('R11_EEU','elec_t_d','2090','2090','M1','year')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2025')=100.0; +EXT.scale('R11_PAO','crude_7','a','2040')=100.0; +LAND.scale('R11_LAM','BIO05GHG000','2110')=0.1; +LAND.scale('R11_AFR','BIO05GHG020','2100')=0.1; +LAND.scale('R11_AFR','BIO05GHG400','2100')=0.1; +ACT.scale('R11_MEA','meth_coal_ccs','2050','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1000','2090')=0.1; +EXT.scale('R11_FSU','gas_5','a','2110')=10.0; +EXT.scale('R11_AFR','gas_2','a','2070')=10.0; +EXT.scale('R11_LAM','gas_3','a','2100')=10.0; +ACT.scale('R11_AFR','syn_liq','2035','2040','M1','year')=100.0; +EXT.scale('R11_PAS','gas_4','a','2090')=10.0; +EXT.scale('R11_LAM','crude_7','a','2035')=100.0; +EXT.scale('R11_FSU','crude_6','a','2060')=100.0; +LAND.scale('R11_AFR','BIO05GHG2000','2070')=0.1; +ACT.scale('R11_CPA','oil_extr_7','2035','2040','M1','year')=100.0; +ACT.scale('R11_WEU','eth_fc_trp','2070','2070','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2100','2100','M1','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2050')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2030')=0.01; +ACT.scale('R11_PAS','foil_trp','2055','2055','M1','year')=10.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2110')=0.01; +LAND.scale('R11_LAM','BIO06GHG000','2090')=0.1; +EXT.scale('R11_PAO','crude_7','a','2045')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2080','2080','M1','year')=100.0; +EXT.scale('R11_MEA','gas_2','a','2030')=100.0; +EXT.scale('R11_FSU','crude_3','a','2100')=10.0; +EXT.scale('R11_EEU','crude_1','a','2040')=100.0; +EXT.scale('R11_NAM','crude_7','a','2080')=10.0; +ACT.scale('R11_WEU','meth_ic_trp','2110','2110','M1','year')=10.0; +LAND.scale('R11_NAM','BIO05GHG600','2090')=0.1; +ACT.scale('R11_LAM','syn_liq','2020','2030','M1','year')=10.0; +EXT.scale('R11_EEU','crude_2','a','2055')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2040')=0.01; +EXT.scale('R11_MEA','crude_2','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal','2015','2035','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG600','2100')=0.1; +ACT.scale('R11_PAO','h2_fc_trp','2040','2045','M1','year')=100.0; +EXT.scale('R11_NAM','crude_1','a','2110')=10.0; +EXT.scale('R11_PAO','coal','a','2100')=10.0; +EXT.scale('R11_CPA','crude_2','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2020','2025','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG050','2110')=0.1; +ACT.scale('R11_AFR','h2_coal','2020','2030','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2100','2100','M1','year')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2050','2050','M1','year')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2090','2090','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG1500','2110')=0.1; +ACT.scale('R11_CPA','oil_extr_6','2050','2050','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2025','2040','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG200','2090')=0.1; +CAP_NEW.scale('R11_PAS','mvac_co2','2090')=0.01; +EXT.scale('R11_MEA','gas_1','a','2045')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2100','2100','M1','year')=100.0; +EXT.scale('R11_FSU','crude_3','a','2070')=10.0; +EXT.scale('R11_PAO','gas_4','a','2035')=100.0; +ACT.scale('R11_SAS','ref_hil','2025','2025','M1','year')=10.0; +ACT.scale('R11_LAM','h2_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_WEU','gas_1','a','2035')=100.0; +EXT.scale('R11_PAO','gas_3','a','2040')=100.0; +EXT.scale('R11_PAS','coal','a','2025')=100.0; +EXT.scale('R11_CPA','lignite','a','2050')=100.0; +EXT.scale('R11_PAS','crude_5','a','2050')=100.0; +EXT.scale('R11_LAM','crude_6','a','2055')=100.0; +EXT.scale('R11_LAM','crude_4','a','2100')=10.0; +EXT.scale('R11_AFR','gas_5','a','2110')=10.0; +ACT.scale('R11_EEU','eth_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_PAO','crude_7','a','2050')=100.0; +EXT.scale('R11_LAM','gas_5','a','2110')=10.0; +ACT.scale('R11_MEA','syn_liq_ccs','2060','2080','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG020','2060')=0.1; +CAP_NEW.scale('R11_NAM','mvac_co2','2110')=0.01; +EXT.scale('R11_FSU','gas_3','a','2090')=10.0; +ACT.scale('R11_PAO','coal_gas','2030','2050','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG010','2090')=0.1; +ACT.scale('R11_LAM','syn_liq_ccs','2035','2045','M1','year')=10.0; +ACT.scale('R11_AFR','meth_coal','2030','2030','M1','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2045')=100.0; +EXT.scale('R11_MEA','crude_6','a','2100')=10.0; +EXT.scale('R11_WEU','gas_1','a','2055')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_EEU','gas_6','a','2025')=100.0; +EXT.scale('R11_EEU','crude_4','a','2080')=10.0; +ACT.scale('R11_PAO','coal_gas','2100','2100','M1','year')=100.0; +EXT.scale('R11_PAO','gas_3','a','2045')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2045','2055','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2045','2060','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG200','2090')=0.1; +ACT.scale('R11_AFR','meth_coal_ccs','2030','2030','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG100','2100')=0.1; +ACT.scale('R11_AFR','syn_liq_ccs','2060','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2050','2055','M1','year')=100.0; +ACT.scale('R11_WEU','eth_fc_trp','2050','2050','M1','year')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2050','2055','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG100','2090')=0.1; +ACT.scale('R11_AFR','h2_coal_ccs','2030','2030','M1','year')=100.0; +EXT.scale('R11_NAM','crude_4','a','2025')=100.0; +EXT.scale('R11_PAS','crude_5','a','2070')=10.0; +EXT.scale('R11_AFR','gas_5','a','2070')=10.0; +EXT.scale('R11_AFR','crude_6','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2050','2050','M1','year')=100.0; +EXT.scale('R11_WEU','crude_4','a','2090')=10.0; +EXT.scale('R11_SAS','gas_5','a','2055')=100.0; +EXT.scale('R11_EEU','crude_2','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2045','2045','M1','year')=100.0; +EXT.scale('R11_CPA','crude_1','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2050','2055','M1','year')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_LAM','loil_trp','2035','2035','M1','year')=10.0; +ACT.scale('R11_LAM','meth_ic_trp','2110','2110','M1','year')=10.0; +EXT.scale('R11_EEU','crude_6','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2070','2070','M1','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2070')=10.0; +LAND.scale('R11_AFR','BIO06GHG400','2060')=0.1; +CAP_NEW.scale('R11_EEU','mvac_co2','2030')=0.01; +EXT.scale('R11_EEU','lignite','a','2045')=100.0; +ACT.scale('R11_PAO','h2_coal','2025','2040','M1','year')=100.0; +EXT.scale('R11_MEA','gas_3','a','2040')=100.0; +EXT.scale('R11_MEA','crude_3','a','2100')=10.0; +EXT.scale('R11_WEU','coal','a','2080')=10.0; +EXT.scale('R11_SAS','crude_5','a','2060')=100.0; +EXT.scale('R11_AFR','coal','a','2110')=10.0; +ACT.scale('R11_PAO','coal_gas','2025','2030','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG200','2080')=0.1; +EXT.scale('R11_WEU','gas_2','a','2050')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_EEU','crude_6','a','2090')=10.0; +ACT.scale('R11_LAM','syn_liq_ccs','2040','2045','M1','year')=10.0; +ACT.scale('R11_EEU','replacement_so2','2070','2070','M1','year')=0.01; +EXT.scale('R11_NAM','crude_1','a','2060')=100.0; +ACT.scale('R11_AFR','syn_liq','2050','2060','M1','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2025')=100.0; +EXT.scale('R11_EEU','gas_6','a','2100')=10.0; +EXT.scale('R11_AFR','coal','a','2025')=100.0; +ACT.scale('R11_LAM','coal_gas','2045','2045','M1','year')=10.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2110','2110','M1','year')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2050')=0.01; +EXT.scale('R11_NAM','crude_7','a','2090')=10.0; +ACT.scale('R11_WEU','eth_fc_trp','2035','2035','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG1500','2090')=0.1; +EXT.scale('R11_MEA','gas_2','a','2070')=10.0; +EXT.scale('R11_PAS','lignite','a','2050')=100.0; +LAND.scale('R11_AFR','BIO05GHG3000','2110')=0.1; +EXT.scale('R11_FSU','coal','a','2050')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2030','2030','M1','year')=100.0; +EXT.scale('R11_PAS','crude_1','a','2080')=10.0; +ACT.scale('R11_PAO','syn_liq','2030','2050','M1','year')=100.0; +EXT.scale('R11_MEA','gas_2','a','2080')=10.0; +ACT.scale('R11_PAO','coal_gas','2070','2070','M1','year')=100.0; +EXT.scale('R11_MEA','crude_6','a','2060')=100.0; +EXT.scale('R11_EEU','coal','a','2090')=10.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2055')=0.01; +ACT.scale('R11_AFR','meth_coal','2020','2040','M1','year')=100.0; +EXT.scale('R11_AFR','gas_5','a','2035')=100.0; +EXT.scale('R11_MEA','crude_1','a','2055')=100.0; +EXT.scale('R11_FSU','crude_4','a','2035')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2070','2080','M1','year')=100.0; +EXT.scale('R11_SAS','lignite','a','2045')=100.0; +EXT.scale('R11_SAS','gas_3','a','2110')=10.0; +ACT.scale('R11_LAM','syn_liq_ccs','2030','2030','M1','year')=10.0; +ACT.scale('R11_MEA','h2_coal_ccs','2070','2080','M1','year')=100.0; +ACT.scale('R11_PAO','eth_fc_trp','2055','2055','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2070','2090','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2080')=10.0; +ACT.scale('R11_AFR','syn_liq','2025','2025','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG600','2110')=0.1; +EXT.scale('R11_AFR','coal','a','2030')=100.0; +EXT.scale('R11_PAS','crude_5','a','2090')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2050','2060','M1','year')=100.0; +ACT.scale('R11_PAS','eth_fc_trp','2070','2070','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG600','2110')=0.1; +EXT.scale('R11_SAS','gas_2','a','2055')=100.0; +ACT.scale('R11_PAO','h2_coal','2020','2030','M1','year')=100.0; +EXT.scale('R11_AFR','gas_4','a','2110')=10.0; +ACT.scale('R11_PAO','loil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_CPA','crude_1','a','2035')=100.0; +EXT.scale('R11_AFR','gas_4','a','2060')=100.0; +EXT.scale('R11_SAS','crude_2','a','2100')=10.0; +EXT.scale('R11_NAM','gas_4','a','2055')=100.0; +EXT.scale('R11_NAM','gas_2','a','2025')=100.0; +EXT.scale('R11_PAO','gas_5','a','2080')=10.0; +LAND.scale('R11_LAM','BIO06GHG100','2110')=0.1; +EXT.scale('R11_CPA','crude_3','a','2040')=100.0; +ACT.scale('R11_LAM','h2_coal','2025','2045','M1','year')=10.0; +EXT.scale('R11_AFR','gas_6','a','2055')=100.0; +EXT.scale('R11_NAM','crude_6','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2030','2030','M1','year')=100.0; +EXT.scale('R11_NAM','coal','a','2050')=100.0; +EXT.scale('R11_LAM','gas_1','a','2050')=100.0; +EXT.scale('R11_PAO','gas_5','a','2045')=100.0; +EXT.scale('R11_NAM','gas_1','a','2035')=100.0; +EXT.scale('R11_LAM','gas_5','a','2035')=100.0; +EXT.scale('R11_PAO','crude_4','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG000','2100')=0.1; +ACT.scale('R11_EEU','elec_t_d','2080','2090','M1','year')=100.0; +EXT.scale('R11_LAM','crude_7','a','2030')=100.0; +ACT.scale('R11_WEU','meth_ic_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_PAO','syn_liq','2030','2035','M1','year')=100.0; +EXT.scale('R11_AFR','crude_1','a','2050')=100.0; +LAND.scale('R11_LAM','BIO06GHG600','2050')=0.1; +ACT.scale('R11_SAS','ref_hil','2020','2025','M1','year')=10.0; +EXT.scale('R11_PAS','crude_4','a','2090')=10.0; +EXT.scale('R11_PAS','crude_5','a','2030')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2070','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2050','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2060','2060','M1','year')=100.0; +EXT.scale('R11_MEA','gas_5','a','2035')=100.0; +EXT.scale('R11_CPA','gas_4','a','2035')=100.0; +ACT.scale('R11_SAS','h2_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal','2090','2090','M1','year')=100.0; +EXT.scale('R11_WEU','gas_3','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2030','2030','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2090')=0.1; +ACT.scale('R11_CPA','oil_extr_3_ch4','2060','2060','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG600','2110')=0.1; +ACT.scale('R11_PAO','meth_coal_ccs','2045','2070','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2030','2030','M1','year')=100.0; +ACT.scale('R11_LAM','eth_ic_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_MEA','meth_coal_ccs','2090','2100','M1','year')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_PAS','crude_2','a','2035')=100.0; +EXT.scale('R11_WEU','crude_7','a','2070')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2045','2045','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2045','2045','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2045','2050','M1','year')=100.0; +EXT.scale('R11_PAO','coal','a','2025')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2070','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1500','2090')=0.1; +LAND.scale('R11_LAM','BIO06GHG020','2050')=0.1; +LAND.scale('R11_LAM','BIO06GHG1000','2080')=0.1; +ACT_LO.scale('R11_LAM','gas_cc','2080','year')=0.01; +EXT.scale('R11_SAS','gas_4','a','2040')=100.0; +EXT.scale('R11_PAS','coal','a','2035')=100.0; +EXT.scale('R11_EEU','gas_1','a','2050')=100.0; +EXT.scale('R11_PAS','gas_2','a','2110')=10.0; +ACT.scale('R11_AFR','h2_coal','2025','2025','M1','year')=100.0; +EXT.scale('R11_SAS','crude_5','a','2050')=100.0; +EXT.scale('R11_SAS','gas_1','a','2060')=100.0; +EXT.scale('R11_LAM','crude_1','a','2050')=100.0; +LAND.scale('R11_NAM','BIO06GHG010','2070')=0.1; +ACT.scale('R11_LAM','h2_coal_ccs','2035','2040','M1','year')=10.0; +EXT.scale('R11_SAS','crude_4','a','2090')=10.0; +EXT.scale('R11_LAM','crude_6','a','2080')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2035','2045','M1','year')=100.0; +EXT.scale('R11_CPA','gas_6','a','2055')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2050','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2040','2040','M1','year')=100.0; +ACT.scale('R11_LAM','loil_trp','2025','2025','M1','year')=10.0; +EXT.scale('R11_FSU','coal','a','2080')=10.0; +EXT.scale('R11_PAS','crude_5','a','2080')=10.0; +ACT.scale('R11_WEU','foil_trp','2080','2080','M1','year')=10.0; +EXT.scale('R11_LAM','gas_3','a','2060')=100.0; +ACT.scale('R11_LAM','syn_liq','2030','2045','M1','year')=10.0; +ACT.scale('R11_MEA','h2_coal','2060','2080','M1','year')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_CPA','gas_3','a','2050')=100.0; +ACT.scale('R11_PAO','meth_coal','2020','2035','M1','year')=100.0; +EXT.scale('R11_EEU','crude_5','a','2055')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2020','2025','M1','year')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2025','2025','M1','year')=10.0; +EXT.scale('R11_LAM','crude_7','a','2090')=10.0; +EXT.scale('R11_EEU','crude_5','a','2080')=10.0; +CAP_NEW.scale('R11_WEU','meth_coal_ccs','2060')=10.0; +EXT.scale('R11_MEA','coal','a','2045')=100.0; +EXT.scale('R11_EEU','crude_5','a','2110')=10.0; +ACT.scale('R11_SAS','eth_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2035','2055','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1000','2110')=0.1; +EXT.scale('R11_EEU','coal','a','2040')=100.0; +LAND.scale('R11_NAM','BIO06GHG2000','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_2','2060','2060','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2070')=10.0; +EXT.scale('R11_NAM','gas_5','a','2080')=10.0; +EXT.scale('R11_PAS','gas_5','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal','2030','2050','M1','year')=100.0; +ACT.scale('R11_PAS','loil_trp','2070','2070','M1','year')=10.0; +LAND.scale('R11_NAM','BIO06GHG050','2080')=0.1; +EXT.scale('R11_SAS','crude_3','a','2100')=10.0; +EXT.scale('R11_AFR','gas_1','a','2045')=100.0; +EXT.scale('R11_AFR','gas_2','a','2110')=10.0; +ACT.scale('R11_PAO','meth_coal','2030','2030','M1','year')=100.0; +EXT.scale('R11_AFR','crude_2','a','2060')=100.0; +EXT.scale('R11_PAS','crude_5','a','2040')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2035','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG050','2070')=0.1; +EXT.scale('R11_SAS','lignite','a','2090')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2050','2055','M1','year')=100.0; +EXT.scale('R11_MEA','gas_3','a','2030')=100.0; +EXT.scale('R11_FSU','coal','a','2100')=10.0; +EXT.scale('R11_NAM','crude_4','a','2040')=100.0; +EXT.scale('R11_FSU','crude_1','a','2045')=100.0; +EXT.scale('R11_LAM','gas_2','a','2035')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2050')=0.01; +EXT.scale('R11_FSU','crude_5','a','2070')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2040','2040','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal','2070','2080','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2055','2060','M1','year')=100.0; +EXT.scale('R11_PAS','crude_6','a','2050')=100.0; +ACT.scale('R11_PAS','eth_ic_trp','2070','2070','M1','year')=10.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_EEU','crude_2','a','2080')=10.0; +ACT.scale('R11_PAO','syn_liq','2040','2055','M1','year')=100.0; +ACT.scale('R11_WEU','eth_fc_trp','2040','2040','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG100','2045')=0.1; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2090','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG400','2060')=0.1; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2045','2045','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG2000','2070')=0.1; +EXT.scale('R11_NAM','crude_4','a','2045')=100.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2080')=0.01; +EXT.scale('R11_LAM','gas_1','a','2110')=10.0; +LAND.scale('R11_AFR','BIO06GHG010','2090')=0.1; +LAND.scale('R11_LAM','BIO06GHG020','2070')=0.1; +EXT.scale('R11_EEU','gas_4','a','2090')=10.0; +EXT.scale('R11_PAS','crude_4','a','2110')=10.0; +EXT.scale('R11_CPA','crude_1','a','2070')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2110','2110','M1','year')=100.0; +EXT.scale('R11_WEU','crude_2','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2045','2050','M1','year')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_CPA','crude_6','a','2110')=10.0; +EXT.scale('R11_CPA','gas_5','a','2080')=10.0; +EXT.scale('R11_PAO','gas_1','a','2090')=10.0; +ACT.scale('R11_PAS','loil_trp','2055','2055','M1','year')=10.0; +EXT.scale('R11_SAS','crude_3','a','2080')=10.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2035')=0.01; +EXT.scale('R11_WEU','crude_1','a','2080')=10.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2060','year')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2035','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2055','2060','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2035','2050','M1','year')=100.0; +ACT.scale('R11_PAS','loil_trp','2050','2050','M1','year')=10.0; +EXT.scale('R11_AFR','crude_6','a','2035')=100.0; +EXT.scale('R11_WEU','gas_4','a','2050')=100.0; +EXT.scale('R11_PAO','gas_5','a','2030')=100.0; +EXT.scale('R11_PAO','crude_2','a','2090')=10.0; +LAND.scale('R11_AFR','BIO05GHG010','2100')=0.1; +EXT.scale('R11_WEU','gas_5','a','2035')=100.0; +LAND.scale('R11_PAS','BIO06GHG2000','2100')=0.01; +EXT.scale('R11_LAM','crude_7','a','2080')=10.0; +ACT.scale('R11_EEU','meth_ic_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal_ccs','2035','2040','M1','year')=100.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2100')=0.01; +EXT.scale('R11_SAS','crude_3','a','2070')=10.0; +EXT.scale('R11_CPA','crude_6','a','2060')=100.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_WEU','gas_5','a','2050')=100.0; +EXT.scale('R11_NAM','gas_2','a','2090')=10.0; +EXT.scale('R11_LAM','gas_1','a','2090')=10.0; +EXT.scale('R11_WEU','gas_2','a','2040')=100.0; +LAND.scale('R11_CPA','BIO06GHG1000','2100')=0.1; +ACT.scale('R11_PAS','h2_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_PAO','gas_4','a','2070')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2045','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_4','a','2090')=10.0; +EXT.scale('R11_AFR','gas_2','a','2045')=100.0; +ACT_LO.scale('R11_LAM','gas_cc','2070','year')=0.01; +CAP_NEW.scale('R11_FSU','mvac_co2','2040')=0.01; +EXT.scale('R11_PAS','crude_4','a','2055')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2025','2030','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2030','2040','M1','year')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2070','2070','M1','year')=10.0; +EXT.scale('R11_NAM','gas_5','a','2100')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2030','2045','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2100')=10.0; +EXT.scale('R11_PAO','crude_6','a','2080')=10.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2080','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG600','2070')=0.1; +ACT.scale('R11_CPA','oil_extr_3','2070','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2025','2030','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG1000','2090')=0.1; +ACT.scale('R11_PAO','coal_gas','2010','2025','M1','year')=100.0; +EXT.scale('R11_SAS','crude_4','a','2035')=100.0; +EXT.scale('R11_NAM','crude_2','a','2050')=100.0; +EXT.scale('R11_WEU','crude_1','a','2025')=100.0; +EXT.scale('R11_NAM','gas_3','a','2050')=100.0; +EXT.scale('R11_LAM','gas_1','a','2100')=10.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2050','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2020','2070','M1','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2080')=10.0; +ACT.scale('R11_PAO','syn_liq','2025','2040','M1','year')=100.0; +EXT.scale('R11_EEU','gas_5','a','2030')=100.0; +EXT.scale('R11_FSU','crude_5','a','2035')=100.0; +EXT.scale('R11_MEA','crude_6','a','2030')=100.0; +EXT.scale('R11_PAO','crude_3','a','2035')=100.0; +EXT.scale('R11_LAM','crude_1','a','2045')=100.0; +ACT.scale('R11_PAO','eth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_MEA','crude_5','a','2040')=100.0; +ACT.scale('R11_PAO','h2_coal','2070','2090','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2040')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_WEU','crude_1','a','2110')=10.0; +ACT.scale('R11_EEU','elec_t_d','2035','2070','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_WEU','gas_1','a','2040')=100.0; +ACT.scale('R11_PAO','syn_liq','2080','2090','M1','year')=100.0; +EXT.scale('R11_PAO','gas_3','a','2080')=10.0; +ACT.scale('R11_EEU','eth_ic_trp','2050','2050','M1','year')=10.0; +LAND.scale('R11_CPA','BIO06GHG100','2090')=0.1; +EXT.scale('R11_PAS','gas_5','a','2110')=10.0; +LAND.scale('R11_NAM','BIO05GHG100','2100')=0.1; +LAND.scale('R11_NAM','BIO06GHG100','2070')=0.1; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_NAM','gas_2','a','2040')=100.0; +ACT.scale('R11_EEU','foil_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_AFR','crude_6','a','2110')=10.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2110','2110','M1','year')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2030')=0.01; +EXT.scale('R11_FSU','crude_5','a','2100')=10.0; +EXT.scale('R11_MEA','gas_2','a','2110')=10.0; +ACT.scale('R11_PAO','eth_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_EEU','gas_5','a','2080')=10.0; +ACT.scale('R11_WEU','meth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2030')=100.0; +ACT.scale('R11_LAM','loil_trp','2050','2050','M1','year')=10.0; +EXT.scale('R11_NAM','gas_3','a','2110')=10.0; +EXT.scale('R11_EEU','crude_1','a','2100')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_WEU','gas_2','a','2030')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2030','2030','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG400','2100')=0.1; +EXT.scale('R11_EEU','gas_1','a','2060')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_EEU','crude_5','a','2060')=100.0; +EXT.scale('R11_AFR','crude_3','a','2070')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2040','2045','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2035','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2025','2030','M1','year')=100.0; +ACT.scale('R11_SAS','ref_lol','2020','2025','M1','year')=10.0; +EXT.scale('R11_PAO','crude_6','a','2050')=100.0; +EXT.scale('R11_PAO','gas_1','a','2050')=100.0; +ACT.scale('R11_SAS','ref_hil','2015','2025','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG3000','2090')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2040','2055','M1','year')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_EEU','loil_trp','2030','2030','M1','year')=10.0; +EXT.scale('R11_CPA','gas_1','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2025','2030','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2055','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2045','2045','M1','year')=100.0; +EXT.scale('R11_PAO','lignite','a','2090')=10.0; +ACT.scale('R11_LAM','meth_coal_ccs','2030','2035','M1','year')=10.0; +EXT.scale('R11_LAM','gas_1','a','2035')=100.0; +ACT.scale('R11_PAO','h2_coal','2070','2080','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2035','2035','M1','year')=10.0; +EXT.scale('R11_PAS','crude_2','a','2100')=10.0; +ACT.scale('R11_PAS','eth_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_MEA','crude_7','a','2025')=100.0; +EXT.scale('R11_PAO','lignite','a','2100')=10.0; +EXT.scale('R11_WEU','gas_2','a','2110')=10.0; +EXT.scale('R11_AFR','crude_6','a','2080')=10.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2070')=0.01; +EXT.scale('R11_AFR','crude_5','a','2045')=100.0; +ACT.scale('R11_LAM','foil_trp','2045','2045','M1','year')=10.0; +EXT.scale('R11_SAS','coal','a','2060')=100.0; +EXT.scale('R11_AFR','gas_5','a','2060')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2025','2025','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG3000','2100')=0.1; +ACT.scale('R11_WEU','meth_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_FSU','crude_6','a','2035')=100.0; +EXT.scale('R11_EEU','crude_5','a','2045')=100.0; +EXT.scale('R11_NAM','crude_7','a','2055')=100.0; +EXT.scale('R11_CPA','gas_3','a','2035')=100.0; +ACT.scale('R11_AFR','h2_coal','2040','2060','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2070','2070','M1','year')=100.0; +EXT.scale('R11_AFR','lignite','a','2110')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_AFR','gas_2','a','2030')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2030','2030','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG100','2060')=0.1; +ACT.scale('R11_LAM','syn_liq','2035','2045','M1','year')=10.0; +EXT.scale('R11_PAO','crude_6','a','2045')=100.0; +EXT.scale('R11_WEU','crude_4','a','2060')=100.0; +EXT.scale('R11_EEU','coal','a','2030')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2045','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG600','2090')=0.1; +EXT.scale('R11_WEU','gas_3','a','2090')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2035','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2050','2050','M1','year')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_WEU','gas_3','a','2025')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_MEA','gas_4','a','2050')=100.0; +EXT.scale('R11_PAO','crude_6','a','2090')=10.0; +EXT.scale('R11_FSU','crude_5','a','2080')=10.0; +EXT.scale('R11_CPA','crude_7','a','2060')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2055','2060','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG200','2100')=0.1; +EXT.scale('R11_WEU','gas_3','a','2070')=10.0; +EXT.scale('R11_EEU','gas_2','a','2070')=10.0; +EXT.scale('R11_AFR','gas_2','a','2060')=100.0; +ACT.scale('R11_MEA','coal_gas','2070','2080','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG2000','2090')=0.1; +EXT.scale('R11_MEA','crude_2','a','2040')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2030','2045','M1','year')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2035')=0.01; +EXT.scale('R11_NAM','gas_2','a','2050')=100.0; +ACT.scale('R11_PAO','meth_coal','2030','2045','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2030')=100.0; +EXT.scale('R11_LAM','gas_3','a','2030')=100.0; +EXT.scale('R11_WEU','crude_5','a','2110')=10.0; +EXT.scale('R11_LAM','gas_3','a','2070')=10.0; +EXT.scale('R11_WEU','gas_6','a','2025')=100.0; +ACT.scale('R11_MEA','h2_coal','2055','2070','M1','year')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2110')=0.01; +ACT.scale('R11_PAO','h2_coal','2055','2060','M1','year')=100.0; +EXT.scale('R11_FSU','gas_1','a','2040')=100.0; +EXT.scale('R11_NAM','crude_4','a','2030')=100.0; +EXT.scale('R11_NAM','gas_6','a','2060')=100.0; +ACT.scale('R11_EEU','replacement_so2','2110','2110','M1','year')=0.01; +ACT.scale('R11_AFR','h2_coal','2030','2050','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2055','2070','M1','year')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2100','2100','M1','year')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2110','year')=100.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2055','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2025','2025','M1','year')=100.0; +EXT.scale('R11_CPA','crude_7','a','2040')=100.0; +EXT.scale('R11_AFR','gas_4','a','2055')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2050','2055','M1','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2030')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2110')=0.1; +EXT.scale('R11_PAS','crude_1','a','2055')=100.0; +LAND.scale('R11_LAM','BIO05GHG1000','2080')=0.1; +ACT.scale('R11_PAS','foil_trp','2110','2110','M1','year')=10.0; +EXT.scale('R11_FSU','crude_7','a','2045')=100.0; +EXT.scale('R11_LAM','crude_1','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG1000','2060')=0.1; +EXT.scale('R11_PAO','crude_5','a','2040')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2030','2040','M1','year')=100.0; +EXT.scale('R11_PAO','crude_5','a','2035')=100.0; +ACT.scale('R11_AFR','h2_coal','2020','2035','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2110')=10.0; +EXT.scale('R11_MEA','crude_5','a','2090')=10.0; +EXT.scale('R11_AFR','crude_7','a','2025')=100.0; +ACT.scale('R11_PAO','coal_gas','2050','2050','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG050','2110')=0.1; +EXT.scale('R11_PAO','crude_6','a','2070')=10.0; +EXT.scale('R11_PAO','gas_2','a','2110')=10.0; +EXT.scale('R11_WEU','crude_2','a','2090')=10.0; +ACT.scale('R11_LAM','meth_coal_ccs','2030','2030','M1','year')=10.0; +EXT.scale('R11_FSU','crude_5','a','2045')=100.0; +EXT.scale('R11_MEA','crude_1','a','2070')=10.0; +ACT.scale('R11_LAM','eth_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_LAM','gas_3','a','2055')=100.0; +EXT.scale('R11_NAM','crude_3','a','2110')=10.0; +ACT.scale('R11_AFR','meth_coal','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2035')=100.0; +LAND.scale('R11_LAM','BIO06GHG1500','2055')=0.1; +ACT.scale('R11_LAM','gas_cc_ccs','2055','2060','M1','year')=10.0; +LAND.scale('R11_AFR','BIO05GHG200','2110')=0.1; +EXT.scale('R11_NAM','crude_1','a','2050')=100.0; +ACT.scale('R11_LAM','meth_coal','2030','2040','M1','year')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal','2090','2100','M1','year')=100.0; +EXT.scale('R11_AFR','gas_3','a','2050')=100.0; +EXT.scale('R11_FSU','coal','a','2060')=100.0; +EXT.scale('R11_NAM','gas_6','a','2045')=100.0; +ACT.scale('R11_PAO','meth_ic_trp','2110','2110','M1','year')=10.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_PAO','loil_trp','2070','2070','M1','year')=10.0; +EXT.scale('R11_FSU','gas_5','a','2055')=100.0; +EXT.scale('R11_LAM','coal','a','2035')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2050','2055','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2045','2100','M1','year')=100.0; +EXT.scale('R11_LAM','gas_2','a','2110')=10.0; +EXT.scale('R11_WEU','crude_4','a','2025')=100.0; +EXT.scale('R11_CPA','gas_4','a','2040')=100.0; +EXT.scale('R11_AFR','crude_1','a','2025')=100.0; +EXT.scale('R11_EEU','crude_7','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2100','2100','M1','year')=100.0; +EXT.scale('R11_WEU','coal','a','2045')=100.0; +EXT.scale('R11_PAO','crude_1','a','2070')=10.0; +EXT.scale('R11_FSU','crude_5','a','2030')=100.0; +EXT.scale('R11_WEU','gas_5','a','2060')=100.0; +ACT.scale('R11_PAO','meth_coal','2035','2040','M1','year')=100.0; +EXT.scale('R11_WEU','gas_3','a','2080')=10.0; +EXT.scale('R11_FSU','gas_4','a','2100')=10.0; +ACT.scale('R11_AFR','meth_coal','2020','2030','M1','year')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2090')=0.01; +EXT.scale('R11_SAS','gas_2','a','2025')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2060','2070','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2040','2050','M1','year')=100.0; +ACT.scale('R11_EEU','foil_trp','2045','2045','M1','year')=10.0; +EXT.scale('R11_FSU','gas_6','a','2040')=100.0; +EXT.scale('R11_WEU','gas_3','a','2060')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2035','2040','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2100','2110','M1','year')=100.0; +EXT.scale('R11_PAO','crude_5','a','2025')=100.0; +EXT.scale('R11_EEU','crude_1','a','2110')=10.0; +ACT.scale('R11_EEU','eth_ic_trp','2035','2035','M1','year')=10.0; +EXT.scale('R11_SAS','crude_3','a','2045')=100.0; +LAND.scale('R11_CPA','BIO06GHG000','2080')=0.1; +EXT.scale('R11_CPA','crude_2','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_5','2045','2045','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2020','2025','M1','year')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_MEA','oil_extr_7','2100','2100','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2045','2050','M1','year')=100.0; +EXT.scale('R11_EEU','crude_6','a','2055')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2035')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2100')=0.1; +EXT.scale('R11_PAS','crude_2','a','2045')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2100')=10.0; +EXT.scale('R11_FSU','gas_6','a','2070')=10.0; +ACT.scale('R11_AFR','h2_coal_ccs','2040','2045','M1','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2060','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG400','2090')=0.1; +LAND.scale('R11_CPA','BIO06GHG400','2090')=0.1; +ACT.scale('R11_WEU','eth_ic_trp','2080','2080','M1','year')=10.0; +EXT.scale('R11_WEU','gas_4','a','2060')=100.0; +EXT.scale('R11_PAS','gas_3','a','2070')=10.0; +EXT.scale('R11_CPA','gas_3','a','2110')=10.0; +EXT.scale('R11_WEU','crude_1','a','2070')=10.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2090')=10.0; +EXT.scale('R11_LAM','gas_3','a','2110')=10.0; +EXT.scale('R11_SAS','crude_1','a','2025')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_FSU','gas_4','a','2090')=10.0; +ACT.scale('R11_SAS','ref_lol','2010','2025','M1','year')=10.0; +EXT.scale('R11_MEA','coal','a','2025')=100.0; +ACT.scale('R11_LAM','foil_trp','2080','2080','M1','year')=10.0; +ACT.scale('R11_LAM','eth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_MEA','gas_5','a','2100')=10.0; +EXT.scale('R11_CPA','crude_3','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2035','2040','M1','year')=100.0; +EXT.scale('R11_FSU','crude_5','a','2050')=100.0; +EXT.scale('R11_PAS','crude_4','a','2080')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2045','2050','M1','year')=100.0; +EXT.scale('R11_SAS','gas_4','a','2045')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2040','2055','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG050','2055')=0.1; +EXT.scale('R11_EEU','gas_6','a','2035')=100.0; +LAND.scale('R11_SAS','BIO06GHG2000','2090')=0.01; +EXT.scale('R11_EEU','crude_3','a','2060')=100.0; +LAND.scale('R11_NAM','BIO06GHG100','2090')=0.1; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_WEU','gas_4','a','2080')=10.0; +EXT.scale('R11_AFR','crude_5','a','2040')=100.0; +LAND.scale('R11_AFR','BIO06GHG050','2050')=0.1; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2030','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG1500','2080')=0.1; +LAND.scale('R11_AFR','BIO06GHG100','2090')=0.1; +EXT.scale('R11_WEU','gas_5','a','2040')=100.0; +ACT.scale('R11_MEA','meth_coal','2080','2080','M1','year')=100.0; +EXT.scale('R11_WEU','lignite','a','2060')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_SAS','coal','a','2110')=10.0; +LAND.scale('R11_AFR','BIO06GHG600','2080')=0.1; +EXT.scale('R11_AFR','gas_4','a','2035')=100.0; +ACT.scale('R11_LAM','gas_cc','2110','2110','M1','year')=0.1; +EXT.scale('R11_MEA','crude_7','a','2055')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_CPA','gas_5','a','2055')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2060','2060','M1','year')=0.01; +EXT.scale('R11_PAS','crude_3','a','2060')=100.0; +EXT.scale('R11_MEA','crude_3','a','2025')=100.0; +ACT.scale('R11_PAO','syn_liq','2045','2060','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2050','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG000','2110')=0.1; +ACT.scale('R11_PAO','coal_gas','2035','2035','M1','year')=100.0; +EXT.scale('R11_LAM','crude_1','a','2080')=10.0; +LAND.scale('R11_LAM','BIO06GHG010','2080')=0.1; +ACT.scale('R11_SAS','h2_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2055')=100.0; +EXT.scale('R11_FSU','crude_7','a','2070')=10.0; +EXT.scale('R11_EEU','crude_3','a','2025')=100.0; +EXT.scale('R11_LAM','gas_6','a','2100')=10.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2100','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2025','2030','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2050')=100.0; +LAND.scale('R11_LAM','BIO05GHG3000','2110')=0.1; +LAND.scale('R11_AFR','BIO05GHG3000','2090')=0.1; +EXT.scale('R11_FSU','gas_5','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2025','2025','M1','year')=100.0; +ACT.scale('R11_EEU','replacement_so2','2080','2080','M1','year')=0.01; +ACT.scale('R11_CPA','oil_extr_1','2025','2030','M1','year')=100.0; +EXT.scale('R11_NAM','gas_3','a','2045')=100.0; +ACT.scale('R11_LAM','loil_trp','2040','2040','M1','year')=10.0; +LAND.scale('R11_NAM','BIO06GHG1000','2080')=0.1; +ACT.scale('R11_AFR','coal_gas','2025','2035','M1','year')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2055','year')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2045')=0.01; +ACT.scale('R11_AFR','h2_coal','2045','2050','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2030','2040','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2040','2060','M1','year')=100.0; +EXT.scale('R11_PAS','crude_2','a','2040')=100.0; +EXT.scale('R11_NAM','coal','a','2090')=10.0; +LAND.scale('R11_NAM','BIO06GHG100','2060')=0.1; +ACT.scale('R11_AFR','meth_coal','2030','2050','M1','year')=100.0; +EXT.scale('R11_WEU','crude_6','a','2045')=100.0; +EXT.scale('R11_EEU','gas_3','a','2110')=10.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_PAO','gas_2','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2040','2050','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2020','2030','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2035','2035','M1','year')=10.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2045','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2025','2025','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2040','2040','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG100','2080')=0.1; +ACT.scale('R11_PAO','meth_coal_ccs','2030','2035','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2080')=0.1; +ACT.scale('R11_CPA','oil_extr_1','2055','2055','M1','year')=100.0; +EXT.scale('R11_CPA','gas_5','a','2060')=100.0; +ACT.scale('R11_PAO','syn_liq','2055','2080','M1','year')=100.0; +EXT.scale('R11_PAO','crude_6','a','2035')=100.0; +EXT.scale('R11_SAS','crude_4','a','2045')=100.0; +ACT.scale('R11_MEA','h2_fc_trp','2100','2100','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG100','2100')=0.1; +EXT.scale('R11_EEU','gas_5','a','2070')=10.0; +ACT.scale('R11_PAO','coal_gas','2030','2045','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2060','2080','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG1500','2055')=0.1; +EXT.scale('R11_PAS','coal','a','2110')=10.0; +EXT.scale('R11_WEU','gas_3','a','2110')=10.0; +EXT.scale('R11_NAM','crude_6','a','2045')=100.0; +EXT.scale('R11_FSU','lignite','a','2030')=100.0; +EXT.scale('R11_PAO','crude_3','a','2070')=10.0; +EXT.scale('R11_LAM','coal','a','2100')=10.0; +ACT.scale('R11_EEU','meth_ic_trp','2040','2040','M1','year')=10.0; +EXT.scale('R11_WEU','gas_4','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal','2050','2070','M1','year')=100.0; +EXT.scale('R11_SAS','crude_7','a','2055')=100.0; +ACT.scale('R11_AFR','h2_coal','2025','2045','M1','year')=100.0; +ACT.scale('R11_AFR','eth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_FSU','lignite','a','2040')=100.0; +ACT.scale('R11_EEU','elec_t_d','2050','2080','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2035')=100.0; +EXT.scale('R11_AFR','lignite','a','2050')=100.0; +ACT.scale('R11_WEU','eth_ic_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_PAS','gas_4','a','2060')=100.0; +EXT.scale('R11_EEU','crude_2','a','2100')=10.0; +EXT.scale('R11_PAS','gas_1','a','2080')=10.0; +EXT.scale('R11_PAO','gas_5','a','2090')=10.0; +EXT.scale('R11_LAM','crude_4','a','2090')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2080','2100','M1','year')=100.0; +EXT.scale('R11_PAO','crude_6','a','2060')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2080','2080','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_4_ch4','2110','2110','M1','year')=100.0; +EXT.scale('R11_PAO','crude_4','a','2090')=10.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_MEA','coal','a','2110')=10.0; +ACT.scale('R11_PAO','syn_liq','2030','2030','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG400','2110')=0.1; +EXT.scale('R11_NAM','crude_7','a','2100')=10.0; +EXT.scale('R11_PAO','coal','a','2055')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2050')=0.01; +ACT.scale('R11_AFR','h2_coal','2045','2060','M1','year')=100.0; +EXT.scale('R11_MEA','gas_4','a','2060')=100.0; +ACT.scale('R11_PAO','meth_coal','2070','2070','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc','2040','2060','M1','year')=10.0; +EXT.scale('R11_FSU','crude_2','a','2100')=10.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2070')=10.0; +LAND.scale('R11_CPA','BIO06GHG010','2100')=0.1; +EXT.scale('R11_LAM','gas_5','a','2100')=10.0; +ACT.scale('R11_PAS','meth_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2055','2080','M1','year')=100.0; +EXT.scale('R11_EEU','gas_5','a','2060')=100.0; +EXT.scale('R11_NAM','crude_4','a','2110')=10.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_FSU','crude_7','a','2030')=100.0; +ACT.scale('R11_AFR','syn_liq','2060','2070','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2030')=100.0; +EXT.scale('R11_LAM','coal','a','2055')=100.0; +ACT.scale('R11_EEU','elec_t_d','2055','2070','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG1000','2100')=0.1; +EXT.scale('R11_SAS','crude_2','a','2090')=10.0; +EXT.scale('R11_LAM','gas_4','a','2045')=100.0; +ACT.scale('R11_AFR','meth_coal','2060','2060','M1','year')=100.0; +ACT.scale('R11_AFR','meth_fc_trp','2080','2080','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG2000','2100')=0.1; +ACT.scale('R11_AFR','h2_coal_ccs','2035','2045','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2025','2025','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2030','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2050','2055','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2050')=0.1; +EXT.scale('R11_NAM','coal','a','2110')=10.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2030')=0.01; +EXT.scale('R11_FSU','crude_2','a','2060')=100.0; +EXT.scale('R11_FSU','crude_1','a','2090')=10.0; +ACT.scale('R11_PAO','coal_gas','2010','2030','M1','year')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2030','2030','M1','year')=100.0; +EXT.scale('R11_LAM','gas_5','a','2060')=100.0; +LAND.scale('R11_LAM','BIO06GHG100','2100')=0.1; +EXT.scale('R11_MEA','crude_3','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2035','2035','M1','year')=100.0; +EXT.scale('R11_EEU','crude_6','a','2050')=100.0; +ACT.scale('R11_LAM','h2_coal','2030','2030','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_7','2055','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2030','2030','M1','year')=100.0; +LAND.scale('R11_SAS','BIO06GHG3000','2080')=0.1; +EXT.scale('R11_CPA','gas_6','a','2025')=100.0; +ACT.scale('R11_PAO','syn_liq','2025','2030','M1','year')=100.0; +EXT.scale('R11_WEU','crude_3','a','2110')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2055','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_5','a','2055')=100.0; +EXT.scale('R11_FSU','lignite','a','2050')=100.0; +ACT.scale('R11_PAO','meth_coal','2070','2090','M1','year')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2110','2110','M1','year')=0.01; +ACT.scale('R11_AFR','meth_coal','2050','2050','M1','year')=100.0; +ACT.scale('R11_LAM','foil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_WEU','crude_6','a','2060')=100.0; +LAND.scale('R11_AFR','BIO05GHG020','2090')=0.1; +LAND.scale('R11_AFR','BIO06GHG2000','2110')=0.1; +LAND.scale('R11_NAM','BIO06GHG1500','2110')=0.1; +ACT.scale('R11_CPA','oil_extr_3','2040','2045','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2040','2045','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2100','2100','M1','year')=100.0; +EXT.scale('R11_AFR','crude_5','a','2060')=100.0; +EXT.scale('R11_CPA','crude_4','a','2035')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2035')=0.01; +ACT.scale('R11_PAO','syn_liq','2030','2045','M1','year')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_MEA','gas_1','a','2070')=10.0; +EXT.scale('R11_NAM','gas_3','a','2040')=100.0; +EXT.scale('R11_PAS','gas_3','a','2055')=100.0; +ACT.scale('R11_AFR','coal_gas','2035','2040','M1','year')=100.0; +EXT.scale('R11_WEU','coal','a','2070')=10.0; +EXT.scale('R11_FSU','coal','a','2055')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2080','2080','M1','year')=100.0; +EXT.scale('R11_PAS','crude_7','a','2100')=10.0; +EXT.scale('R11_CPA','gas_2','a','2055')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2055','2060','M1','year')=100.0; +EXT.scale('R11_LAM','crude_7','a','2045')=100.0; +EXT.scale('R11_PAS','crude_6','a','2090')=10.0; +EXT.scale('R11_CPA','lignite','a','2110')=10.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_LAM','crude_3','a','2110')=10.0; +EXT.scale('R11_PAO','coal','a','2070')=10.0; +ACT.scale('R11_WEU','eth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_AFR','meth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_WEU','foil_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_CPA','crude_5','a','2080')=10.0; +LAND.scale('R11_LAM','BIO05GHG050','2100')=0.1; +EXT.scale('R11_WEU','coal','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_SAS','coal','a','2090')=10.0; +EXT.scale('R11_SAS','coal','a','2050')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2045','2050','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2040','2040','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2040','2050','M1','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2025')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2035','2050','M1','year')=100.0; +EXT.scale('R11_FSU','gas_5','a','2060')=100.0; +EXT.scale('R11_PAS','gas_5','a','2060')=100.0; +EXT.scale('R11_WEU','crude_7','a','2090')=10.0; +EXT.scale('R11_CPA','crude_4','a','2040')=100.0; +ACT.scale('R11_AFR','h2_coal','2050','2070','M1','year')=100.0; +EXT.scale('R11_PAO','crude_5','a','2055')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_CPA','gas_4','a','2030')=100.0; +ACT.scale('R11_SAS','h2_fc_trp','2080','2080','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2090')=0.1; +EXT.scale('R11_MEA','gas_3','a','2090')=10.0; +EXT.scale('R11_PAO','gas_2','a','2030')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2060')=0.01; +LAND.scale('R11_AFR','BIO05GHG400','2070')=0.1; +EXT.scale('R11_LAM','crude_2','a','2110')=10.0; +ACT.scale('R11_LAM','eth_ic_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_AFR','h2_coal','2055','2055','M1','year')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2060','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2060','2060','M1','year')=100.0; +EXT.scale('R11_FSU','lignite','a','2090')=10.0; +LAND.scale('R11_CPA','BIO06GHG050','2100')=0.1; +ACT.scale('R11_PAO','syn_liq_ccs','2045','2045','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG400','2090')=0.1; +EXT.scale('R11_LAM','crude_3','a','2030')=100.0; +ACT.scale('R11_PAO','meth_coal','2090','2100','M1','year')=100.0; +EXT.scale('R11_AFR','gas_3','a','2060')=100.0; +EXT.scale('R11_WEU','crude_1','a','2055')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2050')=100.0; +ACT.scale('R11_LAM','syn_liq','2025','2045','M1','year')=10.0; +EXT.scale('R11_PAO','crude_6','a','2025')=100.0; +EXT.scale('R11_PAS','crude_7','a','2110')=10.0; +ACT.scale('R11_SAS','ref_hil','2000','2025','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_1','2100','2100','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2060','2060','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2025','2025','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2100','2110','M1','year')=100.0; +EXT.scale('R11_FSU','crude_6','a','2100')=10.0; +EXT.scale('R11_EEU','gas_2','a','2060')=100.0; +EXT.scale('R11_CPA','crude_4','a','2070')=10.0; +EXT.scale('R11_MEA','gas_6','a','2060')=100.0; +EXT.scale('R11_FSU','crude_6','a','2090')=10.0; +EXT.scale('R11_LAM','gas_2','a','2055')=100.0; +LAND.scale('R11_NAM','BIO06GHG1500','2080')=0.1; +ACT.scale('R11_CPA','oil_extr_2','2035','2040','M1','year')=100.0; +EXT.scale('R11_NAM','lignite','a','2040')=100.0; +EXT.scale('R11_NAM','coal','a','2100')=10.0; +LAND.scale('R11_NAM','BIO06GHG2000','2070')=0.1; +LAND.scale('R11_AFR','BIO06GHG2000','2060')=0.1; +EXT.scale('R11_WEU','crude_5','a','2050')=100.0; +LAND.scale('R11_LAM','BIO05GHG2000','2110')=0.1; +ACT.scale('R11_PAO','h2_fc_trp','2050','2050','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2035','2055','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal','2045','2045','M1','year')=10.0; +EXT.scale('R11_PAO','crude_7','a','2080')=10.0; +LAND.scale('R11_LAM','BIO06GHG1500','2110')=0.1; +EXT.scale('R11_PAS','crude_1','a','2100')=10.0; +ACT.scale('R11_MEA','syn_liq','2055','2080','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq','2070','2080','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2055','2055','M1','year')=100.0; +EXT.scale('R11_LAM','crude_6','a','2040')=100.0; +EXT.scale('R11_PAO','crude_1','a','2060')=100.0; +LAND.scale('R11_PAS','BIO06GHG3000','2100')=0.01; +LAND.scale('R11_LAM','BIO05GHG100','2100')=0.1; +EXT.scale('R11_NAM','gas_4','a','2060')=100.0; +ACT.scale('R11_AFR','syn_liq','2025','2030','M1','year')=100.0; +EXT.scale('R11_WEU','crude_7','a','2030')=100.0; +EXT.scale('R11_LAM','gas_4','a','2100')=10.0; +EXT.scale('R11_EEU','gas_4','a','2040')=100.0; +EXT.scale('R11_NAM','gas_1','a','2045')=100.0; +EXT.scale('R11_EEU','coal','a','2070')=10.0; +LAND.scale('R11_AFR','BIO06GHG000','2055')=0.1; +EXT.scale('R11_EEU','gas_3','a','2090')=10.0; +EXT.scale('R11_CPA','crude_5','a','2055')=100.0; +EXT.scale('R11_SAS','crude_7','a','2100')=10.0; +EXT.scale('R11_PAO','crude_1','a','2035')=100.0; +EXT.scale('R11_CPA','gas_1','a','2050')=100.0; +EXT.scale('R11_MEA','crude_7','a','2080')=10.0; +EXT.scale('R11_EEU','crude_2','a','2030')=100.0; +LAND.scale('R11_AFR','BIO05GHG200','2100')=0.1; +EXT.scale('R11_CPA','crude_5','a','2090')=10.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2030')=100.0; +EXT.scale('R11_NAM','gas_6','a','2055')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_PAO','gas_6','a','2025')=100.0; +EXT.scale('R11_PAS','crude_3','a','2080')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2090','2090','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2040','2045','M1','year')=100.0; +EXT.scale('R11_LAM','crude_5','a','2080')=10.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_SAS','crude_1','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2050','2050','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG2000','2110')=0.1; +EXT.scale('R11_WEU','gas_1','a','2110')=10.0; +EXT.scale('R11_FSU','gas_3','a','2080')=10.0; +EXT.scale('R11_LAM','crude_5','a','2100')=10.0; +EXT.scale('R11_FSU','gas_2','a','2110')=10.0; +EXT.scale('R11_MEA','coal','a','2035')=100.0; +EXT.scale('R11_FSU','crude_1','a','2110')=10.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2060')=0.01; +CAP_NEW.scale('R11_MEA','mvac_co2','2045')=0.01; +EXT.scale('R11_LAM','crude_7','a','2040')=100.0; +LAND.scale('R11_AFR','BIO05GHG400','2080')=0.1; +ACT.scale('R11_LAM','eth_fc_trp','2025','2025','M1','year')=100.0; +EXT.scale('R11_EEU','crude_7','a','2110')=10.0; +ACT.scale('R11_AFR','syn_liq','2050','2070','M1','year')=100.0; +LAND.scale('R11_FSU','BIO06GHG1500','2110')=0.1; +EXT.scale('R11_PAS','gas_2','a','2060')=100.0; +ACT.scale('R11_EEU','foil_trp','2050','2050','M1','year')=10.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2080','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2025','2030','M1','year')=10.0; +EXT.scale('R11_SAS','coal','a','2025')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2040','year')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2035','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG600','2090')=0.1; +EXT.scale('R11_PAO','lignite','a','2070')=10.0; +EXT.scale('R11_AFR','gas_6','a','2045')=100.0; +EXT.scale('R11_EEU','gas_5','a','2055')=100.0; +EXT.scale('R11_PAS','crude_1','a','2035')=100.0; +LAND.scale('R11_PAS','BIO06GHG1500','2110')=0.01; +EXT.scale('R11_PAO','crude_1','a','2045')=100.0; +ACT.scale('R11_MEA','coal_gas','2050','2070','M1','year')=100.0; +EXT.scale('R11_WEU','crude_5','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2055','2055','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq','2070','2090','M1','year')=100.0; +EXT.scale('R11_PAS','crude_1','a','2025')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2070')=0.1; +EXT.scale('R11_WEU','crude_7','a','2060')=100.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2110')=0.01; +LAND.scale('R11_LAM','BIO05GHG600','2080')=0.1; +EXT.scale('R11_NAM','gas_1','a','2040')=100.0; +EXT.scale('R11_PAO','crude_2','a','2035')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2045','2050','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2100','2110','M1','year')=100.0; +EXT.scale('R11_WEU','lignite','a','2090')=10.0; +ACT.scale('R11_AFR','meth_coal','2025','2045','M1','year')=100.0; +EXT.scale('R11_EEU','crude_2','a','2025')=100.0; +ACT.scale('R11_EEU','loil_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_PAS','eth_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_EEU','crude_5','a','2030')=100.0; +EXT.scale('R11_PAS','gas_1','a','2100')=10.0; +EXT.scale('R11_SAS','crude_2','a','2080')=10.0; +EXT.scale('R11_PAO','crude_6','a','2030')=100.0; +EXT.scale('R11_EEU','lignite','a','2100')=10.0; +EXT.scale('R11_AFR','gas_4','a','2030')=100.0; +EXT.scale('R11_MEA','gas_4','a','2100')=10.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2055')=0.01; +ACT.scale('R11_PAO','loil_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_CPA','crude_5','a','2035')=100.0; +EXT.scale('R11_WEU','gas_6','a','2040')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2035','2045','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2060','2070','M1','year')=100.0; +EXT.scale('R11_SAS','gas_5','a','2045')=100.0; +EXT.scale('R11_PAS','crude_2','a','2080')=10.0; +LAND.scale('R11_LAM','BIO06GHG000','2070')=0.1; +ACT.scale('R11_PAO','meth_coal','2040','2055','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2045','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2060','2060','M1','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2035','2055','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2090')=10.0; +EXT.scale('R11_EEU','gas_2','a','2080')=10.0; +ACT.scale('R11_LAM','gas_cc_ccs','2060','2060','M1','year')=10.0; +EXT.scale('R11_CPA','gas_6','a','2040')=100.0; +LAND.scale('R11_SAS','BIO06GHG1500','2100')=0.01; +ACT.scale('R11_PAO','syn_liq','2020','2040','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2050')=100.0; +EXT.scale('R11_PAO','crude_7','a','2090')=10.0; +ACT.scale('R11_AFR','meth_coal','2040','2060','M1','year')=100.0; +EXT.scale('R11_LAM','gas_5','a','2080')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2030','2035','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2110')=10.0; +EXT.scale('R11_NAM','gas_5','a','2110')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2060','2070','M1','year')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2055')=0.01; +ACT.scale('R11_LAM','h2_coal','2040','2045','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2110','2110','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2035','2035','M1','year')=10.0; +ACT.scale('R11_MEA','coal_gas','2080','2080','M1','year')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_SAS','crude_2','a','2035')=100.0; +ACT.scale('R11_WEU','loil_trp','2110','2110','M1','year')=10.0; +LAND.scale('R11_SAS','BIO06GHG1000','2110')=0.01; +LAND.scale('R11_AFR','BIO06GHG000','2060')=0.1; +ACT.scale('R11_AFR','meth_coal_ccs','2060','2060','M1','year')=100.0; +ACT.scale('R11_PAS','meth_fc_trp','2030','2030','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2055','2070','M1','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2110')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2100','2100','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG600','2110')=0.1; +EXT.scale('R11_LAM','crude_3','a','2045')=100.0; +EXT.scale('R11_SAS','crude_7','a','2050')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2080')=10.0; +ACT.scale('R11_EEU','replacement_so2','2060','2070','M1','year')=0.01; +EXT.scale('R11_PAO','crude_6','a','2110')=10.0; +LAND.scale('R11_AFR','BIO06GHG100','2070')=0.1; +EXT.scale('R11_EEU','gas_6','a','2090')=10.0; +ACT.scale('R11_MEA','coal_gas','2055','2080','M1','year')=100.0; +ACT.scale('R11_WEU','eth_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2080')=10.0; +EXT.scale('R11_EEU','crude_7','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2045','2045','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2090','2110','M1','year')=100.0; +EXT.scale('R11_NAM','gas_2','a','2060')=100.0; +EXT.scale('R11_WEU','crude_6','a','2050')=100.0; +EXT.scale('R11_CPA','coal','a','2110')=10.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2110')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2035','2040','M1','year')=100.0; +EXT.scale('R11_FSU','gas_3','a','2060')=100.0; +ACT.scale('R11_AFR','coal_gas','2040','2055','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2015','2030','M1','year')=100.0; +EXT.scale('R11_EEU','crude_7','a','2090')=10.0; +EXT.scale('R11_SAS','lignite','a','2100')=10.0; +EXT.scale('R11_WEU','crude_6','a','2100')=10.0; +LAND.scale('R11_NAM','BIO05GHG1000','2090')=0.1; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2055','2060','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2090')=10.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2110')=0.01; +EXT.scale('R11_LAM','gas_4','a','2040')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2050','2070','M1','year')=100.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_CPA','crude_5','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2050','2055','M1','year')=100.0; +EXT.scale('R11_WEU','crude_4','a','2035')=100.0; +EXT.scale('R11_PAO','crude_4','a','2110')=10.0; +ACT.scale('R11_PAO','coal_gas','2035','2045','M1','year')=100.0; +ACT.scale('R11_SAS','ref_lol','2000','2025','M1','year')=10.0; +EXT.scale('R11_EEU','crude_6','a','2060')=100.0; +ACT.scale('R11_PAO','meth_ic_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_CPA','coal','a','2025')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2080','2100','M1','year')=100.0; +EXT.scale('R11_CPA','crude_6','a','2080')=10.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2060')=0.01; +EXT.scale('R11_WEU','coal','a','2100')=10.0; +EXT.scale('R11_SAS','crude_5','a','2025')=100.0; +LAND.scale('R11_AFR','BIO06GHG2000','2050')=0.1; +LAND.scale('R11_LAM','BIO06GHG2000','2080')=0.1; +ACT.scale('R11_AFR','syn_liq','2020','2040','M1','year')=100.0; +EXT.scale('R11_CPA','crude_5','a','2100')=10.0; +EXT.scale('R11_PAO','gas_6','a','2070')=10.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2050','year')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2035','2040','M1','year')=10.0; +LAND.scale('R11_AFR','BIO05GHG2000','2090')=0.1; +ACT.scale('R11_PAO','coal_gas','2050','2055','M1','year')=100.0; +EXT.scale('R11_CPA','crude_1','a','2100')=10.0; +EXT.scale('R11_EEU','crude_1','a','2035')=100.0; +ACT.scale('R11_PAO','meth_coal','2040','2060','M1','year')=100.0; +EXT.scale('R11_NAM','gas_3','a','2060')=100.0; +ACT.scale('R11_EEU','elec_t_d','2100','2100','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG000','2080')=0.1; +ACT.scale('R11_PAO','syn_liq','2050','2055','M1','year')=100.0; +ACT.scale('R11_EEU','recycling_gas1','2070','2070','M1','year')=0.01; +LAND.scale('R11_CPA','BIO06GHG400','2080')=0.1; +EXT.scale('R11_EEU','crude_6','a','2070')=10.0; +EXT.scale('R11_MEA','gas_6','a','2100')=10.0; +LAND.scale('R11_LAM','BIO05GHG010','2100')=0.1; +ACT.scale('R11_LAM','eth_ic_trp','2030','2030','M1','year')=10.0; +EXT.scale('R11_LAM','crude_5','a','2045')=100.0; +EXT.scale('R11_AFR','gas_3','a','2100')=10.0; +EXT.scale('R11_MEA','coal','a','2040')=100.0; +ACT.scale('R11_PAO','h2_coal','2050','2050','M1','year')=100.0; +EXT.scale('R11_PAO','crude_1','a','2050')=100.0; +EXT.scale('R11_CPA','gas_5','a','2100')=10.0; +LAND.scale('R11_NAM','BIO05GHG2000','2110')=0.1; +ACT.scale('R11_PAO','meth_coal_ccs','2070','2080','M1','year')=100.0; +EXT.scale('R11_NAM','gas_5','a','2045')=100.0; +ACT.scale('R11_MEA','h2_coal','2070','2070','M1','year')=100.0; +EXT.scale('R11_SAS','coal','a','2030')=100.0; +EXT.scale('R11_SAS','crude_1','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG000','2110')=0.1; +ACT.scale('R11_PAS','loil_trp','2080','2080','M1','year')=10.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2090')=0.01; +ACT.scale('R11_AFR','h2_coal','2010','2030','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2045','2045','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2045','2060','M1','year')=100.0; +EXT.scale('R11_MEA','coal','a','2030')=100.0; +EXT.scale('R11_NAM','gas_1','a','2070')=10.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_WEU','crude_2','a','2080')=10.0; +ACT.scale('R11_EEU','elec_t_d','2030','2080','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2035','2040','M1','year')=100.0; +EXT.scale('R11_WEU','gas_5','a','2070')=10.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2045')=0.01; +ACT.scale('R11_AFR','coal_gas','2055','2070','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2025','2040','M1','year')=10.0; +EXT.scale('R11_EEU','crude_7','a','2100')=10.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2030')=0.01; +EXT.scale('R11_AFR','crude_2','a','2035')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2060','2070','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2035')=100.0; +EXT.scale('R11_WEU','crude_1','a','2060')=100.0; +ACT.scale('R11_PAO','meth_coal','2055','2060','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2050','2070','M1','year')=100.0; +EXT.scale('R11_SAS','crude_7','a','2035')=100.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2070','2080','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2055','2060','M1','year')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2025')=0.01; +EXT.scale('R11_LAM','gas_6','a','2060')=100.0; +LAND.scale('R11_AFR','BIO06GHG010','2055')=0.1; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_CPA','crude_3','a','2035')=100.0; +EXT.scale('R11_LAM','gas_4','a','2060')=100.0; +EXT.scale('R11_AFR','lignite','a','2100')=10.0; +EXT.scale('R11_LAM','coal','a','2060')=100.0; +LAND.scale('R11_AFR','BIO06GHG050','2060')=0.1; +EXT.scale('R11_PAO','crude_5','a','2030')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2080','2080','M1','year')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2055','2055','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2045','2055','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2080','2100','M1','year')=100.0; +EXT.scale('R11_PAO','gas_6','a','2090')=10.0; +ACT.scale('R11_PAO','h2_coal_ccs','2045','2060','M1','year')=100.0; +EXT.scale('R11_AFR','crude_1','a','2035')=100.0; +LAND.scale('R11_AFR','BIO06GHG200','2060')=0.1; +ACT.scale('R11_EEU','elec_t_d','2060','2090','M1','year')=100.0; +EXT.scale('R11_AFR','crude_5','a','2050')=100.0; +EXT.scale('R11_SAS','crude_3','a','2060')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2045','2055','M1','year')=100.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2060')=0.01; +ACT.scale('R11_MEA','syn_liq_ccs','2080','2090','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2055','2055','M1','year')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2060','2060','M1','year')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2070','2070','M1','year')=0.01; +LAND.scale('R11_SAS','BIO06GHG3000','2100')=0.1; +EXT.scale('R11_LAM','gas_6','a','2110')=10.0; +ACT.scale('R11_PAO','meth_coal','2070','2080','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG010','2090')=0.1; +EXT.scale('R11_NAM','crude_1','a','2100')=10.0; +EXT.scale('R11_EEU','crude_2','a','2060')=100.0; +EXT.scale('R11_LAM','crude_5','a','2060')=100.0; +EXT.scale('R11_WEU','lignite','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2030','2030','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG2000','2100')=0.1; +EXT.scale('R11_LAM','gas_1','a','2040')=100.0; +EXT.scale('R11_FSU','gas_1','a','2035')=100.0; +ACT.scale('R11_EEU','recycling_gas1','2060','2060','M1','year')=0.01; +ACT.scale('R11_AFR','syn_liq','2020','2035','M1','year')=100.0; +EXT.scale('R11_AFR','coal','a','2050')=100.0; +LAND.scale('R11_LAM','BIO06GHG400','2110')=0.1; +EXT.scale('R11_EEU','gas_6','a','2080')=10.0; +EXT.scale('R11_PAO','gas_3','a','2110')=10.0; +LAND.scale('R11_CPA','BIO06GHG020','2090')=0.1; +LAND.scale('R11_LAM','BIO06GHG200','2080')=0.1; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_MEA','crude_5','a','2025')=100.0; +EXT.scale('R11_WEU','crude_1','a','2050')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2110','2110','M1','year')=100.0; +LAND.scale('R11_PAS','BIO06GHG1000','2100')=0.01; +EXT.scale('R11_MEA','gas_5','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2110','2110','M1','year')=100.0; +EXT.scale('R11_PAS','crude_4','a','2040')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2040','2040','M1','year')=100.0; +EXT.scale('R11_EEU','crude_7','a','2025')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2055')=0.01; +LAND.scale('R11_AFR','BIO06GHG600','2045')=0.1; +LAND.scale('R11_NAM','BIO06GHG600','2080')=0.1; +ACT.scale('R11_EEU','elec_t_d','2100','2110','M1','year')=100.0; +EXT.scale('R11_AFR','crude_5','a','2070')=10.0; +EXT.scale('R11_WEU','gas_5','a','2055')=100.0; +EXT.scale('R11_PAO','crude_3','a','2080')=10.0; +EXT.scale('R11_SAS','gas_6','a','2030')=100.0; +EXT.scale('R11_PAO','gas_2','a','2040')=100.0; +EXT.scale('R11_AFR','gas_6','a','2070')=10.0; +LAND.scale('R11_LAM','BIO06GHG010','2060')=0.1; +EXT.scale('R11_LAM','crude_6','a','2090')=10.0; +EXT.scale('R11_WEU','gas_1','a','2025')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_MEA','gas_1','a','2040')=100.0; +EXT.scale('R11_LAM','gas_3','a','2050')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2040','2040','M1','year')=10.0; +EXT.scale('R11_PAO','crude_5','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2045','2050','M1','year')=100.0; +EXT.scale('R11_FSU','crude_7','a','2100')=10.0; +EXT.scale('R11_EEU','gas_2','a','2045')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2035','2040','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal_ccs','2035','2035','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2070','2070','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2050','2050','M1','year')=100.0; +EXT.scale('R11_WEU','crude_5','a','2060')=100.0; +ACT.scale('R11_LAM','foil_trp','2110','2110','M1','year')=10.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_PAO','lignite','a','2035')=100.0; +ACT.scale('R11_LAM','coal_gas','2015','2035','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal','2035','2035','M1','year')=100.0; +EXT.scale('R11_PAS','crude_7','a','2050')=100.0; +EXT.scale('R11_SAS','coal','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2040','2040','M1','year')=100.0; +EXT.scale('R11_WEU','crude_7','a','2110')=10.0; +ACT.scale('R11_PAO','h2_coal_ccs','2055','2060','M1','year')=100.0; +EXT.scale('R11_AFR','crude_4','a','2100')=10.0; +EXT.scale('R11_PAS','gas_4','a','2080')=10.0; +EXT.scale('R11_SAS','gas_3','a','2080')=10.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2040')=0.01; +ACT.scale('R11_AFR','coal_gas','2020','2025','M1','year')=100.0; +EXT.scale('R11_EEU','crude_7','a','2050')=100.0; +EXT.scale('R11_LAM','gas_2','a','2070')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2060','2070','M1','year')=100.0; +ACT.scale('R11_MEA','h2_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_AFR','crude_1','a','2055')=100.0; +LAND.scale('R11_LAM','BIO05GHG400','2090')=0.1; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2050','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2090','2100','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2090')=10.0; +EXT.scale('R11_PAS','gas_6','a','2060')=100.0; +EXT.scale('R11_LAM','crude_4','a','2110')=10.0; +EXT.scale('R11_LAM','crude_4','a','2040')=100.0; +LAND.scale('R11_CPA','BIO06GHG020','2110')=0.1; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2045','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2100','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2035','2055','M1','year')=100.0; +EXT.scale('R11_EEU','crude_6','a','2080')=10.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2070','2070','M1','year')=100.0; +EXT.scale('R11_PAS','gas_1','a','2060')=100.0; +EXT.scale('R11_NAM','gas_5','a','2050')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2055','2080','M1','year')=100.0; +EXT.scale('R11_PAS','crude_4','a','2025')=100.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2050')=0.01; +ACT.scale('R11_AFR','h2_coal_ccs','2070','2070','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG020','2100')=0.1; +ACT.scale('R11_PAS','eth_fc_trp','2025','2025','M1','year')=100.0; +EXT.scale('R11_LAM','crude_3','a','2080')=10.0; +EXT.scale('R11_MEA','coal','a','2100')=10.0; +LAND.scale('R11_AFR','BIO06GHG2000','2045')=0.1; +EXT.scale('R11_WEU','coal','a','2110')=10.0; +EXT.scale('R11_NAM','gas_1','a','2090')=10.0; +EXT.scale('R11_MEA','crude_6','a','2070')=10.0; +ACT.scale('R11_PAO','meth_coal','2035','2050','M1','year')=100.0; +EXT.scale('R11_SAS','gas_3','a','2035')=100.0; +EXT.scale('R11_AFR','lignite','a','2090')=10.0; +EXT.scale('R11_LAM','gas_5','a','2070')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2045','2045','M1','year')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_NAM','crude_7','a','2040')=100.0; +EXT.scale('R11_MEA','crude_1','a','2100')=10.0; +ACT.scale('R11_PAO','coal_gas','2050','2070','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG200','2100')=0.1; +EXT.scale('R11_AFR','crude_3','a','2055')=100.0; +EXT.scale('R11_LAM','crude_2','a','2050')=100.0; +ACT.scale('R11_PAO','h2_coal','2035','2055','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2045','2070','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2045','2070','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2045','2070','M1','year')=100.0; +ACT.scale('R11_SAS','eth_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_LAM','coal','a','2045')=100.0; +EXT.scale('R11_PAS','crude_7','a','2040')=100.0; +ACT.scale('R11_AFR','syn_liq','2035','2050','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2045','2050','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal_ccs','2030','2045','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_7','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2090','2090','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2040','2045','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG100','2110')=0.1; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2035','2045','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2055','2060','M1','year')=100.0; +ACT.scale('R11_PAS','foil_trp','2070','2070','M1','year')=10.0; +ACT.scale('R11_AFR','h2_coal','2025','2035','M1','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2080')=10.0; +LAND.scale('R11_CPA','BIO06GHG100','2080')=0.1; +EXT.scale('R11_AFR','crude_4','a','2035')=100.0; +ACT.scale('R11_LAM','meth_coal','2025','2035','M1','year')=10.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_PAS','crude_1','a','2110')=10.0; +EXT.scale('R11_LAM','crude_2','a','2035')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2030','2045','M1','year')=10.0; +EXT.scale('R11_EEU','gas_4','a','2030')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_NAM','gas_4','a','2110')=10.0; +EXT.scale('R11_FSU','crude_3','a','2060')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2050','2060','M1','year')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_NAM','gas_4','a','2090')=10.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2080','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG600','2060')=0.1; +EXT.scale('R11_FSU','gas_3','a','2045')=100.0; +EXT.scale('R11_EEU','gas_2','a','2025')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_WEU','gas_3','a','2040')=100.0; +LAND.scale('R11_SAS','BIO05GHG3000','2100')=0.1; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_AFR','gas_2','a','2035')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2070','2070','M1','year')=10.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2050','2055','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG600','2100')=0.1; +EXT.scale('R11_NAM','crude_7','a','2030')=100.0; +EXT.scale('R11_EEU','crude_5','a','2025')=100.0; +EXT.scale('R11_NAM','crude_1','a','2045')=100.0; +EXT.scale('R11_WEU','gas_6','a','2050')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2055','2055','M1','year')=10.0; +ACT.scale('R11_PAS','foil_trp','2080','2080','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG200','2050')=0.1; +ACT.scale('R11_WEU','foil_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_MEA','meth_coal_ccs','2070','2090','M1','year')=100.0; +EXT.scale('R11_WEU','crude_3','a','2045')=100.0; +EXT.scale('R11_WEU','crude_5','a','2045')=100.0; +ACT.scale('R11_LAM','h2_coal','2025','2025','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal','2020','2040','M1','year')=100.0; +ACT.scale('R11_PAS','meth_ic_trp','2080','2080','M1','year')=10.0; +EXT.scale('R11_WEU','crude_4','a','2040')=100.0; +ACT.scale('R11_PAO','coal_gas','2035','2050','M1','year')=100.0; +EXT.scale('R11_MEA','gas_4','a','2025')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2080','2080','M1','year')=10.0; +EXT.scale('R11_PAO','lignite','a','2040')=100.0; +EXT.scale('R11_FSU','gas_2','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2055','2055','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2010','2070','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2055','2080','M1','year')=100.0; +EXT.scale('R11_WEU','lignite','a','2045')=100.0; +LAND.scale('R11_NAM','BIO06GHG400','2080')=0.1; +ACT.scale('R11_LAM','h2_fc_trp','2040','2045','M1','year')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2035','2035','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2040','2040','M1','year')=100.0; +ACT.scale('R11_FSU','meth_fc_trp','2100','2100','M1','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_WEU','crude_6','a','2030')=100.0; +EXT.scale('R11_MEA','gas_6','a','2040')=100.0; +EXT.scale('R11_LAM','gas_4','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2025','2030','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2080','2080','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG010','2070')=0.1; +EXT.scale('R11_WEU','crude_7','a','2050')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2045')=0.01; +ACT.scale('R11_PAO','h2_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_EEU','crude_7','a','2040')=100.0; +LAND.scale('R11_NAM','BIO06GHG050','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_3_ch4','2110','2110','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2060','2060','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2090','2100','M1','year')=100.0; +EXT.scale('R11_SAS','crude_5','a','2090')=10.0; +EXT.scale('R11_EEU','gas_1','a','2030')=100.0; +ACT.scale('R11_PAO','syn_liq','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2080','2100','M1','year')=100.0; +EXT.scale('R11_AFR','gas_4','a','2025')=100.0; +ACT.scale('R11_EEU','loil_trp','2060','2060','M1','year')=10.0; +ACT.scale('R11_PAO','meth_coal','2055','2070','M1','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2090')=10.0; +ACT.scale('R11_EEU','loil_trp','2080','2080','M1','year')=10.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2055')=0.01; +ACT.scale('R11_PAS','meth_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_PAO','crude_2','a','2030')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_SAS','lignite','a','2040')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_NAM','crude_3','a','2090')=10.0; +ACT.scale('R11_EEU','meth_ic_trp','2045','2045','M1','year')=10.0; +EXT.scale('R11_NAM','crude_4','a','2050')=100.0; +EXT.scale('R11_EEU','crude_7','a','2070')=10.0; +EXT.scale('R11_CPA','lignite','a','2025')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2080')=0.01; +EXT.scale('R11_PAO','crude_5','a','2060')=100.0; +EXT.scale('R11_PAS','coal','a','2055')=100.0; +ACT.scale('R11_LAM','coal_gas','2015','2030','M1','year')=10.0; +EXT.scale('R11_CPA','coal','a','2035')=100.0; +ACT.scale('R11_PAO','h2_coal','2040','2050','M1','year')=100.0; +EXT.scale('R11_FSU','crude_2','a','2080')=10.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2025')=0.01; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2070','2080','M1','year')=100.0; +EXT.scale('R11_NAM','gas_2','a','2055')=100.0; +EXT.scale('R11_CPA','crude_3','a','2045')=100.0; +EXT.scale('R11_FSU','lignite','a','2035')=100.0; +EXT.scale('R11_SAS','gas_6','a','2035')=100.0; +ACT.scale('R11_LAM','syn_liq','2040','2040','M1','year')=10.0; +ACT.scale('R11_AFR','syn_liq','2030','2035','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2045','2050','M1','year')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2025')=0.01; +ACT.scale('R11_MEA','syn_liq','2090','2100','M1','year')=100.0; +EXT.scale('R11_EEU','crude_5','a','2040')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2035')=0.01; +ACT.scale('R11_EEU','SF6_TCE','2100','2100','M1','year')=0.01; +ACT.scale('R11_PAO','syn_liq','2080','2100','M1','year')=100.0; +EXT.scale('R11_EEU','coal','a','2055')=100.0; +ACT.scale('R11_SAS','eth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_PAS','lignite','a','2090')=10.0; +EXT.scale('R11_CPA','gas_2','a','2110')=10.0; +EXT.scale('R11_CPA','crude_7','a','2030')=100.0; +LAND.scale('R11_NAM','BIO06GHG050','2090')=0.1; +EXT.scale('R11_AFR','crude_6','a','2090')=10.0; +LAND.scale('R11_NAM','BIO05GHG3000','2100')=0.1; +EXT.scale('R11_FSU','crude_6','a','2030')=100.0; +EXT.scale('R11_WEU','crude_5','a','2080')=10.0; +EXT.scale('R11_AFR','gas_3','a','2070')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2030','2035','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2040')=100.0; +EXT.scale('R11_WEU','crude_7','a','2055')=100.0; +ACT.scale('R11_AFR','coal_gas','2035','2055','M1','year')=100.0; +EXT.scale('R11_PAS','gas_1','a','2025')=100.0; +ACT.scale('R11_PAO','meth_coal','2080','2090','M1','year')=100.0; +EXT.scale('R11_MEA','gas_5','a','2040')=100.0; +EXT.scale('R11_PAO','crude_1','a','2090')=10.0; +EXT.scale('R11_FSU','lignite','a','2070')=10.0; +EXT.scale('R11_PAO','gas_3','a','2050')=100.0; +ACT.scale('R11_PAO','syn_liq','2110','2110','M1','year')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2100','2100','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2060','2070','M1','year')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2110','year')=100.0; +ACT.scale('R11_MEA','oil_extr_1_ch4','2110','2110','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG1000','2055')=0.1; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2040','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG100','2100')=0.1; +ACT.scale('R11_PAO','eth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_WEU','crude_2','a','2055')=100.0; +EXT.scale('R11_PAO','crude_2','a','2025')=100.0; +EXT.scale('R11_LAM','gas_5','a','2055')=100.0; +EXT.scale('R11_MEA','gas_4','a','2070')=10.0; +EXT.scale('R11_AFR','crude_7','a','2040')=100.0; +EXT.scale('R11_FSU','gas_4','a','2040')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2100','2100','M1','year')=100.0; +EXT.scale('R11_CPA','gas_6','a','2070')=10.0; +EXT.scale('R11_EEU','gas_1','a','2070')=10.0; +EXT.scale('R11_EEU','gas_4','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2035','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2045','2045','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2070','2090','M1','year')=100.0; +EXT.scale('R11_NAM','crude_7','a','2110')=10.0; +ACT.scale('R11_EEU','foil_trp','2040','2040','M1','year')=10.0; +ACT.scale('R11_LAM','h2_coal_ccs','2035','2045','M1','year')=10.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_FSU','crude_6','a','2050')=100.0; +EXT.scale('R11_AFR','crude_1','a','2090')=10.0; +EXT.scale('R11_PAO','crude_5','a','2070')=10.0; +LAND.scale('R11_SAS','BIO06GHG2000','2100')=0.01; +LAND.scale('R11_AFR','BIO05GHG010','2110')=0.1; +EXT.scale('R11_MEA','gas_4','a','2090')=10.0; +EXT.scale('R11_PAS','gas_5','a','2045')=100.0; +EXT.scale('R11_SAS','crude_4','a','2060')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_MEA','oil_extr_2_ch4','2110','2110','M1','year')=100.0; +EXT.scale('R11_PAS','crude_6','a','2045')=100.0; +LAND.scale('R11_AFR','BIO06GHG1500','2050')=0.1; +LAND.scale('R11_SAS','BIO06GHG3000','2090')=0.1; +EXT.scale('R11_LAM','gas_1','a','2045')=100.0; +EXT.scale('R11_MEA','gas_2','a','2035')=100.0; +EXT.scale('R11_EEU','coal','a','2110')=10.0; +EXT.scale('R11_PAS','gas_3','a','2080')=10.0; +EXT.scale('R11_LAM','crude_4','a','2070')=10.0; +EXT.scale('R11_MEA','crude_6','a','2110')=10.0; +EXT.scale('R11_EEU','crude_1','a','2055')=100.0; +EXT.scale('R11_FSU','crude_2','a','2045')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2060','2070','M1','year')=100.0; +EXT.scale('R11_EEU','gas_3','a','2060')=100.0; +EXT.scale('R11_AFR','gas_3','a','2080')=10.0; +EXT.scale('R11_AFR','gas_4','a','2040')=100.0; +EXT.scale('R11_PAO','crude_2','a','2080')=10.0; +ACT.scale('R11_EEU','elec_t_d','2015','2070','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2025','2025','M1','year')=100.0; +EXT.scale('R11_SAS','gas_4','a','2060')=100.0; +ACT.scale('R11_PAO','foil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_PAO','gas_3','a','2035')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2055','2070','M1','year')=100.0; +EXT.scale('R11_WEU','gas_2','a','2090')=10.0; +EXT.scale('R11_WEU','gas_1','a','2060')=100.0; +ACT.scale('R11_MEA','h2_coal','2060','2070','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2070')=10.0; +EXT.scale('R11_PAS','gas_4','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2030','2035','M1','year')=100.0; +ACT.scale('R11_MEA','coal_gas','2060','2070','M1','year')=100.0; +EXT.scale('R11_SAS','crude_3','a','2055')=100.0; +EXT.scale('R11_NAM','crude_5','a','2035')=100.0; +EXT.scale('R11_CPA','coal','a','2100')=10.0; +EXT.scale('R11_EEU','crude_1','a','2070')=10.0; +EXT.scale('R11_PAS','crude_2','a','2060')=100.0; +EXT.scale('R11_PAS','gas_2','a','2070')=10.0; +ACT.scale('R11_LAM','coal_gas','2035','2035','M1','year')=10.0; +ACT.scale('R11_AFR','meth_coal_ccs','2030','2050','M1','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2040','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG200','2110')=0.1; +EXT.scale('R11_PAS','lignite','a','2030')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_SAS','crude_7','a','2110')=10.0; +ACT.scale('R11_PAO','eth_fc_trp','2070','2070','M1','year')=100.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2110')=0.01; +LAND.scale('R11_LAM','BIO05GHG3000','2080')=0.1; +ACT.scale('R11_PAO','h2_coal','2025','2030','M1','year')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_AFR','crude_6','a','2100')=10.0; +EXT.scale('R11_MEA','gas_6','a','2090')=10.0; +EXT.scale('R11_SAS','crude_7','a','2060')=100.0; +EXT.scale('R11_NAM','gas_5','a','2035')=100.0; +EXT.scale('R11_PAO','crude_3','a','2090')=10.0; +ACT.scale('R11_MEA','syn_liq','2090','2090','M1','year')=100.0; +EXT.scale('R11_LAM','crude_7','a','2050')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2035','2045','M1','year')=100.0; +EXT.scale('R11_CPA','crude_1','a','2060')=100.0; +EXT.scale('R11_PAS','gas_4','a','2070')=10.0; +EXT.scale('R11_EEU','gas_1','a','2090')=10.0; +EXT.scale('R11_CPA','crude_6','a','2045')=100.0; +ACT.scale('R11_EEU','elec_t_d','2090','2110','M1','year')=100.0; +EXT.scale('R11_SAS','gas_1','a','2090')=10.0; +EXT.scale('R11_PAO','crude_7','a','2110')=10.0; +EXT.scale('R11_WEU','crude_4','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2045','2055','M1','year')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2025','year')=100.0; +EXT.scale('R11_LAM','gas_3','a','2035')=100.0; +EXT.scale('R11_PAS','gas_4','a','2030')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2080')=0.01; +ACT.scale('R11_LAM','meth_ic_trp','2025','2025','M1','year')=10.0; +EXT.scale('R11_PAO','gas_6','a','2030')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2040','2055','M1','year')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2045')=0.01; +EXT.scale('R11_PAO','crude_4','a','2030')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2040')=0.01; +EXT.scale('R11_CPA','gas_2','a','2100')=10.0; +EXT.scale('R11_WEU','gas_5','a','2030')=100.0; +LAND.scale('R11_NAM','BIO06GHG2000','2060')=0.1; +CAP_NEW.scale('R11_FSU','mvac_co2','2080')=0.01; +EXT.scale('R11_PAS','coal','a','2100')=10.0; +ACT.scale('R11_WEU','loil_trp','2080','2080','M1','year')=10.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_CPA','gas_4','a','2070')=10.0; +EXT.scale('R11_CPA','crude_5','a','2040')=100.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_PAO','eth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_PAO','crude_1','a','2100')=10.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2025','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1000','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_6','2045','2045','M1','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2045')=100.0; +EXT.scale('R11_PAO','gas_6','a','2060')=100.0; +EXT.scale('R11_AFR','crude_4','a','2040')=100.0; +LAND.scale('R11_LAM','BIO06GHG200','2100')=0.1; +LAND.scale('R11_NAM','BIO06GHG600','2100')=0.1; +LAND.scale('R11_NAM','BIO05GHG000','2100')=0.1; +EXT.scale('R11_EEU','gas_3','a','2035')=100.0; +EXT.scale('R11_PAO','crude_7','a','2060')=100.0; +EXT.scale('R11_MEA','crude_2','a','2055')=100.0; +ACT.scale('R11_EEU','elec_t_d','2040','2100','M1','year')=100.0; +EXT.scale('R11_SAS','crude_1','a','2070')=10.0; +EXT.scale('R11_LAM','crude_7','a','2055')=100.0; +EXT.scale('R11_MEA','crude_2','a','2035')=100.0; +EXT.scale('R11_CPA','crude_7','a','2080')=10.0; +EXT.scale('R11_PAS','crude_2','a','2025')=100.0; +EXT.scale('R11_PAS','gas_3','a','2050')=100.0; +EXT.scale('R11_FSU','gas_5','a','2045')=100.0; +ACT_LO.scale('R11_LAM','gas_cc','2110','year')=0.01; +LAND.scale('R11_NAM','BIO06GHG020','2100')=0.1; +ACT.scale('R11_AFR','h2_coal_ccs','2055','2070','M1','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2055')=100.0; +EXT.scale('R11_PAS','gas_2','a','2100')=10.0; +EXT.scale('R11_LAM','crude_5','a','2025')=100.0; +EXT.scale('R11_NAM','lignite','a','2050')=100.0; +EXT.scale('R11_SAS','gas_2','a','2110')=10.0; +LAND.scale('R11_CPA','BIO06GHG000','2110')=0.1; +ACT.scale('R11_PAO','syn_liq','2030','2040','M1','year')=100.0; +EXT.scale('R11_FSU','gas_4','a','2025')=100.0; +EXT.scale('R11_CPA','crude_6','a','2030')=100.0; +EXT.scale('R11_LAM','gas_6','a','2025')=100.0; +EXT.scale('R11_FSU','gas_5','a','2040')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_PAS','crude_3','a','2100')=10.0; +EXT.scale('R11_PAS','gas_3','a','2045')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2055','2080','M1','year')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_MEA','crude_5','a','2060')=100.0; +EXT.scale('R11_SAS','gas_6','a','2080')=10.0; +ACT.scale('R11_PAS','eth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2025')=100.0; +EXT.scale('R11_PAO','gas_6','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_5','2050','2050','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2020','2080','M1','year')=100.0; +EXT.scale('R11_MEA','gas_4','a','2110')=10.0; +EXT.scale('R11_SAS','crude_4','a','2055')=100.0; +EXT.scale('R11_CPA','crude_4','a','2045')=100.0; +LAND.scale('R11_LAM','BIO06GHG050','2110')=0.1; +EXT.scale('R11_FSU','crude_1','a','2050')=100.0; +ACT.scale('R11_EEU','elec_t_d','2080','2110','M1','year')=100.0; +EXT.scale('R11_MEA','gas_2','a','2025')=100.0; +EXT.scale('R11_AFR','gas_3','a','2030')=100.0; +EXT.scale('R11_CPA','gas_3','a','2040')=100.0; +LAND.scale('R11_CPA','BIO06GHG600','2090')=0.1; +ACT.scale('R11_LAM','syn_liq','2040','2045','M1','year')=10.0; +ACT.scale('R11_EEU','meth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_SAS','crude_2','a','2050')=100.0; +LAND.scale('R11_LAM','BIO05GHG010','2090')=0.1; +LAND.scale('R11_AFR','BIO06GHG400','2070')=0.1; +LAND.scale('R11_AFR','BIO06GHG3000','2045')=0.1; +EXT.scale('R11_FSU','gas_3','a','2100')=10.0; +ACT.scale('R11_AFR','h2_coal','2020','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2025','2045','M1','year')=100.0; +EXT.scale('R11_LAM','gas_2','a','2025')=100.0; +EXT.scale('R11_FSU','crude_5','a','2055')=100.0; +EXT.scale('R11_EEU','crude_5','a','2090')=10.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2100')=0.01; +EXT.scale('R11_SAS','crude_1','a','2060')=100.0; +LAND.scale('R11_LAM','BIO06GHG1000','2050')=0.1; +EXT.scale('R11_WEU','gas_1','a','2045')=100.0; +LAND.scale('R11_NAM','BIO06GHG000','2060')=0.1; +EXT.scale('R11_PAO','gas_4','a','2080')=10.0; +EXT.scale('R11_FSU','crude_2','a','2030')=100.0; +EXT.scale('R11_AFR','crude_1','a','2110')=10.0; +LAND.scale('R11_PAS','BIO06GHG1500','2100')=0.01; +EXT.scale('R11_SAS','gas_4','a','2080')=10.0; +EXT.scale('R11_PAO','gas_6','a','2055')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2030','2035','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2025','2025','M1','year')=100.0; +EXT.scale('R11_PAO','gas_1','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2025','2025','M1','year')=100.0; +EXT.scale('R11_CPA','gas_2','a','2070')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2110','2110','M1','year')=100.0; +EXT.scale('R11_FSU','crude_2','a','2090')=10.0; +EXT.scale('R11_AFR','crude_2','a','2050')=100.0; +ACT.scale('R11_EEU','elec_t_d','2030','2090','M1','year')=100.0; +EXT.scale('R11_EEU','gas_1','a','2025')=100.0; +ACT.scale('R11_LAM','eth_ic_trp','2055','2055','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_4','2080','2080','M1','year')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2100')=0.01; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2030','2035','M1','year')=100.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2080','year')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2030','2030','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG020','2060')=0.1; +ACT.scale('R11_PAO','syn_liq_ccs','2050','2055','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG2000','2060')=0.1; +EXT.scale('R11_MEA','crude_5','a','2045')=100.0; +EXT.scale('R11_EEU','gas_4','a','2035')=100.0; +EXT.scale('R11_PAO','gas_2','a','2060')=100.0; +ACT.scale('R11_PAO','h2_coal','2040','2040','M1','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2040')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2045','2045','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2060','2070','M1','year')=100.0; +EXT.scale('R11_FSU','crude_1','a','2070')=10.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2055','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG010','2090')=0.1; +EXT.scale('R11_MEA','gas_3','a','2055')=100.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2025','year')=100.0; +EXT.scale('R11_AFR','coal','a','2055')=100.0; +EXT.scale('R11_PAS','crude_1','a','2060')=100.0; +EXT.scale('R11_EEU','gas_1','a','2110')=10.0; +EXT.scale('R11_AFR','gas_2','a','2100')=10.0; +EXT.scale('R11_PAS','crude_3','a','2045')=100.0; +ACT.scale('R11_EEU','foil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_SAS','gas_5','a','2025')=100.0; +EXT.scale('R11_EEU','crude_2','a','2090')=10.0; +ACT.scale('R11_PAO','h2_coal','2040','2055','M1','year')=100.0; +EXT.scale('R11_FSU','coal','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2055','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_3','a','2100')=10.0; +ACT.scale('R11_PAO','coal_gas','2020','2035','M1','year')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_PAS','gas_3','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2070','2070','M1','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2050')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_PAO','crude_2','a','2055')=100.0; +LAND.scale('R11_CPA','BIO06GHG200','2080')=0.1; +EXT.scale('R11_PAO','gas_3','a','2100')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2040','2045','M1','year')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2030','2030','M1','year')=10.0; +ACT.scale('R11_EEU','elec_t_d','2045','2090','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2020','2040','M1','year')=100.0; +EXT.scale('R11_WEU','gas_3','a','2035')=100.0; +LAND.scale('R11_CPA','BIO06GHG1000','2090')=0.1; +EXT.scale('R11_EEU','crude_6','a','2100')=10.0; +EXT.scale('R11_FSU','crude_2','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG400','2090')=0.1; +EXT.scale('R11_NAM','gas_2','a','2070')=10.0; +EXT.scale('R11_SAS','crude_4','a','2050')=100.0; +EXT.scale('R11_CPA','gas_4','a','2110')=10.0; +EXT.scale('R11_NAM','gas_1','a','2055')=100.0; +LAND.scale('R11_LAM','BIO05GHG000','2090')=0.1; +LAND.scale('R11_AFR','BIO05GHG2000','2080')=0.1; +ACT.scale('R11_PAO','meth_fc_trp','2055','2055','M1','year')=100.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_EEU','recycling_gas1','2055','2060','M1','year')=0.01; +ACT.scale('R11_CPA','oil_extr_4','2040','2040','M1','year')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_PAS','gas_6','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal','2025','2035','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2100','2100','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG3000','2070')=0.1; +ACT.scale('R11_EEU','loil_trp','2040','2040','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal_ccs','2030','2040','M1','year')=100.0; +EXT.scale('R11_PAS','crude_1','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2090','2090','M1','year')=100.0; +EXT.scale('R11_SAS','gas_5','a','2100')=10.0; +EXT.scale('R11_NAM','gas_4','a','2070')=10.0; +EXT.scale('R11_EEU','crude_5','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG200','2045')=0.1; +LAND.scale('R11_LAM','BIO05GHG100','2090')=0.1; +EXT.scale('R11_EEU','crude_3','a','2035')=100.0; +EXT.scale('R11_NAM','gas_3','a','2035')=100.0; +EXT.scale('R11_AFR','crude_7','a','2035')=100.0; +EXT.scale('R11_CPA','gas_3','a','2055')=100.0; +EXT.scale('R11_NAM','gas_4','a','2040')=100.0; +LAND.scale('R11_AFR','BIO06GHG400','2080')=0.1; +EXT.scale('R11_AFR','crude_4','a','2025')=100.0; +EXT.scale('R11_CPA','coal','a','2040')=100.0; +LAND.scale('R11_LAM','BIO06GHG010','2050')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2060','2070','M1','year')=100.0; +ACT.scale('R11_EEU','replacement_so2','2090','2090','M1','year')=0.01; +ACT.scale('R11_PAO','meth_coal_ccs','2050','2055','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2045','2045','M1','year')=10.0; +ACT.scale('R11_AFR','coal_gas','2040','2040','M1','year')=100.0; +EXT.scale('R11_AFR','lignite','a','2030')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2030','2050','M1','year')=100.0; +EXT.scale('R11_CPA','gas_2','a','2050')=100.0; +EXT.scale('R11_FSU','crude_6','a','2045')=100.0; +EXT.scale('R11_EEU','crude_2','a','2050')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2035','2050','M1','year')=100.0; +EXT.scale('R11_CPA','crude_4','a','2055')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2040','2040','M1','year')=100.0; +EXT.scale('R11_PAO','gas_1','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2020','2025','M1','year')=100.0; +ACT.scale('R11_EEU','foil_trp','2025','2025','M1','year')=10.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2050')=0.01; +EXT.scale('R11_SAS','gas_1','a','2030')=100.0; +EXT.scale('R11_PAS','crude_5','a','2045')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2050','2060','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG2000','2050')=0.1; +EXT.scale('R11_LAM','crude_1','a','2035')=100.0; +EXT.scale('R11_MEA','crude_6','a','2045')=100.0; +EXT.scale('R11_CPA','crude_2','a','2045')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2110')=10.0; +EXT.scale('R11_CPA','crude_5','a','2050')=100.0; +EXT.scale('R11_SAS','crude_4','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2035','2045','M1','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_2','a','2110')=10.0; +LAND.scale('R11_CPA','BIO06GHG3000','2110')=0.1; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_PAS','gas_1','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2035','2040','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal','2020','2040','M1','year')=10.0; +EXT.scale('R11_MEA','gas_3','a','2070')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2080','2090','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal','2015','2030','M1','year')=10.0; +EXT.scale('R11_PAO','gas_1','a','2030')=100.0; +EXT.scale('R11_MEA','coal','a','2090')=10.0; +CAP_NEW.scale('R11_MEA','mvac_co2','2070')=0.01; +ACT.scale('R11_PAO','eth_fc_trp','2025','2025','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2040','2040','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2025')=100.0; +EXT.scale('R11_MEA','gas_4','a','2080')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2035','2040','M1','year')=100.0; +ACT.scale('R11_LAM','eth_ic_trp','2070','2070','M1','year')=10.0; +EXT.scale('R11_NAM','gas_4','a','2045')=100.0; +EXT.scale('R11_CPA','gas_3','a','2045')=100.0; +ACT.scale('R11_EEU','foil_trp','2070','2070','M1','year')=10.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2025','year')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2040')=0.01; +EXT.scale('R11_LAM','crude_2','a','2070')=10.0; +EXT.scale('R11_CPA','lignite','a','2060')=100.0; +EXT.scale('R11_AFR','crude_2','a','2055')=100.0; +EXT.scale('R11_PAS','coal','a','2040')=100.0; +LAND.scale('R11_NAM','BIO06GHG010','2110')=0.1; +EXT.scale('R11_PAO','crude_4','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2045','2050','M1','year')=100.0; +ACT.scale('R11_LAM','foil_trp','2040','2040','M1','year')=10.0; +EXT.scale('R11_AFR','crude_2','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2090','2110','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2025','2025','M1','year')=100.0; +ACT_LO.scale('R11_LAM','gas_cc_ccs','2090','year')=0.01; +ACT.scale('R11_LAM','coal_gas','2010','2025','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG050','2070')=0.1; +ACT.scale('R11_PAO','meth_coal','2050','2070','M1','year')=100.0; +LAND.scale('R11_SAS','BIO06GHG3000','2110')=0.1; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_EEU','gas_6','a','2045')=100.0; +ACT.scale('R11_PAO','meth_coal','2040','2050','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2045','2045','M1','year')=100.0; +EXT.scale('R11_PAO','gas_1','a','2100')=10.0; +EXT.scale('R11_CPA','crude_7','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_5','2110','2110','M1','year')=100.0; +ACT.scale('R11_LAM','meth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2050')=100.0; +EXT.scale('R11_WEU','crude_5','a','2025')=100.0; +ACT.scale('R11_PAO','coal_gas','2040','2040','M1','year')=100.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_CPA','crude_7','a','2035')=100.0; +ACT.scale('R11_MEA','syn_liq','2045','2070','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2070','2070','M1','year')=100.0; +EXT.scale('R11_FSU','gas_4','a','2035')=100.0; +EXT.scale('R11_EEU','coal','a','2100')=10.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2030','2040','M1','year')=10.0; +EXT.scale('R11_LAM','crude_2','a','2025')=100.0; +EXT.scale('R11_AFR','gas_1','a','2110')=10.0; +EXT.scale('R11_NAM','crude_5','a','2045')=100.0; +LAND.scale('R11_NAM','BIO06GHG050','2060')=0.1; +EXT.scale('R11_EEU','gas_3','a','2040')=100.0; +EXT.scale('R11_LAM','gas_5','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2055','2055','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2030','2045','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2020','2030','M1','year')=10.0; +ACT.scale('R11_PAS','meth_fc_trp','2025','2025','M1','year')=100.0; +EXT.scale('R11_NAM','gas_1','a','2050')=100.0; +EXT.scale('R11_AFR','gas_5','a','2100')=10.0; +ACT.scale('R11_PAO','h2_coal','2040','2045','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_4_ch4','2100','2100','M1','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2080')=10.0; +EXT.scale('R11_FSU','lignite','a','2025')=100.0; +ACT.scale('R11_LAM','h2_coal','2030','2045','M1','year')=10.0; +EXT.scale('R11_AFR','crude_3','a','2025')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2040','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2025','2025','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1500','2060')=0.1; +LAND.scale('R11_LAM','BIO06GHG600','2070')=0.1; +ACT.scale('R11_CPA','oil_extr_4_ch4','2050','2050','M1','year')=100.0; +EXT.scale('R11_FSU','gas_4','a','2060')=100.0; +ACT.scale('R11_LAM','meth_coal','2035','2045','M1','year')=10.0; +ACT.scale('R11_PAO','syn_liq','2040','2060','M1','year')=100.0; +EXT.scale('R11_LAM','crude_6','a','2030')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2100','2100','M1','year')=10.0; +ACT.scale('R11_PAO','coal_gas','2025','2025','M1','year')=100.0; +EXT.scale('R11_SAS','gas_2','a','2090')=10.0; +EXT.scale('R11_CPA','crude_2','a','2080')=10.0; +ACT.scale('R11_LAM','coal_gas','2030','2040','M1','year')=10.0; +EXT.scale('R11_SAS','gas_3','a','2040')=100.0; +EXT.scale('R11_PAO','gas_3','a','2055')=100.0; +ACT.scale('R11_LAM','h2_coal','2035','2040','M1','year')=10.0; +EXT.scale('R11_LAM','crude_6','a','2025')=100.0; +EXT.scale('R11_MEA','crude_1','a','2035')=100.0; +EXT.scale('R11_FSU','crude_6','a','2080')=10.0; +ACT.scale('R11_PAO','eth_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_LAM','crude_6','a','2060')=100.0; +EXT.scale('R11_EEU','gas_3','a','2030')=100.0; +EXT.scale('R11_AFR','gas_5','a','2090')=10.0; +EXT.scale('R11_WEU','gas_6','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG3000','2060')=0.1; +EXT.scale('R11_FSU','crude_5','a','2090')=10.0; +ACT.scale('R11_LAM','meth_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_MEA','crude_1','a','2030')=100.0; +EXT.scale('R11_FSU','gas_4','a','2055')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_CPA','crude_6','a','2055')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2040','2055','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG1500','2080')=0.1; +ACT.scale('R11_AFR','syn_liq','2020','2025','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG200','2070')=0.1; +EXT.scale('R11_PAS','crude_7','a','2080')=10.0; +ACT.scale('R11_PAO','eth_ic_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_FSU','gas_3','a','2035')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2045','2050','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG200','2080')=0.1; +CAP_NEW.scale('R11_LAM','mvac_co2','2030')=0.01; +ACT.scale('R11_PAO','syn_liq','2090','2110','M1','year')=100.0; +EXT.scale('R11_CPA','crude_6','a','2070')=10.0; +EXT.scale('R11_NAM','crude_1','a','2080')=10.0; +ACT.scale('R11_LAM','gas_cc_ccs','2035','2060','M1','year')=10.0; +ACT.scale('R11_PAO','coal_gas','2035','2040','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG200','2110')=0.1; +EXT.scale('R11_FSU','crude_4','a','2090')=10.0; +EXT.scale('R11_PAS','crude_2','a','2030')=100.0; +LAND.scale('R11_LAM','BIO06GHG200','2060')=0.1; +EXT.scale('R11_PAO','gas_3','a','2090')=10.0; +EXT.scale('R11_PAO','coal','a','2035')=100.0; +EXT.scale('R11_SAS','lignite','a','2070')=10.0; +EXT.scale('R11_LAM','coal','a','2030')=100.0; +LAND.scale('R11_CPA','BIO06GHG020','2080')=0.1; +ACT.scale('R11_WEU','eth_ic_trp','2090','2090','M1','year')=10.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2030','2040','M1','year')=10.0; +EXT.scale('R11_WEU','lignite','a','2030')=100.0; +EXT.scale('R11_WEU','gas_2','a','2070')=10.0; +EXT.scale('R11_PAO','gas_3','a','2030')=100.0; +ACT.scale('R11_PAS','loil_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_LAM','meth_coal','2040','2045','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG100','2050')=0.1; +EXT.scale('R11_AFR','gas_4','a','2090')=10.0; +EXT.scale('R11_LAM','gas_3','a','2040')=100.0; +EXT.scale('R11_MEA','gas_2','a','2050')=100.0; +EXT.scale('R11_WEU','crude_4','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG1000','2055')=0.1; +EXT.scale('R11_PAO','gas_4','a','2040')=100.0; +ACT.scale('R11_WEU','meth_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_MEA','crude_2','a','2045')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2040','2060','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2060','2060','M1','year')=100.0; +EXT.scale('R11_LAM','crude_7','a','2100')=10.0; +LAND.scale('R11_AFR','BIO05GHG050','2080')=0.1; +EXT.scale('R11_NAM','gas_2','a','2035')=100.0; +ACT.scale('R11_PAO','coal_gas','2060','2060','M1','year')=100.0; +EXT.scale('R11_WEU','lignite','a','2100')=10.0; +ACT.scale('R11_PAO','coal_gas','2040','2050','M1','year')=100.0; +EXT.scale('R11_FSU','crude_2','a','2040')=100.0; +EXT.scale('R11_PAO','crude_2','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2030','2035','M1','year')=100.0; +ACT.scale('R11_SAS','meth_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2080','2090','M1','year')=100.0; +EXT.scale('R11_WEU','gas_5','a','2080')=10.0; +EXT.scale('R11_AFR','crude_4','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2035','2035','M1','year')=100.0; +EXT.scale('R11_CPA','gas_3','a','2025')=100.0; +EXT.scale('R11_MEA','gas_5','a','2050')=100.0; +EXT.scale('R11_SAS','crude_6','a','2055')=100.0; +LAND.scale('R11_CPA','BIO06GHG200','2110')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2060','2080','M1','year')=100.0; +EXT.scale('R11_EEU','coal','a','2035')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2040','2060','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG200','2090')=0.1; +EXT.scale('R11_FSU','gas_1','a','2055')=100.0; +ACT.scale('R11_AFR','h2_coal','2015','2035','M1','year')=100.0; +EXT.scale('R11_EEU','gas_6','a','2060')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_FSU','crude_5','a','2110')=10.0; +EXT.scale('R11_LAM','crude_1','a','2090')=10.0; +ACT.scale('R11_PAS','loil_trp','2060','2060','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG050','2070')=0.1; +CAP_NEW.scale('R11_WEU','mvac_co2','2080')=0.01; +ACT.scale('R11_AFR','h2_coal_ccs','2030','2050','M1','year')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2080','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2020','2030','M1','year')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2070')=0.01; +CAP_NEW.scale('R11_PAO','mvac_co2','2100')=0.01; +EXT.scale('R11_WEU','crude_5','a','2070')=10.0; +EXT.scale('R11_FSU','crude_3','a','2055')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2060','year')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2040','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG600','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_2_ch4','2045','2045','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2030','2030','M1','year')=100.0; +EXT.scale('R11_NAM','lignite','a','2070')=10.0; +EXT.scale('R11_PAS','gas_5','a','2050')=100.0; +LAND.scale('R11_NAM','BIO06GHG1000','2070')=0.1; +EXT.scale('R11_PAO','gas_6','a','2045')=100.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2110','2110','M1','year')=100.0; +EXT.scale('R11_SAS','crude_2','a','2110')=10.0; +ACT.scale('R11_LAM','meth_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_PAO','gas_5','a','2110')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2030','2030','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2035','2045','M1','year')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2070')=0.01; +ACT.scale('R11_LAM','eth_ic_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_EEU','elec_t_d','2055','2080','M1','year')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2030','2030','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG3000','2070')=0.1; +ACT.scale('R11_LAM','loil_trp','2055','2055','M1','year')=10.0; +EXT.scale('R11_LAM','coal','a','2050')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2060','2060','M1','year')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2100','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2030','2035','M1','year')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_MEA','crude_6','a','2025')=100.0; +EXT.scale('R11_MEA','gas_4','a','2035')=100.0; +ACT.scale('R11_LAM','eth_ic_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_LAM','gas_2','a','2090')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2055','2060','M1','year')=100.0; +EXT.scale('R11_WEU','coal','a','2060')=100.0; +ACT.scale('R11_AFR','coal_gas','2060','2060','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG020','2100')=0.1; +EXT.scale('R11_AFR','crude_5','a','2030')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_SAS','gas_1','a','2025')=100.0; +ACT.scale('R11_AFR','coal_gas','2070','2070','M1','year')=100.0; +ACT.scale('R11_EEU','replacement_so2','2100','2100','M1','year')=0.01; +EXT.scale('R11_AFR','crude_7','a','2050')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2030','2030','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2030','2035','M1','year')=100.0; +EXT.scale('R11_MEA','crude_2','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2045','2050','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2030','2035','M1','year')=100.0; +EXT.scale('R11_PAO','gas_5','a','2060')=100.0; +EXT.scale('R11_MEA','gas_3','a','2045')=100.0; +EXT.scale('R11_FSU','crude_2','a','2050')=100.0; +EXT.scale('R11_WEU','crude_6','a','2040')=100.0; +EXT.scale('R11_AFR','crude_4','a','2055')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2045','2060','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2040','2040','M1','year')=10.0; +LAND.scale('R11_CPA','BIO06GHG2000','2080')=0.1; +ACT.scale('R11_LAM','meth_coal','2020','2040','M1','year')=10.0; +EXT.scale('R11_MEA','crude_5','a','2030')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_PAO','gas_4','a','2090')=10.0; +ACT.scale('R11_PAO','h2_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_EEU','crude_1','a','2080')=10.0; +EXT.scale('R11_AFR','gas_6','a','2110')=10.0; +LAND.scale('R11_LAM','BIO05GHG050','2080')=0.1; +EXT.scale('R11_SAS','gas_2','a','2080')=10.0; +ACT.scale('R11_LAM','h2_fc_trp','2055','2055','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG100','2055')=0.1; +ACT.scale('R11_AFR','coal_gas','2045','2070','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG020','2080')=0.1; +LAND.scale('R11_AFR','BIO06GHG200','2070')=0.1; +ACT.scale('R11_AFR','meth_coal','2045','2055','M1','year')=100.0; +EXT.scale('R11_LAM','gas_6','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2060','2060','M1','year')=100.0; +ACT.scale('R11_PAS','loil_trp','2110','2110','M1','year')=10.0; +EXT.scale('R11_WEU','crude_6','a','2035')=100.0; +LAND.scale('R11_AFR','BIO06GHG050','2090')=0.1; +EXT.scale('R11_NAM','crude_5','a','2070')=10.0; +EXT.scale('R11_SAS','gas_6','a','2055')=100.0; +EXT.scale('R11_AFR','gas_4','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG200','2055')=0.1; +EXT.scale('R11_CPA','crude_6','a','2100')=10.0; +ACT.scale('R11_AFR','coal_gas','2025','2030','M1','year')=100.0; +ACT.scale('R11_PAO','eth_fc_trp','2040','2040','M1','year')=100.0; +EXT.scale('R11_NAM','gas_6','a','2040')=100.0; +EXT.scale('R11_AFR','gas_1','a','2040')=100.0; +EXT.scale('R11_CPA','gas_1','a','2100')=10.0; +EXT.scale('R11_EEU','crude_4','a','2060')=100.0; +EXT.scale('R11_CPA','gas_2','a','2090')=10.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_EEU','loil_trp','2025','2025','M1','year')=10.0; +ACT_UP.scale('R11_NAM','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_FSU','gas_1','a','2030')=100.0; +EXT.scale('R11_AFR','crude_4','a','2110')=10.0; +ACT.scale('R11_AFR','meth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_AFR','coal','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2025','2030','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG400','2070')=0.1; +EXT.scale('R11_PAO','lignite','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2060','2070','M1','year')=100.0; +ACT_LO.scale('R11_LAM','gas_cc_ccs','2080','year')=0.01; +CAP_NEW.scale('R11_EEU','mvac_co2','2090')=0.01; +ACT.scale('R11_LAM','loil_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_LAM','meth_coal','2025','2045','M1','year')=10.0; +EXT.scale('R11_AFR','crude_7','a','2060')=100.0; +EXT.scale('R11_PAS','gas_5','a','2090')=10.0; +ACT.scale('R11_PAS','meth_ic_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_CPA','gas_6','a','2110')=10.0; +ACT_LO.scale('R11_CPA','csp_sm1_res4','2100','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2060','2060','M1','year')=100.0; +ACT.scale('R11_LAM','eth_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_SAS','gas_3','a','2090')=10.0; +EXT.scale('R11_AFR','crude_7','a','2030')=100.0; +EXT.scale('R11_PAS','gas_2','a','2035')=100.0; +ACT.scale('R11_LAM','h2_coal','2020','2035','M1','year')=10.0; +EXT.scale('R11_LAM','crude_1','a','2110')=10.0; +ACT.scale('R11_AFR','eth_fc_trp','2080','2080','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG3000','2090')=0.1; +EXT.scale('R11_PAO','crude_3','a','2055')=100.0; +EXT.scale('R11_SAS','crude_5','a','2100')=10.0; +ACT.scale('R11_LAM','h2_fc_trp','2035','2040','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2030','2045','M1','year')=100.0; +EXT.scale('R11_PAO','crude_5','a','2100')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2030','2050','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2070','2070','M1','year')=100.0; +EXT.scale('R11_FSU','crude_4','a','2100')=10.0; +ACT.scale('R11_LAM','syn_liq','2045','2045','M1','year')=10.0; +EXT.scale('R11_SAS','crude_3','a','2050')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2070')=0.01; +EXT.scale('R11_NAM','crude_3','a','2045')=100.0; +ACT.scale('R11_EEU','foil_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_1','2045','2050','M1','year')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2045')=0.01; +EXT.scale('R11_PAS','lignite','a','2040')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2050','2070','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG000','2110')=0.1; +EXT.scale('R11_PAO','gas_4','a','2055')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2080')=0.01; +EXT.scale('R11_SAS','gas_2','a','2100')=10.0; +EXT.scale('R11_NAM','crude_3','a','2060')=100.0; +EXT.scale('R11_MEA','coal','a','2060')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2035','2040','M1','year')=100.0; +EXT.scale('R11_SAS','crude_1','a','2030')=100.0; +ACT.scale('R11_PAO','h2_coal','2030','2030','M1','year')=100.0; +ACT.scale('R11_LAM','coal_gas','2020','2040','M1','year')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2050','2070','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2045','2060','M1','year')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2040','2045','M1','year')=100.0; +EXT.scale('R11_MEA','crude_7','a','2035')=100.0; +EXT.scale('R11_WEU','crude_5','a','2100')=10.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2035','2035','M1','year')=100.0; +EXT.scale('R11_MEA','crude_1','a','2050')=100.0; +EXT.scale('R11_LAM','gas_2','a','2080')=10.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2035','year')=100.0; +EXT.scale('R11_NAM','gas_5','a','2060')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_EEU','gas_1','a','2040')=100.0; +ACT.scale('R11_PAO','syn_liq','2050','2070','M1','year')=100.0; +EXT.scale('R11_CPA','gas_5','a','2035')=100.0; +ACT.scale('R11_PAO','meth_coal','2060','2080','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2025')=100.0; +EXT.scale('R11_MEA','gas_5','a','2055')=100.0; +ACT.scale('R11_AFR','h2_coal','2035','2055','M1','year')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2110')=0.01; +LAND.scale('R11_SAS','BIO06GHG600','2110')=0.01; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_WEU','crude_6','a','2090')=10.0; +ACT.scale('R11_PAO','h2_coal_ccs','2040','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2090','2090','M1','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2060','2060','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG1000','2090')=0.1; +LAND.scale('R11_CPA','BIO06GHG400','2100')=0.1; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2055','2060','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal','2060','2070','M1','year')=100.0; +EXT.scale('R11_PAS','crude_5','a','2035')=100.0; +ACT.scale('R11_PAO','syn_liq','2025','2025','M1','year')=100.0; +EXT.scale('R11_PAS','crude_7','a','2035')=100.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2055')=0.01; +ACT.scale('R11_PAO','meth_coal_ccs','2035','2050','M1','year')=100.0; +EXT.scale('R11_MEA','gas_3','a','2025')=100.0; +ACT_UP.scale('R11_LAM','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_LAM','gas_6','a','2030')=100.0; +EXT.scale('R11_NAM','crude_6','a','2110')=10.0; +LAND.scale('R11_AFR','BIO05GHG1500','2070')=0.1; +ACT.scale('R11_WEU','h2_fc_trp','2035','2040','M1','year')=100.0; +EXT.scale('R11_MEA','crude_2','a','2030')=100.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2080')=0.01; +EXT.scale('R11_PAS','crude_3','a','2110')=10.0; +EXT.scale('R11_PAO','crude_3','a','2025')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2035','2050','M1','year')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_PAO','coal','a','2050')=100.0; +ACT.scale('R11_LAM','h2_coal','2025','2040','M1','year')=10.0; +ACT.scale('R11_LAM','h2_coal','2010','2025','M1','year')=10.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2025')=0.01; +ACT.scale('R11_SAS','h2_fc_trp','2090','2090','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2110','2110','M1','year')=100.0; +EXT.scale('R11_MEA','gas_3','a','2100')=10.0; +EXT.scale('R11_SAS','gas_2','a','2030')=100.0; +EXT.scale('R11_SAS','crude_3','a','2040')=100.0; +EXT.scale('R11_EEU','gas_5','a','2100')=10.0; +EXT.scale('R11_NAM','crude_3','a','2035')=100.0; +EXT.scale('R11_PAO','crude_1','a','2110')=10.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2030')=0.01; +CAP_NEW.scale('R11_WEU','mvac_co2','2090')=0.01; +EXT.scale('R11_PAO','crude_4','a','2045')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2055','2055','M1','year')=100.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2060')=0.01; +EXT.scale('R11_AFR','crude_1','a','2045')=100.0; +ACT.scale('R11_MEA','oil_extr_1','2100','2100','M1','year')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2035')=0.01; +ACT.scale('R11_EEU','elec_t_d','2055','2100','M1','year')=100.0; +EXT.scale('R11_MEA','crude_6','a','2055')=100.0; +ACT.scale('R11_EEU','loil_trp','2045','2045','M1','year')=10.0; +LAND.scale('R11_NAM','BIO05GHG000','2090')=0.1; +ACT.scale('R11_EEU','recycling_gas1','2060','2070','M1','year')=0.01; +ACT.scale('R11_PAO','syn_liq_ccs','2040','2060','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG050','2090')=0.1; +EXT.scale('R11_FSU','crude_1','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2030','2035','M1','year')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_PAO','meth_coal','2090','2110','M1','year')=100.0; +ACT.scale('R11_FSU','h2_fc_trp','2090','2090','M1','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2035','2035','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG010','2100')=0.1; +EXT.scale('R11_PAS','crude_7','a','2025')=100.0; +ACT.scale('R11_LAM','syn_liq','2020','2025','M1','year')=10.0; +ACT.scale('R11_AFR','eth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_EEU','gas_5','a','2025')=100.0; +EXT.scale('R11_SAS','crude_1','a','2100')=10.0; +CAP_NEW.scale('R11_FSU','mvac_co2','2100')=0.01; +ACT.scale('R11_AFR','h2_coal','2070','2070','M1','year')=100.0; +ACT_LO.scale('R11_LAM','gas_cc_ccs','2100','year')=0.01; +EXT.scale('R11_AFR','gas_4','a','2080')=10.0; +EXT.scale('R11_PAO','crude_3','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_6','2090','2090','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2055','2055','M1','year')=10.0; +ACT.scale('R11_WEU','eth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_WEU','coal','a','2040')=100.0; +LAND.scale('R11_AFR','BIO05GHG3000','2060')=0.1; +ACT.scale('R11_AFR','syn_liq','2040','2055','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2020','2040','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2080','2090','M1','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2080','2080','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG600','2080')=0.1; +ACT.scale('R11_PAO','h2_coal','2045','2050','M1','year')=100.0; +EXT.scale('R11_MEA','gas_1','a','2100')=10.0; +EXT.scale('R11_NAM','coal','a','2080')=10.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2035','year')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_SAS','gas_4','a','2070')=10.0; +LAND.scale('R11_AFR','BIO06GHG010','2070')=0.1; +ACT.scale('R11_LAM','h2_coal_ccs','2030','2035','M1','year')=10.0; +ACT.scale('R11_PAO','eth_ic_trp','2110','2110','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG2000','2055')=0.1; +EXT.scale('R11_SAS','crude_7','a','2040')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_NAM','crude_3','a','2025')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2090','2090','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG1500','2050')=0.1; +ACT.scale('R11_AFR','h2_coal','2050','2060','M1','year')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2050','2055','M1','year')=100.0; +ACT.scale('R11_WEU','meth_ic_trp','2100','2100','M1','year')=10.0; +ACT.scale('R11_AFR','syn_liq','2055','2055','M1','year')=100.0; +ACT.scale('R11_EEU','recycling_gas1','2110','2110','M1','year')=0.01; +EXT.scale('R11_MEA','crude_5','a','2050')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2090')=0.01; +ACT.scale('R11_MEA','oil_extr_1_ch4','2100','2100','M1','year')=100.0; +EXT.scale('R11_PAO','crude_5','a','2090')=10.0; +ACT.scale('R11_AFR','syn_liq','2060','2060','M1','year')=100.0; +EXT.scale('R11_CPA','gas_2','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2055','2060','M1','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2060')=100.0; +EXT.scale('R11_EEU','coal','a','2060')=100.0; +ACT.scale('R11_PAO','syn_liq','2100','2110','M1','year')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2110','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG050','2055')=0.1; +EXT.scale('R11_CPA','coal','a','2070')=10.0; +EXT.scale('R11_SAS','crude_6','a','2100')=10.0; +ACT.scale('R11_LAM','loil_trp','2030','2030','M1','year')=10.0; +ACT.scale('R11_MEA','meth_coal','2100','2100','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2055','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2030','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2030','2035','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2050','2060','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2100','2100','M1','year')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2060','year')=100.0; +EXT.scale('R11_FSU','gas_5','a','2030')=100.0; +LAND.scale('R11_AFR','BIO05GHG1000','2070')=0.1; +EXT.scale('R11_PAS','gas_2','a','2040')=100.0; +ACT.scale('R11_PAO','syn_liq','2050','2060','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG1000','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_2_ch4','2040','2045','M1','year')=100.0; +EXT.scale('R11_EEU','crude_5','a','2070')=10.0; +EXT.scale('R11_MEA','gas_5','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2055','2060','M1','year')=100.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2055')=0.01; +LAND.scale('R11_LAM','BIO06GHG1500','2060')=0.1; +EXT.scale('R11_NAM','gas_3','a','2025')=100.0; +LAND.scale('R11_LAM','BIO06GHG1500','2070')=0.1; +CAP_NEW.scale('R11_PAO','mvac_co2','2050')=0.01; +ACT.scale('R11_EEU','elec_t_d','2055','2110','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2080','2100','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2040','2040','M1','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2070','year')=100.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2055','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG400','2110')=0.1; +EXT.scale('R11_WEU','crude_1','a','2045')=100.0; +EXT.scale('R11_PAS','crude_7','a','2070')=10.0; +EXT.scale('R11_SAS','crude_2','a','2070')=10.0; +EXT.scale('R11_PAS','gas_2','a','2055')=100.0; +ACT.scale('R11_PAO','h2_coal','2070','2070','M1','year')=100.0; +EXT.scale('R11_EEU','gas_3','a','2100')=10.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_FSU','gas_1','a','2070')=10.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2080')=0.01; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2070','year')=100.0; +EXT.scale('R11_NAM','crude_1','a','2070')=10.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2045')=0.01; +EXT.scale('R11_PAO','lignite','a','2030')=100.0; +EXT.scale('R11_FSU','crude_3','a','2035')=100.0; +EXT.scale('R11_FSU','crude_2','a','2110')=10.0; +LAND.scale('R11_LAM','BIO06GHG1500','2090')=0.1; +ACT.scale('R11_MEA','coal_gas','2045','2070','M1','year')=100.0; +EXT.scale('R11_FSU','coal','a','2030')=100.0; +ACT_LO.scale('R11_MEA','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_NAM','gas_5','a','2040')=100.0; +ACT.scale('R11_LAM','coal_gas','2010','2030','M1','year')=10.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2070')=0.01; +ACT.scale('R11_WEU','h2_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_NAM','gas_3','a','2030')=100.0; +LAND.scale('R11_NAM','BIO05GHG3000','2090')=0.1; +ACT.scale('R11_AFR','syn_liq_ccs','2045','2050','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2080')=10.0; +EXT.scale('R11_PAS','coal','a','2050')=100.0; +EXT.scale('R11_EEU','gas_4','a','2100')=10.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2110')=0.01; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_LAM','gas_6','a','2050')=100.0; +ACT.scale('R11_AFR','meth_coal_ccs','2040','2050','M1','year')=100.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2040')=0.01; +ACT.scale('R11_PAO','h2_coal_ccs','2055','2080','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2025','2035','M1','year')=10.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_PAO','gas_2','a','2070')=10.0; +ACT.scale('R11_PAO','eth_ic_trp','2090','2090','M1','year')=10.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2100','year')=100.0; +ACT.scale('R11_LAM','eth_ic_trp','2035','2035','M1','year')=10.0; +ACT.scale('R11_MEA','oil_extr_7','2110','2110','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG1000','2110')=0.1; +ACT.scale('R11_LAM','coal_gas','2015','2025','M1','year')=10.0; +ACT.scale('R11_PAS','h2_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_SAS','gas_3','a','2070')=10.0; +EXT.scale('R11_NAM','gas_1','a','2060')=100.0; +LAND.scale('R11_NAM','BIO05GHG2000','2090')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2060','2060','M1','year')=100.0; +ACT.scale('R11_PAO','meth_fc_trp','2030','2030','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2030','2050','M1','year')=100.0; +EXT.scale('R11_EEU','crude_3','a','2050')=100.0; +EXT.scale('R11_PAO','gas_4','a','2045')=100.0; +LAND.scale('R11_AFR','BIO06GHG010','2110')=0.1; +EXT.scale('R11_EEU','crude_3','a','2110')=10.0; +ACT.scale('R11_PAO','syn_liq','2070','2090','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2060','2100','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2090','2090','M1','year')=10.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2090')=0.01; +EXT.scale('R11_MEA','crude_7','a','2030')=100.0; +ACT.scale('R11_AFR','syn_liq','2050','2050','M1','year')=100.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_PAO','crude_2','a','2040')=100.0; +ACT.scale('R11_AFR','syn_liq','2045','2060','M1','year')=100.0; +EXT.scale('R11_NAM','crude_1','a','2030')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2030')=0.01; +LAND.scale('R11_AFR','BIO06GHG200','2055')=0.1; +EXT.scale('R11_LAM','gas_6','a','2070')=10.0; +ACT.scale('R11_MEA','coal_gas','2060','2080','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2090','2090','M1','year')=100.0; +EXT.scale('R11_AFR','crude_7','a','2100')=10.0; +ACT.scale('R11_AFR','h2_coal_ccs','2050','2050','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal_ccs','2060','2080','M1','year')=100.0; +EXT.scale('R11_SAS','crude_4','a','2100')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2050','2050','M1','year')=100.0; +EXT.scale('R11_NAM','coal','a','2025')=100.0; +EXT.scale('R11_AFR','gas_5','a','2045')=100.0; +EXT.scale('R11_LAM','crude_4','a','2060')=100.0; +EXT.scale('R11_FSU','crude_7','a','2055')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2040','2040','M1','year')=10.0; +ACT.scale('R11_PAS','eth_ic_trp','2060','2060','M1','year')=10.0; +LAND.scale('R11_CPA','BIO06GHG400','2110')=0.1; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2080','2080','M1','year')=100.0; +EXT.scale('R11_CPA','gas_6','a','2030')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2080')=0.01; +EXT.scale('R11_NAM','crude_5','a','2060')=100.0; +ACT.scale('R11_MEA','h2_coal','2045','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG2000','2090')=0.1; +ACT.scale('R11_LAM','h2_coal_ccs','2040','2040','M1','year')=10.0; +EXT.scale('R11_PAS','crude_4','a','2070')=10.0; +ACT.scale('R11_PAO','meth_coal_ccs','2035','2035','M1','year')=100.0; +LAND.scale('R11_PAS','BIO06GHG1000','2110')=0.01; +ACT.scale('R11_LAM','eth_ic_trp','2100','2100','M1','year')=10.0; +LAND.scale('R11_NAM','BIO05GHG200','2100')=0.1; +LAND.scale('R11_LAM','BIO06GHG000','2055')=0.1; +EXT.scale('R11_SAS','crude_3','a','2035')=100.0; +ACT.scale('R11_FSU','eth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2090')=10.0; +EXT.scale('R11_PAO','crude_3','a','2045')=100.0; +EXT.scale('R11_NAM','crude_3','a','2030')=100.0; +ACT.scale('R11_EEU','leak_repairsf6','2060','2070','M1','year')=0.01; +EXT.scale('R11_CPA','crude_2','a','2050')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2035','2035','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2050','2055','M1','year')=100.0; +ACT.scale('R11_EEU','eth_ic_trp','2030','2030','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_4','2100','2100','M1','year')=100.0; +LAND.scale('R11_AFR','BIO05GHG100','2080')=0.1; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2030','year')=100.0; +EXT.scale('R11_EEU','gas_2','a','2090')=10.0; +ACT.scale('R11_PAS','meth_ic_trp','2050','2050','M1','year')=10.0; +ACT.scale('R11_PAO','meth_coal','2080','2080','M1','year')=100.0; +EXT.scale('R11_WEU','crude_3','a','2035')=100.0; +ACT.scale('R11_AFR','h2_coal','2045','2045','M1','year')=100.0; +EXT.scale('R11_NAM','lignite','a','2045')=100.0; +EXT.scale('R11_MEA','crude_1','a','2110')=10.0; +ACT.scale('R11_MEA','coal_gas','2080','2100','M1','year')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2030','2045','M1','year')=10.0; +ACT.scale('R11_LAM','eth_ic_trp','2050','2050','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2070','2070','M1','year')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2035')=0.01; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2070','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2070','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2090','2090','M1','year')=100.0; +EXT.scale('R11_MEA','crude_4','a','2080')=10.0; +EXT.scale('R11_FSU','gas_1','a','2025')=100.0; +EXT.scale('R11_SAS','crude_6','a','2060')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2100')=0.01; +ACT.scale('R11_AFR','syn_liq_ccs','2030','2030','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_2_ch4','2100','2100','M1','year')=100.0; +EXT.scale('R11_AFR','crude_4','a','2030')=100.0; +EXT.scale('R11_WEU','gas_2','a','2055')=100.0; +EXT.scale('R11_NAM','crude_2','a','2035')=100.0; +ACT.scale('R11_AFR','h2_coal_ccs','2030','2045','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq','2040','2045','M1','year')=100.0; +ACT.scale('R11_FSU','h2_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_NAM','crude_5','a','2110')=10.0; +ACT.scale('R11_LAM','h2_fc_trp','2060','2060','M1','year')=100.0; +EXT.scale('R11_WEU','crude_5','a','2030')=100.0; +EXT.scale('R11_PAS','crude_1','a','2045')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2035')=0.01; +EXT.scale('R11_CPA','crude_4','a','2080')=10.0; +EXT.scale('R11_NAM','crude_2','a','2055')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2055')=0.1; +ACT.scale('R11_PAO','syn_liq_ccs','2045','2060','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2100','2110','M1','year')=100.0; +EXT.scale('R11_PAS','gas_3','a','2040')=100.0; +EXT.scale('R11_PAS','crude_7','a','2045')=100.0; +ACT.scale('R11_EEU','loil_trp','2050','2050','M1','year')=10.0; +EXT.scale('R11_EEU','gas_4','a','2070')=10.0; +EXT.scale('R11_EEU','lignite','a','2025')=100.0; +EXT.scale('R11_NAM','crude_2','a','2070')=10.0; +EXT.scale('R11_PAO','gas_2','a','2080')=10.0; +ACT.scale('R11_PAO','syn_liq','2035','2040','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2040','2045','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2050','2060','M1','year')=100.0; +EXT.scale('R11_PAO','crude_4','a','2040')=100.0; +ACT.scale('R11_LAM','gas_cc_ccs','2050','2060','M1','year')=10.0; +ACT.scale('R11_AFR','h2_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_MEA','syn_liq_ccs','2055','2070','M1','year')=100.0; +EXT.scale('R11_AFR','gas_6','a','2025')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2025','2025','M1','year')=100.0; +EXT.scale('R11_FSU','gas_4','a','2045')=100.0; +EXT.scale('R11_MEA','gas_4','a','2055')=100.0; +EXT.scale('R11_CPA','crude_3','a','2030')=100.0; +EXT.scale('R11_AFR','gas_3','a','2035')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_MEA','gas_1','a','2060')=100.0; +EXT.scale('R11_AFR','crude_6','a','2050')=100.0; +EXT.scale('R11_MEA','crude_3','a','2040')=100.0; +EXT.scale('R11_MEA','crude_2','a','2050')=100.0; +EXT.scale('R11_NAM','crude_5','a','2080')=10.0; +ACT.scale('R11_AFR','coal_gas','2060','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2035','2035','M1','year')=100.0; +EXT.scale('R11_CPA','crude_1','a','2090')=10.0; +EXT.scale('R11_PAS','gas_6','a','2030')=100.0; +LAND.scale('R11_NAM','BIO06GHG000','2080')=0.1; +EXT.scale('R11_NAM','gas_5','a','2090')=10.0; +ACT.scale('R11_CPA','oil_extr_2','2030','2035','M1','year')=100.0; +ACT.scale('R11_PAS','meth_ic_trp','2110','2110','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG400','2050')=0.1; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2100','year')=100.0; +ACT_UP.scale('R11_PAO','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_NAM','crude_4','a','2055')=100.0; +EXT.scale('R11_MEA','gas_1','a','2035')=100.0; +EXT.scale('R11_PAS','gas_6','a','2045')=100.0; +EXT.scale('R11_AFR','gas_5','a','2050')=100.0; +EXT.scale('R11_SAS','crude_3','a','2025')=100.0; +EXT.scale('R11_CPA','crude_5','a','2060')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2100')=0.1; +ACT.scale('R11_EEU','meth_fc_trp','2060','2060','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2030','2045','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG1000','2100')=0.1; +EXT.scale('R11_WEU','gas_6','a','2100')=10.0; +ACT.scale('R11_EEU','loil_trp','2035','2035','M1','year')=10.0; +EXT.scale('R11_NAM','lignite','a','2100')=10.0; +EXT.scale('R11_SAS','crude_1','a','2090')=10.0; +EXT.scale('R11_SAS','crude_5','a','2030')=100.0; +EXT.scale('R11_PAO','gas_1','a','2070')=10.0; +EXT.scale('R11_WEU','coal','a','2030')=100.0; +ACT.scale('R11_PAS','eth_fc_trp','2060','2060','M1','year')=100.0; +ACT.scale('R11_MEA','coal_gas','2055','2070','M1','year')=100.0; +EXT.scale('R11_CPA','gas_2','a','2025')=100.0; +LAND.scale('R11_AFR','BIO06GHG000','2080')=0.1; +ACT.scale('R11_LAM','h2_coal','2030','2035','M1','year')=10.0; +EXT.scale('R11_PAS','crude_4','a','2060')=100.0; +EXT.scale('R11_CPA','gas_4','a','2055')=100.0; +ACT.scale('R11_AFR','coal_gas','2050','2060','M1','year')=100.0; +LAND.scale('R11_AFR','BIO04GHG3000','2110')=0.1; +ACT.scale('R11_MEA','meth_coal','2080','2100','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG100','2070')=0.1; +EXT.scale('R11_FSU','crude_7','a','2080')=10.0; +ACT.scale('R11_LAM','eth_fc_trp','2055','2055','M1','year')=100.0; +EXT.scale('R11_LAM','gas_4','a','2110')=10.0; +ACT.scale('R11_CPA','oil_extr_3','2030','2035','M1','year')=100.0; +EXT.scale('R11_SAS','crude_6','a','2025')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_PAS','crude_2','a','2110')=10.0; +LAND.scale('R11_NAM','BIO06GHG020','2090')=0.1; +ACT.scale('R11_PAO','syn_liq','2100','2100','M1','year')=100.0; +ACT_LO.scale('R11_PAS','csp_sm1_res4','2090','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2080','2100','M1','year')=100.0; +EXT.scale('R11_CPA','crude_7','a','2100')=10.0; +LAND.scale('R11_AFR','BIO06GHG050','2100')=0.1; +ACT.scale('R11_SAS','meth_fc_trp','2080','2080','M1','year')=100.0; +EXT.scale('R11_CPA','gas_1','a','2045')=100.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_SAS','gas_1','a','2070')=10.0; +LAND.scale('R11_LAM','BIO06GHG400','2060')=0.1; +ACT.scale('R11_PAO','h2_coal','2015','2025','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2055','2060','M1','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2100')=10.0; +EXT.scale('R11_WEU','crude_4','a','2110')=10.0; +LAND.scale('R11_AFR','BIO05GHG1500','2080')=0.1; +ACT.scale('R11_PAS','meth_ic_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal','2110','2110','M1','year')=100.0; +EXT.scale('R11_FSU','gas_5','a','2025')=100.0; +EXT.scale('R11_FSU','gas_2','a','2050')=100.0; +LAND.scale('R11_LAM','BIO05GHG3000','2100')=0.1; +LAND.scale('R11_CPA','BIO06GHG1000','2110')=0.1; +ACT.scale('R11_LAM','foil_trp','2060','2060','M1','year')=10.0; +EXT.scale('R11_SAS','gas_6','a','2110')=10.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_MEA','crude_7','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAS','h2_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2040','2040','M1','year')=100.0; +EXT.scale('R11_FSU','crude_3','a','2110')=10.0; +EXT.scale('R11_SAS','crude_7','a','2030')=100.0; +EXT.scale('R11_NAM','gas_4','a','2050')=100.0; +LAND.scale('R11_NAM','BIO05GHG2000','2100')=0.1; +EXT.scale('R11_CPA','gas_5','a','2070')=10.0; +EXT.scale('R11_PAO','lignite','a','2060')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2050','2055','M1','year')=100.0; +EXT.scale('R11_FSU','crude_1','a','2025')=100.0; +EXT.scale('R11_LAM','crude_5','a','2090')=10.0; +EXT.scale('R11_MEA','gas_1','a','2110')=10.0; +EXT.scale('R11_WEU','crude_3','a','2090')=10.0; +ACT.scale('R11_MEA','syn_liq','2060','2080','M1','year')=100.0; +EXT.scale('R11_LAM','crude_1','a','2025')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2035','2040','M1','year')=100.0; +EXT.scale('R11_SAS','gas_1','a','2045')=100.0; +LAND.scale('R11_LAM','BIO06GHG000','2100')=0.1; +EXT.scale('R11_LAM','crude_6','a','2110')=10.0; +ACT.scale('R11_MEA','h2_coal_ccs','2090','2090','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2030','2045','M1','year')=100.0; +EXT.scale('R11_AFR','crude_6','a','2070')=10.0; +LAND.scale('R11_NAM','BIO06GHG3000','2110')=0.1; +ACT.scale('R11_MEA','meth_coal','2070','2080','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2025','2030','M1','year')=100.0; +EXT.scale('R11_LAM','crude_4','a','2080')=10.0; +EXT.scale('R11_PAS','crude_1','a','2070')=10.0; +EXT.scale('R11_CPA','crude_1','a','2080')=10.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_LAM','crude_2','a','2080')=10.0; +ACT.scale('R11_PAO','coal_gas','2045','2070','M1','year')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2040','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2035','2045','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2045','2070','M1','year')=100.0; +EXT.scale('R11_SAS','gas_1','a','2100')=10.0; +EXT.scale('R11_SAS','crude_2','a','2045')=100.0; +EXT.scale('R11_NAM','crude_1','a','2040')=100.0; +LAND.scale('R11_NAM','BIO05GHG1000','2100')=0.1; +EXT.scale('R11_SAS','crude_3','a','2110')=10.0; +ACT.scale('R11_LAM','gas_cc','2035','2060','M1','year')=10.0; +EXT.scale('R11_LAM','crude_6','a','2035')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2045','2045','M1','year')=100.0; +EXT.scale('R11_MEA','crude_6','a','2040')=100.0; +LAND.scale('R11_AFR','BIO06GHG000','2090')=0.1; +EXT.scale('R11_PAS','lignite','a','2055')=100.0; +EXT.scale('R11_PAS','lignite','a','2110')=10.0; +ACT.scale('R11_MEA','meth_coal_ccs','2080','2080','M1','year')=100.0; +EXT.scale('R11_AFR','gas_1','a','2030')=100.0; +ACT.scale('R11_NAM','h2_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_SAS','gas_5','a','2030')=100.0; +ACT.scale('R11_LAM','foil_trp','2070','2070','M1','year')=10.0; +ACT.scale('R11_WEU','meth_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_LAM','gas_cc','2060','2060','M1','year')=10.0; +ACT.scale('R11_AFR','h2_coal_ccs','2035','2055','M1','year')=100.0; +EXT.scale('R11_NAM','gas_5','a','2055')=100.0; +ACT.scale('R11_PAO','coal_gas','2025','2045','M1','year')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2080','2080','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG200','2090')=0.1; +ACT.scale('R11_SAS','eth_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2055','2060','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_MEA','gas_1','a','2080')=10.0; +ACT.scale('R11_LAM','meth_coal','2045','2045','M1','year')=10.0; +EXT.scale('R11_WEU','crude_2','a','2035')=100.0; +LAND.scale('R11_NAM','BIO06GHG400','2100')=0.1; +ACT.scale('R11_EEU','h2_fc_trp','2060','2070','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2050','2050','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG020','2090')=0.1; +ACT.scale('R11_AFR','h2_coal_ccs','2060','2060','M1','year')=100.0; +EXT.scale('R11_AFR','crude_3','a','2060')=100.0; +LAND.scale('R11_LAM','BIO05GHG020','2100')=0.1; +ACT.scale('R11_MEA','h2_coal_ccs','2100','2100','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2090','2100','M1','year')=100.0; +EXT.scale('R11_LAM','gas_5','a','2090')=10.0; +EXT.scale('R11_PAS','coal','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2045','2050','M1','year')=100.0; +EXT.scale('R11_LAM','gas_5','a','2040')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2050')=0.1; +EXT.scale('R11_PAO','crude_3','a','2030')=100.0; +EXT.scale('R11_WEU','crude_6','a','2055')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2100','2100','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq_ccs','2030','2040','M1','year')=10.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2050','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG050','2080')=0.1; +EXT.scale('R11_SAS','crude_3','a','2030')=100.0; +EXT.scale('R11_PAO','coal','a','2060')=100.0; +EXT.scale('R11_PAO','gas_1','a','2110')=10.0; +EXT.scale('R11_AFR','gas_5','a','2080')=10.0; +EXT.scale('R11_NAM','gas_1','a','2025')=100.0; +ACT.scale('R11_EEU','meth_fc_trp','2070','2070','M1','year')=100.0; +EXT.scale('R11_MEA','gas_5','a','2060')=100.0; +EXT.scale('R11_MEA','crude_2','a','2090')=10.0; +EXT.scale('R11_PAO','gas_6','a','2100')=10.0; +ACT.scale('R11_MEA','meth_coal_ccs','2080','2090','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG1000','2110')=0.1; +EXT.scale('R11_SAS','crude_4','a','2040')=100.0; +EXT.scale('R11_PAS','gas_5','a','2055')=100.0; +EXT.scale('R11_PAO','gas_1','a','2025')=100.0; +ACT.scale('R11_SAS','ref_lol','2005','2025','M1','year')=10.0; +EXT.scale('R11_LAM','gas_2','a','2045')=100.0; +LAND.scale('R11_PAS','BIO06GHG2000','2110')=0.01; +ACT.scale('R11_LAM','coal_gas','2030','2030','M1','year')=10.0; +EXT.scale('R11_NAM','crude_4','a','2080')=10.0; +ACT.scale('R11_LAM','h2_coal','2035','2045','M1','year')=10.0; +ACT.scale('R11_EEU','elec_t_d','2035','2080','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_NAM','crude_2','a','2060')=100.0; +ACT.scale('R11_EEU','replacement_so2','2055','2060','M1','year')=0.01; +EXT.scale('R11_SAS','gas_6','a','2050')=100.0; +EXT.scale('R11_EEU','crude_1','a','2060')=100.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2100','year')=100.0; +EXT.scale('R11_LAM','crude_2','a','2040')=100.0; +ACT.scale('R11_MEA','coal_gas','2100','2100','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2030','2050','M1','year')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2030')=0.01; +EXT.scale('R11_PAS','crude_4','a','2030')=100.0; +LAND.scale('R11_AFR','BIO06GHG1500','2045')=0.1; +EXT.scale('R11_SAS','gas_1','a','2080')=10.0; +EXT.scale('R11_PAS','gas_5','a','2040')=100.0; +CAP_NEW.scale('R11_SAS','mvac_co2','2055')=0.01; +ACT.scale('R11_AFR','coal_gas','2015','2025','M1','year')=100.0; +CAP_NEW.scale('R11_AFR','mvac_co2','2040')=0.01; +EXT.scale('R11_PAS','gas_6','a','2090')=10.0; +ACT.scale('R11_PAO','syn_liq_ccs','2055','2055','M1','year')=100.0; +EXT.scale('R11_AFR','crude_7','a','2070')=10.0; +ACT.scale('R11_WEU','eth_fc_trp','2100','2100','M1','year')=100.0; +EXT.scale('R11_MEA','gas_2','a','2045')=100.0; +ACT.scale('R11_EEU','meth_ic_trp','2035','2035','M1','year')=10.0; +ACT.scale('R11_AFR','meth_coal','2045','2050','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2020','2030','M1','year')=100.0; +EXT.scale('R11_NAM','lignite','a','2060')=100.0; +ACT.scale('R11_MEA','syn_liq','2080','2090','M1','year')=100.0; +EXT.scale('R11_SAS','crude_7','a','2070')=10.0; +ACT.scale('R11_EEU','elec_t_d','2040','2070','M1','year')=100.0; +ACT.scale('R11_LAM','eth_ic_trp','2040','2040','M1','year')=10.0; +ACT.scale('R11_SAS','ref_lol','2025','2025','M1','year')=10.0; +EXT.scale('R11_PAS','gas_2','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_5','2040','2040','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2050','2060','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG000','2050')=0.1; +EXT.scale('R11_AFR','coal','a','2070')=10.0; +EXT.scale('R11_LAM','gas_5','a','2045')=100.0; +EXT.scale('R11_PAS','crude_3','a','2055')=100.0; +LAND.scale('R11_CPA','BIO06GHG2000','2090')=0.1; +EXT.scale('R11_FSU','crude_1','a','2060')=100.0; +EXT.scale('R11_NAM','crude_6','a','2090')=10.0; +EXT.scale('R11_CPA','gas_3','a','2090')=10.0; +EXT.scale('R11_CPA','gas_2','a','2040')=100.0; +LAND.scale('R11_LAM','BIO05GHG400','2080')=0.1; +LAND.scale('R11_FSU','BIO06GHG2000','2110')=0.1; +ACT.scale('R11_AFR','meth_coal_ccs','2055','2070','M1','year')=100.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_AFR','lignite','a','2060')=100.0; +ACT.scale('R11_PAO','meth_ic_trp','2070','2070','M1','year')=10.0; +LAND.scale('R11_LAM','BIO06GHG000','2110')=0.1; +ACT.scale('R11_PAO','h2_coal_ccs','2110','2110','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2050','2055','M1','year')=100.0; +ACT.scale('R11_MEA','oil_extr_2','2110','2110','M1','year')=100.0; +EXT.scale('R11_FSU','crude_7','a','2060')=100.0; +ACT.scale('R11_MEA','meth_coal','2080','2090','M1','year')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2070','2070','M1','year')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2070','2070','M1','year')=10.0; +EXT.scale('R11_FSU','gas_3','a','2025')=100.0; +EXT.scale('R11_AFR','gas_2','a','2040')=100.0; +EXT.scale('R11_PAS','gas_4','a','2100')=10.0; +ACT.scale('R11_WEU','h2_fc_trp','2055','2060','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal','2045','2045','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_CPA','crude_3','a','2050')=100.0; +EXT.scale('R11_CPA','gas_5','a','2040')=100.0; +EXT.scale('R11_AFR','lignite','a','2070')=10.0; +ACT.scale('R11_LAM','coal_gas','2025','2040','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG1000','2070')=0.1; +EXT.scale('R11_PAO','gas_4','a','2050')=100.0; +EXT.scale('R11_MEA','crude_6','a','2080')=10.0; +EXT.scale('R11_WEU','crude_4','a','2045')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2050')=0.1; +ACT.scale('R11_AFR','h2_coal','2055','2070','M1','year')=100.0; +EXT.scale('R11_LAM','gas_5','a','2025')=100.0; +LAND.scale('R11_AFR','BIO05GHG100','2110')=0.1; +EXT.scale('R11_PAS','crude_5','a','2100')=10.0; +LAND.scale('R11_LAM','BIO06GHG1500','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_4_ch4','2025','2030','M1','year')=100.0; +EXT.scale('R11_PAS','gas_3','a','2090')=10.0; +ACT.scale('R11_EEU','elec_t_d','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2055','2055','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2090','2090','M1','year')=100.0; +EXT.scale('R11_EEU','crude_4','a','2070')=10.0; +ACT.scale('R11_PAO','coal_gas','2055','2080','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2050','2055','M1','year')=100.0; +EXT.scale('R11_EEU','gas_5','a','2045')=100.0; +EXT.scale('R11_PAO','gas_5','a','2040')=100.0; +EXT.scale('R11_LAM','crude_1','a','2055')=100.0; +EXT.scale('R11_AFR','coal','a','2100')=10.0; +EXT.scale('R11_MEA','crude_2','a','2070')=10.0; +ACT.scale('R11_LAM','coal_gas','2025','2035','M1','year')=10.0; +LAND.scale('R11_AFR','BIO06GHG400','2100')=0.1; +EXT.scale('R11_LAM','gas_6','a','2040')=100.0; +EXT.scale('R11_EEU','gas_6','a','2110')=10.0; +EXT.scale('R11_PAS','coal','a','2030')=100.0; +EXT.scale('R11_PAS','coal','a','2090')=10.0; +EXT.scale('R11_WEU','crude_4','a','2070')=10.0; +EXT.scale('R11_FSU','gas_4','a','2030')=100.0; +EXT.scale('R11_LAM','coal','a','2040')=100.0; +EXT.scale('R11_NAM','crude_2','a','2040')=100.0; +EXT.scale('R11_PAO','gas_6','a','2040')=100.0; +LAND.scale('R11_AFR','BIO06GHG1500','2100')=0.1; +ACT.scale('R11_LAM','h2_fc_trp','2055','2060','M1','year')=100.0; +EXT.scale('R11_MEA','gas_6','a','2110')=10.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2045','year')=100.0; +EXT.scale('R11_LAM','crude_7','a','2070')=10.0; +EXT.scale('R11_EEU','crude_3','a','2040')=100.0; +LAND.scale('R11_LAM','BIO05GHG1000','2110')=0.1; +LAND.scale('R11_NAM','BIO06GHG1500','2070')=0.1; +ACT.scale('R11_PAO','h2_fc_trp','2025','2030','M1','year')=100.0; +EXT.scale('R11_CPA','crude_3','a','2060')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2055','2055','M1','year')=100.0; +ACT.scale('R11_LAM','syn_liq','2025','2040','M1','year')=10.0; +LAND.scale('R11_LAM','BIO05GHG100','2110')=0.1; +EXT.scale('R11_SAS','crude_5','a','2045')=100.0; +ACT.scale('R11_LAM','meth_ic_trp','2045','2045','M1','year')=10.0; +ACT.scale('R11_EEU','foil_trp','2030','2030','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2030','2030','M1','year')=100.0; +ACT_LO.scale('R11_LAM','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_EEU','gas_3','a','2070')=10.0; +EXT.scale('R11_LAM','coal','a','2025')=100.0; +LAND.scale('R11_AFR','BIO06GHG050','2110')=0.1; +EXT.scale('R11_NAM','gas_4','a','2030')=100.0; +EXT.scale('R11_CPA','gas_1','a','2035')=100.0; +EXT.scale('R11_FSU','lignite','a','2100')=10.0; +EXT.scale('R11_MEA','gas_3','a','2060')=100.0; +ACT.scale('R11_AFR','h2_coal','2040','2045','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_7','2110','2110','M1','year')=100.0; +EXT.scale('R11_PAS','crude_3','a','2030')=100.0; +CAP_NEW.scale('R11_WEU','mvac_co2','2060')=0.01; +EXT.scale('R11_LAM','gas_2','a','2060')=100.0; +EXT.scale('R11_AFR','gas_1','a','2035')=100.0; +LAND.scale('R11_NAM','BIO05GHG010','2100')=0.1; +LAND.scale('R11_AFR','BIO05GHG600','2110')=0.1; +EXT.scale('R11_EEU','crude_7','a','2035')=100.0; +EXT.scale('R11_SAS','gas_1','a','2040')=100.0; +EXT.scale('R11_WEU','lignite','a','2025')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2050','2050','M1','year')=100.0; +EXT.scale('R11_EEU','gas_4','a','2060')=100.0; +ACT.scale('R11_PAO','syn_liq','2070','2080','M1','year')=100.0; +EXT.scale('R11_FSU','crude_2','a','2035')=100.0; +ACT.scale('R11_PAO','eth_ic_trp','2070','2070','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_4','2060','2060','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal','2020','2025','M1','year')=10.0; +ACT.scale('R11_PAS','eth_fc_trp','2090','2090','M1','year')=100.0; +EXT.scale('R11_FSU','crude_7','a','2090')=10.0; +LAND.scale('R11_AFR','BIO06GHG2000','2080')=0.1; +EXT.scale('R11_EEU','gas_3','a','2045')=100.0; +LAND.scale('R11_NAM','BIO05GHG020','2090')=0.1; +ACT.scale('R11_LAM','meth_fc_trp','2110','2110','M1','year')=100.0; +ACT_UP.scale('R11_AFR','csp_sm1_res4','2055','year')=100.0; +EXT.scale('R11_PAS','crude_6','a','2060')=100.0; +EXT.scale('R11_CPA','gas_6','a','2050')=100.0; +ACT.scale('R11_LAM','syn_liq','2030','2030','M1','year')=10.0; +ACT.scale('R11_WEU','h2_fc_trp','2100','2100','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2020','2035','M1','year')=100.0; +EXT.scale('R11_WEU','crude_7','a','2035')=100.0; +ACT.scale('R11_PAO','syn_liq_ccs','2040','2045','M1','year')=100.0; +ACT.scale('R11_EEU','h2_fc_trp','2035','2035','M1','year')=100.0; +EXT.scale('R11_WEU','gas_2','a','2080')=10.0; +ACT.scale('R11_LAM','meth_fc_trp','2025','2025','M1','year')=100.0; +LAND.scale('R11_CPA','BIO06GHG100','2110')=0.1; +CAP_NEW.scale('R11_PAO','mvac_co2','2025')=0.01; +ACT.scale('R11_AFR','h2_coal_ccs','2035','2050','M1','year')=100.0; +EXT.scale('R11_LAM','crude_4','a','2050')=100.0; +LAND.scale('R11_AFR','BIO06GHG010','2050')=0.1; +ACT.scale('R11_PAO','coal_gas','2080','2100','M1','year')=100.0; +ACT.scale('R11_AFR','syn_liq','2035','2035','M1','year')=100.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_SAS','crude_5','a','2070')=10.0; +EXT.scale('R11_CPA','coal','a','2080')=10.0; +ACT.scale('R11_CPA','oil_extr_1','2020','2025','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal','2025','2025','M1','year')=10.0; +EXT.scale('R11_SAS','gas_4','a','2025')=100.0; +LAND.scale('R11_AFR','BIO06GHG400','2045')=0.1; +ACT.scale('R11_PAO','meth_coal','2035','2045','M1','year')=100.0; +EXT.scale('R11_NAM','crude_2','a','2045')=100.0; +ACT.scale('R11_EEU','elec_t_d','2030','2070','M1','year')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2055','2070','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG3000','2070')=0.1; +ACT.scale('R11_MEA','meth_coal','2090','2090','M1','year')=100.0; +ACT.scale('R11_EEU','elec_t_d','2045','2080','M1','year')=100.0; +EXT.scale('R11_FSU','gas_2','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_1','2060','2060','M1','year')=100.0; +EXT.scale('R11_PAO','gas_5','a','2055')=100.0; +ACT.scale('R11_MEA','oil_extr_3_ch4','2110','2110','M1','year')=100.0; +ACT.scale('R11_AFR','h2_coal','2035','2035','M1','year')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_LAM','gas_1','a','2025')=100.0; +ACT.scale('R11_LAM','h2_fc_trp','2045','2050','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG020','2080')=0.1; +EXT.scale('R11_NAM','lignite','a','2110')=10.0; +EXT.scale('R11_CPA','coal','a','2045')=100.0; +ACT.scale('R11_PAO','coal_gas','2090','2110','M1','year')=100.0; +EXT.scale('R11_PAS','gas_1','a','2050')=100.0; +EXT.scale('R11_LAM','crude_3','a','2050')=100.0; +EXT.scale('R11_AFR','gas_6','a','2050')=100.0; +ACT.scale('R11_AFR','syn_liq','2045','2070','M1','year')=100.0; +EXT.scale('R11_AFR','crude_4','a','2050')=100.0; +EXT.scale('R11_FSU','gas_1','a','2060')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2045')=0.01; +EXT.scale('R11_PAO','crude_4','a','2100')=10.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_LAM','gas_1','a','2070')=10.0; +EXT.scale('R11_CPA','crude_1','a','2055')=100.0; +EXT.scale('R11_CPA','crude_2','a','2040')=100.0; +EXT.scale('R11_CPA','coal','a','2060')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2040','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2080')=10.0; +EXT.scale('R11_SAS','gas_5','a','2040')=100.0; +ACT.scale('R11_EEU','recycling_gas1','2090','2090','M1','year')=0.01; +ACT.scale('R11_PAO','syn_liq','2055','2055','M1','year')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2060')=0.01; +ACT.scale('R11_MEA','syn_liq_ccs','2070','2070','M1','year')=100.0; +EXT.scale('R11_FSU','gas_3','a','2050')=100.0; +ACT_UP.scale('R11_WEU','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_NAM','crude_3','a','2040')=100.0; +EXT.scale('R11_PAS','gas_6','a','2050')=100.0; +EXT.scale('R11_FSU','crude_1','a','2100')=10.0; +EXT.scale('R11_CPA','gas_2','a','2060')=100.0; +ACT.scale('R11_EEU','elec_t_d','2070','2090','M1','year')=100.0; +EXT.scale('R11_LAM','gas_6','a','2090')=10.0; +ACT_LO.scale('R11_AFR','csp_sm1_res4','2080','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG200','2070')=0.1; +EXT.scale('R11_WEU','crude_2','a','2070')=10.0; +ACT.scale('R11_AFR','h2_coal_ccs','2035','2035','M1','year')=100.0; +EXT.scale('R11_SAS','crude_4','a','2110')=10.0; +EXT.scale('R11_SAS','gas_2','a','2050')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_PAS','foil_trp','2100','2100','M1','year')=10.0; +ACT.scale('R11_MEA','h2_coal','2050','2070','M1','year')=100.0; +EXT.scale('R11_WEU','gas_1','a','2080')=10.0; +LAND.scale('R11_LAM','BIO06GHG400','2090')=0.1; +EXT.scale('R11_NAM','crude_7','a','2035')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2100','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2_ch4','2110','2110','M1','year')=100.0; +ACT.scale('R11_LAM','h2_coal_ccs','2030','2040','M1','year')=10.0; +EXT.scale('R11_AFR','crude_4','a','2080')=10.0; +EXT.scale('R11_EEU','lignite','a','2030')=100.0; +ACT.scale('R11_PAS','foil_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_NAM','crude_2','a','2100')=10.0; +EXT.scale('R11_EEU','crude_3','a','2055')=100.0; +EXT.scale('R11_CPA','crude_2','a','2030')=100.0; +EXT.scale('R11_NAM','crude_1','a','2055')=100.0; +EXT.scale('R11_FSU','lignite','a','2045')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2090','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG1000','2070')=0.1; +ACT.scale('R11_PAO','coal_gas','2015','2035','M1','year')=100.0; +EXT.scale('R11_CPA','lignite','a','2035')=100.0; +EXT.scale('R11_MEA','gas_2','a','2090')=10.0; +EXT.scale('R11_SAS','gas_5','a','2110')=10.0; +EXT.scale('R11_FSU','gas_2','a','2070')=10.0; +LAND.scale('R11_LAM','BIO05GHG020','2110')=0.1; +LAND.scale('R11_AFR','BIO06GHG1000','2090')=0.1; +LAND.scale('R11_CPA','BIO06GHG2000','2110')=0.1; +LAND.scale('R11_NAM','BIO05GHG020','2110')=0.1; +EXT.scale('R11_MEA','gas_3','a','2110')=10.0; +ACT_UP.scale('R11_CPA','csp_sm1_res4','2050','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2070','2070','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2090','2090','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2030','2040','M1','year')=100.0; +EXT.scale('R11_PAO','crude_7','a','2055')=100.0; +EXT.scale('R11_CPA','gas_4','a','2090')=10.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2055')=0.01; +EXT.scale('R11_EEU','lignite','a','2070')=10.0; +EXT.scale('R11_FSU','crude_3','a','2090')=10.0; +EXT.scale('R11_AFR','gas_3','a','2055')=100.0; +EXT.scale('R11_MEA','crude_3','a','2090')=10.0; +EXT.scale('R11_PAO','crude_2','a','2050')=100.0; +CAP_NEW.scale('R11_NAM','mvac_co2','2025')=0.01; +EXT.scale('R11_PAO','crude_5','a','2045')=100.0; +EXT.scale('R11_LAM','crude_3','a','2100')=10.0; +EXT.scale('R11_CPA','gas_2','a','2030')=100.0; +EXT.scale('R11_AFR','gas_4','a','2045')=100.0; +EXT.scale('R11_FSU','gas_6','a','2045')=100.0; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2045','year')=100.0; +ACT.scale('R11_LAM','h2_coal','2040','2040','M1','year')=10.0; +ACT.scale('R11_PAO','coal_gas','2100','2110','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2055','2060','M1','year')=100.0; +LAND.scale('R11_LAM','BIO05GHG010','2080')=0.1; +LAND.scale('R11_LAM','BIO06GHG400','2070')=0.1; +EXT.scale('R11_PAS','crude_5','a','2060')=100.0; +ACT.scale('R11_PAO','syn_liq','2035','2050','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG3000','2060')=0.1; +ACT.scale('R11_CPA','oil_extr_1','2110','2110','M1','year')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2070','2080','M1','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG010','2100')=0.1; +ACT.scale('R11_CPA','oil_extr_2','2040','2040','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG1500','2100')=0.1; +EXT.scale('R11_LAM','gas_3','a','2090')=10.0; +EXT.scale('R11_SAS','gas_6','a','2040')=100.0; +EXT.scale('R11_EEU','gas_6','a','2050')=100.0; +EXT.scale('R11_NAM','gas_2','a','2080')=10.0; +EXT.scale('R11_WEU','gas_5','a','2110')=10.0; +CAP_NEW.scale('R11_LAM','mvac_co2','2100')=0.01; +EXT.scale('R11_LAM','coal','a','2110')=10.0; +ACT.scale('R11_PAO','coal_gas','2055','2070','M1','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG400','2055')=0.1; +ACT.scale('R11_AFR','coal_gas','2015','2035','M1','year')=100.0; +EXT.scale('R11_EEU','crude_2','a','2040')=100.0; +ACT.scale('R11_CPA','oil_extr_3_ch4','2100','2100','M1','year')=100.0; +ACT_UP.scale('R11_EEU','csp_sm1_res4','2070','year')=100.0; +LAND.scale('R11_LAM','BIO06GHG600','2090')=0.1; +ACT.scale('R11_LAM','eth_ic_trp','2025','2025','M1','year')=10.0; +ACT.scale('R11_EEU','h2_fc_trp','2050','2055','M1','year')=100.0; +EXT.scale('R11_SAS','crude_6','a','2035')=100.0; +EXT.scale('R11_WEU','crude_3','a','2025')=100.0; +EXT.scale('R11_MEA','gas_6','a','2030')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2040','2045','M1','year')=10.0; +ACT.scale('R11_AFR','coal_gas','2030','2035','M1','year')=100.0; +EXT.scale('R11_CPA','crude_2','a','2070')=10.0; +LAND.scale('R11_NAM','BIO05GHG2000','2080')=0.1; +ACT.scale('R11_CPA','oil_extr_4_ch4','2080','2080','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2055','2055','M1','year')=100.0; +ACT.scale('R11_PAO','h2_fc_trp','2030','2035','M1','year')=100.0; +ACT.scale('R11_FSU','h2_fc_trp','2110','2110','M1','year')=100.0; +ACT.scale('R11_EEU','eth_fc_trp','2110','2110','M1','year')=100.0; +EXT.scale('R11_CPA','gas_3','a','2030')=100.0; +ACT.scale('R11_EEU','elec_t_d','2070','2100','M1','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2035')=100.0; +EXT.scale('R11_EEU','crude_4','a','2045')=100.0; +ACT.scale('R11_AFR','h2_coal','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAO','loil_trp','2110','2110','M1','year')=10.0; +ACT.scale('R11_CPA','oil_extr_6','2110','2110','M1','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2055','2060','M1','year')=100.0; +ACT.scale('R11_WEU','loil_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_MEA','crude_5','a','2080')=10.0; +EXT.scale('R11_PAO','gas_4','a','2110')=10.0; +ACT.scale('R11_PAO','syn_liq','2090','2090','M1','year')=100.0; +EXT.scale('R11_NAM','crude_6','a','2100')=10.0; +LAND.scale('R11_SAS','BIO06GHG1000','2100')=0.01; +EXT.scale('R11_MEA','crude_7','a','2045')=100.0; +ACT.scale('R11_PAO','foil_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_PAO','loil_trp','2090','2090','M1','year')=10.0; +ACT.scale('R11_PAO','h2_coal_ccs','2080','2080','M1','year')=100.0; +EXT.scale('R11_FSU','crude_3','a','2045')=100.0; +EXT.scale('R11_SAS','coal','a','2040')=100.0; +EXT.scale('R11_MEA','crude_4','a','2055')=100.0; +LAND.scale('R11_NAM','BIO06GHG2000','2080')=0.1; +ACT.scale('R11_PAO','coal_gas','2035','2055','M1','year')=100.0; +EXT.scale('R11_CPA','crude_1','a','2050')=100.0; +EXT.scale('R11_WEU','gas_1','a','2030')=100.0; +LAND.scale('R11_LAM','BIO06GHG2000','2090')=0.1; +LAND.scale('R11_LAM','BIO06GHG1000','2090')=0.1; +ACT.scale('R11_SAS','h2_fc_trp','2060','2070','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2045','2045','M1','year')=100.0; +ACT.scale('R11_AFR','h2_fc_trp','2060','2070','M1','year')=100.0; +EXT.scale('R11_NAM','crude_1','a','2035')=100.0; +ACT.scale('R11_AFR','meth_coal','2045','2060','M1','year')=100.0; +ACT.scale('R11_AFR','coal_gas','2035','2050','M1','year')=100.0; +EXT.scale('R11_SAS','lignite','a','2030')=100.0; +ACT.scale('R11_EEU','elec_t_d','2025','2070','M1','year')=100.0; +EXT.scale('R11_SAS','lignite','a','2060')=100.0; +EXT.scale('R11_NAM','crude_4','a','2100')=10.0; +ACT.scale('R11_PAO','coal_gas','2050','2060','M1','year')=100.0; +EXT.scale('R11_WEU','gas_1','a','2090')=10.0; +EXT.scale('R11_MEA','gas_2','a','2055')=100.0; +EXT.scale('R11_WEU','gas_4','a','2070')=10.0; +EXT.scale('R11_MEA','crude_1','a','2080')=10.0; +EXT.scale('R11_CPA','crude_7','a','2045')=100.0; +CAP_NEW.scale('R11_PAO','mvac_co2','2070')=0.01; +EXT.scale('R11_EEU','gas_2','a','2030')=100.0; +ACT.scale('R11_MEA','meth_coal_ccs','2100','2100','M1','year')=100.0; +EXT.scale('R11_AFR','crude_2','a','2080')=10.0; +EXT.scale('R11_EEU','coal','a','2025')=100.0; +EXT.scale('R11_PAO','gas_5','a','2100')=10.0; +EXT.scale('R11_EEU','crude_3','a','2030')=100.0; +EXT.scale('R11_EEU','coal','a','2050')=100.0; +EXT.scale('R11_NAM','lignite','a','2035')=100.0; +ACT.scale('R11_PAO','coal_gas','2030','2035','M1','year')=100.0; +ACT.scale('R11_MEA','h2_coal','2100','2100','M1','year')=100.0; +CAP_NEW.scale('R11_CPA','mvac_co2','2070')=0.01; +EXT.scale('R11_FSU','gas_3','a','2040')=100.0; +EXT.scale('R11_AFR','gas_1','a','2090')=10.0; +ACT.scale('R11_PAO','syn_liq','2045','2050','M1','year')=100.0; +ACT.scale('R11_LAM','meth_coal_ccs','2035','2045','M1','year')=10.0; +EXT.scale('R11_AFR','crude_3','a','2090')=10.0; +EXT.scale('R11_NAM','coal','a','2040')=100.0; +EXT.scale('R11_LAM','crude_3','a','2060')=100.0; +EXT.scale('R11_LAM','crude_3','a','2070')=10.0; +ACT.scale('R11_AFR','h2_coal','2015','2025','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2030','2030','M1','year')=100.0; +EXT.scale('R11_EEU','lignite','a','2110')=10.0; +ACT.scale('R11_WEU','loil_trp','2100','2100','M1','year')=10.0; +EXT.scale('R11_SAS','crude_2','a','2030')=100.0; +ACT.scale('R11_AFR','coal_gas','2010','2025','M1','year')=100.0; +EXT.scale('R11_PAO','gas_2','a','2050')=100.0; +CAP_NEW.scale('R11_PAS','mvac_co2','2100')=0.01; +EXT.scale('R11_PAS','coal','a','2060')=100.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2080','year')=100.0; +ACT.scale('R11_AFR','meth_coal','2035','2055','M1','year')=100.0; +EXT.scale('R11_EEU','gas_1','a','2045')=100.0; +ACT.scale('R11_PAO','meth_coal','2045','2050','M1','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2110','2110','M1','year')=100.0; +ACT.scale('R11_PAO','coal_gas','2090','2100','M1','year')=100.0; +ACT_LO.scale('R11_NAM','csp_sm1_res4','2090','year')=100.0; +EXT.scale('R11_FSU','crude_3','a','2030')=100.0; +EXT.scale('R11_LAM','crude_2','a','2100')=10.0; +EXT.scale('R11_FSU','gas_2','a','2060')=100.0; +ACT.scale('R11_PAO','h2_coal_ccs','2050','2070','M1','year')=100.0; +ACT_LO.scale('R11_SAS','csp_sm1_res4','2045','year')=100.0; +ACT.scale('R11_CPA','oil_extr_3','2040','2040','M1','year')=100.0; +ACT_UP.scale('R11_FSU','csp_sm1_res4','2025','year')=100.0; +ACT.scale('R11_CPA','oil_extr_2','2020','2025','M1','year')=100.0; +EXT.scale('R11_WEU','gas_5','a','2090')=10.0; +ACT.scale('R11_PAO','coal_gas','2090','2090','M1','year')=100.0; +EXT.scale('R11_MEA','crude_3','a','2055')=100.0; +CAP_NEW.scale('R11_EEU','mvac_co2','2025')=0.01; +LAND.scale('R11_AFR','BIO05GHG1000','2110')=0.1; +EXT.scale('R11_PAS','gas_3','a','2030')=100.0; +EXT.scale('R11_NAM','gas_5','a','2030')=100.0; +EXT.scale('R11_MEA','gas_5','a','2070')=10.0; +EXT.scale('R11_NAM','crude_2','a','2025')=100.0; +ACT_UP.scale('R11_SAS','csp_sm1_res4','2060','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2060','2080','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal_ccs','2090','2090','M1','year')=100.0; +EXT.scale('R11_LAM','crude_1','a','2030')=100.0; +EXT.scale('R11_EEU','gas_1','a','2055')=100.0; +EXT.scale('R11_PAO','crude_1','a','2040')=100.0; +EXT.scale('R11_LAM','gas_4','a','2080')=10.0; +EXT.scale('R11_FSU','coal','a','2045')=100.0; +ACT.scale('R11_LAM','gas_cc_ccs','2045','2060','M1','year')=10.0; +ACT.scale('R11_EEU','foil_trp','2055','2055','M1','year')=10.0; +EXT.scale('R11_PAO','crude_1','a','2030')=100.0; +ACT_LO.scale('R11_FSU','csp_sm1_res4','2050','year')=100.0; +EXT.scale('R11_LAM','gas_3','a','2045')=100.0; +EXT.scale('R11_SAS','gas_4','a','2030')=100.0; +EXT.scale('R11_EEU','gas_5','a','2035')=100.0; +ACT.scale('R11_PAO','syn_liq','2025','2035','M1','year')=100.0; +LAND.scale('R11_AFR','BIO06GHG020','2060')=0.1; +ACT.scale('R11_PAO','syn_liq_ccs','2040','2050','M1','year')=100.0; +EXT.scale('R11_FSU','gas_6','a','2030')=100.0; +ACT.scale('R11_CPA','oil_extr_4','2045','2045','M1','year')=100.0; +EXT.scale('R11_SAS','crude_6','a','2090')=10.0; +ACT_UP.scale('R11_MEA','csp_sm1_res4','2060','year')=100.0; +LAND.scale('R11_NAM','BIO06GHG200','2090')=0.1; +CAP_NEW.scale('R11_WEU','mvac_co2','2025')=0.01; +ACT_LO.scale('R11_WEU','csp_sm1_res4','2080','year')=100.0; +EXT.scale('R11_LAM','gas_3','a','2025')=100.0; +EXT.scale('R11_FSU','crude_6','a','2040')=100.0; +EXT.scale('R11_CPA','crude_2','a','2055')=100.0; +EXT.scale('R11_SAS','crude_6','a','2030')=100.0; +ACT_UP.scale('R11_PAS','csp_sm1_res4','2110','year')=100.0; +EXT.scale('R11_AFR','gas_2','a','2050')=100.0; +EXT.scale('R11_PAO','crude_6','a','2100')=10.0; +EXT.scale('R11_LAM','gas_1','a','2060')=100.0; +LAND.scale('R11_PAS','BIO06GHG3000','2110')=0.01; +LAND.scale('R11_LAM','BIO06GHG600','2055')=0.1; +ACT.scale('R11_AFR','coal_gas','2055','2060','M1','year')=100.0; +LAND.scale('R11_NAM','BIO05GHG1500','2090')=0.1; +EXT.scale('R11_AFR','gas_3','a','2045')=100.0; +EXT.scale('R11_WEU','gas_2','a','2025')=100.0; +EXT.scale('R11_PAO','gas_1','a','2080')=10.0; +ACT.scale('R11_SAS','meth_fc_trp','2090','2090','M1','year')=100.0; +ACT_LO.scale('R11_EEU','csp_sm1_res4','2030','year')=100.0; +ACT.scale('R11_AFR','syn_liq_ccs','2055','2055','M1','year')=100.0; +EXT.scale('R11_LAM','crude_4','a','2035')=100.0; +CAP_NEW.scale('R11_WEU','meth_coal_ccs','2110')=0.01; +EXT.scale('R11_NAM','gas_3','a','2090')=10.0; +EXT.scale('R11_PAS','lignite','a','2035')=100.0; +ACT.scale('R11_CPA','oil_extr_4_ch4','2070','2070','M1','year')=100.0; +EXT.scale('R11_WEU','gas_6','a','2080')=10.0; +EXT.scale('R11_NAM','coal','a','2035')=100.0; +ACT.scale('R11_WEU','h2_fc_trp','2080','2080','M1','year')=100.0; +ACT.scale('R11_WEU','meth_ic_trp','2090','2090','M1','year')=10.0; +EXT.scale('R11_EEU','crude_3','a','2090')=10.0; +EXT.scale('R11_MEA','crude_4','a','2035')=100.0; +EXT.scale('R11_PAS','crude_3','a','2050')=100.0; +EXT.scale('R11_AFR','gas_3','a','2110')=10.0; +ACT_LO.scale('R11_PAO','csp_sm1_res4','2035','year')=100.0; +ACT.scale('R11_CPA','oil_extr_1_ch4','2020','2025','M1','year')=100.0; +ACT.scale('R11_PAO','meth_coal','2045','2060','M1','year')=100.0; +EXT.scale('R11_SAS','crude_5','a','2055')=100.0; +EXT.scale('R11_AFR','gas_6','a','2060')=100.0; +EXT.scale('R11_AFR','coal','a','2040')=100.0; +MESSAGE_LP.scaleopt=1; \ No newline at end of file diff --git a/message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms b/message_ix/model/scaler/MsgScaler_Westeros_Electrified_emission_bound_unscaled.gms similarity index 100% rename from message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms rename to message_ix/model/scaler/MsgScaler_Westeros_Electrified_emission_bound_unscaled.gms index 7be21d66f..17e2f3424 100644 --- a/message_ix/model/prescaler/MsgPrescaler_Westeros Electrified_emission_bound_unscaled.gms +++ b/message_ix/model/scaler/MsgScaler_Westeros_Electrified_emission_bound_unscaled.gms @@ -1,6 +1,6 @@ -COST_ACCOUNTING_NODAL.scale('Westeros','710')=10.0; -COST_ACCOUNTING_NODAL.scale('Westeros','700')=10.0; COST_ACCOUNTING_NODAL.scale('Westeros','720')=10.0; -CAP_NEW.scale('Westeros','wind_ppl','710')=0.1; +COST_ACCOUNTING_NODAL.scale('Westeros','700')=10.0; +COST_ACCOUNTING_NODAL.scale('Westeros','710')=10.0; CAP_NEW.scale('Westeros','wind_ppl','700')=0.1; +CAP_NEW.scale('Westeros','wind_ppl','710')=0.1; MESSAGE_LP.scaleopt=1; \ No newline at end of file diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb deleted file mode 100644 index 460618bb7..000000000 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Copy1.ipynb +++ /dev/null @@ -1,968 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "fdbea0ef", - "metadata": {}, - "source": [ - "# MESSAGE-ix matrix improvement tool\n", - "\n", - "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", - "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", - "\n", - "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", - "\n", - "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", - "\n", - "$\n", - "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", - "$\n", - "\n", - "with $v$ is an acceptable matrix quality criteria.\n", - "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "a771a522", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from pyomo.environ import *\n", - "from datetime import datetime\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def showme(df):\n", - " return df[\"val\"].unstack()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "afc2eec6", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\pratama\\AppData\\Local\\Temp\\ipykernel_21808\\176877734.py:9: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", - " matrix_solv = pd.concat([matrix_lo,matrix_up])\n" - ] - } - ], - "source": [ - "# Load the whole matrix\n", - "matrix = (pd.read_csv('data/matrix_transport.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "# Load and create matrix with small and large coefficient\n", - "matrix_up = (pd.read_csv('data/matrix_transport_prob_upper.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "matrix_lo = (pd.read_csv('data/matrix_transport_prob_lower.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "matrix_solv = pd.concat([matrix_lo,matrix_up])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "c8c05538", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
rowcol
_objx(san-diego,new-york)2.500000e-09
x(san-diego,topeka)1.400000e-08
\n", - "
" - ], - "text/plain": [ - " val\n", - "row col \n", - "_obj x(san-diego,new-york) 2.500000e-09\n", - " x(san-diego,topeka) 1.400000e-08" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matrix_solv" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "92838309", - "metadata": {}, - "outputs": [], - "source": [ - "# calculate log base 10 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", - "#log_absmatrix = log_absmatrix.astype(int)\n", - "\n", - "# calculate log base 10 of the absolute value of the matrix\n", - "log_absmatrix_solv = matrix_solv.copy()\n", - "log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absmatrix_solv.loc[log_absmatrix_solv['val']!=0,'val'])))\n", - "#log_absmatrix_solv = log_absmatrix_solv.astype(int)" - ] - }, - { - "cell_type": "markdown", - "id": "a4435293", - "metadata": {}, - "source": [ - "## Start Looping" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "6dbeb665", - "metadata": {}, - "outputs": [], - "source": [ - "# SCALE BY ROW\n", - "# Populating row scaler\n", - "RSFs = {row:[] for row in set(log_absmatrix_solv.index.get_level_values(0))}\n", - "for k in RSFs.keys():\n", - " rval = log_absmatrix.loc[(k),\"val\"]\n", - " lb,ub = min(rval),max(rval)\n", - " mid = np.mean([lb,ub])\n", - " RSFs[k] = 10**(-mid)\n", - "\n", - "# Create DataFrame of row scaler\n", - "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", - "row_scaler.index.name = 'row'\n", - "\n", - "# Create new matrix with scaled rows\n", - "matrix0 = matrix.copy()\n", - "matrix0.loc[row_scaler.index] = matrix0.loc[row_scaler.index].mul(row_scaler)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "3855a334", - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# SCALE BY COL\n", - "# Populating col scaler\n", - "log_absmatrix0 = np.log10(matrix0)\n", - "log_absmatrix0_solv = log_absmatrix0.loc[(log_absmatrix0[\"val\"] >= 2) | \n", - " (log_absmatrix0[\"val\"] <= -2)]\n", - "\n", - "CSFs = {col:[] for col in set(log_absmatrix0_solv.index.get_level_values(1))}\n", - "for k in CSFs.keys():\n", - " cval = log_absmatrix0.loc[(log_absmatrix0.index.get_level_values('col') == k),\"val\"]\n", - " lb,ub = min(cval),max(cval)\n", - " mid = np.mean([lb,ub])\n", - " CSFs[k] = 10**(-mid)\n", - "\n", - "# Create DataFrame of col scaler\n", - "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", - "col_scaler.index.name = 'col'\n", - "\n", - "# Create new matrix with scaled rows\n", - "new_matrix = matrix0.copy()\n", - "new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))] = new_matrix.loc[(new_matrix.index.get_level_values('col').isin(list(col_scaler.index)))].mul(col_scaler)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "71b37ee7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original value: [ -8 , 0 ]\n", - "Row scaling val: [ -4 , 4 ]\n", - "New Matrix: [ -2 , 2 ]\n" - ] - } - ], - "source": [ - "def report(text,df):\n", - " log_absdf = df.copy()\n", - " log_absdf.loc[log_absdf['val']!=0,'val']=(np.log10(\n", - " np.absolute(\n", - " log_absdf.loc[log_absdf['val']!=0,'val'])))\n", - " print(f\"{text}:\",\"[\",np.int32(np.min(log_absdf)),\",\",np.int32(np.max(log_absdf)),\"]\")\n", - "\n", - "report(\"Original value\",matrix)\n", - "report(\"Row scaling val\",matrix0)\n", - "report(\"New Matrix\",new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "0ba72b75", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "4b5e02f1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 12649.110641 22768.399153 0.000032 \n", - "demand(chicago) NaN 1.000000 NaN \n", - "demand(new-york) NaN NaN 1.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.000000 1.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.000177 21503.488089 \n", - "demand(chicago) NaN 1.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000 NaN \n", - "supply(san-diego) 1.000000 NaN \n", - "supply(seattle) NaN 1.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 31622.776602 22768.399153 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.000000 NaN \n", - "demand(topeka) NaN 1.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.000000 1.000000 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix0)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "96420c06", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.0150.8920120.0056230.013307146.640677177.827941150.892012
demand(chicago)NaN0.006627NaNNaN0.006819NaNNaN
demand(new-york)NaNNaN177.827941NaNNaN0.005623NaN
demand(topeka)NaNNaNNaN75.146020NaNNaN0.006627
supply(san-diego)NaN0.006627177.82794175.146020NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0068190.0056230.006627
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 150.892012 0.005623 \n", - "demand(chicago) NaN 0.006627 NaN \n", - "demand(new-york) NaN NaN 177.827941 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.006627 177.827941 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.013307 146.640677 \n", - "demand(chicago) NaN 0.006819 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 75.146020 NaN \n", - "supply(san-diego) 75.146020 NaN \n", - "supply(seattle) NaN 0.006819 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 177.827941 150.892012 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 0.005623 NaN \n", - "demand(topeka) NaN 0.006627 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.005623 0.006627 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "121c0138", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
row
_obj12649.110641
\n", - "
" - ], - "text/plain": [ - " val\n", - "row \n", - "_obj 12649.110641" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "row_scaler" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "ebe59cc4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
val
col
x(san-diego,topeka)75.146020
constobj0.000079
x(seattle,chicago)0.006819
x(san-diego,chicago)0.006627
x(san-diego,new-york)177.827941
x(seattle,new-york)0.005623
x(seattle,topeka)0.006627
\n", - "
" - ], - "text/plain": [ - " val\n", - "col \n", - "x(san-diego,topeka) 75.146020\n", - "constobj 0.000079\n", - "x(seattle,chicago) 0.006819\n", - "x(san-diego,chicago) 0.006627\n", - "x(san-diego,new-york) 177.827941\n", - "x(seattle,new-york) 0.005623\n", - "x(seattle,topeka) 0.006627" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "col_scaler" - ] - }, - { - "cell_type": "markdown", - "id": "8b1f0009", - "metadata": {}, - "source": [ - "## Modify below later" - ] - }, - { - "cell_type": "raw", - "id": "83311e10", - "metadata": {}, - "source": [ - "scalers = [RSFs,CSFs]\n", - "prescale_args = {}\n", - "for s in scalers:\n", - " for k,v in s.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v})\n", - "\n", - "gams_args = (str(prescale_args)\n", - " .replace('{','')\n", - " .replace('}','')\n", - " .replace('\"','')\n", - " .replace(':','=')\n", - " .replace(', ',';\\n')\n", - " +';'\n", - " )" - ] - }, - { - "cell_type": "raw", - "id": "57398ef7", - "metadata": { - "scrolled": true - }, - "source": [ - "print(gams_args)" - ] - }, - { - "cell_type": "markdown", - "id": "42c09b85", - "metadata": {}, - "source": [ - "np.log10(524288.0)" - ] - }, - { - "cell_type": "raw", - "id": "54c88f5a", - "metadata": {}, - "source": [ - "# Printing stats\n", - "\n", - "matrices_dict = {'Old Matrix':matrix,\n", - " 'New Matrix':new_matrix,\n", - " } \n", - "\n", - "for k,v in matrices_dict.items():\n", - " print(f'{k} stats:')\n", - " print('>> log10 coefficient range:',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", - " print('')\n", - "\n", - "# TO DO:\n", - "# 1. plot histogram of log10 distribution of those matrix\n" - ] - }, - { - "cell_type": "raw", - "id": "353bf8c2", - "metadata": {}, - "source": [ - "plt.hist(np.log10(matrix))" - ] - }, - { - "cell_type": "raw", - "id": "3637a9ab", - "metadata": {}, - "source": [ - "plt.hist(np.log10(new_matrix))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c483f4d9", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb deleted file mode 100644 index 1eb51802a..000000000 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method-Transport.ipynb +++ /dev/null @@ -1,1295 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "fdbea0ef", - "metadata": {}, - "source": [ - "# MESSAGE-ix matrix improvement tool\n", - "\n", - "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", - "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", - "\n", - "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", - "\n", - "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", - "\n", - "$\n", - "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", - "$\n", - "\n", - "with $v$ is an acceptable matrix quality criteria.\n", - "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "a771a522", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from pyomo.environ import *\n", - "from datetime import datetime\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def showme(df):\n", - " return df[\"val\"].unstack()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "afc2eec6", - "metadata": {}, - "outputs": [], - "source": [ - "# Load the whole matrix\n", - "matrix = (pd.read_csv('data/matrix_transport.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "\n", - "# create a binary matrix for optimization coefficient\n", - "matrix_sbin = matrix.copy()\n", - "matrix_sbin.loc[matrix_sbin['val']!=0,'val'] = 1\n", - "matrix_sbin = matrix_sbin.astype(int)\n", - "\n", - "## converting matrix_sbin to dictiony\n", - "dict_matrix_sbin = matrix_sbin['val'].to_dict()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9903afb9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matrix[\"val\"].unstack()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "6948f8fb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "66e003c3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.01.01.01.01.01.0
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.0NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.0NaNNaN1.0
supply(san-diego)NaN1.01.01.0NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.0 1.0 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.0 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.0 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.0 1.0 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.0 NaN \n", - "supply(san-diego) 1.0 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 1.0 1.0 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix_sbin)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "92838309", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj0.00.847997-28.575425-26.0899980.7655351.3219280.847997
demand(chicago)NaN0.000000NaNNaN0.000000NaNNaN
demand(new-york)NaNNaN0.000000NaNNaN0.000000NaN
demand(topeka)NaNNaNNaN0.000000NaNNaN0.000000
supply(san-diego)NaN0.0000000.0000000.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0000000.0000000.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 0.0 0.847997 -28.575425 \n", - "demand(chicago) NaN 0.000000 NaN \n", - "demand(new-york) NaN NaN 0.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.000000 0.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj -26.089998 0.765535 \n", - "demand(chicago) NaN 0.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 0.000000 NaN \n", - "supply(san-diego) 0.000000 NaN \n", - "supply(seattle) NaN 0.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 1.321928 0.847997 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 0.000000 NaN \n", - "demand(topeka) NaN 0.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.000000 0.000000 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# calculate log base 2 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", - " np.absolute(\n", - " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", - "\n", - "log_absmatrix = showme(log_absmatrix)\n", - "log_absmatrix" - ] - }, - { - "cell_type": "markdown", - "id": "a4435293", - "metadata": {}, - "source": [ - "## Start Looping" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "6dbeb665", - "metadata": {}, - "outputs": [], - "source": [ - "RSFs = []\n", - "for row in log_absmatrix.index:\n", - " rval = log_absmatrix.loc[row].fillna(0)\n", - " lb,ub = min(rval),max(rval)\n", - " mid = np.mean([lb,ub])\n", - " RSFs += [2**(-mid)]\n", - "\n", - "matrix0 = showme(matrix).mul(RSFs,axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "e0e3dd97", - "metadata": {}, - "outputs": [], - "source": [ - "log_absmatrix0 = np.log2(matrix0)\n", - "CSFs = []\n", - "for col in log_absmatrix0.columns:\n", - " cval = log_absmatrix0[col].fillna(0)\n", - " lb,ub = min(cval),max(cval)\n", - " mid = np.mean([lb,ub])\n", - " CSFs += [2**(-mid)]\n", - "new_matrix = showme(matrix).mul(RSFs,axis=0).mul(CSFs,axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "2e5a0796", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original value: [ -8 , 0 ]\n", - "Row scaling val: [ -4 , 4 ]\n", - "New Matrix: [ -2 , 2 ]\n" - ] - } - ], - "source": [ - "def report(text,df):\n", - " print(f\"{text}:\",\"[\",np.int32(np.min(np.log10(df))),\",\",np.int32(np.max(np.log10(df))),\"]\")\n", - "report(\"Original value\",showme(matrix))\n", - "report(\"Row scaling val\",matrix0)\n", - "report(\"New Matrix\",new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "c33ccdcf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "0d1675e0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj12649.11064122768.3991530.0000320.00017721503.48808931622.77660222768.399153
demand(chicago)NaN1.000000NaNNaN1.000000NaNNaN
demand(new-york)NaNNaN1.000000NaNNaN1.000000NaN
demand(topeka)NaNNaNNaN1.000000NaNNaN1.000000
supply(san-diego)NaN1.0000001.0000001.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.0000001.0000001.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 12649.110641 22768.399153 0.000032 \n", - "demand(chicago) NaN 1.000000 NaN \n", - "demand(new-york) NaN NaN 1.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.000000 1.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.000177 21503.488089 \n", - "demand(chicago) NaN 1.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000 NaN \n", - "supply(san-diego) 1.000000 NaN \n", - "supply(seattle) NaN 1.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 31622.776602 22768.399153 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.000000 NaN \n", - "demand(topeka) NaN 1.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.000000 1.000000 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matrix0" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "3596c26a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj112.468265150.8920120.0056230.013307146.640677177.827941150.892012
demand(chicago)NaN0.006627NaNNaN0.006819NaNNaN
demand(new-york)NaNNaN177.827941NaNNaN0.005623NaN
demand(topeka)NaNNaNNaN75.146020NaNNaN0.006627
supply(san-diego)NaN0.006627177.82794175.146020NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0068190.0056230.006627
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 112.468265 150.892012 0.005623 \n", - "demand(chicago) NaN 0.006627 NaN \n", - "demand(new-york) NaN NaN 177.827941 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.006627 177.827941 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.013307 146.640677 \n", - "demand(chicago) NaN 0.006819 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 75.146020 NaN \n", - "supply(san-diego) 75.146020 NaN \n", - "supply(seattle) NaN 0.006819 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 177.827941 150.892012 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 0.005623 NaN \n", - "demand(topeka) NaN 0.006627 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.005623 0.006627 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_matrix" - ] - }, - { - "cell_type": "raw", - "id": "d7025869", - "metadata": {}, - "source": [ - "scalers = [RSFs,CSFs]\n", - "prescale_args = {}\n", - "for s in scalers:\n", - " for k,v in s.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v})\n", - "\n", - "gams_args = (str(prescale_args)\n", - " .replace('{','')\n", - " .replace('}','')\n", - " .replace('\"','')\n", - " .replace(':','=')\n", - " .replace(', ',';\\n')\n", - " +';'\n", - " )" - ] - }, - { - "cell_type": "raw", - "id": "3c833ec0", - "metadata": { - "scrolled": true - }, - "source": [ - "print(gams_args)" - ] - }, - { - "cell_type": "markdown", - "id": "a400585c", - "metadata": {}, - "source": [ - "np.log2(524288.0)" - ] - }, - { - "cell_type": "raw", - "id": "b971c49c", - "metadata": {}, - "source": [ - "# Printing stats\n", - "\n", - "matrices_dict = {'Old Matrix':matrix,\n", - " 'New Matrix':new_matrix,\n", - " } \n", - "\n", - "for k,v in matrices_dict.items():\n", - " print(f'{k} stats:')\n", - " print('>> log10 coefficient range:',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", - " print('')\n", - "\n", - "# TO DO:\n", - "# 1. plot histogram of log10 distribution of those matrix\n" - ] - }, - { - "cell_type": "raw", - "id": "b8ca4e72", - "metadata": {}, - "source": [ - "plt.hist(np.log10(matrix))" - ] - }, - { - "cell_type": "raw", - "id": "f3a37aba", - "metadata": {}, - "source": [ - "plt.hist(np.log10(new_matrix))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c483f4d9", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb deleted file mode 100644 index 3279b17e2..000000000 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool-Loop method.ipynb +++ /dev/null @@ -1,458 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "fdbea0ef", - "metadata": {}, - "source": [ - "# MESSAGE-ix matrix improvement tool\n", - "Need to investigate why more steps worsen the results" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "1e4b0b81", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from pyomo.environ import *\n", - "from datetime import datetime\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def showme(df):\n", - " return df[\"val\"].unstack()\n", - "\n", - "path = 'data/matrix_transport.csv'\n", - "bounds = 2\n", - "steps = 1\n", - "\n", - "def filter_df(data, bounds):\n", - " \"\"\"Extracts matrix elements with coefficient outliers.\n", - "\n", - " This function extracts elements from a matrix where \n", - " the coefficients deviate from a specified threshold.\n", - "\n", - " Parameters:\n", - " -----------\n", - " data : pandas DataFrame\n", - " The coefficient matrix, typically generated by \n", - " the mps_sum function in LPDiag.\n", - " bounds: int or list of 2 integers\n", - " Exponent threshold used to identify outlier coefficients. \n", - " If a single integer is provided, the bounds are set to +/- that value. \n", - " If a list of 2 integers is provided, they represent the lower and \n", - " upper bounds of the threshold.\n", - "\n", - " Examples:\n", - " ---------\n", - " # Extract elements with coefficient exponents deviating beyond +/-3\n", - " extracted_data = filter_df(data_matrix, 3)\n", - "\n", - " # Extract elements with coefficients exponents deviating \n", - " # beyond the range of -2 to 2\n", - " extracted_data = extract_outliers(data_matrix, [-2, 2])\n", - " \"\"\"\n", - " \n", - " if isinstance(bounds, int):\n", - " lo_bound = -bounds\n", - " up_bound = bounds\n", - " else:\n", - " lo_bound = bounds[0]\n", - " up_bound = bounds[1]\n", - " \n", - " df_filtered = data.loc[(data[\"val\"] <= lo_bound) |\n", - " (data[\"val\"] >= up_bound)]\n", - " \n", - " return df_filtered\n", - "\n", - "def make_logdf(data):\n", - " \"\"\"\n", - " Make log10 of the absolute non zero value element of dataframe.\n", - "\n", - " \"\"\"\n", - " log_absdf = data.copy()\n", - " \n", - " log_absdf.loc[log_absdf['val']!=0,'val'] = (\n", - " np.log10(np.absolute(\n", - " log_absdf.loc[log_absdf['val']!=0,'val'])\n", - " )\n", - " )\n", - " \n", - " return log_absdf\n", - "\n", - "def get_lvl_ix(data, lvl):\n", - " \"\"\"\n", - " To get level index from coefficient matrix.\n", - " \n", - " Parameters:\n", - " -----------\n", - " data : pandas DataFrame\n", - " The coefficient matrix, typically generated by \n", - " the mps_sum function in LPDiag.\n", - " lvl : int or str\n", - " 0 or \"row\" for rows and 1 or \"col\" for columns \n", - "\n", - " \"\"\"\n", - " return data.index.get_level_values(lvl)\n", - " \n", - "def disp_range(data,pretext):\n", - " \"\"\"\n", - " To displace coefficient exponents range.\n", - "\n", - " \"\"\"\n", - " \n", - " log_absdf = make_logdf(data)\n", - " \n", - " print(f\"{pretext}:\",\n", - " \"[\",np.int32(np.min(log_absdf)), # lower bound\n", - " \"-\",\n", - " np.int32(np.max(log_absdf)),\"]\") # upper bound\n", - "\n", - "def make_prescaler(path, bounds, steps, show_range=True):\n", - " \"\"\"\n", - " Process to generate prescale_args in GAMS to improve \n", - " matrix coefficients.\n", - "\n", - " This function shifts matrix coefficient exponents to improve \n", - " the scaling properties of the matrix. The function returns \n", - " prescale arguments (prescale_args) to be passed to the GAMS model.\n", - "\n", - " Parameters:\n", - " -----------\n", - " path: str\n", - " Pathways to locate the mps file.\n", - " bounds: int or list of 2 integers\n", - " Exponent threshold used to identify outlier coefficients. \n", - " If a single integer is provided, the bounds are set to +/- that value. \n", - " If a list of 2 integers is provided, they represent \n", - " the lower and upper bounds of the threshold.\n", - " steps: int\n", - " Number of times the prescaler generation process is repeated.\n", - " Larger values may lead to more refined prescale_args but \n", - " also increase computation time.\n", - " show_range: boolean\n", - " Option to show the coefficient exponents range before and after scaling.\n", - " If True, the function will display the range; otherwise, it will not.\n", - "\n", - " Returns:\n", - " --------\n", - " prescale_args: dict\n", - " A dictionary of prescale arguments to be passed to the GAMS model.\n", - " \"\"\"\n", - "\n", - " data = (pd.read_csv(path)\n", - " .set_index(['row','col'], drop=True)[['val']])\n", - "\n", - " matrix = data\n", - " \n", - " if show_range == True:\n", - " disp_range(matrix, \"Unscaled range \")\n", - " \n", - " scalers = {\"row\":[], \"col\":[]}\n", - " \n", - " counter = 0\n", - " while counter < steps:\n", - " for s in scalers.keys():\n", - " # print(matrix)\n", - " # calculate log base 10 of the absolute value of the matrix\n", - " log_absmatrix = make_logdf(matrix)\n", - "\n", - " # Create matrix with small and large coefficient\n", - " log_absmatrix_solv = filter_df(log_absmatrix, bounds=bounds)\n", - "\n", - " # Populating row scaler\n", - " objective_ix = \"_obj\" if s == \"row\" else \"constobj\"\n", - " index_solv = [e for e in get_lvl_ix(log_absmatrix_solv,s) if e != objective_ix] \n", - " \n", - " \n", - " SFs = {k:[] for k in index_solv}\n", - " for k in SFs.keys():\n", - " index_val = (get_lvl_ix(log_absmatrix,s) == k)\n", - " dflog_val = log_absmatrix.loc[index_val,\"val\"]\n", - " lb,ub = np.int32(min(dflog_val)),np.int32(max(dflog_val))\n", - " mid = np.int32(np.mean([lb,ub]))\n", - " SFs[k] = 10.0**(-mid)\n", - " \n", - " # Create DataFrame of row scaler\n", - " return_index = list(set(get_lvl_ix(log_absmatrix,s)))\n", - " if counter == 0:\n", - " multiplier = 1\n", - " else:\n", - " multiplier = scalers[s].reindex(return_index).fillna(1)\n", - " step_scaler = pd.DataFrame(data=SFs, index=[\"val\"]).transpose()\n", - " step_scaler.index.name = s\n", - " step_scaler = step_scaler.reindex(return_index).fillna(1)\n", - " \n", - " # summarize multipliers from previous steps\n", - " scalers[s] = step_scaler.mul(multiplier)\n", - " \n", - " # Create new matrix with scaled rows\n", - " matrix = matrix.mul(step_scaler)\n", - " \n", - " if show_range == True:\n", - " disp_range(matrix, f\"Scaled range step {counter}\")\n", - " \n", - " # Increment the counter\n", - " counter += 1\n", - " \n", - " # generating prescaler arguments for GAMS\n", - " prescale_args = {}\n", - " for key,df_scaler in scalers.items():\n", - " df_scaler = df_scaler.loc[df_scaler[\"val\"] != 1]\n", - " scaler_dict = df_scaler[\"val\"].to_dict()\n", - " for k,v in scaler_dict.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v}) \n", - "\n", - " return(prescale_args)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "0a4e6ae0", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Unscaled range : [ -8 - 0 ]\n", - "Scaled range step 0: [ -4 - 4 ]\n", - "Scaled range step 1: [ -3 - 3 ]\n", - "Scaled range step 2: [ -3 - 2 ]\n", - "Scaled range step 3: [ -3 - 2 ]\n", - "Scaled range step 4: [ -3 - 2 ]\n", - "Scaled range step 5: [ -3 - 2 ]\n", - "Scaled range step 6: [ -3 - 2 ]\n", - "Scaled range step 7: [ -3 - 2 ]\n", - "Scaled range step 8: [ -3 - 2 ]\n", - "Scaled range step 9: [ -3 - 2 ]\n" - ] - }, - { - "data": { - "text/plain": [ - "{\"demand.scale('topeka')\": 0.0010000000000000002,\n", - " \"supply.scale('san-diego')\": 0.001,\n", - " \"demand.scale('new-york')\": 0.001,\n", - " \"x.scale('san-diego','new-york')\": 100000.0,\n", - " \"x.scale('seattle','topeka')\": 10.0,\n", - " \"x.scale('seattle','new-york')\": 10.0,\n", - " \"x.scale('san-diego','topeka')\": 100000.0,\n", - " \"x.scale('san-diego','chicago')\": 10.0}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "make_prescaler(path,bounds,10,show_range=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ee70fdd0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Unscaled range : [ -8 - 0 ]\n", - "Scaled range step 0: [ -4 - 4 ]\n" - ] - } - ], - "source": [ - "prescale = make_prescaler(path,bounds,1,show_range=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "367593f8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{\"x.scale('san-diego','new-york')\": 10000.0,\n", - " \"x.scale('san-diego','topeka')\": 1000.0}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "prescale" - ] - }, - { - "cell_type": "markdown", - "id": "170415f4", - "metadata": {}, - "source": [ - "**Prototype - Dev**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "786a19a9", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from pyomo.environ import *\n", - "from datetime import datetime\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def showme(df):\n", - " return df[\"val\"].unstack()\n", - "\n", - "# determine absolute bound of exponent in matrix coeff\n", - "bound = 4 \n", - "\n", - "def solv(df, bound):\n", - " \"\"\"\n", - " this function filters matrix coefficient\n", - " dataframe in which the log of the coefficient \n", - " is lower or higher than the bound\n", - " \"\"\"\n", - " df_solv = df.loc[(df[\"val\"] >= bound) |\n", - " (df[\"val\"] <= -bound)]\n", - " return df_solv\n", - "\n", - "def make_logdf(df):\n", - " df.loc[df['val']!=0,'val'] = np.log10(np.absolute(df.loc[df['val']!=0,'val']))\n", - " return df\n", - " \n", - "\n", - "# Load the whole matrix\n", - "matrix = (pd.read_csv('data/matrix_transport.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "\n", - "# calculate log base 10 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix = make_logdf(log_absmatrix)\n", - "\n", - "# Create matrix with small and large coefficient\n", - "log_absmatrix_solv = solv(log_absmatrix,bound=bound)\n", - "\n", - "# SCALE BY ROW\n", - "# Populating row scaler\n", - "rows_solv = list(set(log_absmatrix_solv.index.get_level_values(\"row\"))\n", - " -set([\"_obj\"]))\n", - "\n", - "RSFs = {row:[] for row in rows_solv}\n", - "for k in RSFs.keys():\n", - " index_row = (log_absmatrix.index.get_level_values('row') == k)\n", - " rval = log_absmatrix.loc[index_row,\"val\"]\n", - " lb,ub = min(rval),max(rval)\n", - " mid = np.mean([lb,ub])\n", - " RSFs[k] = 10**(-mid)\n", - "\n", - "# Create DataFrame of row scaler\n", - "row_scaler = pd.DataFrame(data=RSFs, index=[\"val\"]).transpose()\n", - "row_scaler.index.name = 'row'\n", - "\n", - "# Create new matrix with scaled rows\n", - "matrix0 = matrix.copy()\n", - "index_mod = matrix0.index.get_level_values('row').isin(row_scaler.index)\n", - "matrix0.loc[index_mod] = matrix0.loc[index_mod].mul(row_scaler)\n", - "\n", - "# SCALE BY COL\n", - "# Populating col scaler\n", - "log_absmatrix0 = matrix0.copy()\n", - "log_absmatrix0 = make_logdf(log_absmatrix0)\n", - "log_absmatrix0_solv = solv(log_absmatrix0,bound=bound)\n", - "\n", - "cols_solv = list(set(log_absmatrix_solv.index.get_level_values(\"col\"))\n", - " -set([\"constobj\"]))\n", - "CSFs = {col:[] for col in cols_solv}\n", - "for k in CSFs.keys():\n", - " index_col = (log_absmatrix0.index.get_level_values('col') == k)\n", - " cval = log_absmatrix0.loc[index_col,\"val\"]\n", - " lb,ub = min(cval),max(cval)\n", - " mid = np.mean([lb,ub])\n", - " CSFs[k] = 10**(-mid)\n", - "\n", - "# Create DataFrame of col scaler\n", - "col_scaler = pd.DataFrame(data=CSFs, index=[\"val\"]).transpose()\n", - "col_scaler.index.name = 'col'\n", - "\n", - "# Create new matrix with scaled rows\n", - "new_matrix = matrix0.copy()\n", - "index_mod = new_matrix.index.get_level_values('col').isin(col_scaler.index)\n", - "new_matrix.loc[index_mod] = new_matrix.loc[index_mod].mul(col_scaler)\n", - "\n", - "scalers = [RSFs,CSFs]\n", - "prescale_args = {}\n", - "for s in scalers:\n", - " for k,v in s.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v})\n", - "\n", - "gams_args = (str(prescale_args)\n", - " .replace('{','')\n", - " .replace('}','')\n", - " .replace('\"','')\n", - " .replace(':','=')\n", - " .replace(', ',';\\n')\n", - " +';'\n", - " )" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb b/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb deleted file mode 100644 index 4b48ba1ed..000000000 --- a/message_ix/tools/lp_diag/[PROTOTYPE] Matrix Rescale Tool.ipynb +++ /dev/null @@ -1,1230 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "fdbea0ef", - "metadata": {}, - "source": [ - "# MESSAGE-ix matrix improvement tool\n", - "\n", - "This jupyter notebook is a prototype of the MESSAGE-ix matrix improvement tool.\n", - "This tool is aimed to automatically improve and optimize coefficient matrix quality for a MESSAGE-ix scenario and the used to return the results from scaled MESSAGE-ix matrix to the originally intended values.\n", - "\n", - "This tool is derived from the tool developed by Makowski & Sosnowski, 1981 (https://pure.iiasa.ac.at/id/eprint/1766/1/CP-81-037.pdf)\n", - "\n", - "According to Curtis and Reid (1972), matrix A can be described as well-scaled if:\n", - "\n", - "$\n", - "\\sum_{i} \\sum_{j} \\ (log_{10} \\ |a_{i,j}|)^2 \\leq v \\qquad \\qquad Eq. 1\n", - "$\n", - "\n", - "with $v$ is an acceptable matrix quality criteria.\n", - "If $ax_{i,j}$ is $(log_{10} |a_{i,j}|)^2$ where $a_{i,j}$ is a non-zero value, matrix $Ax$ is:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "a771a522", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from pyomo.environ import *\n", - "from datetime import datetime\n", - "import xarray as xr\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def showme(df):\n", - " return df[\"val\"].unstack()\n", - "\n", - "# generating piecewise of x and y\n", - "x_pos = [2**x for x in range(0,6)]\n", - "x_neg = x_pos.copy()\n", - "x_neg.reverse()\n", - "x_neg = [-e for e in x_neg]\n", - "\n", - "x = x_neg + [0] + x_pos\n", - "y = [np.power(e,2) for e in x]\n", - "\n", - "# populating gradient and intercept for each line segment\n", - "linparams = {n: {'G':[], 'I': []} for n in range(1,len(x))}\n", - "for n in linparams.keys():\n", - " M = (y[n]-y[n-1])/(x[n]-x[n-1])\n", - " C = y[n-1] - M*x[n-1]\n", - " linparams[n]['G'] = M # M\n", - " linparams[n]['I'] = C # C\n", - "\n", - "# create dataframe of gradient and intercept\n", - "df_linparams = pd.DataFrame(linparams).transpose()\n", - "\n", - "fig, ax = plt.subplots(figsize=(5,5))\n", - "\n", - "break_value = ax.scatter(x,y, marker='o', s=50, c='white', edgecolor='maroon', lw=2, zorder=1, )\n", - "for n in df_linparams.index:\n", - " x_lin = [x[n-1],x[n]]\n", - " y_lin = [y[n-1],y[n]]\n", - " linearized_value = ax.plot(x_lin,y_lin, c='maroon', lw=2, zorder=0)\n", - "\n", - "ax.set_xlabel('x', size=14)\n", - "ax.set_ylabel(r'$y = x^2$', size=14)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "afc2eec6", - "metadata": {}, - "outputs": [], - "source": [ - "# Load the whole matrix\n", - "matrix = (pd.read_csv('matrix_transport problem.csv')\n", - " .set_index(['row','col'],drop=True)[['val']])\n", - "\n", - "# create a binary matrix for optimization coefficient\n", - "matrix_sbin = matrix.copy()\n", - "matrix_sbin.loc[matrix_sbin['val']!=0,'val'] = 1\n", - "matrix_sbin = matrix_sbin.astype(int)\n", - "\n", - "## converting matrix_sbin to dictiony\n", - "dict_matrix_sbin = matrix_sbin['val'].to_dict()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "6948f8fb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "66e003c3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.01.01.01.01.01.0
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.0NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.0NaNNaN1.0
supply(san-diego)NaN1.01.01.0NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.0 1.0 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.0 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.0 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.0 1.0 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.0 NaN \n", - "supply(san-diego) 1.0 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 1.0 1.0 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix_sbin)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "92838309", - "metadata": {}, - "outputs": [], - "source": [ - "# calculate log base 2 of the absolute value of the matrix\n", - "log_absmatrix = matrix.copy()\n", - "log_absmatrix.loc[log_absmatrix['val']!=0,'val']=(np.log2(\n", - " np.absolute(\n", - " log_absmatrix.loc[log_absmatrix['val']!=0,'val'])))\n", - "\n", - "# converting log_absmatrix to dictiony\n", - "dict_log_absmatrix = log_absmatrix['val'].to_dict()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d3314890", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj0.00.847997-28.575425-26.0899980.7655351.3219280.847997
demand(chicago)NaN0.000000NaNNaN0.000000NaNNaN
demand(new-york)NaNNaN0.000000NaNNaN0.000000NaN
demand(topeka)NaNNaNNaN0.000000NaNNaN0.000000
supply(san-diego)NaN0.0000000.0000000.000000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN0.0000000.0000000.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 0.0 0.847997 -28.575425 \n", - "demand(chicago) NaN 0.000000 NaN \n", - "demand(new-york) NaN NaN 0.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.000000 0.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj -26.089998 0.765535 \n", - "demand(chicago) NaN 0.000000 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 0.000000 NaN \n", - "supply(san-diego) 0.000000 NaN \n", - "supply(seattle) NaN 0.000000 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 1.321928 0.847997 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 0.000000 NaN \n", - "demand(topeka) NaN 0.000000 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 0.000000 0.000000 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "log_absmatrix[\"val\"].unstack()" - ] - }, - { - "cell_type": "markdown", - "id": "12dafaaa", - "metadata": {}, - "source": [ - "## Matrix quality optimization problem\n", - "Matrix $Ax$ then may be adjusted to fulfill the matrix quality criterion in $Eq. 1$ through the use of scaling coefficient $r_{i}$ for row $i$ and $c_{j}$ for column $j$ to minimize the following objective function:\n", - "\n", - "$\n", - "Min_{(r,c)}: \\frac{1}{2} \\sum_{i} \\sum_{j} (log_{2} \\ r_{i} \\ c_{j} \\ |a_{i,j}|)^2 \\qquad \\qquad Eq. 2\n", - "$\n", - "\n", - "Let us define:\n", - "\n", - "$\n", - "w_{i} = log_{2} \\ r_{i} \\\\\n", - "z_{j} = log_{2} \\ c_{j}\n", - "$\n", - "\n", - "With $w$ and $z$ are positive integer variables, an optimization problem using the equivalent of $Eq. 2$ as objective function can be formulated as:\n", - "\n", - "$\n", - "Min_{(w,j)}: \\frac{1}{2} \\sum_{i} \\sum_{j} \\ (w_{i} + z_{j} + log_{2} \\ |a_{i,j}|)^2 \\qquad \\qquad Eq. 3 \\\\\n", - "S.t.: \\\\\n", - "\\qquad w_{i}, z_{j} \\geq 0 \\qquad \\qquad Eq. 4 \\\\\n", - "\\qquad w_{i}, z_{j} \\in Z \\qquad \\qquad Eq. 5\n", - "$" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "e309b274", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start Time: 13:21:28.031574\n", - "Solution status : optimal\n", - "Objective function: 310.8452172597383\n", - "Finish Time: 13:21:28.276195\n" - ] - } - ], - "source": [ - "# Generate dictionary of log_absmatrix\n", - "log_absmatrix_data = dict_log_absmatrix\n", - "matrix_sbin_data = dict_matrix_sbin\n", - "row_name = list(set(matrix.index.get_level_values('row')))\n", - "col_name = list(set(matrix.index.get_level_values('col')))\n", - "lin_sgmt = list(df_linparams.index)\n", - "\n", - "# print start time\n", - "start_time = datetime.now().time()\n", - "print(\"Start Time:\", start_time)\n", - "\n", - "## Declare model's name\n", - "model = ConcreteModel('Matrix_Rescaling_Factor')\n", - "\n", - "## Define sets\n", - "model.i = Set(initialize=row_name, doc='Rows')\n", - "model.j = Set(initialize=col_name, doc='Columns')\n", - "model.l = Set(initialize=lin_sgmt, doc='Segments')\n", - "\n", - "## Define parameters\n", - "model.log_absmatrix = Param(model.i, model.j, initialize=log_absmatrix_data, default=0,\n", - " doc='log2 of absolute value of a(i,j)')\n", - "model.matrix_sbin = Param(model.i, model.j, initialize=matrix_sbin_data, default=0,\n", - " doc='binary value for row and column coefficients a(i,j)')\n", - "model.lin_grad = Param(model.l, initialize=df_linparams['G'].to_dict(), \n", - " doc='gradient')\n", - "model.lin_intr = Param(model.l, initialize=df_linparams['I'].to_dict(), \n", - " doc='intercept')\n", - "\n", - "## Define variables\n", - "model.Log2RSF = Var(model.i, bounds=(-50,50), domain=Integers, doc='Row scaling factor') # domain='PositiveIntegers'\n", - "model.Log2CSF = Var(model.j, bounds=(-50,50), domain=Integers, doc='Column scaling factor')\n", - "model.LS_obj = Var(model.i, model.j, bounds=(0,None), doc='Linearized substitute of objective function')\n", - "\n", - "## Define constraints\n", - "def linobj_rule(model, i, j, l):\n", - " return model.LS_obj[i,j] >= (model.lin_grad[l] * (- model.Log2RSF[i] + model.Log2CSF[j] + model.log_absmatrix[i,j])\n", - " + model.lin_intr[l])\n", - "model.linobj = Constraint(model.i, model.j, model.l, rule=linobj_rule, doc='Piece linearization of quadratic objective function')\n", - "\n", - "def colobj_rule(model):\n", - " return model.Log2CSF['constobj'] == 0\n", - "model.colobj = Constraint(rule=colobj_rule, doc='objective function column cannot be changed')\n", - "\n", - "def rowobj_rule(model):\n", - " return model.Log2RSF['_obj'] == 0\n", - "model.rowobj = Constraint(rule=rowobj_rule, doc='objective function column cannot be changed')\n", - "\n", - "\n", - "## Define objective function\n", - "def objective_rule(model):\n", - " return (1/2)*sum(model.LS_obj[i,j] * model.matrix_sbin[i,j] for i in model.i for j in model.j)\n", - "model.objective = Objective(rule=objective_rule, sense=minimize, doc='Objective function')\n", - "\n", - "if __name__ == '__main__':\n", - " # This emulates what the pyomo command-line tools does\n", - " from pyomo.opt import SolverFactory\n", - " import pyomo.environ\n", - " opt = SolverFactory(\"gams\")\n", - " opt.options['solver'] = 'cplex'\n", - " results = opt.solve(model)\n", - " print('Solution status : ', results.solver.termination_condition)\n", - " print('Objective function: ', model.objective(value))\n", - "\n", - " \n", - "# print finish time\n", - "finish_time = datetime.now().time()\n", - "print(\"Finish Time:\", finish_time)\n", - "\n", - "\n", - "# collecting results\n", - "Log2RSFs = []\n", - "for i in row_name:\n", - " Log2RSFs.append(model.Log2RSF[i](value))\n", - "\n", - "Log2CSFs = []\n", - "for j in col_name:\n", - " Log2CSFs.append(model.Log2CSF[j](value))\n", - " \n", - "# Create dictionaries of row and column scalers\n", - "RSFs = dict(zip(row_name, [np.round(2**e,6) for e in Log2RSFs]))\n", - "CSFs = dict(zip(col_name, [np.round(2**e,6) for e in Log2CSFs]))\n", - "\n", - "# Create dataframes for row and column scalers\n", - "row_scaler = pd.DataFrame(RSFs,index=['val']).transpose().rename_axis(index='row')\n", - "col_scaler = pd.DataFrame(CSFs,index=['val']).transpose().rename_axis(index='col')\n", - "\n", - "# Create new_matrix dataframe for display\n", - "new_matrix = matrix.div(row_scaler,level=0).mul(col_scaler,level=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "38c72dde", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.01.82.500000e-091.400000e-081.72.51.8
demand(chicago)NaN1.0NaNNaN1.0NaNNaN
demand(new-york)NaNNaN1.000000e+00NaNNaN1.0NaN
demand(topeka)NaNNaNNaN1.000000e+00NaNNaN1.0
supply(san-diego)NaN1.01.000000e+001.000000e+00NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.01.01.0
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 1.8 2.500000e-09 \n", - "demand(chicago) NaN 1.0 NaN \n", - "demand(new-york) NaN NaN 1.000000e+00 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 1.0 1.000000e+00 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 1.400000e-08 1.7 \n", - "demand(chicago) NaN 1.0 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 1.000000e+00 NaN \n", - "supply(san-diego) 1.000000e+00 NaN \n", - "supply(seattle) NaN 1.0 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 2.5 1.8 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 1.0 NaN \n", - "demand(topeka) NaN 1.0 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.0 1.0 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "8f2ad8bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
colconstobjx(san-diego,chicago)x(san-diego,new-york)x(san-diego,topeka)x(seattle,chicago)x(seattle,new-york)x(seattle,topeka)
row
_obj1.0230.4000000.0013110.0036713.6020.00000014.400000
demand(chicago)NaN4.000000NaNNaN0.25NaNNaN
demand(new-york)NaNNaN256.000000NaNNaN0.003906NaN
demand(topeka)NaNNaNNaN256.00000NaNNaN0.007812
supply(san-diego)NaN0.00390616.0000008.00000NaNNaNNaN
supply(seattle)NaNNaNNaNNaN1.001.0000001.000000
\n", - "
" - ], - "text/plain": [ - "col constobj x(san-diego,chicago) x(san-diego,new-york) \\\n", - "row \n", - "_obj 1.0 230.400000 0.001311 \n", - "demand(chicago) NaN 4.000000 NaN \n", - "demand(new-york) NaN NaN 256.000000 \n", - "demand(topeka) NaN NaN NaN \n", - "supply(san-diego) NaN 0.003906 16.000000 \n", - "supply(seattle) NaN NaN NaN \n", - "\n", - "col x(san-diego,topeka) x(seattle,chicago) \\\n", - "row \n", - "_obj 0.00367 13.60 \n", - "demand(chicago) NaN 0.25 \n", - "demand(new-york) NaN NaN \n", - "demand(topeka) 256.00000 NaN \n", - "supply(san-diego) 8.00000 NaN \n", - "supply(seattle) NaN 1.00 \n", - "\n", - "col x(seattle,new-york) x(seattle,topeka) \n", - "row \n", - "_obj 20.000000 14.400000 \n", - "demand(chicago) NaN NaN \n", - "demand(new-york) 0.003906 NaN \n", - "demand(topeka) NaN 0.007812 \n", - "supply(san-diego) NaN NaN \n", - "supply(seattle) 1.000000 1.000000 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "showme(new_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "85bc031e", - "metadata": {}, - "outputs": [], - "source": [ - "scalers = [RSFs,CSFs]\n", - "prescale_args = {}\n", - "for s in scalers:\n", - " for k,v in s.items():\n", - " if k == '_obj':\n", - " k_ = \"_obj.scale\"\n", - " elif k == 'constobj':\n", - " k_ = \"constobj.scale\"\n", - " else:\n", - " k_ = k.replace(\"(\", \".scale('\")\n", - " k_ = k_.replace(\")\", \"')\")\n", - " k_ = k_.replace(\",\", \"','\")\n", - " prescale_args.update({k_:v})\n", - "\n", - "gams_args = (str(prescale_args)\n", - " .replace('{','')\n", - " .replace('}','')\n", - " .replace('\"','')\n", - " .replace(':','=')\n", - " .replace(', ',';\\n')\n", - " +';'\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "2751f1ad", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "demand.scale('new-york')= 2048.0;\n", - "'_obj.scale'= 1.0;\n", - "supply.scale('seattle')= 8.0;\n", - "supply.scale('san-diego')= 32768.0;\n", - "demand.scale('topeka')= 1024.0;\n", - "demand.scale('chicago')= 32.0;\n", - "x.scale('seattle','new-york')= 8.0;\n", - "x.scale('san-diego','topeka')= 262144.0;\n", - "x.scale('seattle','chicago')= 8.0;\n", - "x.scale('seattle','topeka')= 8.0;\n", - "x.scale('san-diego','chicago')= 128.0;\n", - "x.scale('san-diego','new-york')= 524288.0;\n", - "'constobj.scale'= 1.0;\n" - ] - } - ], - "source": [ - "print(gams_args)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "656dbd7b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19.0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.log2(524288.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "9a9a3956", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Old Matrix stats:\n", - ">> log10 coefficient range: -9.0 -- 0.0\n", - "\n", - "New Matrix stats:\n", - ">> log10 coefficient range: -3.0 -- 2.0\n", - "\n" - ] - } - ], - "source": [ - "# Printing stats\n", - "\n", - "matrices_dict = {'Old Matrix':matrix,\n", - " 'New Matrix':new_matrix,\n", - " } \n", - "\n", - "for k,v in matrices_dict.items():\n", - " print(f'{k} stats:')\n", - " print('>> log10 coefficient range:',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).min(axis=None)),'--',\n", - " np.floor(np.log10(np.abs(v['val'].unstack()).fillna(1)).max(axis=None)))\n", - " print('')\n", - "\n", - "# TO DO:\n", - "# 1. plot histogram of log10 distribution of those matrix\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "62a7999e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([ 2., 0., 0., 0., 0., 0., 0., 0., 0., 17.]),\n", - " array([-8.60205999, -7.70205999, -6.80205999, -5.90205999, -5.00205999,\n", - " -4.10205999, -3.20205999, -2.30205999, -1.40205999, -0.50205999,\n", - " 0.39794001]),\n", - " )" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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//645JJL4iUveUkceeSR0djYGO94xzti586dWc4MANSwHsdHZ2dnTJw4MVasWHHQY48//nhs2rQplixZEps2bYrvfe97sWXLlnjDG96QybAAQO2r6+kTmpubo7m5+ZCPNTQ0xB133NHt2Be+8IU47bTT4tFHH42xY8c+uykBgD6jx/HRUx0dHZHL5eIFL3jBIR8vFotRLBbL+4VCodIjAQBVVNEPnP773/+OSy65JN761rdGfX39Ic9pa2uLhoaG8tbU1FTJkQCAKqtYfOzfvz/OPffcKJVKcd111z3lea2trdHR0VHe2tvbKzUSANALVORtl/+Gx5///Oe48847n/KuR0REPp+PfD5fiTEAgF4o8/j4b3g88sgjcdddd8WIESOyXgIAqGE9jo99+/bF1q1by/vbtm2LzZs3x/Dhw2PMmDHx5je/OTZt2hS33XZbHDhwIHbt2hUREcOHD49BgwZlNzkAUJN6HB8bNmyIGTNmlPdbWloiImL+/PnxiU98Ir7//e9HRMSkSZO6Pe+uu+6K6dOnP/tJAYA+ocfxMX369CiVSk/5+NM9BgDgu10AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASfU4PtavXx9z586NxsbGyOVysWbNmm6Pl0qlWLp0aYwZMyaGDBkSM2fOjEceeSSreQGAGtfj+Ojs7IyJEyfGihUrDvn41VdfHZ///Odj5cqV8atf/SqOPPLImDVrVvz73/9+zsMCALWvrqdPaG5ujubm5kM+ViqVYvny5fHxj388zjzzzIiI+OpXvxqjRo2KNWvWxFve8pbnNi0AUPMy/czHtm3bYteuXTFz5szysYaGhpg6dWrce++9h3xOsViMQqHQbQMA+q5M42PXrl0RETFq1Khux0eNGlV+7Mna2tqioaGhvDU1NWU5EgDQy1T9t11aW1ujo6OjvLW3t1d7JACggjKNj9GjR0dExO7du7sd3717d/mxJ8vn81FfX99tAwD6rkzjY8KECTF69OhYt25d+VihUIhf/epXcfrpp2e5FABQo3r82y779u2L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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.hist(np.log10(matrix))" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "1f49d32f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([4., 1., 0., 0., 1., 4., 1., 5., 0., 3.]),\n", - " array([-2.88249007, -2.35341707, -1.82434407, -1.29527106, -0.76619806,\n", - " -0.23712505, 0.29194795, 0.82102095, 1.35009396, 1.87916696,\n", - " 2.40823997]),\n", - " )" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUIUlEQVR4nO3dbYxU9dnA4XuBMqDurvIOYRHUqFUCTREIaAy0VEsMLU1qGmMqJca0ZiEl2zayTVrkg1mSNtZGCdKmxS8SaNMgjY1aSwQ+1FWEkooNpFAJK8iLJe7CPulg2Hk+POk+pQI6yz0MA9eVTOKcPbPnzp9l+XnmzExdqVQqBQBAgn7VHgAAuHwICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgzYCLfcCenp44dOhQ1NfXR11d3cU+PADQB6VSKU6cOBFjxoyJfv3OfV7ioofFoUOHoqmp6WIfFgBI0NHREWPHjj3n1y96WNTX10fE/w3W0NBwsQ8PAPRBV1dXNDU19f47fi4XPSz+/fRHQ0ODsACAGvNJlzG4eBMASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0ZYXF448/HnV1dWfcbr311krNBgDUmLI/K+T222+PP/3pT///DQZc9I8bAQAuUWVXwYABA2LUqFGVmAUAqHFlX2Px97//PcaMGRM33HBDPPjgg3HgwIHz7l8sFqOrq+uMGwBweaorlUqlT7vzSy+9FCdPnoxbbrkl3n///Vi+fHkcPHgwdu3adc7PZ3/88cdj+fLlH9ve2dnpY9MB+mj80j9Ue4Sy7V9xX7VH4AJ0dXVFY2PjJ/77XVZY/LcPP/wwrr/++njyySfj4YcfPus+xWIxisXiGYM1NTUJC4ALICy42D5tWFzQlZfXXntt3HzzzbF3795z7lMoFKJQKFzIYQCAGnFB72Nx8uTJ2LdvX4wePTprHgCghpUVFt///vdjy5YtsX///vjzn/8cX/va16J///7xwAMPVGo+AKCGlPVUyHvvvRcPPPBA/POf/4zhw4fHXXfdFe3t7TF8+PBKzQcA1JCywmLdunWVmgMAuAz4rBAAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSCAsAII2wAADSXFBYrFixIurq6mLJkiVJ4wAAtazPYbFt27ZYvXp1TJo0KXMeAKCG9SksTp48GQ8++GD88pe/jOuuuy57JgCgRvUpLJqbm+O+++6LOXPmfOK+xWIxurq6zrgBAJenAeU+YN26dbFjx47Ytm3bp9q/ra0tli9fXvZgfTF+6R8uynEy7V9xX7VHgFT+HsKVrawzFh0dHfHd7343nn/++Rg0aNCnekxra2t0dnb23jo6Ovo0KABw6SvrjMX27dvj6NGj8fnPf7532+nTp2Pr1q3xzDPPRLFYjP79+5/xmEKhEIVCIWdaAOCSVlZYfPGLX4y33377jG0LFy6MW2+9NR577LGPRQUAcGUpKyzq6+tj4sSJZ2y7+uqrY+jQoR/bDgBcebzzJgCQpuxXhfy3zZs3J4wBAFwOnLEAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANKUFRarVq2KSZMmRUNDQzQ0NMSMGTPipZdeqtRsAECNKSssxo4dGytWrIjt27fHW2+9FV/4whfiq1/9arzzzjuVmg8AqCEDytl53rx5Z9x/4oknYtWqVdHe3h6333576mAAQO0pKyz+0+nTp+O3v/1tdHd3x4wZM865X7FYjGKx2Hu/q6urr4cEAC5xZYfF22+/HTNmzIh//etfcc0118SGDRvitttuO+f+bW1tsXz58gsaEgCqYfzSP1R7hLLtX3FfVY9f9qtCbrnllti5c2e88cYb8eijj8aCBQvib3/72zn3b21tjc7Ozt5bR0fHBQ0MAFy6yj5jMXDgwLjpppsiImLKlCmxbdu2+PnPfx6rV68+6/6FQiEKhcKFTQkA1IQLfh+Lnp6eM66hAACuXGWdsWhtbY25c+fGuHHj4sSJE7F27drYvHlzvPLKK5WaDwCoIWWFxdGjR+Ohhx6K999/PxobG2PSpEnxyiuvxJe+9KVKzQcA1JCywuJXv/pVpeYAAC4DPisEAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEhTVli0tbXF1KlTo76+PkaMGBHz58+PPXv2VGo2AKDGlBUWW7Zsiebm5mhvb49XX301Pvroo7jnnnuiu7u7UvMBADVkQDk7v/zyy2fcf+6552LEiBGxffv2uPvuu1MHAwBqT1lh8d86OzsjImLIkCHn3KdYLEaxWOy939XVdSGHBAAuYX2+eLOnpyeWLFkSd955Z0ycOPGc+7W1tUVjY2Pvrampqa+HBAAucX0Oi+bm5ti1a1esW7fuvPu1trZGZ2dn762jo6OvhwQALnF9eipk0aJF8eKLL8bWrVtj7Nix5923UChEoVDo03AAQG0pKyxKpVIsXrw4NmzYEJs3b44JEyZUai4AoAaVFRbNzc2xdu3a2LhxY9TX18fhw4cjIqKxsTEGDx5ckQEBgNpR1jUWq1atis7Ozpg1a1aMHj2697Z+/fpKzQcA1JCynwoBADgXnxUCAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAGmEBAKQRFgBAmrLDYuvWrTFv3rwYM2ZM1NXVxQsvvFCBsQCAWlR2WHR3d8fkyZNj5cqVlZgHAKhhA8p9wNy5c2Pu3LmVmAUAqHFlh0W5isViFIvF3vtdXV2VPiQAUCUVD4u2trZYvnx5pQ9Ts8Yv/UO1Ryjb/hX3VXuEK0Yt/nzUIusMeSr+qpDW1tbo7OzsvXV0dFT6kABAlVT8jEWhUIhCoVDpwwAAlwDvYwEApCn7jMXJkydj7969vffffffd2LlzZwwZMiTGjRuXOhwAUFvKDou33norZs+e3Xu/paUlIiIWLFgQzz33XNpgAEDtKTssZs2aFaVSqRKzAAA1zjUWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAECaPoXFypUrY/z48TFo0KCYPn16vPnmm9lzAQA1qOywWL9+fbS0tMSyZctix44dMXny5Lj33nvj6NGjlZgPAKghZYfFk08+GY888kgsXLgwbrvttnj22Wfjqquuil//+teVmA8AqCEDytn51KlTsX379mhtbe3d1q9fv5gzZ068/vrrZ31MsViMYrHYe7+zszMiIrq6uvoy73n1FP8n/XvycZX4s+Ps/ExzOanF3x21+HewUuv87+9bKpXOu19ZYfHBBx/E6dOnY+TIkWdsHzlyZOzevfusj2lra4vly5d/bHtTU1M5h+YS0vhUtScAapHfHRdHpdf5xIkT0djYeM6vlxUWfdHa2hotLS2993t6euL48eMxdOjQqKur+8THd3V1RVNTU3R0dERDQ0MlR71iWNPKsK75rGk+a5rvSlnTUqkUJ06ciDFjxpx3v7LCYtiwYdG/f/84cuTIGduPHDkSo0aNOutjCoVCFAqFM7Zde+215Rw2IiIaGhou6z+warCmlWFd81nTfNY035Wwpuc7U/FvZV28OXDgwJgyZUps2rSpd1tPT09s2rQpZsyYUf6EAMBlpeynQlpaWmLBggVxxx13xLRp0+Kpp56K7u7uWLhwYSXmAwBqSNlh8Y1vfCOOHTsWP/7xj+Pw4cPxuc99Ll5++eWPXdCZpVAoxLJlyz72dAp9Z00rw7rms6b5rGk+a3qmutInvW4EAOBT8lkhAEAaYQEApBEWAEAaYQEApKmpsPjKV74S48aNi0GDBsXo0aPjm9/8Zhw6dKjaY9W0/fv3x8MPPxwTJkyIwYMHx4033hjLli2LU6dOVXu0mvbEE0/EzJkz46qrrurTG8IRsXLlyhg/fnwMGjQopk+fHm+++Wa1R6ppW7dujXnz5sWYMWOirq4uXnjhhWqPVPPa2tpi6tSpUV9fHyNGjIj58+fHnj17qj1W1dVUWMyePTt+85vfxJ49e+J3v/td7Nu3L77+9a9Xe6yatnv37ujp6YnVq1fHO++8Ez/72c/i2WefjR/+8IfVHq2mnTp1Ku6///549NFHqz1KTVq/fn20tLTEsmXLYseOHTF58uS499574+jRo9UerWZ1d3fH5MmTY+XKldUe5bKxZcuWaG5ujvb29nj11Vfjo48+invuuSe6u7urPVpV1fTLTX//+9/H/Pnzo1gsxmc+85lqj3PZ+MlPfhKrVq2Kf/zjH9UepeY999xzsWTJkvjwww+rPUpNmT59ekydOjWeeeaZiPi/d/htamqKxYsXx9KlS6s8Xe2rq6uLDRs2xPz586s9ymXl2LFjMWLEiNiyZUvcfffd1R6namrqjMV/On78eDz//PMxc+ZMUZGss7MzhgwZUu0xuEKdOnUqtm/fHnPmzOnd1q9fv5gzZ068/vrrVZwMzq+zszMi4or//VlzYfHYY4/F1VdfHUOHDo0DBw7Exo0bqz3SZWXv3r3x9NNPx7e//e1qj8IV6oMPPojTp09/7N18R44cGYcPH67SVHB+PT09sWTJkrjzzjtj4sSJ1R6nqqoeFkuXLo26urrz3nbv3t27/w9+8IP4y1/+En/84x+jf//+8dBDD0UNP5tTMeWua0TEwYMH48tf/nLcf//98cgjj1Rp8ktXX9YUuDI0NzfHrl27Yt26ddUeperK/qyQbN/73vfiW9/61nn3ueGGG3r/e9iwYTFs2LC4+eab47Of/Ww0NTVFe3u7T1f9L+Wu66FDh2L27Nkxc+bM+MUvflHh6WpTuWtK3wwbNiz69+8fR44cOWP7kSNHYtSoUVWaCs5t0aJF8eKLL8bWrVtj7Nix1R6n6qoeFsOHD4/hw4f36bE9PT0REVEsFjNHuiyUs64HDx6M2bNnx5QpU2LNmjXRr1/VT2Rdki7kZ5VPb+DAgTFlypTYtGlT78WFPT09sWnTpli0aFF1h4P/UCqVYvHixbFhw4bYvHlzTJgwodojXRKqHhaf1htvvBHbtm2Lu+66K6677rrYt29f/OhHP4obb7zR2YoLcPDgwZg1a1Zcf/318dOf/jSOHTvW+zX/d9h3Bw4ciOPHj8eBAwfi9OnTsXPnzoiIuOmmm+Kaa66p7nA1oKWlJRYsWBB33HFHTJs2LZ566qno7u6OhQsXVnu0mnXy5MnYu3dv7/133303du7cGUOGDIlx48ZVcbLa1dzcHGvXro2NGzdGfX197zVAjY2NMXjw4CpPV0WlGvHXv/61NHv27NKQIUNKhUKhNH78+NJ3vvOd0nvvvVft0WramjVrShFx1ht9t2DBgrOu6WuvvVbt0WrG008/XRo3blxp4MCBpWnTppXa29urPVJNe+211876M7lgwYJqj1azzvW7c82aNdUerapq+n0sAIBLiyfTAYA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASPO/g7UWmppTPXIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.hist(np.log10(new_matrix))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c483f4d9", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/message_ix/tools/lp_diag/cplex.opt b/message_ix/tools/lp_diag/cplex.opt deleted file mode 100644 index 569f4249d..000000000 --- a/message_ix/tools/lp_diag/cplex.opt +++ /dev/null @@ -1 +0,0 @@ -writemps=transport diff --git a/message_ix/tools/lp_diag/cplex_mpstest.opt b/message_ix/tools/lp_diag/cplex_mpstest.opt deleted file mode 100644 index 0c1f0120d..000000000 --- a/message_ix/tools/lp_diag/cplex_mpstest.opt +++ /dev/null @@ -1 +0,0 @@ -writemps=transport_mpstest_mps diff --git a/message_ix/tools/lp_diag/scale_trial.gms b/message_ix/tools/lp_diag/scale_trial.gms deleted file mode 100644 index 58aea03c3..000000000 --- a/message_ix/tools/lp_diag/scale_trial.gms +++ /dev/null @@ -1,64 +0,0 @@ -$ontext - -Illustrate user defined scaling by GAMS - -$offtext - sets items names of variables /x1*x4/ - resources names of constraints /r1*r4/ - - parameter objcoef(items) objective function coeficients - /x1 100000, - x2 -50000000 - x3 -40000000 - x4 -50000000/ -* - rhs(resources) resource availabilities - /r3 1200 - r4 60/; - - Table amatrix(resources,items) aij matrix - x1 x2 x3 x4 - r1 1 -10000 -8000 - r2 1 4 -50 - r3 1500 2000 - r4 50 45 ; - - variables z objective function; - positive variables xvar(items) variables; - equations objfun objective function - avail(resources) resource limits; - - objfun.. z =e= sum(items,objcoef(items)*xvar(items)); - avail(resources).. sum(items,amatrix(resources,items)*xvar(items)) - =l= rhs(resources); -model scalemod /all/; -avail.scale('r2')= 0.001311; -avail.scale('r1')= 0.020972; -avail.scale('r3')= 0.005243; -objfun.scale= 1.0; -avail.scale('r4')= 0.003906; -xvar.scale('x2')= 5e-06; -xvar.scale('x4')= 0.000244; -z.scale= 1.0; -xvar.scale('x1')= 0.001311; -xvar.scale('x3')= 5e-06; - -scalemod.scaleopt=1; -scalemod.OptFile = 1; -solve scalemod using lp maximizing z; - -$ontext -DO NOT DELETE THIS BLOCK -This is the scaling factor from GAMS documentation -================================================== -avail.scale('r1')= 1000; -avail.scale('r2')= 5; -avail.scale('r3')= 1500; -avail.scale('r4')= 50; -objfun.scale=50; -xvar.scale('x1')= 1000; -xvar.scale('x2')= 1; -xvar.scale('x3')= 1.25; -xvar.scale('x4')= 1/10; -z.scale= 1.0; -$offtext diff --git a/message_ix/tools/lp_diag/transport_problem_mpstest.gms b/message_ix/tools/lp_diag/transport_problem_mpstest.gms deleted file mode 100644 index 73e4039d2..000000000 --- a/message_ix/tools/lp_diag/transport_problem_mpstest.gms +++ /dev/null @@ -1,67 +0,0 @@ -$title A Transportation Problem (TRNSPORT,SEQ=1) - -$onText -This problem finds a least cost shipping schedule that meets -requirements at markets and supplies at factories. - - -Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. -Princeton University Press, Princeton, New Jersey, 1963. - -This formulation is described in detail in: -Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. -The Scientific Press, Redwood City, California, 1988. - -The line numbers will not match those in the book because of these -comments. - -Keywords: linear programming, transportation problem, scheduling -$offText - -Set - i 'canning plants' / seattle, san-diego / - j 'markets' / new-york, chicago, topeka /; - -Parameter - a(i) 'capacity of plant i in cases' - / seattle 350 - san-diego 600 / - - b(j) 'demand at market j in cases' - / new-york 325 - chicago 300 - topeka 275 /; - -Table d(i,j) 'distance in thousands of miles' - new-york chicago topeka - seattle 2.5 1.7 1.8 - san-diego 0.0000000025 1.8 0.000000014; - -Scalar f 'freight in dollars per case per thousand miles' / 1000 /; - -Parameter c(i,j) 'transport cost in thousands of dollars per case'; -c(i,j) = f*d(i,j)/1000; - -Variable - x(i,j) 'shipment quantities in cases' - z 'total transportation costs in thousands of dollars'; - -Positive Variable x; - -Equation - cost 'define objective function' - supply(i) 'observe supply limit at plant i' - demand(j) 'satisfy demand at market j'; - -cost.. z =e= sum((i,j), c(i,j)*x(i,j)); - -supply(i).. sum(j, x(i,j)) =l= a(i); - -demand(j).. sum(i, x(i,j)) =g= b(j); - -Model transport_mpstest / all /; -*x.scale('san-diego',j)=10000; -*transport.scaleopt=1; -transport_mpstest.OptFile = 1; -solve transport_mpstest using lp minimizing z; -display x.l, x.m, c; diff --git a/message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms b/message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms deleted file mode 100644 index 7861a4f28..000000000 --- a/message_ix/tools/lp_diag/transport_problem_mpstest_scaled.gms +++ /dev/null @@ -1,70 +0,0 @@ -$title A Transportation Problem (TRNSPORT,SEQ=1) - -$onText -This problem finds a least cost shipping schedule that meets -requirements at markets and supplies at factories. - - -Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. -Princeton University Press, Princeton, New Jersey, 1963. - -This formulation is described in detail in: -Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. -The Scientific Press, Redwood City, California, 1988. - -The line numbers will not match those in the book because of these -comments. - -Keywords: linear programming, transportation problem, scheduling -$offText - -Set - i 'canning plants' / seattle, san-diego / - j 'markets' / new-york, chicago, topeka /; - -Parameter - a(i) 'capacity of plant i in cases' - / seattle 350 - san-diego 600 / - - b(j) 'demand at market j in cases' - / new-york 325 - chicago 300 - topeka 275 /; - -Table d(i,j) 'distance in thousands of miles' - new-york chicago topeka - seattle 2.5 1.7 1.8 - san-diego 0.0000000025 1.8 0.000000014; - -Scalar f 'freight in dollars per case per thousand miles' / 1000 /; - -Parameter c(i,j) 'transport cost in thousands of dollars per case'; -c(i,j) = f*d(i,j)/1000; - -Variable - x(i,j) 'shipment quantities in cases' - z 'total transportation costs in thousands of dollars'; - -Positive Variable x; - -Equation - cost 'define objective function' - supply(i) 'observe supply limit at plant i' - demand(j) 'satisfy demand at market j'; - -cost.. z =e= sum((i,j), c(i,j)*x(i,j)); - -supply(i).. sum(j, x(i,j)) =l= a(i); - -demand(j).. sum(i, x(i,j)) =g= b(j); - -Model transport_mpstest / all /; -x.scale('san-diego','new-york') = 13.0; -x.scale('san-diego','topeka') = 10.0; -cost.scale = 77.0; -z.scale = cost.scale ; -transport_mpstest.scaleopt=1; -transport_mpstest.OptFile = 1; -solve transport_mpstest using lp minimizing z; -display x.l, x.m, c; diff --git a/message_ix/tools/lp_diag/transport_problem_original.gms b/message_ix/tools/lp_diag/transport_problem_original.gms deleted file mode 100644 index 5beef59ff..000000000 --- a/message_ix/tools/lp_diag/transport_problem_original.gms +++ /dev/null @@ -1,65 +0,0 @@ -$title A Transportation Problem (TRNSPORT,SEQ=1) - -$onText -This problem finds a least cost shipping schedule that meets -requirements at markets and supplies at factories. - - -Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. -Princeton University Press, Princeton, New Jersey, 1963. - -This formulation is described in detail in: -Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. -The Scientific Press, Redwood City, California, 1988. - -The line numbers will not match those in the book because of these -comments. - -Keywords: linear programming, transportation problem, scheduling -$offText - -Set - i 'canning plants' / seattle, san-diego / - j 'markets' / new-york, chicago, topeka /; - -Parameter - a(i) 'capacity of plant i in cases' - / seattle 350 - san-diego 600 / - - b(j) 'demand at market j in cases' - / new-york 325 - chicago 300 - topeka 275 /; - -Table d(i,j) 'distance in thousands of miles' - new-york chicago topeka - seattle 2.5 1.7 1.8 - san-diego 2.5 1.8 1.4; - -Scalar f 'freight in dollars per case per thousand miles' / 1000 /; - -Parameter c(i,j) 'transport cost in thousands of dollars per case'; -c(i,j) = f*d(i,j)/1000; - -Variable - x(i,j) 'shipment quantities in cases' - z 'total transportation costs in thousands of dollars'; - -Positive Variable x; - -Equation - cost 'define objective function' - supply(i) 'observe supply limit at plant i' - demand(j) 'satisfy demand at market j'; - -cost.. z =e= sum((i,j), c(i,j)*x(i,j)); - -supply(i).. sum(j, x(i,j)) =l= a(i); - -demand(j).. sum(i, x(i,j)) =g= b(j); - -Model transport_original / all /; -transport_original.OptFile = 1; -solve transport_original using lp minimizing z; -display x.l, x.m, c; diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 b/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 deleted file mode 100644 index 09f43d756..000000000 --- a/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.0 +++ /dev/null @@ -1,229 +0,0 @@ -$ontext - == Model for Gas Logistics Systems (MGLogs) == -=============================== An MILP Model for Optimal Planning of Small-scale LNG Logistics Systems =============================== -= (c) Yoga Wienda Pratama, Widodo Wahyu Purwanto = -= Department of Chemical Engineering, Faculty of Engineering Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = -= Sustainable Energy Systems & Policy Research Cluster (SESP - UI) Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = -======================================================================================================================================= -$offtext - -$set Data 'MGLogs_Input0' -*Read data from Excel and store in GDX file. -$call gdxxrw %Data%.xlsx skipempty=0 trace=2 index=Specs!A1 -$gdxin %Data%.gdx -*$gdxin MGLogs_Input.gdx - - -Sets - i locations - s storages - c vessels - r route slots - l frequency / 1*100 /; -$load i,s,c,r - -Alias (i,j,k) ; - -Parameters - di(i,i) distance between locations - d(i) demand of LNG at location i in m3 of LNG - capexc(c) capital expenditures of vessels (USD per unit) - capexs(s) capital expenditures of storage and FSRU (USD per unit) - capexns(s) capital expenditures of non storage facility and onshore interface for FSRU (USD per m3 per year) - fec(c) fuel economy of vessel (MMBTU per nautical mile) - ucc(c) unit capacity of vessel (m3) - ucs(s) unit capacity of storage or FSRU (m3) - vc(c) velocity of vessel (kn) - lurc(c) loading unloading rate of vessel (m3 per hr) - btc(c) berthing time of vessels - c_lp(j) liquefaction plant production capacity (m3 per year) - nTr(l) number of frequency in binary linearization - pg(i) price of LNG ($ p MMBTU) ; - -$load di,d,capexc,capexs,capexns,fec,ucc,ucs,vc,lurc,btc,c_lp, pg -nTr(l) = ord(l) ; - -SCALARS fomc fixed operating and maintenance carrier - fomr fixed operating and maintenance costs of regas - cgr cost of gas regasification ($ p m3) - svr coefficient for storage volume reserve - hvc heels volume of carrier - cbogc coefficient of BOG for vessels (LNG transported per day) - pd price of diessel fuel ($ p MMBTU) - crfc cost recovery factor - crfr cost recovery factor - ghv m3 to mmbtu - m any large number for number of storage - scur_up upper bound for storage capacity for vessel unloading - scsor_up upper bound for storage capacity for send out - sclr_up upper bound for storage capacity for vessel loading - itc Idle time of vessel (hr) - ; - -$load fomc,fomr,cgr,svr,hvc,cbogc,pd,crfc,crfr,ghv,m,scur_up,scsor_up,sclr_up,itc - -VARIABLES -*Objective Function - TASC Total annual systems cost US$ - CoG Cost in gas from liquefaction terminal - CoC Cost in vessels - CoR Cost in receiving terminal - ; - -POSITIVE VARIABLES -*Vessels - Lv(i,r,c,j) Volume of LNG from liquefaction terminal i loaded to vessel (m3 LNG) - Tv(i,r,c,j,k) Volume of LNG from liquefaction terminal i transported by vessel from terminals j to k (m3 LNG) - Uv(i,r,c,j) Volume of LNG from liquefaction terminal i unloaded from vessel to terminal j (m3 LNG) - Rv(i,r,c,j) Volume of LNG from liquefaction terminal i remains in vessel after unloading in terminal j (m3 LNG) - Bogv(i,r,c,j,k) Volume of LNG from liquefaction terminal i boiled off during travel from j to k - Dec(i,r,c,j,k) Diessel fuel consumption from j to k (MMBTU) - Hv(i) Heels' volume of carriers (m3 of LNG) - -*Receiving Terminals - Scr(j) Storage capacity of receiving terminal (m3 LNG) - Socr(j) Send-out capacity of receiving terminal (m3 LNG per year) - Scsor(l,i,r,c,k) Storage capacity for send out (m3 LNG) - Sclr(l,i,r,c,j) Storage capacity for vessels loading from receiving terminal (m3 LNG) - Scur(l,i,r,c,k) Storage capacity for unloading - Sorr(i,r,c,k) Send-out rate of receiving terminal (m3 LNG per year) - - ; -BINARY VARIABLES - Sb(s,j) Storage type selection - Rb(l,i,r,c,j,k) Route selection - ; - -INTEGER VARIABLES - Nc(i,r,c) - Nsr(s,j) - Tr(i,r,c,j,k) - ; - -EQUATIONS - EQ1 - EQ2 - EQ3 - EQ4 - EQ5(j) - EQ6(r,k) - EQ7(r,j) - EQ8(k) - EQ9(j) - EQ10(l,i,r,c,j,k) - EQ11(l,i,r,c,k) - EQ12(i,r,c,j,k) - EQ13(i,r,c,k) - EQ14(i,r,c,j) - EQ15(i,r,c,j,k) - EQ16(i,r,c,j) - EQ17(j) - EQ18(j) - EQ19(i,r,c,j,k) - EQ20(i,r,c,j,k) - EQ21(i,r,c,j,k) - EQ22(i,r,c) - EQ23(i) - EQ24(j) - EQ25(k) - EQ26(k) -** EQ27(i,r,c,j,k) - EQ27a(i,r,c,k) - EQ27b(l,i,r,c,k) -** EQ28(i,r,c,j,k) - EQ28a(i,r,c,j,k) - EQ28b(l,i,r,c,k) -** EQ29(i,r,c,j,k) - EQ29a(i,r,c,j) - EQ29b(l,i,r,c,j) - EQ30(s,j) - EQ31(s,j) - EQ32(j) - EQ33(j) - EQ34(i,r,c,j,k) - ; - -*Statement of Equations -*Objective Function - EQ1.. TASC =E= CoG + CoR + CoC ; - EQ2.. CoG =E= sum[i, pg(i) * ghv * (sum[(r,c,j), Lv(i,r,c,j)$(ord(i) < 3)] - sum[(r,c,j,k), Bogv(i,r,c,j,k)] - Hv(i))] ; - EQ3.. CoC =E= sum[(i,r,c), Nc(i,r,c) * (capexc(c) * (crfc + fomc))] + sum[(i,r,c,j,k), Dec(i,r,c,j,k) * pd + Bogv(i,r,c,j,k) * ghv * pg(i)] ; - EQ4.. CoR =E= (sum[(s,i)$(ord(s) = 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)] + sum[(s,i)$(ord(s) > 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)]) * (crfr + fomr) + sum[i, d(i) * cgr] ; - -*Constraints -*Supply Demand Balance - EQ5(j).. sum[(i,r,c), Sorr(i,r,c,j)] =E= d(j) ; -*Vehicle flow formulation -*--------untuk hub, untuk masing-masing rs, boleh didatangi dan ditinggal masing-masing sekali - EQ6(r,k).. sum[(l,i,c,j)$(ord(i) = ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; - EQ7(r,j).. sum[(l,i,c,k)$(ord(i) = ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; -*--------kalau bukan hub, hanya boleh didatangi dan ditinggal oleh 1 rute untuk semua slot - EQ8(k).. sum[(l,i,r,c,j)$(ord(i) <> ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; - EQ9(j).. sum[(l,i,r,c,k)$(ord(i) <> ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; - EQ10(l,i,r,c,j,k)$(ord(j) = ord(k)).. Rb(l,i,r,c,j,k) =E= 0 ; - EQ11(l,i,r,c,k).. sum[j, Rb(l,i,r,c,j,k)] =E= sum[j, Rb(l,i,r,c,k,j)] ; - -*LNG balance in Vessels - EQ12(i,r,c,j,k).. Tr(i,r,c,j,k) =E= sum[l, Rb(l,i,r,c,j,k) * nTR(l)] ; - EQ13(i,r,c,k).. sum[j, Tv(i,r,c,j,k)] =E= Uv(i,r,c,k) +Rv(i,r,c,k) ; - EQ14(i,r,c,j).. sum[k, Tv(i,r,c,j,k)] =E= Rv(i,r,c,j) + Lv(i,r,c,j) - sum[k, Bogv(i,r,c,j,k)] ; - EQ15(i,r,c,j,k).. Bogv(i,r,c,j,k) =E= cbogc * (di(j,k) / [vc(c) * 24]) * (Tv(i,r,c,j,k) + Bogv(i,r,c,j,k)) ; - EQ16(i,r,c,j)$(ord(i) <> ord(j)).. Lv(i,r,c,j) =E= 0 ; - EQ17(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) < 3)] =L= c_lp(j) ; - EQ18(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) > 2)] =L= sum[(i,r,c), Uv(i,r,c,j)] - sum[(i,r,c), Sorr(i,r,c,j)] ; - EQ19(i,r,c,j,k).. Tv(i,r,c,j,k) + Bogv(i,r,c,j,k) =L= Tr(i,r,c,j,k) * ucc(c) ; - EQ20(i,r,c,j,k).. Tv(i,r,c,j,k) =G= Tr(i,r,c,j,k) * hvc * ucc(c) ; - EQ21(i,r,c,j,k)$(ord(i) = ord(k)).. Tv(i,r,c,j,k) =E= Tr(i,r,c,j,k) * hvc * ucc(c) ; - EQ22(i,r,c).. Nc(i,r,c) * (8766 - itc) =G= sum[(j,k), Tr(i,r,c,j,k) * ([di(j,k)/vc(c)] + btc(c))] + sum[k, Uv(i,r,c,k)/lurc(c)] + sum[j, Lv(i,r,c,j)/lurc(c)] ; - -*Heels of Ship - EQ23(i).. Hv(i) =E= sum[(r,c), hvc * Nc(i,r,c) * ucc(c)] ; - -*Storage size constraints - EQ24(j).. Scr(j) =E= sum[s, Nsr(s,j) * ucs(s)] ; - EQ25(k).. Scr(k) =G= sum[(l,i,r,c), Scur(l,i,r,c,k)] ; - EQ26(k).. Scr(k) =G= sum[(l,i,r,c), Scsor(l,i,r,c,k)] + sum[(l,i,r,c), Sclr(l,i,r,c,k)] ; - -** Do not remove -** EQ27(i,r,c,j,k)$(ord(i) <> ord(k)).. Scur(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Uv(i,r,c,k) ; - EQ27a(i,r,c,k)$(ord(i) <> ord(k)).. svr * Uv(i,r,c,k) =L= sum[l, nTR(l) * Scur(l,i,r,c,k)] ; - EQ27b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scur(l,i,r,c,k) =L= scur_up * sum[j, Rb(l,i,r,c,j,k)] ; -** Do not remove -** EQ28(i,r,c,j,k)$(ord(i) <> ord(k)).. Scsor(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Sorr(i,r,c,k) ; - EQ28a(i,r,c,j,k)$(ord(i) <> ord(k)).. svr * Sorr(i,r,c,k) =L= sum[l, nTR(l) * Scsor(l,i,r,c,k)] ; - EQ28b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scsor(l,i,r,c,k) =L= scsor_up * sum[j, Rb(l,i,r,c,j,k)] ; -** Do not remove -** EQ29(i,r,c,j,k)$(ord(i) = ord(j) and ord(i) > 2).. Sclr(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Lv(i,r,c,j) ; - EQ29a(i,r,c,j)$(ord(i) > 2).. svr * Lv(i,r,c,j) =L= sum[l, nTR(l) * Sclr(l,i,r,c,j)] ; - EQ29b(l,i,r,c,j)$(ord(i) > 2).. Sclr(l,i,r,c,j) =L= sclr_up * sum[k, Rb(l,i,r,c,j,k)] ; - EQ30(s,j)$(ord(s) = 1).. Nsr(s,j) =L= Sb(s,j) * m ; - EQ31(s,j)$(ord(s) > 1).. Nsr(s,j) =L= Sb(s,j) ; - EQ32(j).. sum[s, Sb(s,j)] =L= 1 ; - EQ33(j).. Socr(j) =E= sum[(i,r,c), Sorr(i,r,c,j)] ; - -*Fuel Consumption for Shipping - EQ34(i,r,c,j,k).. Dec(i,r,c,j,k) + (BOGV(i,r,c,j,k) * ghv) =E= fec(c) * Tr(i,r,c,j,k) * di(j,k) ; - - Nc.up(i,r,c) = 3 ; - Nsr.up(s,j) = 10 ; - Tr.up(i,r,c,j,k) = card(l) ; - - - -MODEL MGLogs / all / -OPTION mip = CPLEX ; -OPTION reslim = 864000; -OPTION threads = 12; -OPTION optcr = 0.03 ; -MGLogs.nodlim = 10000000; -SOLVE MGLogs using MIP minimize TASC; - - -$set datatype Output -$set outputname (SESP-UI) -Execute_Unload "MGLogs_%datatype%_%outputname%.gdx"; - - -$ontext - -$offtext diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms b/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms deleted file mode 100644 index 09f43d756..000000000 --- a/message_ix/tools/make_prescaler/Tranport Scaling/MGLogs 1.gms +++ /dev/null @@ -1,229 +0,0 @@ -$ontext - == Model for Gas Logistics Systems (MGLogs) == -=============================== An MILP Model for Optimal Planning of Small-scale LNG Logistics Systems =============================== -= (c) Yoga Wienda Pratama, Widodo Wahyu Purwanto = -= Department of Chemical Engineering, Faculty of Engineering Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = -= Sustainable Energy Systems & Policy Research Cluster (SESP - UI) Universitas Indonesia - Depok, Jawa Barat INDONESIA 16424 = -======================================================================================================================================= -$offtext - -$set Data 'MGLogs_Input0' -*Read data from Excel and store in GDX file. -$call gdxxrw %Data%.xlsx skipempty=0 trace=2 index=Specs!A1 -$gdxin %Data%.gdx -*$gdxin MGLogs_Input.gdx - - -Sets - i locations - s storages - c vessels - r route slots - l frequency / 1*100 /; -$load i,s,c,r - -Alias (i,j,k) ; - -Parameters - di(i,i) distance between locations - d(i) demand of LNG at location i in m3 of LNG - capexc(c) capital expenditures of vessels (USD per unit) - capexs(s) capital expenditures of storage and FSRU (USD per unit) - capexns(s) capital expenditures of non storage facility and onshore interface for FSRU (USD per m3 per year) - fec(c) fuel economy of vessel (MMBTU per nautical mile) - ucc(c) unit capacity of vessel (m3) - ucs(s) unit capacity of storage or FSRU (m3) - vc(c) velocity of vessel (kn) - lurc(c) loading unloading rate of vessel (m3 per hr) - btc(c) berthing time of vessels - c_lp(j) liquefaction plant production capacity (m3 per year) - nTr(l) number of frequency in binary linearization - pg(i) price of LNG ($ p MMBTU) ; - -$load di,d,capexc,capexs,capexns,fec,ucc,ucs,vc,lurc,btc,c_lp, pg -nTr(l) = ord(l) ; - -SCALARS fomc fixed operating and maintenance carrier - fomr fixed operating and maintenance costs of regas - cgr cost of gas regasification ($ p m3) - svr coefficient for storage volume reserve - hvc heels volume of carrier - cbogc coefficient of BOG for vessels (LNG transported per day) - pd price of diessel fuel ($ p MMBTU) - crfc cost recovery factor - crfr cost recovery factor - ghv m3 to mmbtu - m any large number for number of storage - scur_up upper bound for storage capacity for vessel unloading - scsor_up upper bound for storage capacity for send out - sclr_up upper bound for storage capacity for vessel loading - itc Idle time of vessel (hr) - ; - -$load fomc,fomr,cgr,svr,hvc,cbogc,pd,crfc,crfr,ghv,m,scur_up,scsor_up,sclr_up,itc - -VARIABLES -*Objective Function - TASC Total annual systems cost US$ - CoG Cost in gas from liquefaction terminal - CoC Cost in vessels - CoR Cost in receiving terminal - ; - -POSITIVE VARIABLES -*Vessels - Lv(i,r,c,j) Volume of LNG from liquefaction terminal i loaded to vessel (m3 LNG) - Tv(i,r,c,j,k) Volume of LNG from liquefaction terminal i transported by vessel from terminals j to k (m3 LNG) - Uv(i,r,c,j) Volume of LNG from liquefaction terminal i unloaded from vessel to terminal j (m3 LNG) - Rv(i,r,c,j) Volume of LNG from liquefaction terminal i remains in vessel after unloading in terminal j (m3 LNG) - Bogv(i,r,c,j,k) Volume of LNG from liquefaction terminal i boiled off during travel from j to k - Dec(i,r,c,j,k) Diessel fuel consumption from j to k (MMBTU) - Hv(i) Heels' volume of carriers (m3 of LNG) - -*Receiving Terminals - Scr(j) Storage capacity of receiving terminal (m3 LNG) - Socr(j) Send-out capacity of receiving terminal (m3 LNG per year) - Scsor(l,i,r,c,k) Storage capacity for send out (m3 LNG) - Sclr(l,i,r,c,j) Storage capacity for vessels loading from receiving terminal (m3 LNG) - Scur(l,i,r,c,k) Storage capacity for unloading - Sorr(i,r,c,k) Send-out rate of receiving terminal (m3 LNG per year) - - ; -BINARY VARIABLES - Sb(s,j) Storage type selection - Rb(l,i,r,c,j,k) Route selection - ; - -INTEGER VARIABLES - Nc(i,r,c) - Nsr(s,j) - Tr(i,r,c,j,k) - ; - -EQUATIONS - EQ1 - EQ2 - EQ3 - EQ4 - EQ5(j) - EQ6(r,k) - EQ7(r,j) - EQ8(k) - EQ9(j) - EQ10(l,i,r,c,j,k) - EQ11(l,i,r,c,k) - EQ12(i,r,c,j,k) - EQ13(i,r,c,k) - EQ14(i,r,c,j) - EQ15(i,r,c,j,k) - EQ16(i,r,c,j) - EQ17(j) - EQ18(j) - EQ19(i,r,c,j,k) - EQ20(i,r,c,j,k) - EQ21(i,r,c,j,k) - EQ22(i,r,c) - EQ23(i) - EQ24(j) - EQ25(k) - EQ26(k) -** EQ27(i,r,c,j,k) - EQ27a(i,r,c,k) - EQ27b(l,i,r,c,k) -** EQ28(i,r,c,j,k) - EQ28a(i,r,c,j,k) - EQ28b(l,i,r,c,k) -** EQ29(i,r,c,j,k) - EQ29a(i,r,c,j) - EQ29b(l,i,r,c,j) - EQ30(s,j) - EQ31(s,j) - EQ32(j) - EQ33(j) - EQ34(i,r,c,j,k) - ; - -*Statement of Equations -*Objective Function - EQ1.. TASC =E= CoG + CoR + CoC ; - EQ2.. CoG =E= sum[i, pg(i) * ghv * (sum[(r,c,j), Lv(i,r,c,j)$(ord(i) < 3)] - sum[(r,c,j,k), Bogv(i,r,c,j,k)] - Hv(i))] ; - EQ3.. CoC =E= sum[(i,r,c), Nc(i,r,c) * (capexc(c) * (crfc + fomc))] + sum[(i,r,c,j,k), Dec(i,r,c,j,k) * pd + Bogv(i,r,c,j,k) * ghv * pg(i)] ; - EQ4.. CoR =E= (sum[(s,i)$(ord(s) = 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)] + sum[(s,i)$(ord(s) > 1), Nsr(s,i) * capexs(s) + Socr(i) * capexns(s)]) * (crfr + fomr) + sum[i, d(i) * cgr] ; - -*Constraints -*Supply Demand Balance - EQ5(j).. sum[(i,r,c), Sorr(i,r,c,j)] =E= d(j) ; -*Vehicle flow formulation -*--------untuk hub, untuk masing-masing rs, boleh didatangi dan ditinggal masing-masing sekali - EQ6(r,k).. sum[(l,i,c,j)$(ord(i) = ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; - EQ7(r,j).. sum[(l,i,c,k)$(ord(i) = ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; -*--------kalau bukan hub, hanya boleh didatangi dan ditinggal oleh 1 rute untuk semua slot - EQ8(k).. sum[(l,i,r,c,j)$(ord(i) <> ord(k)), Rb(l,i,r,c,j,k)] =L= 1 ; - EQ9(j).. sum[(l,i,r,c,k)$(ord(i) <> ord(j)), Rb(l,i,r,c,j,k)] =L= 1 ; - EQ10(l,i,r,c,j,k)$(ord(j) = ord(k)).. Rb(l,i,r,c,j,k) =E= 0 ; - EQ11(l,i,r,c,k).. sum[j, Rb(l,i,r,c,j,k)] =E= sum[j, Rb(l,i,r,c,k,j)] ; - -*LNG balance in Vessels - EQ12(i,r,c,j,k).. Tr(i,r,c,j,k) =E= sum[l, Rb(l,i,r,c,j,k) * nTR(l)] ; - EQ13(i,r,c,k).. sum[j, Tv(i,r,c,j,k)] =E= Uv(i,r,c,k) +Rv(i,r,c,k) ; - EQ14(i,r,c,j).. sum[k, Tv(i,r,c,j,k)] =E= Rv(i,r,c,j) + Lv(i,r,c,j) - sum[k, Bogv(i,r,c,j,k)] ; - EQ15(i,r,c,j,k).. Bogv(i,r,c,j,k) =E= cbogc * (di(j,k) / [vc(c) * 24]) * (Tv(i,r,c,j,k) + Bogv(i,r,c,j,k)) ; - EQ16(i,r,c,j)$(ord(i) <> ord(j)).. Lv(i,r,c,j) =E= 0 ; - EQ17(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) < 3)] =L= c_lp(j) ; - EQ18(j).. sum[(i,r,c), Lv(i,r,c,j)$(ord(j) > 2)] =L= sum[(i,r,c), Uv(i,r,c,j)] - sum[(i,r,c), Sorr(i,r,c,j)] ; - EQ19(i,r,c,j,k).. Tv(i,r,c,j,k) + Bogv(i,r,c,j,k) =L= Tr(i,r,c,j,k) * ucc(c) ; - EQ20(i,r,c,j,k).. Tv(i,r,c,j,k) =G= Tr(i,r,c,j,k) * hvc * ucc(c) ; - EQ21(i,r,c,j,k)$(ord(i) = ord(k)).. Tv(i,r,c,j,k) =E= Tr(i,r,c,j,k) * hvc * ucc(c) ; - EQ22(i,r,c).. Nc(i,r,c) * (8766 - itc) =G= sum[(j,k), Tr(i,r,c,j,k) * ([di(j,k)/vc(c)] + btc(c))] + sum[k, Uv(i,r,c,k)/lurc(c)] + sum[j, Lv(i,r,c,j)/lurc(c)] ; - -*Heels of Ship - EQ23(i).. Hv(i) =E= sum[(r,c), hvc * Nc(i,r,c) * ucc(c)] ; - -*Storage size constraints - EQ24(j).. Scr(j) =E= sum[s, Nsr(s,j) * ucs(s)] ; - EQ25(k).. Scr(k) =G= sum[(l,i,r,c), Scur(l,i,r,c,k)] ; - EQ26(k).. Scr(k) =G= sum[(l,i,r,c), Scsor(l,i,r,c,k)] + sum[(l,i,r,c), Sclr(l,i,r,c,k)] ; - -** Do not remove -** EQ27(i,r,c,j,k)$(ord(i) <> ord(k)).. Scur(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Uv(i,r,c,k) ; - EQ27a(i,r,c,k)$(ord(i) <> ord(k)).. svr * Uv(i,r,c,k) =L= sum[l, nTR(l) * Scur(l,i,r,c,k)] ; - EQ27b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scur(l,i,r,c,k) =L= scur_up * sum[j, Rb(l,i,r,c,j,k)] ; -** Do not remove -** EQ28(i,r,c,j,k)$(ord(i) <> ord(k)).. Scsor(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Sorr(i,r,c,k) ; - EQ28a(i,r,c,j,k)$(ord(i) <> ord(k)).. svr * Sorr(i,r,c,k) =L= sum[l, nTR(l) * Scsor(l,i,r,c,k)] ; - EQ28b(l,i,r,c,k)$(ord(i) <> ord(k)).. Scsor(l,i,r,c,k) =L= scsor_up * sum[j, Rb(l,i,r,c,j,k)] ; -** Do not remove -** EQ29(i,r,c,j,k)$(ord(i) = ord(j) and ord(i) > 2).. Sclr(i,r,c,j,k) * Tr(i,r,c,j,k) =E= svr * Lv(i,r,c,j) ; - EQ29a(i,r,c,j)$(ord(i) > 2).. svr * Lv(i,r,c,j) =L= sum[l, nTR(l) * Sclr(l,i,r,c,j)] ; - EQ29b(l,i,r,c,j)$(ord(i) > 2).. Sclr(l,i,r,c,j) =L= sclr_up * sum[k, Rb(l,i,r,c,j,k)] ; - EQ30(s,j)$(ord(s) = 1).. Nsr(s,j) =L= Sb(s,j) * m ; - EQ31(s,j)$(ord(s) > 1).. Nsr(s,j) =L= Sb(s,j) ; - EQ32(j).. sum[s, Sb(s,j)] =L= 1 ; - EQ33(j).. Socr(j) =E= sum[(i,r,c), Sorr(i,r,c,j)] ; - -*Fuel Consumption for Shipping - EQ34(i,r,c,j,k).. Dec(i,r,c,j,k) + (BOGV(i,r,c,j,k) * ghv) =E= fec(c) * Tr(i,r,c,j,k) * di(j,k) ; - - Nc.up(i,r,c) = 3 ; - Nsr.up(s,j) = 10 ; - Tr.up(i,r,c,j,k) = card(l) ; - - - -MODEL MGLogs / all / -OPTION mip = CPLEX ; -OPTION reslim = 864000; -OPTION threads = 12; -OPTION optcr = 0.03 ; -MGLogs.nodlim = 10000000; -SOLVE MGLogs using MIP minimize TASC; - - -$set datatype Output -$set outputname (SESP-UI) -Execute_Unload "MGLogs_%datatype%_%outputname%.gdx"; - - -$ontext - -$offtext diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms b/message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms deleted file mode 100644 index 466d9ccea..000000000 --- a/message_ix/tools/make_prescaler/Tranport Scaling/Savepoint.gms +++ /dev/null @@ -1,10 +0,0 @@ -$ontext -This program illustrates the use savepoint. It writes -the current model solution to a log or GDX file. The option -values are: - 0: do not write a point file (default) - 1: write the solution to _p.gdx - 2: write the solution to _p.gdx -$offtext - -$call =gams trnsport savepoint=2 lo=%GAMS.lo% diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms b/message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms deleted file mode 100644 index ea652c663..000000000 --- a/message_ix/tools/make_prescaler/Tranport Scaling/Transport Export.gms +++ /dev/null @@ -1,57 +0,0 @@ -*$set Data 'var_scale' -*Read data from Excel and store in GDX file. -*$call gdxxrw %Data%.xlsx skipempty=0 trace=2 index=Scale!A1 -*$gdxin %Data%.gdx -*$gdxin MGLogs_Input.gdx - -Sets - i 'canning plants' / seattle, san-diego / - j 'markets' / new-york, chicago, topeka / ; - -Parameters - - a(i) 'capacity of plant i in cases' - / seattle 350 - san-diego 600 / - - b(j) 'demand at market j in cases' - / new-york 325 - chicago 300 - topeka 275 / -; - - -Table d(i,j) 'distance in thousands of miles' - new-york chicago topeka - seattle 2.5 1.7 1.8 - san-diego 2.5 1.8 1.4 ; - -Scalar f 'freight in dollars per case per thousand miles' /90/ ; - -Parameter c(i,j) 'transport cost in thousands of dollars per case' ; - - c(i,j) = f * d(i,j) / 1000 ; - -Variables - x(i,j) 'shipment quantities in cases' - z 'total transportation costs in thousands of dollars' ; - -Positive Variable x ; - -Equations - cost 'define objective function' - supply(i) 'observe supply limit at plant i' - demand(j) 'satisfy demand at market j' ; - -cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; - -supply(i) .. sum(j, x(i,j)) =l= a(i) ; - -demand(j) .. sum(i, x(i,j)) =g= b(j) ; - -Model transport /all/ ; -$include args.gms -Solve transport using lp minimizing z ; - -Display x.l, x.m ; - diff --git a/message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms b/message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms deleted file mode 100644 index e6d98860f..000000000 --- a/message_ix/tools/make_prescaler/Tranport Scaling/trnsport.gms +++ /dev/null @@ -1,69 +0,0 @@ -$Title A Transportation Problem (TRNSPORT,SEQ=1) -$Ontext - -This problem finds a least cost shipping schedule that meets -requirements at markets and supplies at factories. - - -Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. -Princeton University Press, Princeton, New Jersey, 1963. - -This formulation is described in detail in: -Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. -The Scientific Press, Redwood City, California, 1988. - -The line numbers will not match those in the book because of these -comments. - -$Offtext - - - Sets - i canning plants / seattle, san-diego / - j markets / new-york, chicago, topeka / ; - - Parameters - - a(i) capacity of plant i in cases - / seattle 350 - san-diego 600 / - - b(j) demand at market j in cases - / new-york 325 - chicago 300 - topeka 275 / ; - - Table d(i,j) distance in thousands of miles - new-york chicago topeka - seattle 2.5 1.7 1.8 - san-diego 2.5 1.8 1.4 ; - - Scalar f freight in dollars per case per thousand miles /90/ ; - - Parameter c(i,j) transport cost in thousands of dollars per case ; - - c(i,j) = f * d(i,j) / 1000 ; - - Variables - x(i,j) shipment quantities in cases - z total transportation costs in thousands of dollars ; - - Positive Variable x ; - - Equations - cost define objective function - supply(i) observe supply limit at plant i - demand(j) satisfy demand at market j ; - - cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; - - supply(i) .. sum(j, x(i,j)) =l= a(i) ; - - demand(j) .. sum(i, x(i,j)) =g= b(j) ; - - Model transport /all/ ; - - Solve transport using lp minimizing z ; - - Display x.l, x.m ; - diff --git a/message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps b/message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps deleted file mode 100644 index f04b3652b..000000000 --- a/message_ix/tools/make_prescaler/Westeros Electrified_emission_bound_unscaled.mps +++ /dev/null @@ -1,283 +0,0 @@ -* ENCODING=ISO-8859-1 -NAME gamsmodel -ROWS - N _obj - E COST_ACCOUNTING_NODAL(World,700) - E COST_ACCOUNTING_NODAL(World,710) - E COST_ACCOUNTING_NODAL(World,720) - E COST_ACCOUNTING_NODAL(Westeros,700) - E COST_ACCOUNTING_NODAL(Westeros,710) - E COST_ACCOUNTING_NODAL(Westeros,720) - G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) - G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) - G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) - G COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) - G COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) - G COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) - G COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) - G COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) - G COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) - L CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) - L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) - L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) - L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) - L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) - L CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) - L CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) - L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) - L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) - L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) - L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) - L CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) - L CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) - L CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) - L CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) - L CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) - L CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) - E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) - E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) - E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) - E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) - E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) - E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) - E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) - E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) - E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) - L CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) - L CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) - L CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) - L CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) - G ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) - G ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) - G ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) - G ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) - G ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) - G ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) - G ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) - G ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) - G ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) - G ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) - G ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) - G ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) - L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) - L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) - L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) - L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) - L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) - L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) - E EMISSION_EQUIVALENCE(World,CO2,all,700) - E EMISSION_EQUIVALENCE(World,CO2,all,710) - E EMISSION_EQUIVALENCE(World,CO2,all,720) - E EMISSION_EQUIVALENCE(Westeros,CO2,all,700) - E EMISSION_EQUIVALENCE(Westeros,CO2,all,710) - E EMISSION_EQUIVALENCE(Westeros,CO2,all,720) - L EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) -COLUMNS - CAP_NEW(Westeros,coal_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -500 - CAP_NEW(Westeros,coal_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) -10 - CAP_NEW(Westeros,coal_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -500 - CAP_NEW(Westeros,coal_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) -10 - CAP_NEW(Westeros,coal_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -304.023646636842 - CAP_NEW(Westeros,coal_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) -10 - CAP_NEW(Westeros,wind_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -1500 - CAP_NEW(Westeros,wind_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) -10 - CAP_NEW(Westeros,wind_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -1500 - CAP_NEW(Westeros,wind_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) -10 - CAP_NEW(Westeros,wind_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -912.070939910527 - CAP_NEW(Westeros,wind_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) -10 - CAP_NEW(Westeros,bulb,700) COST_ACCOUNTING_NODAL(Westeros,700) -5 - CAP_NEW(Westeros,bulb,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) -1 - CAP_NEW(Westeros,bulb,710) COST_ACCOUNTING_NODAL(Westeros,710) -5 - CAP_NEW(Westeros,bulb,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) -1 - CAP_NEW(Westeros,bulb,720) COST_ACCOUNTING_NODAL(Westeros,720) -5 - CAP_NEW(Westeros,bulb,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) -1 - CAP(Westeros,coal_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -30 - CAP(Westeros,coal_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) -1 - CAP(Westeros,coal_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 1 - CAP(Westeros,coal_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -30 - CAP(Westeros,coal_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) -1 - CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) 1 - CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) -1 - CAP(Westeros,coal_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -30 - CAP(Westeros,coal_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) -1 - CAP(Westeros,coal_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) 1 - CAP(Westeros,coal_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -30 - CAP(Westeros,coal_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) -1 - CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) 1 - CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) -1 - CAP(Westeros,coal_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -30 - CAP(Westeros,coal_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) -1 - CAP(Westeros,coal_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) 1 - CAP(Westeros,coal_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -30 - CAP(Westeros,coal_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) -1 - CAP(Westeros,coal_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) 1 - CAP(Westeros,wind_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -10 - CAP(Westeros,wind_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) -0.36 - CAP(Westeros,wind_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 1 - CAP(Westeros,wind_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -10 - CAP(Westeros,wind_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) -0.36 - CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) 1 - CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) -1 - CAP(Westeros,wind_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -10 - CAP(Westeros,wind_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) -0.36 - CAP(Westeros,wind_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) 1 - CAP(Westeros,wind_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -10 - CAP(Westeros,wind_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) -0.36 - CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) 1 - CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) -1 - CAP(Westeros,wind_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -10 - CAP(Westeros,wind_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) -0.36 - CAP(Westeros,wind_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) 1 - CAP(Westeros,wind_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -10 - CAP(Westeros,wind_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) -0.36 - CAP(Westeros,wind_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) 1 - CAP(Westeros,bulb,700,700) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) -1 - CAP(Westeros,bulb,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) 1 - CAP(Westeros,bulb,710,710) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) -1 - CAP(Westeros,bulb,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) 1 - CAP(Westeros,bulb,720,720) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) -1 - CAP(Westeros,bulb,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) 1 - ACT(Westeros,coal_ppl,690,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -30 - ACT(Westeros,coal_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 - ACT(Westeros,coal_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) 1 - ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 - ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 - ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 - ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 - ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 - ACT(Westeros,coal_ppl,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -30 - ACT(Westeros,coal_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 - ACT(Westeros,coal_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) 1 - ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 - ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 - ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 - ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 - ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 - ACT(Westeros,coal_ppl,700,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -30 - ACT(Westeros,coal_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 - ACT(Westeros,coal_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) 1 - ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 - ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 - ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 - ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 - ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 - ACT(Westeros,coal_ppl,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -30 - ACT(Westeros,coal_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 - ACT(Westeros,coal_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) 1 - ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 - ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 - ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 - ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 - ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 - ACT(Westeros,coal_ppl,710,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -30 - ACT(Westeros,coal_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 - ACT(Westeros,coal_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) 1 - ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 - ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 - ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 - ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 - ACT(Westeros,coal_ppl,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -30 - ACT(Westeros,coal_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 - ACT(Westeros,coal_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) 1 - ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 - ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 - ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 - ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 - ACT(Westeros,wind_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 - ACT(Westeros,wind_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) 1 - ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 - ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 - ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 - ACT(Westeros,wind_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 - ACT(Westeros,wind_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) 1 - ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 - ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 - ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 - ACT(Westeros,wind_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 - ACT(Westeros,wind_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) 1 - ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 - ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 - ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 - ACT(Westeros,wind_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 - ACT(Westeros,wind_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) 1 - ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 - ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 - ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 - ACT(Westeros,wind_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 - ACT(Westeros,wind_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) 1 - ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 - ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 - ACT(Westeros,wind_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 - ACT(Westeros,wind_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) 1 - ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 - ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 - ACT(Westeros,grid,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -50 - ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) -1 - ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) 0.9 - ACT(Westeros,grid,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) 1 - ACT(Westeros,grid,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -50 - ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) -1 - ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) 0.9 - ACT(Westeros,grid,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) 1 - ACT(Westeros,grid,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -50 - ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) -1 - ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) 0.9 - ACT(Westeros,grid,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) 1 - ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) -1 - ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 1 - ACT(Westeros,bulb,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) 1 - ACT(Westeros,bulb,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) 1 - ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) -1 - ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 1 - ACT(Westeros,bulb,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) 1 - ACT(Westeros,bulb,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) 1 - ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) -1 - ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 1 - ACT(Westeros,bulb,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) 1 - ACT(Westeros,bulb,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) 1 - COST_NODAL(World,700) _obj 7.72173492918481 - COST_NODAL(World,700) COST_ACCOUNTING_NODAL(World,700) 1 - COST_NODAL(World,710) _obj 4.74047541335517 - COST_NODAL(World,710) COST_ACCOUNTING_NODAL(World,710) 1 - COST_NODAL(World,720) _obj 2.91024068434285 - COST_NODAL(World,720) COST_ACCOUNTING_NODAL(World,720) 1 - COST_NODAL(Westeros,700) _obj 7.72173492918481 - COST_NODAL(Westeros,700) COST_ACCOUNTING_NODAL(Westeros,700) 1 - COST_NODAL(Westeros,710) _obj 4.74047541335517 - COST_NODAL(Westeros,710) COST_ACCOUNTING_NODAL(Westeros,710) 1 - COST_NODAL(Westeros,720) _obj 2.91024068434285 - COST_NODAL(Westeros,720) COST_ACCOUNTING_NODAL(Westeros,720) 1 - EMISS(World,CO2,all,700) EMISSION_EQUIVALENCE(World,CO2,all,700) 1 - EMISS(World,CO2,all,710) EMISSION_EQUIVALENCE(World,CO2,all,710) 1 - EMISS(World,CO2,all,720) EMISSION_EQUIVALENCE(World,CO2,all,720) 1 - EMISS(Westeros,CO2,all,700) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) 1 - EMISS(Westeros,CO2,all,700) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 - EMISS(Westeros,CO2,all,710) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) 1 - EMISS(Westeros,CO2,all,710) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 - EMISS(Westeros,CO2,all,720) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) 1 - EMISS(Westeros,CO2,all,720) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 - constobj _obj 1 -RHS - rhs COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 55 - rhs COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 82 - rhs COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 104 - rhs CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 18.2648401826484 - rhs CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 33.8237781160156 - rhs ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 47.3742915086758 - rhs ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 31.5828610057839 - rhs EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 500 -BOUNDS - FR bnd COST_NODAL(World,700) - FR bnd COST_NODAL(World,710) - FR bnd COST_NODAL(World,720) - FR bnd COST_NODAL(Westeros,700) - FR bnd COST_NODAL(Westeros,710) - FR bnd COST_NODAL(Westeros,720) - FR bnd EMISS(World,CO2,all,700) - FR bnd EMISS(World,CO2,all,710) - FR bnd EMISS(World,CO2,all,720) - FR bnd EMISS(Westeros,CO2,all,700) - FR bnd EMISS(Westeros,CO2,all,710) - FR bnd EMISS(Westeros,CO2,all,720) - FX bnd constobj 0 -ENDATA diff --git a/message_ix/tools/make_prescaler/westeros_scaling.ipynb b/message_ix/tools/make_prescaler/westeros_scaling.ipynb deleted file mode 100644 index 2e47555aa..000000000 --- a/message_ix/tools/make_prescaler/westeros_scaling.ipynb +++ /dev/null @@ -1,292 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Westeros Tutorial - Introducing emissions (part1/2): Adding emission bounds\n", - "\n", - "In the first part, the model chose not to base the power system on wind power as electricity from wind turbines was more expensive than electricity produced from coal. However, we now introduce emissions to investigate the impact of climate policy. Let's see what happens then.\n", - "\n", - "**Pre-requisites**\n", - "- You have the *MESSAGEix* framework installed and working\n", - "- You have run Westeros baseline scenario (``westeros_baseline.ipynb``) and solved it successfully" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import ixmp\n", - "import message_ix\n", - "import os\n", - "\n", - "from message_ix.tools.lp_diag import LPdiag\n", - "from message_ix.tools.make_prescaler import make_prescaler\n", - "from message_ix.tools.make_prescaler import disp_range\n", - "\n", - "from message_ix.util import make_df\n", - "\n", - "%matplotlib inline\n", - "\n", - "lp = LPdiag()\n", - "mp = ixmp.Platform()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Making a clone of the existing scenario 'baseline'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = \"Westeros Electrified\"\n", - "\n", - "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", - "\n", - "\n", - "scen_name = \"emission_bound_unscaled\"\n", - "scen = base.clone(\n", - " model,\n", - " scen_name,\n", - " \"introducing scaling tool for westeros tutorial\",\n", - " keep_solution=False,\n", - ")\n", - "scen.check_out()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Time to Solve the Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.commit(comment=\"Introducing scaling tool\")\n", - "scen.set_as_default()\n", - "\n", - "current_directory = os.getcwd()\n", - "mps_dir = os.path.join(current_directory, f\"{model}_{scen_name}.mps\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.solve(solve_options={\"writemps\": mps_dir,})\n", - "scen.var(\"OBJ\")[\"lvl\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the unscaled scenario above, we make scaler arguments to solve scenario with scaled matrix coefficients" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "scale_args = make_prescaler(mps_dir, scen, bounds=2, steps=1)\n", - "scale_args" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run scenarios with scaled matrix" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "This Scenario has a solution, use `Scenario.remove_solution()` or `Scenario.clone(..., keep_solution=False)`\n" - ] - } - ], - "source": [ - "model = \"Westeros Electrified\"\n", - "\n", - "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", - "\n", - "\n", - "sc_name = \"emission_bound_scaled\"\n", - "sc = base.clone(\n", - " model,\n", - " sc_name,\n", - " \"introducing scaling tool for westeros tutorial\",\n", - " keep_solution=False,\n", - ")\n", - "sc.check_out()\n", - "\n", - "sc.commit(comment=\"Introducing scaling tool\")\n", - "sc.set_as_default()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "current_directory = os.getcwd()\n", - "mps_dir = os.path.join(current_directory, f\"{model}_{sc_name}.mps\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "model = model\n", - "scenario_name = \"emission_bound_unscaled\"\n", - "\n", - "sc.solve(solve_options={\"writemps\": mps_dir},\n", - " #gams_args=[f\"--scaler='MsgPrescaler_Westeros Electrified_emission_bound_unscaled'\"]\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "206280.0625" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sc.var(\"OBJ\")[\"lvl\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Reading MPS-format file C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_prescaler\\Westeros Electrified_emission_bound_scaled.mps.\n", - "Next section found: NAME gamsmodel (line 1).\n", - "\tProblem name: gamsmodel.\n", - "Next section found: ROWS (line 2).\n", - "\tRow _obj (row_seq = 0) is the objective (goal function) row.\n", - "Next section found: COLUMNS (line 74).\n", - "Next section found: RHS (line 259).\n", - "\tId of RHS: rhs\n", - "Next section found: BOUNDS (line 268).\n", - "\tId of BOUNDS: bnd\n", - "Next section found: ENDATA (line 282).\n", - "\n", - "Finished processing 282 lines of the MPS file: C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_prescaler\\Westeros Electrified_emission_bound_scaled.mps.\n", - "LP has: 71 rows, 55 cols, 184 non-zeros, matrix density = 4.71e-02.\n", - "Numbers of redefined: RHS = 8, ranges = 0, bounds = 13.\n", - "\n", - "The GF (objective) row named \"_obj\" has 7 elements.\n", - "Distribution of the GF (objective) values:\n", - "count 7.000000\n", - "mean 4.534986\n", - "std 2.522265\n", - "min 1.000000\n", - "25% 2.910241\n", - "50% 4.740475\n", - "75% 6.231105\n", - "max 7.721735\n", - "Name: val, dtype: float64\n", - "\n", - "New exp range:: [ -1 | 1 ]\n" - ] - } - ], - "source": [ - "lp.read_mps(mps_dir)\n", - "data = lp.read_matrix()\n", - "disp_range(data,\"\\nNew exp range:\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Close the connection to the database" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "mp.close_db()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/message_ix/tools/make_scaler/DACCS Scenario.ipynb b/message_ix/tools/make_scaler/DACCS Scenario.ipynb new file mode 100644 index 000000000..aec7d6efd --- /dev/null +++ b/message_ix/tools/make_scaler/DACCS Scenario.ipynb @@ -0,0 +1,506 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using scaling tool in global model with DACCS scenario" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "import os\n", + "\n", + "from message_ix.tools.lp_diag import LPdiag\n", + "from message_ix.tools.make_scaler import make_scaler\n", + "from message_ix.tools.make_scaler import show_range\n", + "from message_ix.tools.make_scaler import get_scaler_args\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "lp = LPdiag()\n", + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This Scenario has a solution, use `Scenario.remove_solution()` or `Scenario.clone(..., keep_solution=False)`\n" + ] + } + ], + "source": [ + "model = \"GENIE_sandbox\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"cb1000_splitCO2transdisp\")\n", + "\n", + "\n", + "scen_name = \"cb1000_splitCO2transdisp_unscaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"unscaled daccs scenario with split infrastructure\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model\n", + "\n", + "Solution time: 48.14s" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"unscaled daccs scenario with split infrastructure\")\n", + "scen.set_as_default()\n", + "\n", + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{scen_name}.mps\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scen.solve(solve_options={'barcrossalg': '2','scaind':'0'\n", + " # ,\"writemps\": mps_dir,\n", + " })\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the unscaled scenario above, we make scaler arguments to solve scenario with scaled matrix coefficients" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "scen = message_ix.Scenario(mp, model=\"GENIE_sandbox\", scenario=\"cb1000_splitCO2transdisp_unscaled\")\n" + ] + }, + { + "cell_type": "raw", + "metadata": { + "scrolled": false + }, + "source": [ + "model = \"GENIE_sandbox\"\n", + "scen_name = \"cb1000_splitCO2transdisp_unscaled\"\n", + "\n", + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{scen_name}.mps\")\n", + "scale_df = make_scaler(mps_dir, scen, bounds=4, steps=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run scenarios with scaled matrix\n", + "\n", + "Results: solution time 57.8s" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "model = \"GENIE_sandbox\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"cb1000_splitCO2transdisp_unscaled\")\n", + "\n", + "\n", + "sc_name = \"cb1000_splitCO2transdisp_scaled\"\n", + "sc = base.clone(\n", + " model,\n", + " sc_name,\n", + " \"introducing scaling tool for global model daccs scenario\",\n", + " keep_solution=False,\n", + ")\n", + "sc.check_out()\n", + "\n", + "sc.commit(comment=\"Scaling tool test for global model\")\n", + "sc.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{sc_name}.mps\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "argument = get_scaler_args(scen)\n", + "\n", + "sc.solve(solve_options={\"writemps\": mps_dir},\n", + " gams_args=[argument]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sc.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "lp.read_mps(mps_dir)\n", + "data = lp.read_matrix()\n", + "show_range(data,\"\\nNew exp range:\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Let's compare with running scenario without special arguments**\n", + "\n", + "Results: solution time 50s\n", + "\n", + "\n", + "\n", + "Primal simplex solved model.\n", + "\n", + "Iteration: 4009 Objective = 2609317.507987\n", + "Elapsed time = 40.50 sec. (46961.19 ticks, 4009 iterations)\n", + "Iteration: 4096 Objective = 2609317.507987\n", + "Iteration: 5667 Objective = 2609317.519581\n", + "Total crossover time = 29.84 sec. (24634.88 ticks)\n", + "\n", + "Total time on 4 threads = 50.02 sec. (52935.76 ticks)\n", + "\n", + "--- LP status (5): optimal with unscaled infeasibilities.\n", + "--- Cplex Time: 50.03sec (det. 52937.85 ticks)\n", + "\n", + "Optimal solution found, but with infeasibilities after unscaling\n", + "Simplex iterations after crossover: 0\n", + "Objective: 2609317.507987\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Scaled with default GAMS options:**\n", + "\n", + "Solution time: 119.23s" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "import os\n", + "\n", + "from message_ix.tools.lp_diag import LPdiag\n", + "from message_ix.tools.make_scaler import make_scaler\n", + "from message_ix.tools.make_scaler import show_range\n", + "from message_ix.tools.make_scaler import get_scaler_args\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "lp = LPdiag()\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"GENIE_sandbox\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"cb1000_splitCO2transdisp_unscaled\")\n", + "\n", + "\n", + "scen_name = \"cb1000_splitCO2transdisp_scaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"unscaled daccs scenario with split infrastructure\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()\n", + "\n", + "\n", + "argument = get_scaler_args(base)\n", + "\n", + "\n", + "scen.solve(solve_options={\"advind\": \"determined by GAMS Bratio\",\n", + " \"epopt\": \"1.0e-06\",\n", + " \"lpmethod\": \"0\",\n", + " },\n", + " gams_args=[argument])\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Unscaled with default GAMS settings**\n", + "\n", + "Solution time: 93.52sec" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This Scenario has a solution, use `Scenario.remove_solution()` or `Scenario.clone(..., keep_solution=False)`\n" + ] + }, + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = \"GENIE_sandbox\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"cb1000_splitCO2transdisp\")\n", + "\n", + "\n", + "scen_name = \"cb1000_splitCO2transdisp_unscaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"unscaled daccs scenario with split infrastructure\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()\n", + "\n", + "scen.solve(solve_options={\"advind\": \"determined by GAMS Bratio\",\n", + " \"epopt\": \"1.0e-06\",\n", + " \"lpmethod\": \"0\",\n", + " })\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Scaled with dual simplex:**\n", + "\n", + "Solution time: s" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "import os\n", + "\n", + "from message_ix.tools.lp_diag import LPdiag\n", + "from message_ix.tools.make_scaler import make_scaler\n", + "from message_ix.tools.make_scaler import show_range\n", + "from message_ix.tools.make_scaler import get_scaler_args\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "lp = LPdiag()\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"GENIE_sandbox\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"cb1000_splitCO2transdisp_unscaled\")\n", + "\n", + "\n", + "scen_name = \"cb1000_splitCO2transdisp_scaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"unscaled daccs scenario with split infrastructure\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()\n", + "\n", + "\n", + "argument = get_scaler_args(base)\n", + "\n", + "\n", + "scen.solve(solve_options={\"advind\": \"determined by GAMS Bratio\",\n", + " \"epopt\": \"1.0e-06\",\n", + " \"lpmethod\": \"2\",\n", + " },\n", + " gams_args=[argument])\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/message_ix/tools/make_prescaler/__init__.py b/message_ix/tools/make_scaler/__init__.py similarity index 75% rename from message_ix/tools/make_prescaler/__init__.py rename to message_ix/tools/make_scaler/__init__.py index 2fface362..7e0967ee0 100644 --- a/message_ix/tools/make_prescaler/__init__.py +++ b/message_ix/tools/make_scaler/__init__.py @@ -79,7 +79,7 @@ def get_lvl_ix(data, lvl): return data.index.get_level_values(lvl) -def disp_range(data, pretext): +def show_range(data, pretext): """ To displace coefficient exponents range. @@ -97,7 +97,31 @@ def disp_range(data, pretext): ) -def make_prescaler(path, scen, bounds=4, steps=1, show_range=True): +def get_scaler_args(scenario_ref=None, model="", scenario=""): + """ + Function to make gams argument for scaling + + """ + if not scenario_ref: + strings = ["MsgScaler", model, scenario] + else: + strings = ["MsgScaler", scenario_ref.model, scenario_ref.scenario] + + file_name = "_".join(s.replace(" ", "_") for s in strings) + + current_directory = os.getcwd() + two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) + + prescale_args_dir = os.path.join(two_levels_up, f"model/scaler/{file_name}.gms") + + if os.path.exists(prescale_args_dir): + return f"--scaler={file_name}" + else: + print("The referred scenario doesn't have prescaler file!") + print("Please use make_prescaler() function to create one") + + +def make_scaler(path, scen, bounds=4, steps=1, display_range=True): """ Process to generate prescale_args in GAMS to improve matrix coefficients. @@ -134,8 +158,8 @@ def make_prescaler(path, scen, bounds=4, steps=1, show_range=True): matrix = data - if show_range is True: - disp_range(matrix, "\nUnscaled range ") + if display_range is True: + show_range(matrix, "\nUnscaled range ") scalers = {"row": [], "col": []} @@ -182,18 +206,18 @@ def make_prescaler(path, scen, bounds=4, steps=1, show_range=True): # Create new matrix with scaled rows matrix = matrix.div(step_scaler) if s == "row" else matrix.mul(step_scaler) - if show_range is True: - disp_range(matrix, f"Scaled range step {counter + 1}") + if display_range is True: + show_range(matrix, f"Scaled range step {counter + 1}") # Increment the counter counter += 1 # generating prescaler arguments for GAMS - prescale_args = {} + scaler_dict = {} for key, df_scaler in scalers.items(): df_scaler = df_scaler.loc[df_scaler["val"] != 1] - scaler_dict = df_scaler["val"].to_dict() - for k, v in scaler_dict.items(): + df_scaler_dict = df_scaler["val"].to_dict() + for k, v in df_scaler_dict.items(): if k == "_obj": k_ = "_obj.scale" elif k == "constobj": @@ -202,33 +226,31 @@ def make_prescaler(path, scen, bounds=4, steps=1, show_range=True): k_ = k.replace("(", ".scale('") k_ = k_.replace(")", "')") k_ = k_.replace(",", "','") - prescale_args.update({k_: v}) + scaler_dict.update({k_: v}) - prescale_args["MESSAGE_LP.scaleopt"] = 1 + # add this line to active scaling option + scaler_dict["MESSAGE_LP.scaleopt"] = 1 - # prescale_args = {} # activate this for temporary test + scaler_df = pd.DataFrame(scaler_dict, index=["val"]).transpose() + scaler_df.index = scaler_df.index.rename("key", inplace=False) - # prescale_args["MESSAGE_LP.OptFile"] = 1 + scaler_list = [] + for k, v in scaler_dict.items(): + scaler_list.append(f"{k}={v};") + scaler_args_txt = "\n".join(scaler_list) current_directory = os.getcwd() two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) - # args_name = os.path.join(two_levels_up, "prescale_args.csv") - prescale_args_df = pd.DataFrame(prescale_args, index=["val"]).transpose() - prescale_args_df.index = prescale_args_df.index.rename("key", inplace=False) - # args_df_temp.to_csv(args_name) - # print(args_name) - - prescale_args_list = [] - for k, v in prescale_args.items(): - prescale_args_list.append(f"{k}={v};") - prescale_args_txt = "\n".join(prescale_args_list) - - prescale_args_dir = os.path.join( - two_levels_up, f"model/prescaler/MsgPrescaler_{scen.model}_{scen.scenario}.gms" + + scaler_gms_name = [scen.model, scen.scenario] + scaler_gms_name = "_".join(s.replace(" ", "_") for s in scaler_gms_name) + + scaler_gms_dir = os.path.join( + two_levels_up, f"model/scaler/MsgScaler_{scaler_gms_name}.gms" ) - with open(prescale_args_dir, "w") as txtfile: + with open(scaler_gms_dir, "w") as txtfile: # Write some text to the file - txtfile.write(prescale_args_txt) + txtfile.write(scaler_args_txt) - return prescale_args_df + return scaler_df From f4ae465225d7d501bb6c08dfb1aca2c4fabaa048 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Mon, 15 Apr 2024 09:23:02 +0200 Subject: [PATCH 22/25] Finished testing Next step is further documentation on the tool --- message_ix/model/MESSAGE/args.gms | 1 + message_ix/model/cplex.op2 | 2 +- .../tools/make_scaler/DACCS Scenario.ipynb | 88 ++++- ...eros Electrified_emission_bound_scaled.mps | 283 ++++++++++++++ ...os Electrified_emission_bound_unscaled.mps | 283 ++++++++++++++ .../tools/make_scaler/westeros_scaling.ipynb | 351 ++++++++++++++++++ 6 files changed, 1003 insertions(+), 5 deletions(-) create mode 100644 message_ix/model/MESSAGE/args.gms create mode 100644 message_ix/tools/make_scaler/Westeros Electrified_emission_bound_scaled.mps create mode 100644 message_ix/tools/make_scaler/Westeros Electrified_emission_bound_unscaled.mps create mode 100644 message_ix/tools/make_scaler/westeros_scaling.ipynb diff --git a/message_ix/model/MESSAGE/args.gms b/message_ix/model/MESSAGE/args.gms new file mode 100644 index 000000000..95e7f3653 --- /dev/null +++ b/message_ix/model/MESSAGE/args.gms @@ -0,0 +1 @@ +MESSAGE_LP.scaleopt = 1 ; diff --git a/message_ix/model/cplex.op2 b/message_ix/model/cplex.op2 index 70756bbe7..9f12e0392 100644 --- a/message_ix/model/cplex.op2 +++ b/message_ix/model/cplex.op2 @@ -1,5 +1,5 @@ advind = determined by GAMS Bratio -lpmethod = 2 +lpmethod = 1 threads = 4 epopt = 1.0e-06 barcrossalg = 2 \ No newline at end of file diff --git a/message_ix/tools/make_scaler/DACCS Scenario.ipynb b/message_ix/tools/make_scaler/DACCS Scenario.ipynb index aec7d6efd..e4418894c 100644 --- a/message_ix/tools/make_scaler/DACCS Scenario.ipynb +++ b/message_ix/tools/make_scaler/DACCS Scenario.ipynb @@ -406,14 +406,25 @@ "source": [ "**Scaled with dual simplex:**\n", "\n", - "Solution time: s" + "Solution time: 5152.6 s" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import pandas as pd\n", "import ixmp\n", @@ -458,6 +469,75 @@ "scen.var(\"OBJ\")[\"lvl\"]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Scaled with primal simplex:**\n", + "\n", + "Solution time: 54665.56 s" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2609317.5" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "import os\n", + "\n", + "from message_ix.tools.lp_diag import LPdiag\n", + "from message_ix.tools.make_scaler import make_scaler\n", + "from message_ix.tools.make_scaler import show_range\n", + "from message_ix.tools.make_scaler import get_scaler_args\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "lp = LPdiag()\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"GENIE_sandbox\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"cb1000_splitCO2transdisp_unscaled\")\n", + "\n", + "\n", + "scen_name = \"cb1000_splitCO2transdisp_scaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"unscaled daccs scenario with split infrastructure\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()\n", + "\n", + "\n", + "argument = get_scaler_args(base)\n", + "\n", + "\n", + "scen.solve(solve_options={\"advind\": \"determined by GAMS Bratio\",\n", + " \"epopt\": \"1.0e-06\",\n", + " \"lpmethod\": \"1\",\n", + " },\n", + " gams_args=[argument])\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -467,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ diff --git a/message_ix/tools/make_scaler/Westeros Electrified_emission_bound_scaled.mps b/message_ix/tools/make_scaler/Westeros Electrified_emission_bound_scaled.mps new file mode 100644 index 000000000..36c2b6080 --- /dev/null +++ b/message_ix/tools/make_scaler/Westeros Electrified_emission_bound_scaled.mps @@ -0,0 +1,283 @@ +* ENCODING=ISO-8859-1 +NAME gamsmodel +ROWS + N _obj + E COST_ACCOUNTING_NODAL(World,700) + E COST_ACCOUNTING_NODAL(World,710) + E COST_ACCOUNTING_NODAL(World,720) + E COST_ACCOUNTING_NODAL(Westeros,700) + E COST_ACCOUNTING_NODAL(Westeros,710) + E COST_ACCOUNTING_NODAL(Westeros,720) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) + L CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) + L CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) + L CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) + L CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) + L CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) + L CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) + E EMISSION_EQUIVALENCE(World,CO2,all,700) + E EMISSION_EQUIVALENCE(World,CO2,all,710) + E EMISSION_EQUIVALENCE(World,CO2,all,720) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,700) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,710) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,720) + L EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) +COLUMNS + CAP_NEW(Westeros,coal_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -50 + CAP_NEW(Westeros,coal_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) -10 + CAP_NEW(Westeros,coal_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -50 + CAP_NEW(Westeros,coal_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) -10 + CAP_NEW(Westeros,coal_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -30.4023646636842 + CAP_NEW(Westeros,coal_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) -10 + CAP_NEW(Westeros,wind_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -15 + CAP_NEW(Westeros,wind_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) -1 + CAP_NEW(Westeros,wind_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -15 + CAP_NEW(Westeros,wind_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) -1 + CAP_NEW(Westeros,wind_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -91.2070939910527 + CAP_NEW(Westeros,wind_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) -10 + CAP_NEW(Westeros,bulb,700) COST_ACCOUNTING_NODAL(Westeros,700) -0.5 + CAP_NEW(Westeros,bulb,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) -1 + CAP_NEW(Westeros,bulb,710) COST_ACCOUNTING_NODAL(Westeros,710) -0.5 + CAP_NEW(Westeros,bulb,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) -1 + CAP_NEW(Westeros,bulb,720) COST_ACCOUNTING_NODAL(Westeros,720) -0.5 + CAP_NEW(Westeros,bulb,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) -1 + CAP(Westeros,coal_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -3 + CAP(Westeros,coal_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) -1 + CAP(Westeros,coal_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 1 + CAP(Westeros,coal_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -3 + CAP(Westeros,coal_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) -1 + CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) 1 + CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) -1 + CAP(Westeros,coal_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -3 + CAP(Westeros,coal_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) -1 + CAP(Westeros,coal_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) 1 + CAP(Westeros,coal_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -3 + CAP(Westeros,coal_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) -1 + CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) 1 + CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) -1 + CAP(Westeros,coal_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -3 + CAP(Westeros,coal_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) -1 + CAP(Westeros,coal_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) 1 + CAP(Westeros,coal_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -3 + CAP(Westeros,coal_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) -1 + CAP(Westeros,coal_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) 1 + CAP(Westeros,wind_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -1 + CAP(Westeros,wind_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) -0.36 + CAP(Westeros,wind_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 1 + CAP(Westeros,wind_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -1 + CAP(Westeros,wind_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) -0.36 + CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) 1 + CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) -1 + CAP(Westeros,wind_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -1 + CAP(Westeros,wind_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) -0.36 + CAP(Westeros,wind_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) 1 + CAP(Westeros,wind_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -1 + CAP(Westeros,wind_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) -0.36 + CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) 1 + CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) -1 + CAP(Westeros,wind_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -1 + CAP(Westeros,wind_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) -0.36 + CAP(Westeros,wind_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) 1 + CAP(Westeros,wind_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -1 + CAP(Westeros,wind_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) -0.36 + CAP(Westeros,wind_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) 1 + CAP(Westeros,bulb,700,700) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) -1 + CAP(Westeros,bulb,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) 1 + CAP(Westeros,bulb,710,710) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) -1 + CAP(Westeros,bulb,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) 1 + CAP(Westeros,bulb,720,720) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) -1 + CAP(Westeros,bulb,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -3 + ACT(Westeros,coal_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 + ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -3 + ACT(Westeros,coal_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 + ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -3 + ACT(Westeros,coal_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 + ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -3 + ACT(Westeros,coal_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 + ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -3 + ACT(Westeros,coal_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -3 + ACT(Westeros,coal_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 + ACT(Westeros,wind_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 + ACT(Westeros,wind_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 + ACT(Westeros,wind_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 + ACT(Westeros,wind_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 + ACT(Westeros,wind_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 + ACT(Westeros,grid,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -5 + ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) -1 + ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) 0.9 + ACT(Westeros,grid,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) 1 + ACT(Westeros,grid,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -5 + ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) -1 + ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) 0.9 + ACT(Westeros,grid,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) 1 + ACT(Westeros,grid,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -5 + ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) -1 + ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) 0.9 + ACT(Westeros,grid,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) 1 + ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) -1 + ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 1 + ACT(Westeros,bulb,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) 1 + ACT(Westeros,bulb,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) 1 + ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) -1 + ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 1 + ACT(Westeros,bulb,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) 1 + ACT(Westeros,bulb,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) 1 + ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) -1 + ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 1 + ACT(Westeros,bulb,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) 1 + ACT(Westeros,bulb,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) 1 + COST_NODAL(World,700) _obj 7.72173492918481 + COST_NODAL(World,700) COST_ACCOUNTING_NODAL(World,700) 1 + COST_NODAL(World,710) _obj 4.74047541335517 + COST_NODAL(World,710) COST_ACCOUNTING_NODAL(World,710) 1 + COST_NODAL(World,720) _obj 2.91024068434285 + COST_NODAL(World,720) COST_ACCOUNTING_NODAL(World,720) 1 + COST_NODAL(Westeros,700) _obj 7.72173492918481 + COST_NODAL(Westeros,700) COST_ACCOUNTING_NODAL(Westeros,700) 0.1 + COST_NODAL(Westeros,710) _obj 4.74047541335517 + COST_NODAL(Westeros,710) COST_ACCOUNTING_NODAL(Westeros,710) 0.1 + COST_NODAL(Westeros,720) _obj 2.91024068434285 + COST_NODAL(Westeros,720) COST_ACCOUNTING_NODAL(Westeros,720) 0.1 + EMISS(World,CO2,all,700) EMISSION_EQUIVALENCE(World,CO2,all,700) 1 + EMISS(World,CO2,all,710) EMISSION_EQUIVALENCE(World,CO2,all,710) 1 + EMISS(World,CO2,all,720) EMISSION_EQUIVALENCE(World,CO2,all,720) 1 + EMISS(Westeros,CO2,all,700) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) 1 + EMISS(Westeros,CO2,all,700) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + EMISS(Westeros,CO2,all,710) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) 1 + EMISS(Westeros,CO2,all,710) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + EMISS(Westeros,CO2,all,720) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) 1 + EMISS(Westeros,CO2,all,720) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + constobj _obj 1 +RHS + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 55 + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 82 + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 104 + rhs CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 18.2648401826484 + rhs CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 33.8237781160156 + rhs ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 47.3742915086758 + rhs ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 31.5828610057839 + rhs EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 500 +BOUNDS + FR bnd COST_NODAL(World,700) + FR bnd COST_NODAL(World,710) + FR bnd COST_NODAL(World,720) + FR bnd COST_NODAL(Westeros,700) + FR bnd COST_NODAL(Westeros,710) + FR bnd COST_NODAL(Westeros,720) + FR bnd EMISS(World,CO2,all,700) + FR bnd EMISS(World,CO2,all,710) + FR bnd EMISS(World,CO2,all,720) + FR bnd EMISS(Westeros,CO2,all,700) + FR bnd EMISS(Westeros,CO2,all,710) + FR bnd EMISS(Westeros,CO2,all,720) + FX bnd constobj 0 +ENDATA diff --git a/message_ix/tools/make_scaler/Westeros Electrified_emission_bound_unscaled.mps b/message_ix/tools/make_scaler/Westeros Electrified_emission_bound_unscaled.mps new file mode 100644 index 000000000..f04b3652b --- /dev/null +++ b/message_ix/tools/make_scaler/Westeros Electrified_emission_bound_unscaled.mps @@ -0,0 +1,283 @@ +* ENCODING=ISO-8859-1 +NAME gamsmodel +ROWS + N _obj + E COST_ACCOUNTING_NODAL(World,700) + E COST_ACCOUNTING_NODAL(World,710) + E COST_ACCOUNTING_NODAL(World,720) + E COST_ACCOUNTING_NODAL(Westeros,700) + E COST_ACCOUNTING_NODAL(Westeros,710) + E COST_ACCOUNTING_NODAL(Westeros,720) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) + G COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) + G COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) + L CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) + L CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) + L CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) + L CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) + L CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) + E CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) + L CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) + L CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) + L CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) + L CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) + G ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) + L ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) + E EMISSION_EQUIVALENCE(World,CO2,all,700) + E EMISSION_EQUIVALENCE(World,CO2,all,710) + E EMISSION_EQUIVALENCE(World,CO2,all,720) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,700) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,710) + E EMISSION_EQUIVALENCE(Westeros,CO2,all,720) + L EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) +COLUMNS + CAP_NEW(Westeros,coal_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -500 + CAP_NEW(Westeros,coal_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) -10 + CAP_NEW(Westeros,coal_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -500 + CAP_NEW(Westeros,coal_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) -10 + CAP_NEW(Westeros,coal_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -304.023646636842 + CAP_NEW(Westeros,coal_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) -10 + CAP_NEW(Westeros,wind_ppl,700) COST_ACCOUNTING_NODAL(Westeros,700) -1500 + CAP_NEW(Westeros,wind_ppl,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) -10 + CAP_NEW(Westeros,wind_ppl,710) COST_ACCOUNTING_NODAL(Westeros,710) -1500 + CAP_NEW(Westeros,wind_ppl,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) -10 + CAP_NEW(Westeros,wind_ppl,720) COST_ACCOUNTING_NODAL(Westeros,720) -912.070939910527 + CAP_NEW(Westeros,wind_ppl,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) -10 + CAP_NEW(Westeros,bulb,700) COST_ACCOUNTING_NODAL(Westeros,700) -5 + CAP_NEW(Westeros,bulb,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) -1 + CAP_NEW(Westeros,bulb,710) COST_ACCOUNTING_NODAL(Westeros,710) -5 + CAP_NEW(Westeros,bulb,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) -1 + CAP_NEW(Westeros,bulb,720) COST_ACCOUNTING_NODAL(Westeros,720) -5 + CAP_NEW(Westeros,bulb,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) -1 + CAP(Westeros,coal_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -30 + CAP(Westeros,coal_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) -1 + CAP(Westeros,coal_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 1 + CAP(Westeros,coal_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -30 + CAP(Westeros,coal_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) -1 + CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,700,700) 1 + CAP(Westeros,coal_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) -1 + CAP(Westeros,coal_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -30 + CAP(Westeros,coal_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) -1 + CAP(Westeros,coal_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,700,710) 1 + CAP(Westeros,coal_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -30 + CAP(Westeros,coal_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) -1 + CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,710,710) 1 + CAP(Westeros,coal_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) -1 + CAP(Westeros,coal_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -30 + CAP(Westeros,coal_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) -1 + CAP(Westeros,coal_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,coal_ppl,710,720) 1 + CAP(Westeros,coal_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -30 + CAP(Westeros,coal_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) -1 + CAP(Westeros,coal_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,coal_ppl,720,720) 1 + CAP(Westeros,wind_ppl,690,700) COST_ACCOUNTING_NODAL(Westeros,700) -10 + CAP(Westeros,wind_ppl,690,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) -0.36 + CAP(Westeros,wind_ppl,690,700) CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 1 + CAP(Westeros,wind_ppl,700,700) COST_ACCOUNTING_NODAL(Westeros,700) -10 + CAP(Westeros,wind_ppl,700,700) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) -0.36 + CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,700,700) 1 + CAP(Westeros,wind_ppl,700,700) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) -1 + CAP(Westeros,wind_ppl,700,710) COST_ACCOUNTING_NODAL(Westeros,710) -10 + CAP(Westeros,wind_ppl,700,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) -0.36 + CAP(Westeros,wind_ppl,700,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,700,710) 1 + CAP(Westeros,wind_ppl,710,710) COST_ACCOUNTING_NODAL(Westeros,710) -10 + CAP(Westeros,wind_ppl,710,710) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) -0.36 + CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,710,710) 1 + CAP(Westeros,wind_ppl,710,710) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) -1 + CAP(Westeros,wind_ppl,710,720) COST_ACCOUNTING_NODAL(Westeros,720) -10 + CAP(Westeros,wind_ppl,710,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) -0.36 + CAP(Westeros,wind_ppl,710,720) CAPACITY_MAINTENANCE(Westeros,wind_ppl,710,720) 1 + CAP(Westeros,wind_ppl,720,720) COST_ACCOUNTING_NODAL(Westeros,720) -10 + CAP(Westeros,wind_ppl,720,720) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) -0.36 + CAP(Westeros,wind_ppl,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,wind_ppl,720,720) 1 + CAP(Westeros,bulb,700,700) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) -1 + CAP(Westeros,bulb,700,700) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,700,700) 1 + CAP(Westeros,bulb,710,710) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) -1 + CAP(Westeros,bulb,710,710) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,710,710) 1 + CAP(Westeros,bulb,720,720) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) -1 + CAP(Westeros,bulb,720,720) CAPACITY_MAINTENANCE_NEW(Westeros,bulb,720,720) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -30 + ACT(Westeros,coal_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,690,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 + ACT(Westeros,coal_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 + ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,690,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -30 + ACT(Westeros,coal_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,700,standard,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 1 + ACT(Westeros,coal_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) -2.5937424601 + ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,700,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) -7.4 + ACT(Westeros,coal_ppl,700,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -30 + ACT(Westeros,coal_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,700,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 + ACT(Westeros,coal_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 + ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,700,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -30 + ACT(Westeros,coal_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,710,standard,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,710,year) 1 + ACT(Westeros,coal_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) -2.5937424601 + ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,710,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) -7.4 + ACT(Westeros,coal_ppl,710,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -30 + ACT(Westeros,coal_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,710,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 + ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,710,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -30 + ACT(Westeros,coal_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,coal_ppl,720,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,coal_ppl,720,standard,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,720,year) 1 + ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(World,CO2,all,720) -7.4 + ACT(Westeros,coal_ppl,720,720,standard,year) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) -7.4 + ACT(Westeros,wind_ppl,690,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,690,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 + ACT(Westeros,wind_ppl,690,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 + ACT(Westeros,wind_ppl,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,700,standard,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 1 + ACT(Westeros,wind_ppl,700,700,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) -2.5937424601 + ACT(Westeros,wind_ppl,700,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,700,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 + ACT(Westeros,wind_ppl,700,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 + ACT(Westeros,wind_ppl,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,710,standard,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,710,year) 1 + ACT(Westeros,wind_ppl,710,710,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) -2.5937424601 + ACT(Westeros,wind_ppl,710,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,710,720,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 + ACT(Westeros,wind_ppl,710,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,wind_ppl,720,720,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,wind_ppl,720,standard,year) 1 + ACT(Westeros,wind_ppl,720,720,standard,year) ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,720,year) 1 + ACT(Westeros,grid,700,700,standard,year) COST_ACCOUNTING_NODAL(Westeros,700) -50 + ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,700,year) -1 + ACT(Westeros,grid,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) 0.9 + ACT(Westeros,grid,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,700,standard,year) 1 + ACT(Westeros,grid,710,710,standard,year) COST_ACCOUNTING_NODAL(Westeros,710) -50 + ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,710,year) -1 + ACT(Westeros,grid,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) 0.9 + ACT(Westeros,grid,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,710,standard,year) 1 + ACT(Westeros,grid,720,720,standard,year) COST_ACCOUNTING_NODAL(Westeros,720) -50 + ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,secondary,720,year) -1 + ACT(Westeros,grid,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) 0.9 + ACT(Westeros,grid,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,grid,720,standard,year) 1 + ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,700,year) -1 + ACT(Westeros,bulb,700,700,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 1 + ACT(Westeros,bulb,700,700,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,700,700,year) 1 + ACT(Westeros,bulb,700,700,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,700,standard,year) 1 + ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,710,year) -1 + ACT(Westeros,bulb,710,710,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 1 + ACT(Westeros,bulb,710,710,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,710,710,year) 1 + ACT(Westeros,bulb,710,710,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,710,standard,year) 1 + ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,electricity,final,720,year) -1 + ACT(Westeros,bulb,720,720,standard,year) COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 1 + ACT(Westeros,bulb,720,720,standard,year) CAPACITY_CONSTRAINT(Westeros,bulb,720,720,year) 1 + ACT(Westeros,bulb,720,720,standard,year) ACTIVITY_BOUND_LO(Westeros,bulb,720,standard,year) 1 + COST_NODAL(World,700) _obj 7.72173492918481 + COST_NODAL(World,700) COST_ACCOUNTING_NODAL(World,700) 1 + COST_NODAL(World,710) _obj 4.74047541335517 + COST_NODAL(World,710) COST_ACCOUNTING_NODAL(World,710) 1 + COST_NODAL(World,720) _obj 2.91024068434285 + COST_NODAL(World,720) COST_ACCOUNTING_NODAL(World,720) 1 + COST_NODAL(Westeros,700) _obj 7.72173492918481 + COST_NODAL(Westeros,700) COST_ACCOUNTING_NODAL(Westeros,700) 1 + COST_NODAL(Westeros,710) _obj 4.74047541335517 + COST_NODAL(Westeros,710) COST_ACCOUNTING_NODAL(Westeros,710) 1 + COST_NODAL(Westeros,720) _obj 2.91024068434285 + COST_NODAL(Westeros,720) COST_ACCOUNTING_NODAL(Westeros,720) 1 + EMISS(World,CO2,all,700) EMISSION_EQUIVALENCE(World,CO2,all,700) 1 + EMISS(World,CO2,all,710) EMISSION_EQUIVALENCE(World,CO2,all,710) 1 + EMISS(World,CO2,all,720) EMISSION_EQUIVALENCE(World,CO2,all,720) 1 + EMISS(Westeros,CO2,all,700) EMISSION_EQUIVALENCE(Westeros,CO2,all,700) 1 + EMISS(Westeros,CO2,all,700) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + EMISS(Westeros,CO2,all,710) EMISSION_EQUIVALENCE(Westeros,CO2,all,710) 1 + EMISS(Westeros,CO2,all,710) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + EMISS(Westeros,CO2,all,720) EMISSION_EQUIVALENCE(Westeros,CO2,all,720) 1 + EMISS(Westeros,CO2,all,720) EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 0.333333333333333 + constobj _obj 1 +RHS + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,700,year) 55 + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,710,year) 82 + rhs COMMODITY_BALANCE_GT(Westeros,light,useful,720,year) 104 + rhs CAPACITY_MAINTENANCE_HIST(Westeros,coal_ppl,690,700) 18.2648401826484 + rhs CAPACITY_MAINTENANCE_HIST(Westeros,wind_ppl,690,700) 33.8237781160156 + rhs ACTIVITY_CONSTRAINT_UP(Westeros,coal_ppl,700,year) 47.3742915086758 + rhs ACTIVITY_CONSTRAINT_UP(Westeros,wind_ppl,700,year) 31.5828610057839 + rhs EMISSION_CONSTRAINT(Westeros,GHG,all,cumulative) 500 +BOUNDS + FR bnd COST_NODAL(World,700) + FR bnd COST_NODAL(World,710) + FR bnd COST_NODAL(World,720) + FR bnd COST_NODAL(Westeros,700) + FR bnd COST_NODAL(Westeros,710) + FR bnd COST_NODAL(Westeros,720) + FR bnd EMISS(World,CO2,all,700) + FR bnd EMISS(World,CO2,all,710) + FR bnd EMISS(World,CO2,all,720) + FR bnd EMISS(Westeros,CO2,all,700) + FR bnd EMISS(Westeros,CO2,all,710) + FR bnd EMISS(Westeros,CO2,all,720) + FX bnd constobj 0 +ENDATA diff --git a/message_ix/tools/make_scaler/westeros_scaling.ipynb b/message_ix/tools/make_scaler/westeros_scaling.ipynb new file mode 100644 index 000000000..233321340 --- /dev/null +++ b/message_ix/tools/make_scaler/westeros_scaling.ipynb @@ -0,0 +1,351 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Westeros Tutorial: Using scaling tool in Westeros emission bounds scenario\n", + "\n", + "In the first part, the model chose not to base the power system on wind power as electricity from wind turbines was more expensive than electricity produced from coal. However, we now introduce emissions to investigate the impact of climate policy. Let's see what happens then.\n", + "\n", + "**Pre-requisites**\n", + "- You have the *MESSAGEix* framework installed and working\n", + "- You have run Westeros baseline scenario (``westeros_baseline.ipynb``) and solved it successfully" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "import os\n", + "\n", + "from message_ix.tools.lp_diag import LPdiag\n", + "from message_ix.tools.make_scaler import make_scaler\n", + "from message_ix.tools.make_scaler import show_range\n", + "from message_ix.tools.make_scaler import get_scaler_args\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "lp = LPdiag()\n", + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This Scenario has a solution, use `Scenario.remove_solution()` or `Scenario.clone(..., keep_solution=False)`\n" + ] + } + ], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "\n", + "scen_name = \"emission_bound_unscaled\"\n", + "scen = base.clone(\n", + " model,\n", + " scen_name,\n", + " \"introducing scaling tool for westeros tutorial\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing scaling tool\")\n", + "scen.set_as_default()\n", + "\n", + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{scen_name}.mps\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "206280.0625" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scen.solve(solve_options={\"writemps\": mps_dir,})\n", + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the unscaled scenario above, we make scaler arguments to solve scenario with scaled matrix coefficients" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Reading MPS-format file C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_scaler\\Westeros Electrified_emission_bound_unscaled.mps.\n", + "Next section found: NAME gamsmodel (line 1).\n", + "\tProblem name: gamsmodel.\n", + "Next section found: ROWS (line 2).\n", + "\tRow _obj (row_seq = 0) is the objective (goal function) row.\n", + "Next section found: COLUMNS (line 74).\n", + "Next section found: RHS (line 259).\n", + "\tId of RHS: rhs\n", + "Next section found: BOUNDS (line 268).\n", + "\tId of BOUNDS: bnd\n", + "Next section found: ENDATA (line 282).\n", + "\n", + "Finished processing 282 lines of the MPS file: C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_scaler\\Westeros Electrified_emission_bound_unscaled.mps.\n", + "LP has: 71 rows, 55 cols, 184 non-zeros, matrix density = 4.71e-02.\n", + "Numbers of redefined: RHS = 8, ranges = 0, bounds = 13.\n", + "\n", + "The GF (objective) row named \"_obj\" has 7 elements.\n", + "Distribution of the GF (objective) values:\n", + "count 7.000000\n", + "mean 4.534986\n", + "std 2.522265\n", + "min 1.000000\n", + "25% 2.910241\n", + "50% 4.740475\n", + "75% 6.231105\n", + "max 7.721735\n", + "Name: val, dtype: float64\n", + "\n", + "Unscaled range : [ 0 | 3 ]\n", + "Scaled range step 1: [ -1 | 1 ]\n" + ] + } + ], + "source": [ + "scale_df = make_scaler(mps_dir, scen, bounds=2, steps=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run scenarios with scaled matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This Scenario has a solution, use `Scenario.remove_solution()` or `Scenario.clone(..., keep_solution=False)`\n" + ] + } + ], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "\n", + "sc_name = \"emission_bound_scaled\"\n", + "sc = base.clone(\n", + " model,\n", + " sc_name,\n", + " \"introducing scaling tool for westeros tutorial\",\n", + " keep_solution=False,\n", + ")\n", + "sc.check_out()\n", + "\n", + "sc.commit(comment=\"Introducing scaling tool\")\n", + "sc.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "current_directory = os.getcwd()\n", + "mps_dir = os.path.join(current_directory, f\"{model}_{sc_name}.mps\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = model\n", + "scenario_name = \"emission_bound_unscaled\"\n", + "\n", + "argument = get_scaler_args(scen)\n", + "\n", + "sc.solve(solve_options={\"writemps\": mps_dir},\n", + " gams_args=[argument]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "206280.0625" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sc.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Reading MPS-format file C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_scaler\\Westeros Electrified_emission_bound_scaled.mps.\n", + "Next section found: NAME gamsmodel (line 1).\n", + "\tProblem name: gamsmodel.\n", + "Next section found: ROWS (line 2).\n", + "\tRow _obj (row_seq = 0) is the objective (goal function) row.\n", + "Next section found: COLUMNS (line 74).\n", + "Next section found: RHS (line 259).\n", + "\tId of RHS: rhs\n", + "Next section found: BOUNDS (line 268).\n", + "\tId of BOUNDS: bnd\n", + "Next section found: ENDATA (line 282).\n", + "\n", + "Finished processing 282 lines of the MPS file: C:\\Users\\pratama\\Documents\\GitHub\\MESSAGEix\\message_ix\\message_ix\\tools\\make_scaler\\Westeros Electrified_emission_bound_scaled.mps.\n", + "LP has: 71 rows, 55 cols, 184 non-zeros, matrix density = 4.71e-02.\n", + "Numbers of redefined: RHS = 8, ranges = 0, bounds = 13.\n", + "\n", + "The GF (objective) row named \"_obj\" has 7 elements.\n", + "Distribution of the GF (objective) values:\n", + "count 7.000000\n", + "mean 4.534986\n", + "std 2.522265\n", + "min 1.000000\n", + "25% 2.910241\n", + "50% 4.740475\n", + "75% 6.231105\n", + "max 7.721735\n", + "Name: val, dtype: float64\n", + "\n", + "New exp range:: [ -1 | 1 ]\n" + ] + } + ], + "source": [ + "lp.read_mps(mps_dir)\n", + "data = lp.read_matrix()\n", + "show_range(data,\"\\nNew exp range:\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 5b0c1550850437de21ab52c3ea4b47fefcb96096 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Thu, 2 May 2024 17:05:16 +0200 Subject: [PATCH 23/25] gams file cleanup --- message_ix/model/MESSAGE/args.gms | 1 - message_ix/model/MESSAGE/data_load.gms | 2 - message_ix/model/MESSAGE/model_core.gms | 2 +- .../model/MESSAGE/model_learningeos.gms | 47 ----- message_ix/model/MESSAGE/model_setup.gms | 14 +- message_ix/model/MESSAGE/model_solve.gms | 86 ++++----- message_ix/model/MESSAGE/sets_maps_def.gms | 3 - message_ix/model/MESSAGE/~$model_solve.gms | 170 ++++++++++++++++++ message_ix/model/MESSAGE_master.gms | 5 - message_ix/models.py | 22 --- 10 files changed, 207 insertions(+), 145 deletions(-) delete mode 100644 message_ix/model/MESSAGE/args.gms delete mode 100644 message_ix/model/MESSAGE/model_learningeos.gms create mode 100644 message_ix/model/MESSAGE/~$model_solve.gms diff --git a/message_ix/model/MESSAGE/args.gms b/message_ix/model/MESSAGE/args.gms deleted file mode 100644 index 95e7f3653..000000000 --- a/message_ix/model/MESSAGE/args.gms +++ /dev/null @@ -1 +0,0 @@ -MESSAGE_LP.scaleopt = 1 ; diff --git a/message_ix/model/MESSAGE/data_load.gms b/message_ix/model/MESSAGE/data_load.gms index c3784a530..1f094303b 100644 --- a/message_ix/model/MESSAGE/data_load.gms +++ b/message_ix/model/MESSAGE/data_load.gms @@ -103,8 +103,6 @@ Set rating_unrated(rating) ; rating_unrated(rating) = yes ; rating_unrated('unrated') = no ; -Set newtec(tec) / wind_ppl / ; - *----------------------------------------------------------------------------------------------------------------------* * assignment and computation of MESSAGE-specific auxiliary parameters * *----------------------------------------------------------------------------------------------------------------------* diff --git a/message_ix/model/MESSAGE/model_core.gms b/message_ix/model/MESSAGE/model_core.gms index 462fa8f4b..e549c7fb1 100644 --- a/message_ix/model/MESSAGE/model_core.gms +++ b/message_ix/model/MESSAGE/model_core.gms @@ -142,7 +142,7 @@ Variables * =========================================================================== ====================================================================================================== * * .. warning:: -* Please be aware that transitioning from one period length to another for consecutive periods may result in false values of :math:`\text{PRICE_EMISSION}`. +* Please be aware that transitioning from one period length to another for consecutive periods may result in false values of :math:`\text{PRICE_EMISSION}`. * Please see `this issue `_ for further information. We are currently working on a fix. *** diff --git a/message_ix/model/MESSAGE/model_learningeos.gms b/message_ix/model/MESSAGE/model_learningeos.gms deleted file mode 100644 index 389c5a00e..000000000 --- a/message_ix/model/MESSAGE/model_learningeos.gms +++ /dev/null @@ -1,47 +0,0 @@ -SETS - size 'size' / small, medium, large / ; - -ALIAS (size,size2); -PARAMETERS - cap_new2(node,newtec,year_all2) 'annual newly installed capacity' - bin_cap_new(node,newtec,year_all2) 'binary of newly installed capacity' - rho(newtec) 'economy of scale parameter' / wind_ppl 1.0 / #0.8 - b(newtec) 'technology cost learning parameter' / wind_ppl 0.9 / #0.9 - u(size) 'unit size' - / small 5 - medium 10 - large 50 / - inv_cost_ref(node,newtec) 'initial capex' - nbr_unit_ref(newtec) 'initial number of unit' / wind_ppl 100 / - u_ref(newtec) 'reference size' / wind_ppl 5 / ; -inv_cost_ref(node,newtec) = 1500; - -SCALAR hist_length the length of historical periods; -hist_length = card(year_all2) - card(model_horizon); - -VARIABLES - NBR_UNIT(node,newtec,size,year_all2) number of units for each size every year - CAPEX_TEC(node,newtec,year_all2) capital cost in dollar per kW - OBJECT objective function ; - -POSITIVE VARIABLES - NBR_UNIT ; - -EQUATIONS - OBJECTIVE_INNER total investment cost - CAP_NEW_BALANCE installed capacity balance - CAPEX_ESTIMATE estimating average capex - NO_BUILT_YEAR annual investment cost -; - - -OBJECTIVE_INNER.. OBJECT =e= sum((node,newtec,year_all2), CAPEX_TEC(node,newtec,year_all2)*cap_new2(node,newtec,year_all2)) ; -CAP_NEW_BALANCE(node,newtec,year_all2).. sum(size, NBR_UNIT(node,newtec,size,year_all2)*u(size)) =e= cap_new2(node,newtec,year_all2) ; -CAPEX_ESTIMATE(node,newtec,year_all2).. CAPEX_TEC(node,newtec,year_all2)*cap_new2(node,newtec,year_all2) =g= sum(size,inv_cost_ref(node,newtec) - * NBR_UNIT(node,newtec,size,year_all2)*u(size) - * [(((sum((size2,year_all3)$(ord(year_all3) le ord(year_all2) and ord(year_all3) gt hist_length), NBR_UNIT(node,newtec,size2,year_all3))+nbr_unit_ref(newtec))/nbr_unit_ref(newtec))**(-b(newtec)))] - * [((u(size)/u_ref(newtec))**rho(newtec))]) ; -NO_BUILT_YEAR(node,newtec,year_all2).. CAPEX_TEC(node,newtec,year_all2) =e= bin_cap_new(node,newtec,year_all2)*CAPEX_TEC(node,newtec,year_all2) - + (1-bin_cap_new(node,newtec,year_all2))*CAPEX_TEC(node,newtec,year_all2-1) ; - -model learningeos / all /; diff --git a/message_ix/model/MESSAGE/model_setup.gms b/message_ix/model/MESSAGE/model_setup.gms index 1e522bac5..46966f37f 100644 --- a/message_ix/model/MESSAGE/model_setup.gms +++ b/message_ix/model/MESSAGE/model_setup.gms @@ -21,15 +21,6 @@ $IF NOT SET out $SETGLOBAL out "output/MsgOutput.gdx" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $IF NOT SET foresight $SETGLOBAL foresight "0" - -$IF NOT SET scaler $SETGLOBAL scaler "MsgScaler_Default" - - -** define learning mode (active / inactive) ** -* deactivate - 0 (assumed as default if not specified) -* activate - 1 -$IF NOT SET learningmode $SETGLOBAL learningmode "0" - ** specify optional additional calibration output ** $IF NOT SET calibration $SETGLOBAL calibration "" * mark with * to include detailed calibration information in outputs and get an extended GAMS listing (.lst) file @@ -93,7 +84,4 @@ $INCLUDE MESSAGE/scaling_investment_costs.gms *----------------------------------------------------------------------------------------------------------------------* $INCLUDE MESSAGE/model_core.gms - -$INCLUDE scaler/%scaler%.gms - -$INCLUDE MESSAGE/model_learningeos.gms +$INCLUDE scaler/%scaler%.gms \ No newline at end of file diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index 57a8afdec..92685e861 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -5,11 +5,6 @@ * This part of the code includes the perfect-foresight, myopic and rolling-horizon model solve statements * including the required accounting of investment costs beyond the model horizon. *** -*set year_rd(year_all) /700, 710/; -*set year_rd(year_all) all year in recursive dynamic iterations ; -*year_rd(year_all) = ord(year_all) >1; -Parameter iter 'iteration number'; -iter = 1; if (%foresight% = 0, *** @@ -28,9 +23,7 @@ if (%foresight% = 0, year(year_all)$( model_horizon(year_all) ) = yes ; * write a status update to the log file, solve the model - put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; - option threads = 4 ; Solve MESSAGE_LP using LP minimizing OBJ ; * write model status summary @@ -94,56 +87,47 @@ else * variables in additional reporting parameters - the last model solve automatically includes the results over the * entire model horizon and can be imported via the ixmp interface. *** + year(year_all) = no ; LOOP(year_all$( model_horizon(year_all) ), * include all past periods and future periods including the period where the %foresight% is reached - year(year_all2)$( ORD(year_all2) < (ORD(year_all) + %foresight%) ) = yes ; - year4(year_all2)$((ord(year_all2) < ord(year_all))) = yes ; - - option threads = 4 ; - Solve MESSAGE_LP using LP minimizing OBJ ; -* write model status summary - status('perfect_foresight','modelstat') = MESSAGE_LP.modelstat ; - status('perfect_foresight','solvestat') = MESSAGE_LP.solvestat ; - status('perfect_foresight','resUsd') = MESSAGE_LP.resUsd ; - status('perfect_foresight','objEst') = MESSAGE_LP.objEst ; - status('perfect_foresight','objVal') = MESSAGE_LP.objVal ; - -* write an error message if model did not solve to optimality - IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), - put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; - ABORT "MESSAGEix did not solve to optimality!" - ) ; - - IF(%learningmode% = 1, -* passing CAP_NEW values to update cap_new2 data for unit and size optimization - cap_new2(node,newtec,year_all2) = CAP_NEW.l(node,newtec,year_all2); -* this is to make bin param equal to 1 when technology is built, and 0 if otherwise - bin_cap_new(node,newtec,year_all2) = CAP_NEW.l(node,newtec,year_all2); - bin_cap_new(node,newtec,year_all2)$(bin_cap_new(node,newtec,year_all2) > 0) = 1 ; - solve learningeos using nlp minimizing OBJECT; -* passing CapexTec values to update inv_cost data for MESSAGE optimization - inv_cost(node,newtec,year_all2) = CAPEX_TEC.l(node,newtec,year_all2); - - display bin_cap_new, NBR_UNIT.l, CAPEX_TEC.l, inv_cost, cap_new2, CAP_NEW.l; - ); + year(year_all) = yes ; + +* reset the investment cost scaling parameter + year(year_all2)$( ORD(year_all2) > ORD(year_all) + AND duration_period_sum(year_all,year_all2) < %foresight% ) = yes ; + +* write a status update and time elapsed to the log file, solve the model + put_utility 'log' /'+++ Solve the recursive-dynamic version of MESSAGEix - iteration ' year_all.tl:0 ' +++ ' ; + $$INCLUDE includes/aux_computation_time.gms + Solve MESSAGE_LP using LP minimizing OBJ ; + +* write model status summary + status(year_all,'modelstat') = MESSAGE_LP.modelstat ; + status(year_all,'solvestat') = MESSAGE_LP.solvestat ; + status(year_all,'resUsd') = MESSAGE_LP.resUsd ; + status(year_all,'objEst') = MESSAGE_LP.objEst ; + status(year_all,'objVal') = MESSAGE_LP.objVal ; + +* write an error message AND ABORT THE SOLVE LOOP if model did not solve to optimality + IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), + put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; + ABORT "MESSAGEix did not solve to optimality!" + ) ; * fix all variables of the current iteration period 'year_all' to the optimal levels - EXT.fx(node,commodity,grade,year4) = EXT.l(node,commodity,grade,year4) ; - CAP_NEW.fx(node,tec,year4) = CAP_NEW.l(node,tec,year4) ; -* CAP.fx(node,tec,year4,year4) = CAP.l(node,tec,year4,year4) ; - CAP.up(node,tec,year4,year4) = 1.000001*CAP.l(node,tec,year4,year4) ; - CAP.lo(node,tec,year4,year4) = 0.999999*CAP.l(node,tec,year4,year4) ; - ACT.fx(node,tec,year4,year4,mode,time) = ACT.l(node,tec,year4,year4,mode,time) ; - CAP_NEW_UP.fx(node,tec,year4) = CAP_NEW_UP.l(node,tec,year4) ; - CAP_NEW_LO.fx(node,tec,year4) = CAP_NEW_LO.l(node,tec,year4) ; - ACT_UP.fx(node,tec,year4,time) = ACT_UP.l(node,tec,year4,time) ; - ACT_LO.fx(node,tec,year4,time) = ACT_LO.l(node,tec,year4,time) ; - - - Display year,year4,year_all,year_all2,model_horizon ; + EXT.fx(node,commodity,grade,year_all) = EXT.l(node,commodity,grade,year_all) ; + CAP_NEW.fx(node,tec,year_all) = CAP_NEW.l(node,tec,year_all) ; + CAP.fx(node,tec,year_all2,year_all)$( map_period(year_all2,year_all) ) = CAP.l(node,tec,year_all,year_all2) ; + ACT.fx(node,tec,year_all2,year_all,mode,time)$( map_period(year_all2,year_all) ) + = ACT.l(node,tec,year_all2,year_all,mode,time) ; + CAP_NEW_UP.fx(node,tec,year_all) = CAP_NEW_UP.l(node,tec,year_all) ; + CAP_NEW_LO.fx(node,tec,year_all) = CAP_NEW_LO.l(node,tec,year_all) ; + ACT_UP.fx(node,tec,year_all,time) = ACT_UP.l(node,tec,year_all,time) ; + ACT_LO.fx(node,tec,year_all,time) = ACT_LO.l(node,tec,year_all,time) ; + ) ; # end of the recursive-dynamic loop ) ; # end of if statement for the selection betwen perfect-foresight or recursive-dynamic model @@ -183,4 +167,4 @@ COST_NODAL_NET.L(node, year)$(NOT macro_base_period(year)) = ( AND map_node(node2,node) AND cat_year(type_year,year) ), emission_scaling(type_emission,emission) * tax_emission(node2,type_emission,type_tec,type_year) * EMISS.L(node,emission,type_tec,year) ) -) / 1000 ; +) ; diff --git a/message_ix/model/MESSAGE/sets_maps_def.gms b/message_ix/model/MESSAGE/sets_maps_def.gms index b6510b5fb..479da3298 100644 --- a/message_ix/model/MESSAGE/sets_maps_def.gms +++ b/message_ix/model/MESSAGE/sets_maps_def.gms @@ -152,8 +152,6 @@ Sets land_type types of land use year_all years (over entire model horizon) year (year_all) years included in a model instance (for myopic or rolling-horizon optimization) - year4 (year_all) years included in a model instance (for myopic or rolling-horizon optimization) - year_hist (year_all) historical year time subannual time periods (seasons - days - hours) shares share constraint relations relation generic linear relations @@ -303,7 +301,6 @@ Sets addon(tec) technologies that are an add-on to other (parent) technologies type_addon types of add-on technologies (that can be applied mutually exclusive) cat_addon(type_addon,addon) mapping of add-on technologies to respective add-on technology types - newtec(tec) new technologies that will experience technological learning type_year types of year aggregations cat_year(type_year,year_all) mapping of years to respective categories type_emission types of emission aggregations diff --git a/message_ix/model/MESSAGE/~$model_solve.gms b/message_ix/model/MESSAGE/~$model_solve.gms new file mode 100644 index 000000000..e0a343a6b --- /dev/null +++ b/message_ix/model/MESSAGE/~$model_solve.gms @@ -0,0 +1,170 @@ +*** +* Solve statement workflow +* ======================== +* +* This part of the code includes the perfect-foresight, myopic and rolling-horizon model solve statements +* including the required accounting of investment costs beyond the model horizon. +*** + +if (%foresight% = 0, +*** +* Perfect-foresight model +* ~~~~~~~~~~~~~~~~~~~~~~~ +* For the perfect foresight version of |MESSAGEix|, include all years in the model horizon and solve the entire model. +* This is the standard option; the GAMS global variable ``%foresight%=0`` by default. +* +* .. math:: +* \min_x \text{OBJ} = \sum_{y \in Y} \text{OBJ}_y(x_y) +*** + +* reset year in case it was set by MACRO to include the base year before + year(year_all) = no ; +* include all model periods in the optimization horizon (excluding historical periods prior to 'first_period') + year(year_all)$( model_horizon(year_all) ) = yes ; + +* write a status update to the log file, solve the model + put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; + Solve MESSAGE_LP using LP minimizing OBJ ; + +* write model status summary + status('perfect_foresight','modelstat') = MESSAGE_LP.modelstat ; + status('perfect_foresight','solvestat') = MESSAGE_LP.solvestat ; + status('perfect_foresight','resUsd') = MESSAGE_LP.resUsd ; + status('perfect_foresight','objEst') = MESSAGE_LP.objEst ; + status('perfect_foresight','objVal') = MESSAGE_LP.objVal ; + +* write an error message if model did not solve to optimality + IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), + put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; + ABORT "MESSAGEix did not solve to optimality!" + ) ; + +* rescale the dual of the emission constraint to account that the constraint is defined on the average year, not total +EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year)$( + EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year) ) = + EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year) + / SUM(year$( cat_year(type_year,year) ), duration_period(year) ) + * SUM(year$( map_first_period(type_year,year) ), duration_period(year) / df_period(year) * df_year(year) ); + + +* assign auxiliary variables DEMAND, PRICE_COMMODITY and PRICE_EMISSION for integration with MACRO and reporting + DEMAND.l(node,commodity,level,year,time) = demand_fixed(node,commodity,level,year,time) ; + PRICE_COMMODITY.l(node,commodity,level,year,time) = + ( COMMODITY_BALANCE_GT.m(node,commodity,level,year,time) + COMMODITY_BALANCE_LT.m(node,commodity,level,year,time) ) + / df_period(year) ; + PRICE_EMISSION.l(node,type_emission,type_tec,year)$( SUM(type_year$( cat_year(type_year,year) ), 1 ) ) = + SMAX(type_year$( cat_year(type_year,year) ), + - EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year) ) + / df_year(year) ; + PRICE_EMISSION.l(node,type_emission,type_tec,year)$( + PRICE_EMISSION.l(node,type_emission,type_tec,year) = - inf ) = 0 ; + +%AUX_BOUNDS% AUX_ACT_BOUND_LO(node,tec,year_all,year_all2,mode,time)$( ACT.l(node,tec,year_all,year_all2,mode,time) < 0 AND +%AUX_BOUNDS% ACT.l(node,tec,year_all,year_all2,mode,time) = -%AUX_BOUND_VALUE% ) = yes ; +%AUX_BOUNDS% AUX_ACT_BOUND_UP(node,tec,year_all,year_all2,mode,time)$( ACT.l(node,tec,year_all,year_all2,mode,time) > 0 AND +%AUX_BOUNDS% ACT.l(node,tec,year_all,year_all2,mode,time) = %AUX_BOUND_VALUE% ) = yes ; + +else +*** +* Recursive-dynamic and myopic model +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* For the myopic and rolling-horizon models, loop over horizons and iteratively solve the model, keeping the decision +* variables from prior periods fixed. +* This option is selected by setting the GAMS global variable ``%foresight%`` to a value greater than 0, +* where the value represents the number of years that the model instance is considering when iterating over the periods +* of the optimization horizon. +* +* Loop over :math:`\hat{y} \in Y`, solving +* +* .. math:: +* \min_x \ \text{OBJ} = \sum_{y \in \hat{Y}(\hat{y})} \text{OBJ}_y(x_y) \\ +* \text{s.t. } x_{y'} = x_{y'}^* \quad \forall \ y' < y +* +* where :math:`\hat{Y}(\hat{y}) = \{y \in Y | \ |\hat{y}| - |y| < \text{optimization_horizon} \}` and +* :math:`x_{y'}^*` is the optimal value of :math:`x_{y'}` in iteration :math:`|y'|` of the iterative loop. +* +* The advantage of this implementation is that there is no need to 'store' the optimal values of all decision +* variables in additional reporting parameters - the last model solve automatically includes the results over the +* entire model horizon and can be imported via the ixmp interface. +*** + + year(year_all) = no ; + + LOOP(year_all$( model_horizon(year_all) ), + +* include all past periods and future periods including the period where the %foresight% is reached + year(year_all) = yes ; + +* reset the investment cost scaling parameter + year(year_all2)$( ORD(year_all2) > ORD(year_all) + AND duration_period_sum(year_all,year_all2) < %foresight% ) = yes ; + +* write a status update and time elapsed to the log file, solve the model + put_utility 'log' /'+++ Solve the recursive-dynamic version of MESSAGEix - iteration ' year_all.tl:0 ' +++ ' ; + $$INCLUDE includes/aux_computation_time.gms + Solve MESSAGE_LP using LP minimizing OBJ ; + +* write model status summary + status(year_all,'modelstat') = MESSAGE_LP.modelstat ; + status(year_all,'solvestat') = MESSAGE_LP.solvestat ; + status(year_all,'resUsd') = MESSAGE_LP.resUsd ; + status(year_all,'objEst') = MESSAGE_LP.objEst ; + status(year_all,'objVal') = MESSAGE_LP.objVal ; + +* write an error message AND ABORT THE SOLVE LOOP if model did not solve to optimality + IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), + put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; + ABORT "MESSAGEix did not solve to optimality!" + ) ; + +* fix all variables of the current iteration period 'year_all' to the optimal levels + EXT.fx(node,commodity,grade,year_all) = EXT.l(node,commodity,grade,year_all) ; + CAP_NEW.fx(node,tec,year_all) = CAP_NEW.l(node,tec,year_all) ; + CAP.fx(node,tec,year_all2,year_all)$( map_period(year_all2,year_all) ) = CAP.l(node,tec,year_all,year_all2) ; + ACT.fx(node,tec,year_all2,year_all,mode,time)$( map_period(year_all2,year_all) ) + = ACT.l(node,tec,year_all2,year_all,mode,time) ; + CAP_NEW_UP.fx(node,tec,year_all) = CAP_NEW_UP.l(node,tec,year_all) ; + CAP_NEW_LO.fx(node,tec,year_all) = CAP_NEW_LO.l(node,tec,year_all) ; + ACT_UP.fx(node,tec,year_all,time) = ACT_UP.l(node,tec,year_all,time) ; + ACT_LO.fx(node,tec,year_all,time) = ACT_LO.l(node,tec,year_all,time) ; + + ) ; # end of the recursive-dynamic loop + +) ; # end of if statement for the selection betwen perfect-foresight or recursive-dynamic model + +*----------------------------------------------------------------------------------------------------------------------* +* post-processing of trade costs and total costs * +*----------------------------------------------------------------------------------------------------------------------* + +* calculation of commodity import costs by node, commodity and year +import_cost(node2, commodity, year) = + SUM( (node,tec,vintage,mode,level,time,time2)$( (NOT sameas(node,node2)) AND map_tec_act(node2,tec,year,mode,time2) + AND map_tec_lifetime(node2,tec,vintage,year) AND map_commodity(node,commodity,level,year,time) ), +* import into node2 from other nodes + input(node2,tec,vintage,year,mode,node,commodity,level,time2,time) + * duration_time_rel(time,time2) * ACT.L(node2,tec,vintage,year,mode,time2) + * PRICE_COMMODITY.l(node,commodity,level,year,time) ) +; + +* calculation of commodity export costs by node, commodity and year +export_cost(node2, commodity, year) = + SUM( (node,tec,vintage,mode,level,time,time2)$( (NOT sameas(node,node2)) AND map_tec_act(node2,tec,year,mode,time2) + AND map_tec_lifetime(node2,tec,vintage,year) AND map_commodity(node,commodity,level,year,time) ), +* export from node2 to other market + output(node2,tec,vintage,year,mode,node,commodity,level,time2,time) + * duration_time_rel(time,time2) * ACT.L(node2,tec,vintage,year,mode,time2) + * PRICE_COMMODITY.l(node,commodity,level,year,time) ) +; + +* net commodity trade costs by node and year +trade_cost(node2, year) = SUM(commodity, import_cost(node2, commodity, year) - export_cost(node2, commodity, year)) ; + +* total energy system costs excluding taxes by node and time (CAVEAT: lacking regional corrections due to emission trading) +COST_NODAL_NET.L(node, year)$(NOT macro_base_period(year)) = ( + COST_NODAL.L(node, year) + trade_cost(node, year) +* subtract emission taxes applied at any higher nodal level (via map_node set) + - sum((type_emission,emission,type_tec,type_year,node2)$( emission_scaling(type_emission,emission) + AND map_node(node2,node) AND cat_year(type_year,year) ), + emission_scaling(type_emission,emission) * tax_emission(node2,type_emission,type_tec,type_year) + * EMISS.L(node,emission,type_tec,year) ) +) / 1000 ; diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index 995674e69..a8e6c090f 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -58,11 +58,6 @@ $SETGLOBAL macromode "none" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $SETGLOBAL foresight "0" -** for recursive dynamic approach, this is to activate/deactivate technology learning module ** -* deactivate technology learning - 0 -* activate technology learning - 1 -$SETGLOBAL learningmode "0" - ** include scaler commands $SETGLOBAL scaler "MsgScaler_Default" diff --git a/message_ix/models.py b/message_ix/models.py index 95e1bafc7..5c9253f71 100644 --- a/message_ix/models.py +++ b/message_ix/models.py @@ -211,28 +211,6 @@ def run(self, scenario): optfile.write_text("\n".join(lines)) log.info(f"Use CPLEX options {self.cplex_opts}") - """ - # removing prescaler arguments in options file - current_dir = os.getcwd() - prescale_args_dir = os.path.join(current_dir, "prescale_args.csv") - - if os.path.exists(prescale_args_dir): - prescale_args = pd.read_csv(prescale_args_dir) - keys2remove = list(prescale_args["key"]) - - for key in keys2remove: - del self.cplex_opts[key] - - if "writemps" in self.cplex_opts.keys(): - del self.cplex_opts["writemps"] - - # for k, v in self.cplex_opts.items(): - # print(k, v) - - print("opt1:", self.cplex_opts) - print("opt2:", self.cplex_opts) - """ - self.cplex_opts.update({"barcrossalg": 2}) optfile2 = Path(self.model_dir).joinpath("cplex.op2") lines2 = ("{} = {}".format(*kv) for kv in self.cplex_opts.items()) From ce5057342c14829d2b0467c939b88becf36b14a1 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Thu, 2 May 2024 18:06:09 +0200 Subject: [PATCH 24/25] Cleaned files prior to merging functions --- message_ix/tools/lp_diag/Readme.rst | 189 ---- message_ix/tools/lp_diag/data/Readme.txt | 5 - .../tools/lp_diag/lp_diag - Original.py | 910 ---------------- .../tools/lp_diag/lp_diag - Yoga edit.py | 939 ----------------- message_ix/tools/lp_diag/lp_diag.py | 932 ----------------- message_ix/tools/lp_diag/lpdiag - Original.py | 149 --- message_ix/tools/lp_diag/lpdiag.py | 149 --- message_ix/tools/lp_diag/nohup.out | 977 ------------------ 8 files changed, 4250 deletions(-) delete mode 100644 message_ix/tools/lp_diag/Readme.rst delete mode 100644 message_ix/tools/lp_diag/data/Readme.txt delete mode 100644 message_ix/tools/lp_diag/lp_diag - Original.py delete mode 100644 message_ix/tools/lp_diag/lp_diag - Yoga edit.py delete mode 100644 message_ix/tools/lp_diag/lp_diag.py delete mode 100644 message_ix/tools/lp_diag/lpdiag - Original.py delete mode 100644 message_ix/tools/lp_diag/lpdiag.py delete mode 100644 message_ix/tools/lp_diag/nohup.out diff --git a/message_ix/tools/lp_diag/Readme.rst b/message_ix/tools/lp_diag/Readme.rst deleted file mode 100644 index 156466418..000000000 --- a/message_ix/tools/lp_diag/Readme.rst +++ /dev/null @@ -1,189 +0,0 @@ -.. LPdiag documentation file - -``LPdiag``: basic diagnostics of the LP programming problems -============================================================ - -Description ------------ - -``LPdiag`` provides basic information about the LP programming problems -defined by corresponding MPS-format files. -The diagnostics focuses on the implied numerical properties of the underlying -optimization problem. - -In this context, the term `outlier` denotes the model entities having values -in either lower or upper tail of the corresponding value distribution. -The tails are defined by the corresponding orders of magnitudes defined as -:math:`int(alog(abs(val)))`, where :math:`val` stands for the value of -the corresponding coefficient. -The default values of the tails are equal to (-6, 6), respectively; -they can be redefined, if desired. - -The rule of thumb says: the maximum and minimum orders of magnitudes of -the LP matrix coefficients passed to optimization should differ by at most four. -``LPdiag`` helps to achieve such a goal by providing info on outliers. -Such info can be used e.g., for: - -- reconsideration of measurement units of the corresponding variables - and relations, -- consideration of replacing `small` (in relations to other coefficients in - the same row or column) by zero, -- splitting the corresponding rows and/or columns, -- verification of the coefficients' values. - -Features -^^^^^^^^ - -The current ``LPdiag`` version provides the following information: - -- characteristics of the problem (including numbers of rows, columns, non-zero - coefficients and distributions of their values), -- distributions of diverse values characterizing the LP matrix, -- location (row and column) of each outlier, -- ranges of values of other coefficients in each such row or column, as well as - the corresponding bounds (LHS, RHS for rows, lower and upper bounds for - columns). - -The functionality of ``LPdiag`` will be gradually enhanced to meet actual needs -of the ``message_ix`` modelers. - -Usage ------ - -The tool analyzes provided MPS-format files. -We provide several small MPSs for testing local installations, as well -as becoming familiar with ``LPdiag``. -Hints on generating MPS files are provided below. - -We suggest the following steps for becoming familiar with ``LPdiag`` and -then use it for analysis of actual MPS files: - -- becoming familiar with ``LPdiag``, -- prepare MPS file, -- actual analysis. - -We outline each of these steps below. - -Becoming familiar with ``LPdiag`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Note that ``LPdiag`` should be run at the terminal prompt. - -- Navigate to the folder `message_ix/tools/lp_diag`. -- For initial testing run the following command, which will run analysis of - the default (pre-specified) MPS provided in the test_mps folder. - Other provided MPS example can be run by using the ``--mps`` option explained - below. :: - - python lpdiag.py - -- To display the available ``LPdiag`` options run: :: - - python lpdiag.py -h - -The output of the above should read as follows (except of the work_dir line, -which differs for each local repository): :: - - work_dir: '/Users/marek/Documents/GitHub/marek_iiasa/message_ix/message_ix/tools/lp_diag'. - usage: lpdiag.py [-h] [--wdir WDIR] [--mps MPS] [--outp OUTP] - Diagnostics of basic properties of LP Problems represented by the MPS-format. - Examples of usage: - python lpdiag.py - python lpdiag.py -h - python lpdiag.py --mps test_mps/aez --outp foo.txt - options: - -h, --help show this help message and exit - --wdir WDIR --wdir : string Working directory. - --mps MPS --mps : string Name of the MPS file (optionally with path). - --outp OUTP --outp : string Redirect output to the named file. - -Comments on the arguments of the above three options: - -- WDIR: specification of the desired work-directory (by default the work-directory - is the same, in which ``LPdiag`` is located). -- MPS: name of the MPS file to be analysed; if the file is not located in the - work-directory, then the name should include the path to the file (see - the example above). -- OUTP: name of the file to which the output shall be redirected. - By default the output is listed to the stdout, i.e., to the terminal window - unless the redirection is included in the command. - Optionally, the output can be redirected to a specified file. - Such redirection can be specified by either using the ``--outp file_name`` - option, as illustrated by the second example shown above (in the output - resulting from using the ``-h`` option), - or by including the redirection in the corresponding command, e.g.,: :: - - python lpdiag.py -h > foo.txt - - -Generation of the MPS file in the ``message_ix`` environment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The MPS-format is the oldest but still widely used for specification of -the LP problems. -Most modeling environments provide various ways of the MPS file generation. - -In the ``message_ix`` environment one can generate the MPS file e.g., -upon solving a :class:`message_ix scenario` by defining -in `scenario.solve()` the `writemps` option together with the desired name of -the MPS file. -The MPS file will then be generated and deposited in the `message_ix/message_ix/model` -folder. -Details are available in the GAMS-Documentation: -https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXwritemps - -Example of specification of the corresponding option:: - - `scenario.solve(solve_options={"writemps": ".mps"})` - - -Actual analysis -^^^^^^^^^^^^^^^ - -For actual analysis one needs to specify the corresponding MPS file in -a command run (still in the directory `message_ix/tools/lp_diag`): :: - - python lpdiag.py --mps loc/name - -where `loc` and `name` stand for the path to the directory where the MPS-file is -located, and `name` stands for the corresponding file-name, respectively. -Other option(s) can be included in the command, as explained above. - -If the output redirection is desired (e.g., for results to be shared or composed -of many lines), then run: :: - - python lpdiag.py --mps loc/name --outp outfile.txt - -Extensions in the file names are optional. -An alternative way of output redirection is explained above. - - -Summary of the provided analysis results ----------------------------------------- - -The results are composed of the following elements: - -- Info on the work-directory. -- Info during reading the MPS file: - - - Should a syntax error occur during reading the file, then the corresponding - exception is thrown with the corresponding details. - - Basic info during processing of each MPS section. -- Basic attributes of the read MPS. -- Distribution of values of the objective (goal function) coefficients. -- Distribution of :math:`abs(val)` of the matrix elements. -- Distribution of values of :math:`int(log10(abs(values)))`. -- Distribution of values of :math:`int(log10(abs(values)))` sorted by - magnitudes of values (magnitudes of zero-occurrences skipped). -- For each (lower and upper) tail of the matrix coefficient values of the - corresponding sub-matrix: - - - Distributions of diverse values (:math:`value, abs(val), log10(abs(val))`) - of the matrix elements. - - For each order of magnitude: number of elements - - Row-wise location of each outlier with: - (1) info on other coefficients in the same row, (2) order of magnitude of the row's LHS and RHS. - - Column-wise location of each outlier with: - (1) info on other coefficients in the same column, and (2) order of magnitude of the column's lower and upper bounds. -- The processing start- and end-times. - diff --git a/message_ix/tools/lp_diag/data/Readme.txt b/message_ix/tools/lp_diag/data/Readme.txt deleted file mode 100644 index f8d22c6a6..000000000 --- a/message_ix/tools/lp_diag/data/Readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -mps dir contains large MPS files for actual analysis. Files from this dir - are NOT posted to gitHub. - -mps_tst contains small MPS files for testing the application. Files from this dir - are posted at gitHub. diff --git a/message_ix/tools/lp_diag/lp_diag - Original.py b/message_ix/tools/lp_diag/lp_diag - Original.py deleted file mode 100644 index 8dc510643..000000000 --- a/message_ix/tools/lp_diag/lp_diag - Original.py +++ /dev/null @@ -1,910 +0,0 @@ -""" -Prototype of simple analysis of the MPS-format file -Written by Marek Makowski, ECE Program of IIASA, in March 2023 -""" - -import math - -# import os -# import sys # needed for sys.exit() -import typing -from collections import Counter - -import numpy as np -import pandas as pd - -# from datetime import datetime as dt -# from datetime import timedelta as td -# import matplotlib.pyplot as plt -# from matplotlib import cm -# from matplotlib import colors -# from matplotlib.ticker import LinearLocator # needed for ax.set_major_locator -# import seaborn as sns -# # sns.set() # settings for seaborn plotting style - - -class LPdiag: - """Process the MPS-format input file and provide its basic diagnotics. - - The diagnostics currently includes: - - handling formal errors of the MPS file - - basic statistics of the matrix coefficients. - - Attributes - ---------- - - """ - - def __init__(self): - self.fname = "undefined" # MPS file name, to be defined by rd_mps() call - self.pname = "undefined" # problem name - self.id_rhs = False # True, if rhs_id defined - self.id_range = False # True, if range_id defined - self.id_bnd = False # True, if bnd_id defined - self.rhs_id = "" # id of rhs elements - self.range_id = "" # id of ranges elements (might differ from rhs_id) - self.bnd_id = "" # id of bounds elements - self.infty = "none" # marker for infinity value - self.n_lines = 0 # number of processed lines of the MPS file - self.n_rhs = 0 # number of defined RHS - self.n_ranges = 0 # number of defined ranges - self.n_bounds = 0 # number of defined bounds - # if not os.path.exists(self.rep_dir): - # os.makedirs(self.rep_dir, mode=0o755) - - # dictionaries for searchable names and its indices - # (searching very-long lists is prohibitively slow) - self.row_name = {} # key: row-name, item: its seq_id - self.seq_row = {} # key: row sequence, item: [row-name, lo_bnd, up_bond, type] - self.col_name = {} # key: col-name, item: its seq_id - self.seq_col = {} # key: col-sequence, item: [col-name, lo_bnd, up_bond] - # tmp space for reading COLUMN section of the MPS - self.mat_row = [] # row seq_no of the matrix coef. - self.mat_col = [] # col seq_no the matrix coef. - self.mat_val = [] # matrix coeff. - self.col_curr = "" # current column (initialized to an illegal empty name) - self.gf_seq = ( - -1 - ) # sequence_no of the goal function (objective) row: equal = -1, if undefined - # representation of the LP matrix: - self.mat = pd.DataFrame(columns=["row", "col", "val"]) # LP matrix - # cols attributes: - # self.cols = pd.DataFrame(columns=['seq_id', 'name', 'lo_bnd', 'up_bnd']) - # rows attributes: - # self.rows = pd.DataFrame( - # columns=['seq_id', 'name', 'type', 'lo_bnd', 'up_bnd'] - # ) - - def rd_mps(self, fname): # process the MPS file - print(f"\nReading MPS-format file {fname}.") - self.fname = fname - sections = [ - "NAME", - "ROWS", - "COLUMNS", - "RHS", - "RANGES", - "BOUNDS", - "SOS", - "ENDATA", - ] - - # lists are OK only for small and medium problems - # row_names = [] # names of rows - # row_types = [] # types of rows - # col_names = [] # names of columns - - # wrk vars - n_section = 0 # seq_no of the currently processed MPS-file section - next_sect = 0 # seq_no of the next (to be processed) MPS-file section - # last_sect = -1 # last processed section - - # process the MPS file - with open(self.fname, "r") as reader: - for n_line, line in enumerate(reader): - line = line.rstrip("\n") - # print(f'line {line}') - if line[0] == "*" or len(line) == 0: # skip commented and empty lines - continue - words = line.split() - if line[0] == " ": # continue reading the current MPS section - # columns/matrix (first here because most frequently used) - if n_section == 2: - self.add_coeff(words, n_line) # add column and its coefficients - elif n_section == 1: # rows - self.add_row(words, n_line) # add row and its type - elif n_section == 3: # rhs - self.add_rhs(words, n_line) # process RHS - elif n_section == 4: # ranges - self.add_range(words, n_line) # process range - elif n_section == 5: # bounds - self.add_bnd(words, n_line) # process bound - elif n_section == 6: # SOS section - pass # SOS section not processed - # elif n_section == 7: # end data - # raise Exception( - # "Unexpected execution flow; needs to be explored." - # ) - else: - print(f"MPS record {n_line}, section id {n_section}.") - raise Exception( - f"MPS line '{line}' (line {n_line}) misplaced," - f" processing section {sections[n_section]}." - ) - else: # found a new section - if n_section == 0: # problem-name processed with the section header - pass - elif n_section <= 5: - # print(f'\tData of section {sections[n_section]} processed.') - pass - elif n_section == 6: # SOS - print(f"WARNING: Section {sections[n_section]} not processed.") - else: - raise Exception( - f"Should not come here, n_section = {n_section}." - ) - - # process the head of new section - print(f"Next section found: {line} (line {n_line}).") - self.n_lines = n_line - # last_sect = n_section - n_section = self.next_sec(next_sect, words, sections) - next_sect = n_section + 1 - # print(f'{n_section = }, {next_sect = }') - # end of MPS reading - - # check, if the last required section ('ENDATA') was defined - assert ( - n_section == 7 - ), f'The "ENDATA" section is not declared; last section_id = {n_section}.' - - self.mps_sum() # summarize the processed MPS content - - def next_sec(self, n_exp, words, sections): - # required/optional MPS sections - req_sect = [True, True, True, False, False, False, False, True] - n_line = self.n_lines - n_words = len(words) - if req_sect[n_exp]: # required section must be in the sequence - # assert ( - # words[0] == sections[next_sect] - # ), f"expect section {sections[next_sect]} found: {line}." - if words[0] == sections[n_exp]: # required section found - if n_exp == 0: # store the problem name - assert n_words > 1, ( - f"problem name undefined: line {n_line} has" - f" {n_words} words." - ) - # print(f"\tProblem name line {words[1:]}.") - if n_words == 2: - self.pname = words[1] # store the problem name - else: - self.pname = words[1:] # store the problem name - print(f"\tProblem name: {self.pname}.") - return n_exp # n_sections equals to the expected: n_exp - else: - print(f"section {words} found.") - raise Exception( - f"Required MPS section {sections[n_exp]} undefined" " or misplaced." - ) - else: # the found section does not follow the last processed section - try: - n_section = sections.index(words[0]) - except ValueError: - raise Exception(f"Unknown section: {words} (line {n_line}).") - if n_section < n_exp: - raise Exception( - f"Section {words[0]} (line {n_line}) is misplaced or duplicated." - ) - return n_section - - def mps_sum(self): - # check, if there was at least one N row - # (the first N row assumed to be the objective): - assert self.gf_seq != -1, "objective (goal function) row is undefined." - - # create a df with the matrix coefficients - self.mat = pd.DataFrame( - {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} - ) - self.mat["abs_val"] = abs( - self.mat["val"] - ) # add column with absolute values of coeff. - self.mat["log"] = np.log10(self.mat["abs_val"]).astype( - int - ) # add col with int(log10(coeffs)) - # print(f'matrix after initialization:\n {self.mat}') - - # Finish the MPS processing with the summary of its attributes - dens = f"{float(len(self.mat)) / (len(self.row_name) * len(self.col_name)):.2e}" - print( - f"\nFinished processing {self.n_lines} lines of the MPS file: {self.fname}." - ) - print( - f"LP has: {len(self.row_name)} rows, {len(self.col_name)} cols," - f" {len(self.mat)} non-zeros, matrix density = {dens}." - ) - print( - f"Numbers of redefined: RHS = {self.n_rhs}, ranges = {self.n_ranges}," - f" bounds = {self.n_bounds}." - ) - - # todo: add info on dense rows and cols - - # info on the GF row, RHS, ranges, bounds - df = self.mat.loc[self.mat["row"] == self.gf_seq][ - "val" - ] # df with values of the GF coefficients. - print( - f'\nThe GF (objective) row named "{self.seq_row.get(self.gf_seq)[0]}" has' - f" {len(df)} elements." - ) - print(f"Distribution of the GF (objective) values:\n{df.describe()}") - - def add_row(self, words, n_line): - """Process current line of the ROWS section. - - While processing the ROWS section the row attributes are initialized to the - default (for the corresponding row type) values. The attributes are updated for - optionally defined values in the (also optional) RHS and RANGES sections. The - interpretation of the MPS-format (in particular of values in the RANGES section) - follows the original MPS standard, see e.g., "Advanced Linear Programming," by - Bruce A. Murtagh. or the standard summary at - https://lpsolve.sourceforge.net/5.5/mps-format.htm . - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - row_types = ["N", "E", "G", "L"] # types of rows - n_words = len(words) - assert ( - n_words == 2 - ), f"row declaration (line {n_line}) has {n_words} words instead of 2." - row_type = words[0] - row_name = words[1] - row_seq = len(self.row_name) - assert row_type in row_types, f"unknown row type {row_type} (line {n_line})." - assert ( - row_name not in self.row_name - ), f"duplicated row name: {row_name} (line {n_line})." - if row_type == "N" and self.gf_seq == -1: - self.gf_seq = row_seq - print( - f"\tRow {row_name} (row_seq = {row_seq}) is the objective" - " (goal function) row." - ) - self.row_name.update({row_name: row_seq}) # add to dict of row_names - # store row_{seq, name, type} and the default - # (to be changed in rhs/ranges) [lo_bnd, upp_bnd] - self.row_att(row_seq, row_name, row_type, "rows") - - def add_coeff(self, words, n_line): - """Process current line of the COLUMNS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - # print( - # f"processing line no {n_line}, n_words {n_words}:" - # f" {line}" - # ) - assert n_words in [ - 3, - 5, - ], f"matrix element (line {n_line}) has {n_words} words." - col_name = words[0] - if col_name != self.col_curr: # new column - assert ( - col_name not in self.col_name - ), f"duplicated column name: {col_name} (line {n_line})" - col_seq = len(self.col_name) - self.col_name.update({col_name: col_seq}) - self.seq_col.update({col_seq: [col_name, 0.0, self.infty]}) - self.col_curr = col_name - else: - col_seq = self.col_name.get(col_name) - row_name = words[1] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." - val = float(words[2]) - assert ( - type(val) is float - ), f"string {words[2]} (line {n_line}) is not a number." - # add the matrix element to the lists of: seq_row, seq_col, val - # the lists will be converted to self.mat df after all elements - # will be read - self.mat_row.append(row_seq) - self.mat_col.append(col_seq) - self.mat_val.append(val) - # print(f' matrix element ({row_seq}, {col_seq}) = {val}') - # the next two commands take far too long for large matrices; - # thus tmp-store in three lists - # df2 = pd.DataFrame( - # {"row": row_seq, "col": col_seq, "val": val}, - # index=list(range(1)), - # ) - # self.mat = pd.concat( - # [self.mat, df2], - # axis=0, - # ignore_index=True - # ) - - # proccess the second matrix element in the same MPS row, if defined - if n_words > 3: - assert n_words == 5, ( - f"line {n_line}) has {n_words} words, five words needed" - " fordefining second element in the same MPS line." - ) - row_name = words[3] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." - val = float(words[4]) - assert ( - type(val) is float - ), f"string {words[4]} (line {n_line}) is not a number." - self.mat_row.append(row_seq) - self.mat_col.append(col_seq) - self.mat_val.append(val) - - def add_rhs(self, words, n_line): - """Process current line of the RHS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - - # first RHS record implies RHS/ranges id (might be empty) - if self.n_rhs == 0: - # print(f"first rhs line: {n_line}: '{words}'") - if n_words in [3, 5]: # RHS name/id defined - self.id_rhs = True - self.rhs_id = words[0] - print(f"\tId of RHS: {self.rhs_id}") - else: - self.id_rhs = False - self.rhs_id = "" - print("\tId of RHS: (empty)") - - if self.id_rhs: - n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) - pos_name = 1 # first row-name in words[pos_name] - else: - n_req_wrd = [2, 4] - pos_name = 0 # first row-name in words[pos_name] - - assert n_words in n_req_wrd, ( - f"rhs line {n_line} has {n_words} words, expected" f" {n_req_wrd}." - ) - if self.id_rhs: # check id of the RHS entry, if it was defined - assert words[0] == self.rhs_id, ( - f"RHS id {words[0]}, line {n_line} differ from" - f"expected: {self.rhs_id}." - ) - row_name = words[pos_name] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown RHS row-name {row_name} (line {n_line})." - val = float(words[pos_name + 1]) - assert type(val) is float, ( - f"RHS value {words[pos_name + 1]} (line {n_line}) is not a" " number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "rhs", val) - self.n_rhs += 1 - if n_words == n_req_wrd[1]: # second pair of rhs defined - row_name = words[pos_name + 2] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown RHS row-name {row_name} (line {n_line})." - val = float(words[pos_name + 3]) - assert type(val) is float, ( - f"RHS value {words[pos_name + 1]} (line {n_line}) is" " not a number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "rhs", val) - self.n_rhs += 1 - - def add_range(self, words, n_line): - """Process current line of the RANGES section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - - # first ranges record implies ranges id (might be empty) - if self.n_ranges == 0: - if n_words in [3, 5]: - self.id_range = True - self.range_id = words[0] - print(f"\tId of ranges: {self.range_id}") - else: - self.id_range = False - self.range_id = "" - print("\tId of ranges: (empty)") - - if self.id_range: - n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) - pos_name = 1 # first row-name in words[pos_name] - else: - n_req_wrd = [2, 4] - pos_name = 0 # first row-name in words[pos_name] - - assert ( - n_words in n_req_wrd - ), f"ranges line {n_line} has {n_words} words, expected {n_req_wrd}." - if self.id_range: # check id of the ranges' entry, if it was defined - assert words[0] == self.range_id, ( - f"Ranges id {words[0]}, line {n_line} differ from" - f" expected: {self.range_id}." - ) - row_name = words[pos_name] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown range row-name {row_name} (line {n_line})." - val = float(words[pos_name + 1]) - assert ( - type(val) is float - ), f"Range value {words[pos_name + 1]} (line {n_line}) is not a number." - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "ranges", val) - self.n_ranges += 1 - if n_words == n_req_wrd[1]: # second pair of ranges defined - row_name = words[pos_name + 2] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown ranges row-name {row_name} (line {n_line})." - val = float(words[pos_name + 3]) - assert type(val) is float, ( - f"Ranges value {words[pos_name + 1]} (line {n_line}) is" - " not a number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "ranges", val) - self.n_ranges += 1 - - def add_bnd(self, words, n_line): - """Process current line of the BOUNDS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - # items of the below dictionaries indicate bounds to be modified: - # 1 - low, 2 - upper, 3 - both - bnd_type1 = {"LO": 1, "UP": 2, "FX": 3} # types of bounds requiring value - bnd_type2 = {"MI": 1, "PL": 2, "FR": 3} # types of bounds not requiring value - bnd_type3 = { - "BV": 0, - "LI": 0, - "UI": 0, - "SC": 0, - } # types of bounds legal for int-type vars, not processed yet - - n_words = len(words) - - # first Bounds record implies bounds id (might be empty) - if self.n_bounds == 0: - # print(f"first BOUNDS line: {n_line}: '{words}'") - if n_words == 4 or (n_words == 3 and words[0] in ["FR", "MI", "PL"]): - self.id_bnd = True - self.bnd_id = words[1] - print(f"\tId of BOUNDS: {self.bnd_id}") - else: - self.id_bnd = False - self.bnd_id = "" - print("\tId of BOUNDS: (empty)") - - # number of required words in a line (with/without) required value: - if self.id_bnd: - n_req_wrd = [4, 3] - pos_name = 2 # col-name in words[pos_name] - else: - n_req_wrd = [3, 2] - pos_name = 1 # col-name in words[pos_name] - - assert ( - n_words in n_req_wrd - ), f"bounds line {n_line} has {n_words} words, expected: {n_req_wrd}." - if self.id_bnd: # check id of the BOUNDS line, if it was defined - assert words[1] == self.bnd_id, ( - f"BOUNDS id {words[1]}, line {n_line} differ from " - f"expected id: {self.bnd_id}." - ) - col_name = words[pos_name] - col_seq = self.col_name.get(col_name) - assert ( - col_seq is not None - ), f"unknown BOUNDS col-name {col_name} (line {n_line})." - attr = self.seq_col.get(col_seq) # [col_name, lo_bnd, up_bnd] - - typ = words[0] - if typ in bnd_type1: # bound-types that require a value - val = float(words[pos_name + 1]) - assert ( - type(val) is float - ), f"BOUND value {words[pos_name + 1]} (line {n_line}) is not a number." - at_pos = bnd_type1.get(typ) - if at_pos == 3: # set both bounds - attr[1] = attr[2] = val - else: - attr[at_pos] = val - elif typ in bnd_type2: # value not needed; - # therefore it is neither checked nor processed - at_pos = bnd_type2.get(typ) - if at_pos == 3: # set both bounds - attr[1] = attr[2] = self.infty - else: - attr[at_pos] = self.infty - elif typ in bnd_type3: - raise Exception( - f"Bound type {typ} of integer var. (line {n_line}) not" - " processed yet." - ) - else: - raise Exception(f"Unknown bound type {typ} (line {n_line}).") - self.seq_col.update({col_seq: attr}) # store the updated col-attributes - self.n_bounds += 1 - - def row_att(self, row_seq, row_name, row_type, sec_name, val=0.0): - """Process values defined in ROWS, RHS and RANGES sections and store/update - the corresponding row attributes. - - While processing the ROWS section the row attributes are initialized to the - default (for the corresponding row type) values. The attributes are updated for - optionally defined values in the (also optional) RHS and RANGES sections. The - interpretation of the MPS-format (in particular of values in the RANGES section) - follows the original MPS standard, see e.g., "Advanced Linear Programming," by - Bruce A. Murtagh. or the standard summary at - https://lpsolve.sourceforge.net/5.5/mps-format.htm . - - Attributes - ---------- - row_seq: int - position of row in dictionaries and the matrix df - row_name: str - row name (defined in the ROWS section) - row_type: str - row type (defined in the ROWS section) - sec_name: str - identifies the MPS section: either 'rows' (for initialization) or 'rhs' or - 'ranges' (for updates) - val: float - value of the row attribute defining either lo_bnd or up_bnd of the row - (the type checked while processing the MPS section) - """ - - type2bnd = { - "E": [0.0, 0.0], - "G": [0.0, self.infty], - "L": [self.infty, 0.0], - "N": [self.infty, self.infty], - } - assert row_seq == self.row_name.get( - row_name - ), f"{row_seq=} should be equal to: {self.row_name.get(row_name)}." - assert row_type in type2bnd, f"undefined row type {row_type=} for {row_name=}." - if sec_name == "rows": # initialize row attributes (used in ROW section) - low_upp = type2bnd.get(row_type) - self.seq_row.update({row_seq: [row_name, low_upp[0], low_upp[1], row_type]}) - # print( - # f"attributes of row {row_name} initialized in section {sec_name} to" - # f"{self.seq_row.get(row_seq)}." - # ) - elif sec_name in [ - "rhs", - "ranges", - ]: # update row attributes (used in RHS and ranges sections) - if row_type == "N": - print(f"{sec_name} value {val} ignored for neutral row {row_name}.") - return - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - if sec_name == "rhs": # process the RHS value - if row_type == "G": # update lo_bnd - attr[1] = val - elif row_type == "L": # update up_bnd - attr[2] = val - elif row_type == "E": # update both bounds - attr[1] = attr[2] = val - else: # process the ranges value - if row_type == "G": # update up_bnd - attr[2] = attr[1] + abs(val) - elif row_type == "L": # update lo_bnd - attr[1] = attr[2] - abs(val) - elif row_type == "E": # update both bounds - if val > 0: - attr[2] = attr[1] + val - else: - attr[1] = attr[2] - abs(val) - self.seq_row.update({row_seq: attr}) - # print( - # f"attributes of row {row_name} updated in section {sec_name} to" - # f" {attr}." - # ) - else: # update row attributes (used in RHS and ranges sections) - raise Exception(f"row_att() should not be called for {sec_name=}.") - - def stat(self, lo_tail=-7, up_tail=6): - """Basic statistics of the matrix coefficients. - - Focus on distributions of magnitudes of non-zero coeff. represented by values - of int(log10(abs(coeff))). - Additionally, tails (low and upp) of the distributions are reported. - - Attributes - ---------- - lo_tail: int - Magnitude order of the low-tail (-7 denotes values < 10^(-6)) - up_tail: int - Magnitude order of the upper-tail (6 denotes values >= 10^6) - """ - - # print(f'\nDistribution of non-zero values:\n{self.mat["val"].describe()}') - print( - f'\nDistribution of abs(non-zero) values:\n{self.mat["abs_val"].describe()}' - ) - print( - f'\nDistribution of int(log10(abs(values))):\n{self.mat["log"].describe()}' - ) - min_logv = self.mat["log"].min() - max_logv = self.mat["log"].max() - - # count numbers of coeffs for each order of magnitude of their value - magn_dist = Counter(self.mat["log"]) - magn_dist = dict( - sorted(magn_dist.items()) - ) # counter (sorted by occurances) --> dict sorted by magnitudes - print( - "\nDistribution of int(log10(abs(values))) sorted by magnitudes of values:" - ) - print( - f"range = [{min_logv}, {max_logv}] (magnitudes with zero-occurrences" - " skipped)." - ) - for magn in magn_dist: - print(f"{magn:3d}: {magn_dist[magn]:7d}") - - if lo_tail > up_tail: - print(f"Overlapping distribution tails ({lo_tail}, {up_tail}) reset to 0.") - lo_tail = up_tail = 0 - - # low-tail of the distribution - if lo_tail < min_logv: - print( - f"\nNo log10(values) in the requested low-tail (<= {lo_tail}) of the" - " distribution." - ) - else: - print( - "\nDistribution of log10(values) in the requested low-tail (<=" - f" {lo_tail}) of the distribution." - ) - print(f'{self.mat.loc[self.mat["log"] <= lo_tail].describe()}') - for val in [*range(min_logv, lo_tail + 1)]: - print( - f"Number of log10(values) == {val}:" - f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" - ) - # up-tail of the distribution - if max_logv < up_tail: - print( - f"\nNo log10(values) in the requested upper-tail (>= {up_tail}) of the" - " distribution." - ) - else: - print( - "\nDistribution of log10(values) in the requested upp-tail (>=" - f" {up_tail}) of the distribution." - ) - print(f'{self.mat.loc[self.mat["log"] >= up_tail].describe()}') - for val in [*range(up_tail, max_logv + 1)]: - print( - f"Number of log10(values) == {val}:" - f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" - ) - - def out_loc(self, small=True, thresh=-7, max_rec=500): - """Locations of outliers, i.e., elements having small/large coeff values. - - Locations of outliers (in the term of the matrix coefficient values). - The provided ranges of values in the corresponding row/col indicate potential - of the simple scaling. - - Attributes - ---------- - small: bool - True/False for threshold of either small or large coefficients - thresh: int - Magnitude of the threshold (in: int(log10(abs(coeff))), i.e. -7 denotes - values < 10^(-6)) - max_rec: int - Maximum number of processed coefficients - """ - - if small: # sub-matrix composed of only small-value outliers - df = self.mat.loc[self.mat["log"] <= thresh] - print( - f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' - f" values of log10(values) <= {thresh})." - ) - else: # large-value outliers - df = self.mat.loc[self.mat["log"] >= thresh] - print( - f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' - f" values of log10(values) >= {thresh})." - ) - df1 = df.sort_values( - "row" - ) # sort the df with outliers ascending seq_id of rows - df1.reset_index() - col_out = [] # col_seq of outliers' cols - for n_rows, (indx, row) in enumerate(df1.iterrows()): - assert ( - n_rows < max_rec - ), "To process all requested coeffs modify the safety limit assertion." - row_seq, row_name = self.ent_inf( - row, True - ) # row seq_id and name of the current coeff. - col_seq, col_name = self.ent_inf( - row, False - ) # col seq_id and name of the current coeff. - if col_seq not in col_out: - col_out.append(col_seq) - else: - print(f"{col_seq = } already in another outlier row.") - print( - f'Coeff. ({row_seq}, {col_seq}): val = {row["val"]:.4e}, log(val) =' - f' {row["log"]:n}' - ) - df_row_out = df1.loc[df1["row"] == row_seq] # df with only outlier elements - df_row_all = self.mat.loc[ - self.mat["row"] == row_seq - ] # df with all elements - # print(f'matrix elements in the same row:\n{df_row}') - print( - f"\tRow {row_name} {self.ent_range(row_seq, True)} has" - f" {df_row_out['log'].count()} outlier-coeff. of magnitudes in" - f" [{df_row_out['log'].min()}, {df_row_out['log'].max()}]" - ) - print( - f"\tRow {row_name} {self.ent_range(row_seq, True)} has" - f" {df_row_all['log'].count()} (all)-coeff. of magnitudes in" - f" [{df_row_all['log'].min()}, {df_row_all['log'].max()}]" - ) - # a column may include more than 1 outlier; - # therefore columns with outliers reported below: - # df with outliers in the same col: - # df_col = df1.loc[df1['col'] == col_seq] - # print( - # f"\tCol {col_name} {self.ent_range(col_seq, False)} has " - # f"{df_col["log"].count()} outlier coeff. of magnitudes in " - # f"[{df_col["log"].min()}, {df_col["log"].max()}]" - # ) - print( - "\nColumn-wise locations of outlier coefficients in" - f" {len(col_out)} columns:" - ) - col_out.sort() - for col_seq in col_out: - col_name = self.seq_col.get(col_seq)[0] - df_col = self.mat.loc[ - self.mat["col"] == col_seq - ] # df with elements in the same col - print( - f"\tCol {col_name} {self.ent_range(col_seq, False)} has" - f" {df_col['log'].count()} coeff. of magnitudes in" - f" [{df_col['log'].min()}, {df_col['log'].max()}]" - ) - - def ent_inf(self, mat_row, by_row=True) -> typing.Tuple[int, str]: - """Return info on the entity (either row or col) defining the selected matrix - coefficient. - - Each row of the dataFrame contains the definition (composed of the row_seq, - col_seq, value, log(value)) of one matrix coefficient. - The function returns seq_id and name of either row or col of the currently - considered coeff. - - Attributes - ---------- - mat_row: dataFrame row - record of the df with the data of currently processed element - by_row: bool - True/False for returning the seq_id and name of the corresponding row/col - """ - - if by_row: - # if seq_row {} not stored, then: - # names = [k for k, idx in self.row_name.items() if idx == ent_seq] - ent_seq = int(mat_row["row"]) - name = self.seq_row.get(ent_seq)[0] - else: - ent_seq = int(mat_row["col"]) - name = self.seq_col.get(ent_seq)[0] - return ent_seq, name - - def ent_range(self, seq_id, by_row=True) -> str: - """Return formatted string representing ranges of feasible values of either a - row or a column. - - The returned values of ranges are either 'none' (for plus/minus infinity) or - int(log10(abs(val))) for other values. Small values, defined as - abs(value) < 1e-10, are represented by 0. - - Attributes - ---------- - seq_id: int - sequence number of either row or col. - by_row: bool - True/False for returning the seq_id and name of the corresponding row/col. - """ - - if by_row: - attr = self.seq_row.get(seq_id) # [row_name, lo_bnd, up_bnd, row_type] - pass - else: - attr = self.seq_col.get(seq_id) # [col_name, lo_bnd, up_bnd] - pass - s = [] # strings representing lo/up-bounds - for pos in [0, 1]: - val = attr[pos + 1] # 0-th element is the name - if val == self.infty: # used for both infinites (positive and negative) - s.append(self.infty) - else: - if type(val) is int: - val = float(val) - if abs(val) < 1e-10: - s.append("0") # same string for int and float zeros - else: - val = int(math.log10(abs(val))) - s.append(f"{val}") # small integer value, no formatting needed - ret = "[" + s[0] + ", " + s[1] + "]" - return ret # the range is formatted as: '[lo_bnd, up_bnd]' - - def plot_hist(self): - """Plot histograms.""" - # todo: might not be needed; therefore the implementation postponed diff --git a/message_ix/tools/lp_diag/lp_diag - Yoga edit.py b/message_ix/tools/lp_diag/lp_diag - Yoga edit.py deleted file mode 100644 index 6118e34cb..000000000 --- a/message_ix/tools/lp_diag/lp_diag - Yoga edit.py +++ /dev/null @@ -1,939 +0,0 @@ -""" -Prototype of simple analysis of the MPS-format file -Written by Marek Makowski, ECE Program of IIASA, in March 2023 -""" - -import math - -# import os -# import sys # needed for sys.exit() -import typing -from collections import Counter - -import numpy as np -import pandas as pd - -# from datetime import datetime as dt -# from datetime import timedelta as td -# import matplotlib.pyplot as plt -# from matplotlib import cm -# from matplotlib import colors -# from matplotlib.ticker import LinearLocator # needed for ax.set_major_locator -# import seaborn as sns -# # sns.set() # settings for seaborn plotting style - - -class LPdiag: - """Process the MPS-format input file and provide its basic diagnotics. - - The diagnostics currently includes: - - handling formal errors of the MPS file - - basic statistics of the matrix coefficients. - - Attributes - ---------- - - """ - - def __init__(self): - self.fname = "undefined" # MPS file name, to be defined by rd_mps() call - self.pname = "undefined" # problem name - self.id_rhs = False # True, if rhs_id defined - self.id_range = False # True, if range_id defined - self.id_bnd = False # True, if bnd_id defined - self.rhs_id = "" # id of rhs elements - self.range_id = "" # id of ranges elements (might differ from rhs_id) - self.bnd_id = "" # id of bounds elements - self.infty = "none" # marker for infinity value - self.n_lines = 0 # number of processed lines of the MPS file - self.n_rhs = 0 # number of defined RHS - self.n_ranges = 0 # number of defined ranges - self.n_bounds = 0 # number of defined bounds - # if not os.path.exists(self.rep_dir): - # os.makedirs(self.rep_dir, mode=0o755) - - # dictionaries for searchable names and its indices - # (searching very-long lists is prohibitively slow) - self.row_name = {} # key: row-name, item: its seq_id - self.seq_row = {} # key: row sequence, item: [row-name, lo_bnd, up_bond, type] - self.col_name = {} # key: col-name, item: its seq_id - self.seq_col = {} # key: col-sequence, item: [col-name, lo_bnd, up_bond] - # tmp space for reading COLUMN section of the MPS - self.mat_row = [] # row seq_no of the matrix coef. - self.mat_col = [] # col seq_no the matrix coef. - self.mat_val = [] # matrix coeff. - self.col_curr = "" # current column (initialized to an illegal empty name) - self.gf_seq = ( - -1 - ) # sequence_no of the goal function (objective) row: equal = -1, if undefined - # representation of the LP matrix: - self.mat = pd.DataFrame(columns=["row", "col", "val"]) # LP matrix - # cols attributes: - # self.cols = pd.DataFrame(columns=['seq_id', 'name', 'lo_bnd', 'up_bnd']) - # rows attributes: - # self.rows = pd.DataFrame( - # columns=['seq_id', 'name', 'type', 'lo_bnd', 'up_bnd'] - # ) - print('[YOGA TEST 8] self.mat:\n', self.mat) - - - def rd_mps(self, fname): # process the MPS file - print(f"\nReading MPS-format file {fname}.") - self.fname = fname - sections = [ - "NAME", - "ROWS", - "COLUMNS", - "RHS", - "RANGES", - "BOUNDS", - "SOS", - "ENDATA", - ] - - # lists are OK only for small and medium problems - # row_names = [] # names of rows - # row_types = [] # types of rows - # col_names = [] # names of columns - - # wrk vars - n_section = 0 # seq_no of the currently processed MPS-file section - next_sect = 0 # seq_no of the next (to be processed) MPS-file section - # last_sect = -1 # last processed section - - # process the MPS file - with open(self.fname, "r") as reader: - for n_line, line in enumerate(reader): - line = line.rstrip("\n") - # print(f'line {line}') - if line[0] == "*" or len(line) == 0: # skip commented and empty lines - continue - words = line.split() - if line[0] == " ": # continue reading the current MPS section - # columns/matrix (first here because most frequently used) - if n_section == 2: - self.add_coeff(words, n_line) # add column and its coefficients - elif n_section == 1: # rows - self.add_row(words, n_line) # add row and its type - elif n_section == 3: # rhs - self.add_rhs(words, n_line) # process RHS - elif n_section == 4: # ranges - self.add_range(words, n_line) # process range - elif n_section == 5: # bounds - self.add_bnd(words, n_line) # process bound - elif n_section == 6: # SOS section - pass # SOS section not processed - # elif n_section == 7: # end data - # raise Exception( - # "Unexpected execution flow; needs to be explored." - # ) - else: - print(f"MPS record {n_line}, section id {n_section}.") - raise Exception( - f"MPS line '{line}' (line {n_line}) misplaced," - f" processing section {sections[n_section]}." - ) - else: # found a new section - if n_section == 0: # problem-name processed with the section header - pass - elif n_section <= 5: - # print(f'\tData of section {sections[n_section]} processed.') - pass - elif n_section == 6: # SOS - print(f"WARNING: Section {sections[n_section]} not processed.") - else: - raise Exception( - f"Should not come here, n_section = {n_section}." - ) - - # process the head of new section - print(f"Next section found: {line} (line {n_line}).") - self.n_lines = n_line - # last_sect = n_section - n_section = self.next_sec(next_sect, words, sections) - next_sect = n_section + 1 - # print(f'{n_section = }, {next_sect = }') - # end of MPS reading - - # check, if the last required section ('ENDATA') was defined - assert ( - n_section == 7 - ), f'The "ENDATA" section is not declared; last section_id = {n_section}.' - - self.mps_sum() # summarize the processed MPS content - - def next_sec(self, n_exp, words, sections): - # required/optional MPS sections - req_sect = [True, True, True, False, False, False, False, True] - n_line = self.n_lines - n_words = len(words) - if req_sect[n_exp]: # required section must be in the sequence - # assert ( - # words[0] == sections[next_sect] - # ), f"expect section {sections[next_sect]} found: {line}." - if words[0] == sections[n_exp]: # required section found - if n_exp == 0: # store the problem name - assert n_words > 1, ( - f"problem name undefined: line {n_line} has" - f" {n_words} words." - ) - # print(f"\tProblem name line {words[1:]}.") - if n_words == 2: - self.pname = words[1] # store the problem name - else: - self.pname = words[1:] # store the problem name - print(f"\tProblem name: {self.pname}.") - return n_exp # n_sections equals to the expected: n_exp - else: - print(f"section {words} found.") - raise Exception( - f"Required MPS section {sections[n_exp]} undefined" " or misplaced." - ) - else: # the found section does not follow the last processed section - try: - n_section = sections.index(words[0]) - except ValueError: - raise Exception(f"Unknown section: {words} (line {n_line}).") - if n_section < n_exp: - raise Exception( - f"Section {words[0]} (line {n_line}) is misplaced or duplicated." - ) - return n_section - - def mps_sum(self): - # check, if there was at least one N row - # (the first N row assumed to be the objective): - assert self.gf_seq != -1, "objective (goal function) row is undefined." - - # create a df with the matrix coefficients - self.mat = pd.DataFrame( - # {"row": self.mat_row, "col": self.mat_row, "val": self.mat_val} # this is the original line - {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} # this is Yoga edited line - ) - self.mat["abs_val"] = abs( - self.mat["val"] - ) # add column with absolute values of coeff. - self.mat["log"] = np.log10(self.mat["abs_val"]).astype( - int - ) # add col with int(log10(coeffs)) - # print(f'matrix after initialization:\n {self.mat}') - print('[YOGA TEST 10] self.mat:\n', self.mat) - print('[YOGA TEST 11]: writing dataframe to excel') - row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() - col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() - matrix = (self.mat['val'].set_index(['row','col'],drop=True) - .unstack().fillna(0).rename(index=row_name,columns=col_name)) - #with pd.ExcelWriter('coeff_matrix.xlsx') as writer: - # self.mat.to_excel(writer, sheet_name='Matrix') - # df_seq_row_name.to_excel(writer, sheet_name='Row_Name') - # df_seq_col_name.to_excel(writer, sheet_name='Col_Name') - cmatrix = matrix.to_xarray() - cmatrix.to_netcdf('matrix.nc') - - - # Finish the MPS processing with the summary of its attributes - dens = f"{float(len(self.mat)) / (len(self.row_name) * len(self.col_name)):.2e}" - print( - f"\nFinished processing {self.n_lines} lines of the MPS file: {self.fname}." - ) - print( - f"LP has: {len(self.row_name)} rows, {len(self.col_name)} cols," - f" {len(self.mat)} non-zeros, matrix density = {dens}." - ) - print( - f"Numbers of redefined: RHS = {self.n_rhs}, ranges = {self.n_ranges}," - f" bounds = {self.n_bounds}." - ) - - # todo: add info on dense rows and cols - - # info on the GF row, RHS, ranges, bounds - df = self.mat.loc[self.mat["row"] == self.gf_seq][ - "val" - ] # df with values of the GF coefficients. - print( - f'\nThe GF (objective) row named "{self.seq_row.get(self.gf_seq)[0]}" has' - f" {len(df)} elements." - ) - print(f"Distribution of the GF (objective) values:\n{df.describe()}") - print('[YOGA TEST 9] self.mat:\n', self.mat) - - - def add_row(self, words, n_line): - """Process current line of the ROWS section. - - While processing the ROWS section the row attributes are initialized to the - default (for the corresponding row type) values. The attributes are updated for - optionally defined values in the (also optional) RHS and RANGES sections. The - interpretation of the MPS-format (in particular of values in the RANGES section) - follows the original MPS standard, see e.g., "Advanced Linear Programming," by - Bruce A. Murtagh. or the standard summary at - https://lpsolve.sourceforge.net/5.5/mps-format.htm . - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - row_types = ["N", "E", "G", "L"] # types of rows - n_words = len(words) - assert ( - n_words == 2 - ), f"row declaration (line {n_line}) has {n_words} words instead of 2." - row_type = words[0] - row_name = words[1] - row_seq = len(self.row_name) - assert row_type in row_types, f"unknown row type {row_type} (line {n_line})." - assert ( - row_name not in self.row_name - ), f"duplicated row name: {row_name} (line {n_line})." - if row_type == "N" and self.gf_seq == -1: - self.gf_seq = row_seq - print( - f"\tRow {row_name} (row_seq = {row_seq}) is the objective" - " (goal function) row." - ) - self.row_name.update({row_name: row_seq}) # add to dict of row_names - # store row_{seq, name, type} and the default - # (to be changed in rhs/ranges) [lo_bnd, upp_bnd] - self.row_att(row_seq, row_name, row_type, "rows") - - def add_coeff(self, words, n_line): - """Process current line of the COLUMNS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - # print( - # f"processing line no {n_line}, n_words {n_words}:" - # f" {line}" - # ) - assert n_words in [ - 3, - 5, - ], f"matrix element (line {n_line}) has {n_words} words." - col_name = words[0] - if col_name != self.col_curr: # new column - assert ( - col_name not in self.col_name - ), f"duplicated column name: {col_name} (line {n_line})" - col_seq = len(self.col_name) - self.col_name.update({col_name: col_seq}) - self.seq_col.update({col_seq: [col_name, 0.0, self.infty]}) - self.col_curr = col_name - else: - col_seq = self.col_name.get(col_name) - row_name = words[1] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." - val = float(words[2]) - assert ( - type(val) is float - ), f"string {words[2]} (line {n_line}) is not a number." - # add the matrix element to the lists of: seq_row, seq_col, val - # the lists will be converted to self.mat df after all elements - # will be read - self.mat_row.append(row_seq) - self.mat_col.append(col_seq) - self.mat_val.append(val) - print('[YOGA TEST 5]', - '\nROW, COL, VAL: ', row_seq, col_seq, val) - # print(f' matrix element ({row_seq}, {col_seq}) = {val}') - # the next two commands take far too long for large matrices; - # thus tmp-store in three lists - # df2 = pd.DataFrame( - # {"row": row_seq, "col": col_seq, "val": val}, - # index=list(range(1)), - # ) - # self.mat = pd.concat( - # [self.mat, df2], - # axis=0, - # ignore_index=True - # ) - - # proccess the second matrix element in the same MPS row, if defined - if n_words > 3: - assert n_words == 5, ( - f"line {n_line}) has {n_words} words, five words needed" - " fordefining second element in the same MPS line." - ) - row_name = words[3] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." - val = float(words[4]) - assert ( - type(val) is float - ), f"string {words[4]} (line {n_line}) is not a number." - self.mat_row.append(row_seq) - self.mat_col.append(col_seq) - self.mat_val.append(val) - print('[YOGA TEST 6]', - '\nROW, COL, VAL: ', row_seq, col_seq, val) - - - def add_rhs(self, words, n_line): - """Process current line of the RHS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - - # first RHS record implies RHS/ranges id (might be empty) - if self.n_rhs == 0: - # print(f"first rhs line: {n_line}: '{words}'") - if n_words in [3, 5]: # RHS name/id defined - self.id_rhs = True - self.rhs_id = words[0] - print(f"\tId of RHS: {self.rhs_id}") - else: - self.id_rhs = False - self.rhs_id = "" - print("\tId of RHS: (empty)") - - if self.id_rhs: - n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) - pos_name = 1 # first row-name in words[pos_name] - else: - n_req_wrd = [2, 4] - pos_name = 0 # first row-name in words[pos_name] - - assert n_words in n_req_wrd, ( - f"rhs line {n_line} has {n_words} words, expected" f" {n_req_wrd}." - ) - if self.id_rhs: # check id of the RHS entry, if it was defined - assert words[0] == self.rhs_id, ( - f"RHS id {words[0]}, line {n_line} differ from" - f"expected: {self.rhs_id}." - ) - row_name = words[pos_name] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown RHS row-name {row_name} (line {n_line})." - val = float(words[pos_name + 1]) - assert type(val) is float, ( - f"RHS value {words[pos_name + 1]} (line {n_line}) is not a" " number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "rhs", val) - self.n_rhs += 1 - if n_words == n_req_wrd[1]: # second pair of rhs defined - row_name = words[pos_name + 2] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown RHS row-name {row_name} (line {n_line})." - val = float(words[pos_name + 3]) - assert type(val) is float, ( - f"RHS value {words[pos_name + 1]} (line {n_line}) is" " not a number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "rhs", val) - self.n_rhs += 1 - - def add_range(self, words, n_line): - """Process current line of the RANGES section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - - # first ranges record implies ranges id (might be empty) - if self.n_ranges == 0: - if n_words in [3, 5]: - self.id_range = True - self.range_id = words[0] - print(f"\tId of ranges: {self.range_id}") - else: - self.id_range = False - self.range_id = "" - print("\tId of ranges: (empty)") - - if self.id_range: - n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) - pos_name = 1 # first row-name in words[pos_name] - else: - n_req_wrd = [2, 4] - pos_name = 0 # first row-name in words[pos_name] - - assert ( - n_words in n_req_wrd - ), f"ranges line {n_line} has {n_words} words, expected {n_req_wrd}." - if self.id_range: # check id of the ranges' entry, if it was defined - assert words[0] == self.range_id, ( - f"Ranges id {words[0]}, line {n_line} differ from" - f" expected: {self.range_id}." - ) - row_name = words[pos_name] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown range row-name {row_name} (line {n_line})." - val = float(words[pos_name + 1]) - assert ( - type(val) is float - ), f"Range value {words[pos_name + 1]} (line {n_line}) is not a number." - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "ranges", val) - self.n_ranges += 1 - if n_words == n_req_wrd[1]: # second pair of ranges defined - row_name = words[pos_name + 2] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown ranges row-name {row_name} (line {n_line})." - val = float(words[pos_name + 3]) - assert type(val) is float, ( - f"Ranges value {words[pos_name + 1]} (line {n_line}) is" - " not a number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "ranges", val) - self.n_ranges += 1 - - def add_bnd(self, words, n_line): - """Process current line of the BOUNDS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - # items of the below dictionaries indicate bounds to be modified: - # 1 - low, 2 - upper, 3 - both - bnd_type1 = {"LO": 1, "UP": 2, "FX": 3} # types of bounds requiring value - bnd_type2 = {"MI": 1, "PL": 2, "FR": 3} # types of bounds not requiring value - bnd_type3 = { - "BV": 0, - "LI": 0, - "UI": 0, - "SC": 0, - } # types of bounds legal for int-type vars, not processed yet - - n_words = len(words) - - # first Bounds record implies bounds id (might be empty) - if self.n_bounds == 0: - # print(f"first BOUNDS line: {n_line}: '{words}'") - if n_words == 4 or (n_words == 3 and words[0] in ["FR", "MI", "PL"]): - self.id_bnd = True - self.bnd_id = words[1] - print(f"\tId of BOUNDS: {self.bnd_id}") - else: - self.id_bnd = False - self.bnd_id = "" - print("\tId of BOUNDS: (empty)") - - # number of required words in a line (with/without) required value: - if self.id_bnd: - n_req_wrd = [4, 3] - pos_name = 2 # col-name in words[pos_name] - else: - n_req_wrd = [3, 2] - pos_name = 1 # col-name in words[pos_name] - - assert ( - n_words in n_req_wrd - ), f"bounds line {n_line} has {n_words} words, expected: {n_req_wrd}." - if self.id_bnd: # check id of the BOUNDS line, if it was defined - assert words[1] == self.bnd_id, ( - f"BOUNDS id {words[1]}, line {n_line} differ from " - f"expected id: {self.bnd_id}." - ) - col_name = words[pos_name] - col_seq = self.col_name.get(col_name) - assert ( - col_seq is not None - ), f"unknown BOUNDS col-name {col_name} (line {n_line})." - attr = self.seq_col.get(col_seq) # [col_name, lo_bnd, up_bnd] - - typ = words[0] - if typ in bnd_type1: # bound-types that require a value - val = float(words[pos_name + 1]) - assert ( - type(val) is float - ), f"BOUND value {words[pos_name + 1]} (line {n_line}) is not a number." - at_pos = bnd_type1.get(typ) - if at_pos == 3: # set both bounds - attr[1] = attr[2] = val - else: - attr[at_pos] = val - elif typ in bnd_type2: # value not needed; - # therefore it is neither checked nor processed - at_pos = bnd_type2.get(typ) - if at_pos == 3: # set both bounds - attr[1] = attr[2] = self.infty - else: - attr[at_pos] = self.infty - elif typ in bnd_type3: - raise Exception( - f"Bound type {typ} of integer var. (line {n_line}) not" - " processed yet." - ) - else: - raise Exception(f"Unknown bound type {typ} (line {n_line}).") - self.seq_col.update({col_seq: attr}) # store the updated col-attributes - self.n_bounds += 1 - - def row_att(self, row_seq, row_name, row_type, sec_name, val=0.0): - """Process values defined in ROWS, RHS and RANGES sections and store/update - the corresponding row attributes. - - While processing the ROWS section the row attributes are initialized to the - default (for the corresponding row type) values. The attributes are updated for - optionally defined values in the (also optional) RHS and RANGES sections. The - interpretation of the MPS-format (in particular of values in the RANGES section) - follows the original MPS standard, see e.g., "Advanced Linear Programming," by - Bruce A. Murtagh. or the standard summary at - https://lpsolve.sourceforge.net/5.5/mps-format.htm . - - Attributes - ---------- - row_seq: int - position of row in dictionaries and the matrix df - row_name: str - row name (defined in the ROWS section) - row_type: str - row type (defined in the ROWS section) - sec_name: str - identifies the MPS section: either 'rows' (for initialization) or 'rhs' or - 'ranges' (for updates) - val: float - value of the row attribute defining either lo_bnd or up_bnd of the row - (the type checked while processing the MPS section) - """ - - type2bnd = { - "E": [0.0, 0.0], - "G": [0.0, self.infty], - "L": [self.infty, 0.0], - "N": [self.infty, self.infty], - } - assert row_seq == self.row_name.get( - row_name - ), f"{row_seq=} should be equal to: {self.row_name.get(row_name)}." - assert row_type in type2bnd, f"undefined row type {row_type=} for {row_name=}." - if sec_name == "rows": # initialize row attributes (used in ROW section) - low_upp = type2bnd.get(row_type) - self.seq_row.update({row_seq: [row_name, low_upp[0], low_upp[1], row_type]}) - # print( - # f"attributes of row {row_name} initialized in section {sec_name} to" - # f"{self.seq_row.get(row_seq)}." - # ) - elif sec_name in [ - "rhs", - "ranges", - ]: # update row attributes (used in RHS and ranges sections) - if row_type == "N": - print(f"{sec_name} value {val} ignored for neutral row {row_name}.") - return - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - if sec_name == "rhs": # process the RHS value - if row_type == "G": # update lo_bnd - attr[1] = val - elif row_type == "L": # update up_bnd - attr[2] = val - elif row_type == "E": # update both bounds - attr[1] = attr[2] = val - else: # process the ranges value - if row_type == "G": # update up_bnd - attr[2] = attr[1] + abs(val) - elif row_type == "L": # update lo_bnd - attr[1] = attr[2] - abs(val) - elif row_type == "E": # update both bounds - if val > 0: - attr[2] = attr[1] + val - else: - attr[1] = attr[2] - abs(val) - self.seq_row.update({row_seq: attr}) - # print( - # f"attributes of row {row_name} updated in section {sec_name} to" - # f" {attr}." - # ) - else: # update row attributes (used in RHS and ranges sections) - raise Exception(f"row_att() should not be called for {sec_name=}.") - - def stat(self, lo_tail=-7, up_tail=6): - """Basic statistics of the matrix coefficients. - - Focus on distributions of magnitudes of non-zero coeff. represented by values - of int(log10(abs(coeff))). - Additionally, tails (low and upp) of the distributions are reported. - - Attributes - ---------- - lo_tail: int - Magnitude order of the low-tail (-7 denotes values < 10^(-6)) - up_tail: int - Magnitude order of the upper-tail (6 denotes values >= 10^6) - """ - - # print(f'\nDistribution of non-zero values:\n{self.mat["val"].describe()}') - print( - f'\nDistribution of abs(non-zero) values:\n{self.mat["abs_val"].describe()}' - ) - print( - f'\nDistribution of int(log10(abs(values))):\n{self.mat["log"].describe()}' - ) - min_logv = self.mat["log"].min() - max_logv = self.mat["log"].max() - - # count numbers of coeffs for each order of magnitude of their value - magn_dist = Counter(self.mat["log"]) - magn_dist = dict( - sorted(magn_dist.items()) - ) # counter (sorted by occurances) --> dict sorted by magnitudes - print( - "\nDistribution of int(log10(abs(values))) sorted by magnitudes of values:" - ) - print( - f"range = [{min_logv}, {max_logv}] (magnitudes with zero-occurrences" - " skipped)." - ) - for magn in magn_dist: - print(f"{magn:3d}: {magn_dist[magn]:7d}") - - if lo_tail > up_tail: - print(f"Overlapping distribution tails ({lo_tail}, {up_tail}) reset to 0.") - lo_tail = up_tail = 0 - - # low-tail of the distribution - if lo_tail < min_logv: - print( - f"\nNo log10(values) in the requested low-tail (<= {lo_tail}) of the" - " distribution." - ) - else: - print( - "\nDistribution of log10(values) in the requested low-tail (<=" - f" {lo_tail}) of the distribution." - ) - print(f'{self.mat.loc[self.mat["log"] <= lo_tail].describe()}') - for val in [*range(min_logv, lo_tail + 1)]: - print( - f"Number of log10(values) == {val}:" - f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" - ) - # up-tail of the distribution - if max_logv < up_tail: - print( - f"\nNo log10(values) in the requested upper-tail (>= {up_tail}) of the" - " distribution." - ) - else: - print( - "\nDistribution of log10(values) in the requested upp-tail (>=" - f" {up_tail}) of the distribution." - ) - print(f'{self.mat.loc[self.mat["log"] >= up_tail].describe()}') - for val in [*range(up_tail, max_logv + 1)]: - print( - f"Number of log10(values) == {val}:" - f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" - ) - - def out_loc(self, small=True, thresh=-7, max_rec=500): - """Locations of outliers, i.e., elements having small/large coeff values. - - Locations of outliers (in the term of the matrix coefficient values). - The provided ranges of values in the corresponding row/col indicate potential - of the simple scaling. - - Attributes - ---------- - small: bool - True/False for threshold of either small or large coefficients - thresh: int - Magnitude of the threshold (in: int(log10(abs(coeff))), i.e. -7 denotes - values < 10^(-6)) - max_rec: int - Maximum number of processed coefficients - """ - print('[YOGA TEST 7] self.mat:\n', self.mat) - - if small: # sub-matrix composed of only small-value outliers - df = self.mat.loc[self.mat["log"] <= thresh] - print( - f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' - f" values of log10(values) <= {thresh})." - ) - else: # large-value outliers - df = self.mat.loc[self.mat["log"] >= thresh] - print( - f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' - f" values of log10(values) >= {thresh})." - ) - df1 = df.sort_values( - "row" - ) # sort the df with outliers ascending seq_id of rows - df1.reset_index() - print('[YOGA TEST 2] df:\n', df) - print('[YOGA TEST 3] df1:\n', df1) - print('[YOGA TEST 4] self.mat:\n', self.mat) - col_out = [] # col_seq of outliers' cols - for n_rows, (indx, row) in enumerate(df1.iterrows()): - assert ( - n_rows < max_rec - ), "To process all requested coeffs modify the safety limit assertion." - row_seq, row_name = self.ent_inf( - row, True - ) # row seq_id and name of the current coeff. - col_seq, col_name = self.ent_inf( - row, False - ) # col seq_id and name of the current coeff. - if col_seq not in col_out: - col_out.append(col_seq) - else: - print(f"{col_seq = } already in another outlier row.") - print( - f'Coeff. ({row_seq}, {col_seq}): val = {row["val"]:.4e}, log(val) =' - f' {row["log"]:n}' - ) - df_row_out = df1.loc[df1["row"] == row_seq] # df with only outlier elements - df_row_all = self.mat.loc[ - self.mat["row"] == row_seq - ] # df with all elements - # print(f'matrix elements in the same row:\n{df_row}') - print( - f"\tRow {row_name} {self.ent_range(row_seq, True)} has" - f" {df_row_out['log'].count()} outlier-coeff. of magnitudes in" - f" [{df_row_out['log'].min()}, {df_row_out['log'].max()}]" - ) - print( - f"\tRow {row_name} {self.ent_range(row_seq, True)} has" - f" {df_row_all['log'].count()} (all)-coeff. of magnitudes in" - f" [{df_row_all['log'].min()}, {df_row_all['log'].max()}]" - ) - # a column may include more than 1 outlier; - # therefore columns with outliers reported below: - # df with outliers in the same col: - # df_col = df1.loc[df1['col'] == col_seq] - # print( - # f"\tCol {col_name} {self.ent_range(col_seq, False)} has " - # f"{df_col["log"].count()} outlier coeff. of magnitudes in " - # f"[{df_col["log"].min()}, {df_col["log"].max()}]" - # ) - print( - "\nColumn-wise locations of outlier coefficients in" - f" {len(col_out)} columns:" - ) - col_out.sort() - print('[YOGA TEST 1]| col_out',col_out) - print('[YOGA TEST 1]| col_name',self.seq_col) - for col_seq in col_out: - col_name = self.seq_col.get(col_seq)[0] - df_col = self.mat.loc[ - self.mat["col"] == col_seq - ] # df with elements in the same col - print( - f"\tCol {col_name} {self.ent_range(col_seq, False)} has" - f" {df_col['log'].count()} coeff. of magnitudes in" - f" [{df_col['log'].min()}, {df_col['log'].max()}]" - ) - - def ent_inf(self, mat_row, by_row=True) -> typing.Tuple[int, str]: - """Return info on the entity (either row or col) defining the selected matrix - coefficient. - - Each row of the dataFrame contains the definition (composed of the row_seq, - col_seq, value, log(value)) of one matrix coefficient. - The function returns seq_id and name of either row or col of the currently - considered coeff. - - Attributes - ---------- - mat_row: dataFrame row - record of the df with the data of currently processed element - by_row: bool - True/False for returning the seq_id and name of the corresponding row/col - """ - - if by_row: - # if seq_row {} not stored, then: - # names = [k for k, idx in self.row_name.items() if idx == ent_seq] - ent_seq = int(mat_row["row"]) - name = self.seq_row.get(ent_seq)[0] - else: - ent_seq = int(mat_row["col"]) - name = self.seq_col.get(ent_seq)[0] - return ent_seq, name - - def ent_range(self, seq_id, by_row=True) -> str: - """Return formatted string representing ranges of feasible values of either a - row or a column. - - The returned values of ranges are either 'none' (for plus/minus infinity) or - int(log10(abs(val))) for other values. Small values, defined as - abs(value) < 1e-10, are represented by 0. - - Attributes - ---------- - seq_id: int - sequence number of either row or col. - by_row: bool - True/False for returning the seq_id and name of the corresponding row/col. - """ - - if by_row: - attr = self.seq_row.get(seq_id) # [row_name, lo_bnd, up_bnd, row_type] - pass - else: - attr = self.seq_col.get(seq_id) # [col_name, lo_bnd, up_bnd] - pass - s = [] # strings representing lo/up-bounds - for pos in [0, 1]: - val = attr[pos + 1] # 0-th element is the name - if val == self.infty: # used for both infinites (positive and negative) - s.append(self.infty) - else: - if type(val) is int: - val = float(val) - if abs(val) < 1e-10: - s.append("0") # same string for int and float zeros - else: - val = int(math.log10(abs(val))) - s.append(f"{val}") # small integer value, no formatting needed - ret = "[" + s[0] + ", " + s[1] + "]" - return ret # the range is formatted as: '[lo_bnd, up_bnd]' - - def plot_hist(self): - """Plot histograms.""" - # todo: might not be needed; therefore the implementation postponed diff --git a/message_ix/tools/lp_diag/lp_diag.py b/message_ix/tools/lp_diag/lp_diag.py deleted file mode 100644 index 7501880dd..000000000 --- a/message_ix/tools/lp_diag/lp_diag.py +++ /dev/null @@ -1,932 +0,0 @@ -""" -Prototype of simple analysis of the MPS-format file -Written by Marek Makowski, ECE Program of IIASA, in March 2023 -""" - -import math - -# import os -# import sys # needed for sys.exit() -import typing -from collections import Counter - -import numpy as np -import pandas as pd - -# from datetime import datetime as dt -# from datetime import timedelta as td -# import matplotlib.pyplot as plt -# from matplotlib import cm -# from matplotlib import colors -# from matplotlib.ticker import LinearLocator # needed for ax.set_major_locator -# import seaborn as sns -# # sns.set() # settings for seaborn plotting style - - -class LPdiag: - """Process the MPS-format input file and provide its basic diagnotics. - - The diagnostics currently includes: - - handling formal errors of the MPS file - - basic statistics of the matrix coefficients. - - Attributes - ---------- - - """ - - def __init__(self): - self.fname = "undefined" # MPS file name, to be defined by rd_mps() call - self.pname = "undefined" # problem name - self.id_rhs = False # True, if rhs_id defined - self.id_range = False # True, if range_id defined - self.id_bnd = False # True, if bnd_id defined - self.rhs_id = "" # id of rhs elements - self.range_id = "" # id of ranges elements (might differ from rhs_id) - self.bnd_id = "" # id of bounds elements - self.infty = "none" # marker for infinity value - self.n_lines = 0 # number of processed lines of the MPS file - self.n_rhs = 0 # number of defined RHS - self.n_ranges = 0 # number of defined ranges - self.n_bounds = 0 # number of defined bounds - # if not os.path.exists(self.rep_dir): - # os.makedirs(self.rep_dir, mode=0o755) - - # dictionaries for searchable names and its indices - # (searching very-long lists is prohibitively slow) - self.row_name = {} # key: row-name, item: its seq_id - self.seq_row = {} # key: row sequence, item: [row-name, lo_bnd, up_bond, type] - self.col_name = {} # key: col-name, item: its seq_id - self.seq_col = {} # key: col-sequence, item: [col-name, lo_bnd, up_bond] - # tmp space for reading COLUMN section of the MPS - self.mat_row = [] # row seq_no of the matrix coef. - self.mat_col = [] # col seq_no the matrix coef. - self.mat_val = [] # matrix coeff. - self.col_curr = "" # current column (initialized to an illegal empty name) - self.gf_seq = ( - -1 - ) # sequence_no of the goal function (objective) row: equal = -1, if undefined - # representation of the LP matrix: - self.mat = pd.DataFrame(columns=["row", "col", "val"]) # LP matrix - # cols attributes: - # self.cols = pd.DataFrame(columns=['seq_id', 'name', 'lo_bnd', 'up_bnd']) - # rows attributes: - # self.rows = pd.DataFrame( - # columns=['seq_id', 'name', 'type', 'lo_bnd', 'up_bnd'] - # ) - - def rd_mps(self, fname): # process the MPS file - print(f"\nReading MPS-format file {fname}.") - self.fname = fname - sections = [ - "NAME", - "ROWS", - "COLUMNS", - "RHS", - "RANGES", - "BOUNDS", - "SOS", - "ENDATA", - ] - - # lists are OK only for small and medium problems - # row_names = [] # names of rows - # row_types = [] # types of rows - # col_names = [] # names of columns - - # wrk vars - n_section = 0 # seq_no of the currently processed MPS-file section - next_sect = 0 # seq_no of the next (to be processed) MPS-file section - # last_sect = -1 # last processed section - - # process the MPS file - with open(self.fname, "r") as reader: - for n_line, line in enumerate(reader): - line = line.rstrip("\n") - # print(f'line {line}') - if line[0] == "*" or len(line) == 0: # skip commented and empty lines - continue - words = line.split() - if line[0] == " ": # continue reading the current MPS section - # columns/matrix (first here because most frequently used) - if n_section == 2: - self.add_coeff(words, n_line) # add column and its coefficients - elif n_section == 1: # rows - self.add_row(words, n_line) # add row and its type - elif n_section == 3: # rhs - self.add_rhs(words, n_line) # process RHS - elif n_section == 4: # ranges - self.add_range(words, n_line) # process range - elif n_section == 5: # bounds - self.add_bnd(words, n_line) # process bound - elif n_section == 6: # SOS section - pass # SOS section not processed - # elif n_section == 7: # end data - # raise Exception( - # "Unexpected execution flow; needs to be explored." - # ) - else: - print(f"MPS record {n_line}, section id {n_section}.") - raise Exception( - f"MPS line '{line}' (line {n_line}) misplaced," - f" processing section {sections[n_section]}." - ) - else: # found a new section - if n_section == 0: # problem-name processed with the section header - pass - elif n_section <= 5: - # print(f'\tData of section {sections[n_section]} processed.') - pass - elif n_section == 6: # SOS - print(f"WARNING: Section {sections[n_section]} not processed.") - else: - raise Exception( - f"Should not come here, n_section = {n_section}." - ) - - # process the head of new section - print(f"Next section found: {line} (line {n_line}).") - self.n_lines = n_line - # last_sect = n_section - n_section = self.next_sec(next_sect, words, sections) - next_sect = n_section + 1 - # print(f'{n_section = }, {next_sect = }') - # end of MPS reading - - # check, if the last required section ('ENDATA') was defined - assert ( - n_section == 7 - ), f'The "ENDATA" section is not declared; last section_id = {n_section}.' - - self.mps_sum() # summarize the processed MPS content - - def next_sec(self, n_exp, words, sections): - # required/optional MPS sections - req_sect = [True, True, True, False, False, False, False, True] - n_line = self.n_lines - n_words = len(words) - if req_sect[n_exp]: # required section must be in the sequence - # assert ( - # words[0] == sections[next_sect] - # ), f"expect section {sections[next_sect]} found: {line}." - if words[0] == sections[n_exp]: # required section found - if n_exp == 0: # store the problem name - assert n_words > 1, ( - f"problem name undefined: line {n_line} has" - f" {n_words} words." - ) - # print(f"\tProblem name line {words[1:]}.") - if n_words == 2: - self.pname = words[1] # store the problem name - else: - self.pname = words[1:] # store the problem name - print(f"\tProblem name: {self.pname}.") - return n_exp # n_sections equals to the expected: n_exp - else: - print(f"section {words} found.") - raise Exception( - f"Required MPS section {sections[n_exp]} undefined" " or misplaced." - ) - else: # the found section does not follow the last processed section - try: - n_section = sections.index(words[0]) - except ValueError: - raise Exception(f"Unknown section: {words} (line {n_line}).") - if n_section < n_exp: - raise Exception( - f"Section {words[0]} (line {n_line}) is misplaced or duplicated." - ) - return n_section - - def mps_sum(self): - # check, if there was at least one N row - # (the first N row assumed to be the objective): - assert self.gf_seq != -1, "objective (goal function) row is undefined." - - # create a df with the matrix coefficients - self.mat = pd.DataFrame( - {"row": self.mat_row, "col": self.mat_col, "val": self.mat_val} - ) - self.mat["abs_val"] = abs( - self.mat["val"] - ) # add column with absolute values of coeff. - self.mat["log"] = np.log10(self.mat["abs_val"]).astype( - int - ) # add col with int(log10(coeffs)) - # print(f'matrix after initialization:\n {self.mat}') - - # recreate all matrix dataframe for rescaler - row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() - col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() - matrix = self.mat.copy() - matrix = (matrix.set_index(['row','col'],drop=True)[['val']] - .rename(index=row_name,level='row') - .rename(index=col_name,level='col')) - - matrix.to_csv('matrix.csv',index=True) - - # Finish the MPS processing with the summary of its attributes - dens = f"{float(len(self.mat)) / (len(self.row_name) * len(self.col_name)):.2e}" - print( - f"\nFinished processing {self.n_lines} lines of the MPS file: {self.fname}." - ) - print( - f"LP has: {len(self.row_name)} rows, {len(self.col_name)} cols," - f" {len(self.mat)} non-zeros, matrix density = {dens}." - ) - print( - f"Numbers of redefined: RHS = {self.n_rhs}, ranges = {self.n_ranges}," - f" bounds = {self.n_bounds}." - ) - - # todo: add info on dense rows and cols - - # info on the GF row, RHS, ranges, bounds - df = self.mat.loc[self.mat["row"] == self.gf_seq][ - "val" - ] # df with values of the GF coefficients. - print( - f'\nThe GF (objective) row named "{self.seq_row.get(self.gf_seq)[0]}" has' - f" {len(df)} elements." - ) - print(f"Distribution of the GF (objective) values:\n{df.describe()}") - - def add_row(self, words, n_line): - """Process current line of the ROWS section. - - While processing the ROWS section the row attributes are initialized to the - default (for the corresponding row type) values. The attributes are updated for - optionally defined values in the (also optional) RHS and RANGES sections. The - interpretation of the MPS-format (in particular of values in the RANGES section) - follows the original MPS standard, see e.g., "Advanced Linear Programming," by - Bruce A. Murtagh. or the standard summary at - https://lpsolve.sourceforge.net/5.5/mps-format.htm . - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - row_types = ["N", "E", "G", "L"] # types of rows - n_words = len(words) - assert ( - n_words == 2 - ), f"row declaration (line {n_line}) has {n_words} words instead of 2." - row_type = words[0] - row_name = words[1] - row_seq = len(self.row_name) - assert row_type in row_types, f"unknown row type {row_type} (line {n_line})." - assert ( - row_name not in self.row_name - ), f"duplicated row name: {row_name} (line {n_line})." - if row_type == "N" and self.gf_seq == -1: - self.gf_seq = row_seq - print( - f"\tRow {row_name} (row_seq = {row_seq}) is the objective" - " (goal function) row." - ) - self.row_name.update({row_name: row_seq}) # add to dict of row_names - # store row_{seq, name, type} and the default - # (to be changed in rhs/ranges) [lo_bnd, upp_bnd] - self.row_att(row_seq, row_name, row_type, "rows") - - def add_coeff(self, words, n_line): - """Process current line of the COLUMNS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - # print( - # f"processing line no {n_line}, n_words {n_words}:" - # f" {line}" - # ) - assert n_words in [ - 3, - 5, - ], f"matrix element (line {n_line}) has {n_words} words." - col_name = words[0] - if col_name != self.col_curr: # new column - assert ( - col_name not in self.col_name - ), f"duplicated column name: {col_name} (line {n_line})" - col_seq = len(self.col_name) - self.col_name.update({col_name: col_seq}) - self.seq_col.update({col_seq: [col_name, 0.0, self.infty]}) - self.col_curr = col_name - else: - col_seq = self.col_name.get(col_name) - row_name = words[1] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." - val = float(words[2]) - assert ( - type(val) is float - ), f"string {words[2]} (line {n_line}) is not a number." - # add the matrix element to the lists of: seq_row, seq_col, val - # the lists will be converted to self.mat df after all elements - # will be read - self.mat_row.append(row_seq) - self.mat_col.append(col_seq) - self.mat_val.append(val) - # print(f' matrix element ({row_seq}, {col_seq}) = {val}') - # the next two commands take far too long for large matrices; - # thus tmp-store in three lists - # df2 = pd.DataFrame( - # {"row": row_seq, "col": col_seq, "val": val}, - # index=list(range(1)), - # ) - # self.mat = pd.concat( - # [self.mat, df2], - # axis=0, - # ignore_index=True - # ) - - # proccess the second matrix element in the same MPS row, if defined - if n_words > 3: - assert n_words == 5, ( - f"line {n_line}) has {n_words} words, five words needed" - " fordefining second element in the same MPS line." - ) - row_name = words[3] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown row name {row_name} (line {n_line})." - val = float(words[4]) - assert ( - type(val) is float - ), f"string {words[4]} (line {n_line}) is not a number." - self.mat_row.append(row_seq) - self.mat_col.append(col_seq) - self.mat_val.append(val) - - def add_rhs(self, words, n_line): - """Process current line of the RHS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - - # first RHS record implies RHS/ranges id (might be empty) - if self.n_rhs == 0: - # print(f"first rhs line: {n_line}: '{words}'") - if n_words in [3, 5]: # RHS name/id defined - self.id_rhs = True - self.rhs_id = words[0] - print(f"\tId of RHS: {self.rhs_id}") - else: - self.id_rhs = False - self.rhs_id = "" - print("\tId of RHS: (empty)") - - if self.id_rhs: - n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) - pos_name = 1 # first row-name in words[pos_name] - else: - n_req_wrd = [2, 4] - pos_name = 0 # first row-name in words[pos_name] - - assert n_words in n_req_wrd, ( - f"rhs line {n_line} has {n_words} words, expected" f" {n_req_wrd}." - ) - if self.id_rhs: # check id of the RHS entry, if it was defined - assert words[0] == self.rhs_id, ( - f"RHS id {words[0]}, line {n_line} differ from" - f"expected: {self.rhs_id}." - ) - row_name = words[pos_name] - row_seq = self.row_name.get(row_name) - assert row_seq is not None, f"unknown RHS row-name {row_name} (line {n_line})." - val = float(words[pos_name + 1]) - assert type(val) is float, ( - f"RHS value {words[pos_name + 1]} (line {n_line}) is not a" " number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "rhs", val) - self.n_rhs += 1 - if n_words == n_req_wrd[1]: # second pair of rhs defined - row_name = words[pos_name + 2] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown RHS row-name {row_name} (line {n_line})." - val = float(words[pos_name + 3]) - assert type(val) is float, ( - f"RHS value {words[pos_name + 1]} (line {n_line}) is" " not a number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "rhs", val) - self.n_rhs += 1 - - def add_range(self, words, n_line): - """Process current line of the RANGES section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - n_words = len(words) - - # first ranges record implies ranges id (might be empty) - if self.n_ranges == 0: - if n_words in [3, 5]: - self.id_range = True - self.range_id = words[0] - print(f"\tId of ranges: {self.range_id}") - else: - self.id_range = False - self.range_id = "" - print("\tId of ranges: (empty)") - - if self.id_range: - n_req_wrd = [3, 5] # number of required words in a line (either 3 or 5) - pos_name = 1 # first row-name in words[pos_name] - else: - n_req_wrd = [2, 4] - pos_name = 0 # first row-name in words[pos_name] - - assert ( - n_words in n_req_wrd - ), f"ranges line {n_line} has {n_words} words, expected {n_req_wrd}." - if self.id_range: # check id of the ranges' entry, if it was defined - assert words[0] == self.range_id, ( - f"Ranges id {words[0]}, line {n_line} differ from" - f" expected: {self.range_id}." - ) - row_name = words[pos_name] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown range row-name {row_name} (line {n_line})." - val = float(words[pos_name + 1]) - assert ( - type(val) is float - ), f"Range value {words[pos_name + 1]} (line {n_line}) is not a number." - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "ranges", val) - self.n_ranges += 1 - if n_words == n_req_wrd[1]: # second pair of ranges defined - row_name = words[pos_name + 2] - row_seq = self.row_name.get(row_name) - assert ( - row_seq is not None - ), f"unknown ranges row-name {row_name} (line {n_line})." - val = float(words[pos_name + 3]) - assert type(val) is float, ( - f"Ranges value {words[pos_name + 1]} (line {n_line}) is" - " not a number." - ) - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - row_type = attr[3] - self.row_att(row_seq, row_name, row_type, "ranges", val) - self.n_ranges += 1 - - def add_bnd(self, words, n_line): - """Process current line of the BOUNDS section. - - The section defines both column names and values of the matrix coefficients. - One line can have either one or two matrix elements. - - Attributes - ---------- - words: str[] - words of the current line - n_line: int - sequence number of the current MPS line - """ - - # items of the below dictionaries indicate bounds to be modified: - # 1 - low, 2 - upper, 3 - both - bnd_type1 = {"LO": 1, "UP": 2, "FX": 3} # types of bounds requiring value - bnd_type2 = {"MI": 1, "PL": 2, "FR": 3} # types of bounds not requiring value - bnd_type3 = { - "BV": 0, - "LI": 0, - "UI": 0, - "SC": 0, - } # types of bounds legal for int-type vars, not processed yet - - n_words = len(words) - - # first Bounds record implies bounds id (might be empty) - if self.n_bounds == 0: - # print(f"first BOUNDS line: {n_line}: '{words}'") - if n_words == 4 or (n_words == 3 and words[0] in ["FR", "MI", "PL"]): - self.id_bnd = True - self.bnd_id = words[1] - print(f"\tId of BOUNDS: {self.bnd_id}") - else: - self.id_bnd = False - self.bnd_id = "" - print("\tId of BOUNDS: (empty)") - - # number of required words in a line (with/without) required value: - if self.id_bnd: - n_req_wrd = [4, 3] - pos_name = 2 # col-name in words[pos_name] - else: - n_req_wrd = [3, 2] - pos_name = 1 # col-name in words[pos_name] - - assert ( - n_words in n_req_wrd - ), f"bounds line {n_line} has {n_words} words, expected: {n_req_wrd}." - if self.id_bnd: # check id of the BOUNDS line, if it was defined - assert words[1] == self.bnd_id, ( - f"BOUNDS id {words[1]}, line {n_line} differ from " - f"expected id: {self.bnd_id}." - ) - col_name = words[pos_name] - col_seq = self.col_name.get(col_name) - assert ( - col_seq is not None - ), f"unknown BOUNDS col-name {col_name} (line {n_line})." - attr = self.seq_col.get(col_seq) # [col_name, lo_bnd, up_bnd] - - typ = words[0] - if typ in bnd_type1: # bound-types that require a value - val = float(words[pos_name + 1]) - assert ( - type(val) is float - ), f"BOUND value {words[pos_name + 1]} (line {n_line}) is not a number." - at_pos = bnd_type1.get(typ) - if at_pos == 3: # set both bounds - attr[1] = attr[2] = val - else: - attr[at_pos] = val - elif typ in bnd_type2: # value not needed; - # therefore it is neither checked nor processed - at_pos = bnd_type2.get(typ) - if at_pos == 3: # set both bounds - attr[1] = attr[2] = self.infty - else: - attr[at_pos] = self.infty - elif typ in bnd_type3: - raise Exception( - f"Bound type {typ} of integer var. (line {n_line}) not" - " processed yet." - ) - else: - raise Exception(f"Unknown bound type {typ} (line {n_line}).") - self.seq_col.update({col_seq: attr}) # store the updated col-attributes - self.n_bounds += 1 - - def row_att(self, row_seq, row_name, row_type, sec_name, val=0.0): - """Process values defined in ROWS, RHS and RANGES sections and store/update - the corresponding row attributes. - - While processing the ROWS section the row attributes are initialized to the - default (for the corresponding row type) values. The attributes are updated for - optionally defined values in the (also optional) RHS and RANGES sections. The - interpretation of the MPS-format (in particular of values in the RANGES section) - follows the original MPS standard, see e.g., "Advanced Linear Programming," by - Bruce A. Murtagh. or the standard summary at - https://lpsolve.sourceforge.net/5.5/mps-format.htm . - - Attributes - ---------- - row_seq: int - position of row in dictionaries and the matrix df - row_name: str - row name (defined in the ROWS section) - row_type: str - row type (defined in the ROWS section) - sec_name: str - identifies the MPS section: either 'rows' (for initialization) or 'rhs' or - 'ranges' (for updates) - val: float - value of the row attribute defining either lo_bnd or up_bnd of the row - (the type checked while processing the MPS section) - """ - - type2bnd = { - "E": [0.0, 0.0], - "G": [0.0, self.infty], - "L": [self.infty, 0.0], - "N": [self.infty, self.infty], - } - assert row_seq == self.row_name.get( - row_name - ), f"{row_seq=} should be equal to: {self.row_name.get(row_name)}." - assert row_type in type2bnd, f"undefined row type {row_type=} for {row_name=}." - if sec_name == "rows": # initialize row attributes (used in ROW section) - low_upp = type2bnd.get(row_type) - self.seq_row.update({row_seq: [row_name, low_upp[0], low_upp[1], row_type]}) - # print( - # f"attributes of row {row_name} initialized in section {sec_name} to" - # f"{self.seq_row.get(row_seq)}." - # ) - elif sec_name in [ - "rhs", - "ranges", - ]: # update row attributes (used in RHS and ranges sections) - if row_type == "N": - print(f"{sec_name} value {val} ignored for neutral row {row_name}.") - return - attr = self.seq_row.get(row_seq) # [row_name, lo_bnd, up_bnd, row_type] - if sec_name == "rhs": # process the RHS value - if row_type == "G": # update lo_bnd - attr[1] = val - elif row_type == "L": # update up_bnd - attr[2] = val - elif row_type == "E": # update both bounds - attr[1] = attr[2] = val - else: # process the ranges value - if row_type == "G": # update up_bnd - attr[2] = attr[1] + abs(val) - elif row_type == "L": # update lo_bnd - attr[1] = attr[2] - abs(val) - elif row_type == "E": # update both bounds - if val > 0: - attr[2] = attr[1] + val - else: - attr[1] = attr[2] - abs(val) - self.seq_row.update({row_seq: attr}) - # print( - # f"attributes of row {row_name} updated in section {sec_name} to" - # f" {attr}." - # ) - else: # update row attributes (used in RHS and ranges sections) - raise Exception(f"row_att() should not be called for {sec_name=}.") - - def stat(self, lo_tail=-7, up_tail=6): - """Basic statistics of the matrix coefficients. - - Focus on distributions of magnitudes of non-zero coeff. represented by values - of int(log10(abs(coeff))). - Additionally, tails (low and upp) of the distributions are reported. - - Attributes - ---------- - lo_tail: int - Magnitude order of the low-tail (-7 denotes values < 10^(-6)) - up_tail: int - Magnitude order of the upper-tail (6 denotes values >= 10^6) - """ - - # print(f'\nDistribution of non-zero values:\n{self.mat["val"].describe()}') - print( - f'\nDistribution of abs(non-zero) values:\n{self.mat["abs_val"].describe()}' - ) - print( - f'\nDistribution of int(log10(abs(values))):\n{self.mat["log"].describe()}' - ) - min_logv = self.mat["log"].min() - max_logv = self.mat["log"].max() - - # count numbers of coeffs for each order of magnitude of their value - magn_dist = Counter(self.mat["log"]) - magn_dist = dict( - sorted(magn_dist.items()) - ) # counter (sorted by occurances) --> dict sorted by magnitudes - print( - "\nDistribution of int(log10(abs(values))) sorted by magnitudes of values:" - ) - print( - f"range = [{min_logv}, {max_logv}] (magnitudes with zero-occurrences" - " skipped)." - ) - for magn in magn_dist: - print(f"{magn:3d}: {magn_dist[magn]:7d}") - - if lo_tail > up_tail: - print(f"Overlapping distribution tails ({lo_tail}, {up_tail}) reset to 0.") - lo_tail = up_tail = 0 - - # low-tail of the distribution - if lo_tail < min_logv: - print( - f"\nNo log10(values) in the requested low-tail (<= {lo_tail}) of the" - " distribution." - ) - else: - print( - "\nDistribution of log10(values) in the requested low-tail (<=" - f" {lo_tail}) of the distribution." - ) - print(f'{self.mat.loc[self.mat["log"] <= lo_tail].describe()}') - for val in [*range(min_logv, lo_tail + 1)]: - print( - f"Number of log10(values) == {val}:" - f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" - ) - # up-tail of the distribution - - if max_logv < up_tail: - print( - f"\nNo log10(values) in the requested upper-tail (>= {up_tail}) of the" - " distribution." - ) - else: - print( - "\nDistribution of log10(values) in the requested upp-tail (>=" - f" {up_tail}) of the distribution." - ) - print(f'{self.mat.loc[self.mat["log"] >= up_tail].describe()}') - for val in [*range(up_tail, max_logv + 1)]: - print( - f"Number of log10(values) == {val}:" - f" {self.mat.loc[self.mat['log'] == val]['log'].count()}" - ) - - def out_loc(self, small=True, thresh=-7, max_rec=500): - """Locations of outliers, i.e., elements having small/large coeff values. - - Locations of outliers (in the term of the matrix coefficient values). - The provided ranges of values in the corresponding row/col indicate potential - of the simple scaling. - - Attributes - ---------- - small: bool - True/False for threshold of either small or large coefficients - thresh: int - Magnitude of the threshold (in: int(log10(abs(coeff))), i.e. -7 denotes - values < 10^(-6)) - max_rec: int - Maximum number of processed coefficients - """ - - if small: # sub-matrix composed of only small-value outliers - df = self.mat.loc[self.mat["log"] <= thresh] - print( - f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' - f" values of log10(values) <= {thresh})." - ) - else: # large-value outliers - df = self.mat.loc[self.mat["log"] >= thresh] - print( - f'\nRow-wise locations of {df["log"].count()} outliers (coeff. with' - f" values of log10(values) >= {thresh})." - ) - df1 = df.sort_values( - "row" - ) # sort the df with outliers ascending seq_id of rows - df1.reset_index() - - col_out = [] # col_seq of outliers' cols - for n_rows, (indx, row) in enumerate(df1.iterrows()): - assert ( - n_rows < max_rec - ), "To process all requested coeffs modify the safety limit assertion." - row_seq, row_name = self.ent_inf( - row, True - ) # row seq_id and name of the current coeff. - col_seq, col_name = self.ent_inf( - row, False - ) # col seq_id and name of the current coeff. - if col_seq not in col_out: - col_out.append(col_seq) - else: - print(f"{col_seq = } already in another outlier row.") - print( - f'Coeff. ({row_seq}, {col_seq}): val = {row["val"]:.4e}, log(val) =' - f' {row["log"]:n}' - ) - df_row_out = df1.loc[df1["row"] == row_seq] # df with only outlier elements - df_row_all = self.mat.loc[ - self.mat["row"] == row_seq - ] # df with all elements - # print(f'matrix elements in the same row:\n{df_row}') - print( - f"\tRow {row_name} {self.ent_range(row_seq, True)} has" - f" {df_row_out['log'].count()} outlier-coeff. of magnitudes in" - f" [{df_row_out['log'].min()}, {df_row_out['log'].max()}]" - ) - print( - f"\tRow {row_name} {self.ent_range(row_seq, True)} has" - f" {df_row_all['log'].count()} (all)-coeff. of magnitudes in" - f" [{df_row_all['log'].min()}, {df_row_all['log'].max()}]" - ) - # a column may include more than 1 outlier; - # therefore columns with outliers reported below: - # df with outliers in the same col: - # df_col = df1.loc[df1['col'] == col_seq] - # print( - # f"\tCol {col_name} {self.ent_range(col_seq, False)} has " - # f"{df_col["log"].count()} outlier coeff. of magnitudes in " - # f"[{df_col["log"].min()}, {df_col["log"].max()}]" - # ) - print( - "\nColumn-wise locations of outlier coefficients in" - f" {len(col_out)} columns:" - ) - col_out.sort() - for col_seq in col_out: - col_name = self.seq_col.get(col_seq)[0] - df_col = self.mat.loc[ - self.mat["col"] == col_seq - ] # df with elements in the same col - print( - f"\tCol {col_name} {self.ent_range(col_seq, False)} has" - f" {df_col['log'].count()} coeff. of magnitudes in" - f" [{df_col['log'].min()}, {df_col['log'].max()}]" - ) - # recreate bad coefficient dataframe for rescaler - row_name = pd.DataFrame(self.seq_row).transpose()[0].to_dict() - col_name = pd.DataFrame(self.seq_col).transpose()[0].to_dict() - matrix_prob = df1.copy() - - matrix_prob = (matrix_prob.set_index(['row','col'],drop=True)[['val']] - .rename(index=row_name,level='row') - .rename(index=col_name,level='col')) - - matrix_prob_name = 'matrix_prob_lower.csv' if small else 'matrix_prob_upper.csv' - matrix_prob.to_csv(matrix_prob_name,index=True) - def ent_inf(self, mat_row, by_row=True) -> typing.Tuple[int, str]: - """Return info on the entity (either row or col) defining the selected matrix - coefficient. - - Each row of the dataFrame contains the definition (composed of the row_seq, - col_seq, value, log(value)) of one matrix coefficient. - The function returns seq_id and name of either row or col of the currently - considered coeff. - - Attributes - ---------- - mat_row: dataFrame row - record of the df with the data of currently processed element - by_row: bool - True/False for returning the seq_id and name of the corresponding row/col - """ - - if by_row: - # if seq_row {} not stored, then: - # names = [k for k, idx in self.row_name.items() if idx == ent_seq] - ent_seq = int(mat_row["row"]) - name = self.seq_row.get(ent_seq)[0] - else: - ent_seq = int(mat_row["col"]) - name = self.seq_col.get(ent_seq)[0] - return ent_seq, name - - def ent_range(self, seq_id, by_row=True) -> str: - """Return formatted string representing ranges of feasible values of either a - row or a column. - - The returned values of ranges are either 'none' (for plus/minus infinity) or - int(log10(abs(val))) for other values. Small values, defined as - abs(value) < 1e-10, are represented by 0. - - Attributes - ---------- - seq_id: int - sequence number of either row or col. - by_row: bool - True/False for returning the seq_id and name of the corresponding row/col. - """ - - if by_row: - attr = self.seq_row.get(seq_id) # [row_name, lo_bnd, up_bnd, row_type] - pass - else: - attr = self.seq_col.get(seq_id) # [col_name, lo_bnd, up_bnd] - pass - s = [] # strings representing lo/up-bounds - for pos in [0, 1]: - val = attr[pos + 1] # 0-th element is the name - if val == self.infty: # used for both infinites (positive and negative) - s.append(self.infty) - else: - if type(val) is int: - val = float(val) - if abs(val) < 1e-10: - s.append("0") # same string for int and float zeros - else: - val = int(math.log10(abs(val))) - s.append(f"{val}") # small integer value, no formatting needed - ret = "[" + s[0] + ", " + s[1] + "]" - return ret # the range is formatted as: '[lo_bnd, up_bnd]' - - def plot_hist(self): - """Plot histograms.""" - # todo: might not be needed; therefore the implementation postponed diff --git a/message_ix/tools/lp_diag/lpdiag - Original.py b/message_ix/tools/lp_diag/lpdiag - Original.py deleted file mode 100644 index 4d5cde671..000000000 --- a/message_ix/tools/lp_diag/lpdiag - Original.py +++ /dev/null @@ -1,149 +0,0 @@ -""" -Prototype of simple analysis of the MPS-format file -Written by Marek Makowski, ECE Program of IIASA, in March 2023 -Developed in PyCharm, with Python 3.10.4 -""" - -import argparse -import os -import sys # needed for sys.exit() and redirecting stdout -from datetime import datetime as dt -from os import R_OK, access -from os.path import isfile - -# from datetime import timedelta as td -# noinspection PyUnresolvedReferences -from message_ix.tools.lp_diag.lp_diag import ( - LPdiag, # LPdiag class for processing and analysis of LP matrices -) - -""" -The above import stmt works only in the message-ix editable environment; it is treated -as error by PyCharm (but it works); therefore, the noinspection option is applied for -this statement. -In other environments the import from message_ix... does not work; therefore, it has -to be replaced by the below (now commented-out) import statement. The latter, however, -mypy flags as error. -""" -# from lp_diag import LPdiag - - -def read_args(): - descr = """ - Diagnostics of basic properties of LP Problems represented by the MPS-format. - - Examples of usage: - python lpdiag.py - python lpdiag.py -h - python lpdiag.py --mps test_mps/aez --outp foo.txt - - """ - # python lpdiag.py --path "message_ix/tools/lp_diag" --mps "test.mps" -s - - parser = argparse.ArgumentParser( - description=descr, formatter_class=argparse.RawDescriptionHelpFormatter - ) - wdir = "--wdir : string\n Working directory." - parser.add_argument("--wdir", help=wdir) - mps = "--mps : string\n Name of the MPS file (optionally with path)." - parser.add_argument("--mps", help=mps) - outp = "--outp : string\n Redirect output to the named file." - parser.add_argument("--outp", help=outp) - # parser.add_argument("-s", "--save", action="store_true") # on/off flag - - # parse cli - cl_args = parser.parse_args() - return cl_args - - -if __name__ == "__main__": - """Driver of the LP diagnostics provided by LPdiag class. - - Defines the working space, then controls the flow by executing the desired - functions of LPdiag class. - """ - - work_dir = os.getcwd() - print(f"work_dir: '{work_dir}'.") - tstart = dt.now() - # print('Started at:', str(tstart)) - - # Retrieve and assign arguments - args = read_args() - # dir2 = os.getcwd() - # print(f"{dir2 =}") - w_dir = args.wdir or "." - prob_id = args.mps or "test_mps/aez" # default MPS for testing - # alternative specs of test-MPS commented below - # prob_id = args.mps or "test_mps/diet" # default MPS for testing - # prob_id = args.mps or "test_mps/err_tst" # default MPS for testing - # prob_id = args.mps or "test_mps/jg_korh" # default MPS for testing - # prob_id = args.mps or "test_mps/lotfi" # default MPS for testing - if len(w_dir) > 1: - work_dir = w_dir - print(f"Changing work-directory to: {w_dir}.") - try: - os.chdir(w_dir) - except OSError: - print(f"Cannot change work-directory to: {w_dir}.") - # dir3 = os.getcwd() - # print(f"{dir3 =}") - assert isfile(prob_id), ( - f"MPS file {prob_id} not accessible from the work-directory:\n'{work_dir}'." - "\nTry to use the --wdir command option to set the work-directory." - ) - assert access(prob_id, R_OK), f"MPS file {prob_id} is not readable." - - # large (1+ GB) MPSs files, shall not be posted to gitHub. - # app was tested on two (1+ GB) MPSs posted by Oliver in /t/fricko on Feb 16, 2023: - # OFR_test_led_barrier.mps - # baseline_barrier.mps - - # small MPSs, for testing the code, posted to 'test_mps' subdirectory: - # err_tst - small MPS with various errors for testing the diagnostics - # aez - agro-ecological zones, medium size; two matrix elems in a row - # diet - classical small LP - # jg_korh - tiny testing problem - # lotfi - classical medium size; two matrix elems in a row - - fn_outp = args.outp or None # optional redirection of stdout - - default_stdout = sys.stdout - if fn_outp: - # fn_out = "./" + repdir + prob_id + ".txt" # file for redirected stdout - print(f"Stdout redirected to: {fn_outp}") - f_out = open(fn_outp, "w") - sys.stdout = f_out - # else: # defined to avoid warnings (only used when redir_stdo == True) - # fn_out = "foo" - # f_out = open(fn_out, "w") - - lp = LPdiag() # LPdiag ctor - lp.rd_mps(prob_id) # read MPS, store the matrix in dataFrame - lp.stat(lo_tail=-7, up_tail=5) # stats of matrix coeffs, incl. distrib. tails - # to get numbers of coeffs for each magnitute specify equal/overlapping tails: - # lp.stat(lo_tail=0, up_tail=0) - lp.out_loc(small=True, thresh=-7, max_rec=100) # locations of small-value outliers - lp.out_loc(small=False, thresh=6, max_rec=500) # locations of large-value outliers - # lp.out_loc(small=True, thresh=-1, max_rec=100) # test (lotfi) small-value outliers - # lp.out_loc(small=False, thresh=2, max_rec=500) # test (lotfi) large-value outliers - - tend = dt.now() - time_diff = tend - tstart - print("\nStarted at: ", str(tstart)) - print("Finished at:", str(tend)) - print(f"Wall-clock execution time: {time_diff.seconds} sec.") - - if fn_outp: # close the redirected output - # noinspection PyUnboundLocalVariable - f_out.close() - sys.stdout = default_stdout - print(f"\nRedirected stdout stored in {fn_outp}. Now writing to the console.") - print("\nStarted at: ", str(tstart)) - print("Finished at:", str(tend)) - print(f"Wall-clock execution time: {time_diff.seconds} sec.") - - # todo: TBD, if the MPS-standard should be observed; should it cause error or info - # in particular, range of values: 10^{-10} < abs(val) < 10^{10} - # todo: naive scaling? might not be informative due to the later preprocessing - # todo: plots of distributions of coeffs, if indeed usefull diff --git a/message_ix/tools/lp_diag/lpdiag.py b/message_ix/tools/lp_diag/lpdiag.py deleted file mode 100644 index 20af1cbe7..000000000 --- a/message_ix/tools/lp_diag/lpdiag.py +++ /dev/null @@ -1,149 +0,0 @@ -""" -Prototype of simple analysis of the MPS-format file -Written by Marek Makowski, ECE Program of IIASA, in March 2023 -Developed in PyCharm, with Python 3.10.4 -""" - -import argparse -import os -import sys # needed for sys.exit() and redirecting stdout -from datetime import datetime as dt -from os import R_OK, access -from os.path import isfile - -# from datetime import timedelta as td -# noinspection PyUnresolvedReferences -from message_ix.tools.lp_diag.lp_diag import ( - LPdiag, # LPdiag class for processing and analysis of LP matrices -) - -""" -The above import stmt works only in the message-ix editable environment; it is treated -as error by PyCharm (but it works); therefore, the noinspection option is applied for -this statement. -In other environments the import from message_ix... does not work; therefore, it has -to be replaced by the below (now commented-out) import statement. The latter, however, -mypy flags as error. -""" -# from lp_diag import LPdiag - - -def read_args(): - descr = """ - Diagnostics of basic properties of LP Problems represented by the MPS-format. - - Examples of usage: - python lpdiag.py - python lpdiag.py -h - python lpdiag.py --mps test_mps/aez --outp foo.txt - - """ - # python lpdiag.py --path "message_ix/tools/lp_diag" --mps "test.mps" -s - - parser = argparse.ArgumentParser( - description=descr, formatter_class=argparse.RawDescriptionHelpFormatter - ) - wdir = "--wdir : string\n Working directory." - parser.add_argument("--wdir", help=wdir) - mps = "--mps : string\n Name of the MPS file (optionally with path)." - parser.add_argument("--mps", help=mps) - outp = "--outp : string\n Redirect output to the named file." - parser.add_argument("--outp", help=outp) - # parser.add_argument("-s", "--save", action="store_true") # on/off flag - - # parse cli - cl_args = parser.parse_args() - return cl_args - - -if __name__ == "__main__": - """Driver of the LP diagnostics provided by LPdiag class. - - Defines the working space, then controls the flow by executing the desired - functions of LPdiag class. - """ - - work_dir = os.getcwd() - print(f"work_dir: '{work_dir}'.") - tstart = dt.now() - # print('Started at:', str(tstart)) - - # Retrieve and assign arguments - args = read_args() - # dir2 = os.getcwd() - # print(f"{dir2 =}") - w_dir = args.wdir or "." - prob_id = args.mps or "test_mps/aez" # default MPS for testing - # alternative specs of test-MPS commented below - # prob_id = args.mps or "test_mps/diet" # default MPS for testing - # prob_id = args.mps or "test_mps/err_tst" # default MPS for testing - # prob_id = args.mps or "test_mps/jg_korh" # default MPS for testing - # prob_id = args.mps or "test_mps/lotfi" # default MPS for testing - if len(w_dir) > 1: - work_dir = w_dir - print(f"Changing work-directory to: {w_dir}.") - try: - os.chdir(w_dir) - except OSError: - print(f"Cannot change work-directory to: {w_dir}.") - # dir3 = os.getcwd() - # print(f"{dir3 =}") - assert isfile(prob_id), ( - f"MPS file {prob_id} not accessible from the work-directory:\n'{work_dir}'." - "\nTry to use the --wdir command option to set the work-directory." - ) - assert access(prob_id, R_OK), f"MPS file {prob_id} is not readable." - - # large (1+ GB) MPSs files, shall not be posted to gitHub. - # app was tested on two (1+ GB) MPSs posted by Oliver in /t/fricko on Feb 16, 2023: - # OFR_test_led_barrier.mps - # baseline_barrier.mps - - # small MPSs, for testing the code, posted to 'test_mps' subdirectory: - # err_tst - small MPS with various errors for testing the diagnostics - # aez - agro-ecological zones, medium size; two matrix elems in a row - # diet - classical small LP - # jg_korh - tiny testing problem - # lotfi - classical medium size; two matrix elems in a row - - fn_outp = args.outp or None # optional redirection of stdout - - default_stdout = sys.stdout - if fn_outp: - # fn_out = "./" + repdir + prob_id + ".txt" # file for redirected stdout - print(f"Stdout redirected to: {fn_outp}") - f_out = open(fn_outp, "w") - sys.stdout = f_out - # else: # defined to avoid warnings (only used when redir_stdo == True) - # fn_out = "foo" - # f_out = open(fn_out, "w") - - lp = LPdiag() # LPdiag ctor - lp.rd_mps(prob_id) # read MPS, store the matrix in dataFrame - lp.stat(lo_tail=-6, up_tail=6) # stats of matrix coeffs, incl. distrib. tails - # to get numbers of coeffs for each magnitute specify equal/overlapping tails: - # lp.stat(lo_tail=0, up_tail=0) - lp.out_loc(small=True, thresh=-6, max_rec=100) # locations of small-value outliers - lp.out_loc(small=False, thresh=6, max_rec=500) # locations of large-value outliers - # lp.out_loc(small=True, thresh=-1, max_rec=100) # test (lotfi) small-value outliers - # lp.out_loc(small=False, thresh=2, max_rec=500) # test (lotfi) large-value outliers - - tend = dt.now() - time_diff = tend - tstart - print("\nStarted at: ", str(tstart)) - print("Finished at:", str(tend)) - print(f"Wall-clock execution time: {time_diff.seconds} sec.") - - if fn_outp: # close the redirected output - # noinspection PyUnboundLocalVariable - f_out.close() - sys.stdout = default_stdout - print(f"\nRedirected stdout stored in {fn_outp}. Now writing to the console.") - print("\nStarted at: ", str(tstart)) - print("Finished at:", str(tend)) - print(f"Wall-clock execution time: {time_diff.seconds} sec.") - - # todo: TBD, if the MPS-standard should be observed; should it cause error or info - # in particular, range of values: 10^{-10} < abs(val) < 10^{10} - # todo: naive scaling? might not be informative due to the later preprocessing - # todo: plots of distributions of coeffs, if indeed usefull diff --git a/message_ix/tools/lp_diag/nohup.out b/message_ix/tools/lp_diag/nohup.out deleted file mode 100644 index 75e038180..000000000 --- a/message_ix/tools/lp_diag/nohup.out +++ /dev/null @@ -1,977 +0,0 @@ -[I 17:31:34.132 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag -[I 17:31:34.132 NotebookApp] Jupyter Notebook 6.5.3 is running at: -[I 17:31:34.132 NotebookApp] http://localhost:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 -[I 17:31:34.132 NotebookApp] or http://127.0.0.1:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 -[I 17:31:34.132 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). -[C 17:31:34.251 NotebookApp] - - To access the notebook, open this file in a browser: - file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-9180-open.html - Or copy and paste one of these URLs: - http://localhost:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 - or http://127.0.0.1:8888/?token=a738bfdc89cf5d4ac011657b3a6cf2f882ed79ee7c7b1857 -[I 17:31:42.551 NotebookApp] Creating new notebook in -[I 17:31:45.014 NotebookApp] Kernel started: c7170213-4682-4a9f-aa31-a04414c7a587, name: python3 -[I 17:33:44.941 NotebookApp] Saving file at /Untitled.ipynb -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate(nb) -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate_nb(model['content']) -[I 17:35:45.922 NotebookApp] Saving file at /Untitled.ipynb -[I 17:37:44.943 NotebookApp] Saving file at /Untitled.ipynb -[I 17:38:48.477 NotebookApp] Saving file at /Untitled.ipynb -[I 17:47:44.953 NotebookApp] Saving file at /Untitled.ipynb -[I 17:49:44.942 NotebookApp] Saving file at /Untitled.ipynb -[I 18:27:06.505 NotebookApp] Starting buffering for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 -[I 18:27:09.662 NotebookApp] Restoring connection for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 -[I 18:27:12.775 NotebookApp] Starting buffering for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 -[I 18:27:27.666 NotebookApp] Restoring connection for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 -[I 20:24:34.127 NotebookApp] Starting buffering for c7170213-4682-4a9f-aa31-a04414c7a587:17e78bc3478e409999446d49c69d79c9 -[I 20:24:38.909 NotebookApp] Kernel shutdown: c7170213-4682-4a9f-aa31-a04414c7a587 -[I 20:24:40.316 NotebookApp] Shutting down on /api/shutdown request. -[I 20:24:40.318 NotebookApp] Shutting down 0 kernels -[I 20:24:40.318 NotebookApp] Shutting down 0 terminals - - _ _ _ _ - | | | |_ __ __| |__ _| |_ ___ - | |_| | '_ \/ _` / _` | _/ -_) - \___/| .__/\__,_\__,_|\__\___| - |_| - -Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. - -https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html - -Please note that updating to Notebook 7 might break some of your extensions. - -,_\__,_|\__\___| - |_| - -Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. - -https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html - -Please note that updating to Notebook 7 might break some of your extensions. - -[I 20:31:49.579 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag -[I 20:31:49.579 NotebookApp] Jupyter Notebook 6.5.3 is running at: -[I 20:31:49.579 NotebookApp] http://localhost:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 -[I 20:31:49.579 NotebookApp] or http://127.0.0.1:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 -[I 20:31:49.579 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). -[C 20:31:49.710 NotebookApp] - - To access the notebook, open this file in a browser: - file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-19876-open.html - Or copy and paste one of these URLs: - http://localhost:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 - or http://127.0.0.1:8888/?token=8bd707abde3223b11975bb9cc8890de02596bd88335a4454 -[W 20:31:56.246 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 20:31:56.356 NotebookApp] Kernel started: 08b25722-a90a-4727-8980-ba9ff63b142e, name: python3 -[I 20:33:56.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 20:33:56.323 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 20:35:56.319 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:37:56.325 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:39:56.330 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:41:56.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:43:56.338 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:45:56.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:47:56.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:49:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate(nb) -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate_nb(model['content']) -[I 20:51:56.326 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:55:56.335 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:57:56.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:59:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:01:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:03:07.562 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:03:56.337 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:05:56.342 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:07:56.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:11:56.342 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:13:56.331 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:15:56.340 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:17:56.337 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:19:56.352 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:21:56.976 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:23:56.354 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:25:56.347 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:26:09.315 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:31:56.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:33:56.343 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:35:56.344 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:36:17.503 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 21:36:34.091 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 21:52:18.955 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 21:59:56.343 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:01:12.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:01:56.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:03:56.327 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:05:56.317 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:06:19.842 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:07:56.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:09:56.322 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:20:04.757 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 22:20:05.454 NotebookApp] Kernel restarted: 08b25722-a90a-4727-8980-ba9ff63b142e -[I 22:20:05.462 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 22:20:07.003 NotebookApp] Replaying 3 buffered messages -[I 22:21:56.321 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 22:37:45.741 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 06:07:56.317 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 06:09:56.311 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 06:13:56.308 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 06:15:56.320 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 07:19:45.367 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 07:19:50.950 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 07:19:54.303 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 07:49:51.074 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 07:49:55.892 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 07:49:59.666 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 10:11:25.043 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 10:12:38.619 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 10:14:40.743 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 10:14:44.426 NotebookApp] Restoring connection for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 10:39:39.702 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:39:45.483 NotebookApp] Starting buffering for 08b25722-a90a-4727-8980-ba9ff63b142e:b4b4028221634213907700f7f9483e1e -[I 10:39:48.999 NotebookApp] Kernel shutdown: 08b25722-a90a-4727-8980-ba9ff63b142e -[I 10:39:53.577 NotebookApp] Shutting down on /api/shutdown request. -[I 10:39:53.579 NotebookApp] Shutting down 0 kernels -[I 10:39:53.579 NotebookApp] Shutting down 0 terminals - - _ _ _ _ - | | | |_ __ __| |__ _| |_ ___ - | |_| | '_ \/ _` / _` | _/ -_) - \___/| .__/\__,_\__,_|\__\___| - |_| - -Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. - -https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html - -Please note that updating to Notebook 7 might break some of your extensions. - -[I 15:33:44.317 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag -[I 15:33:44.317 NotebookApp] Jupyter Notebook 6.5.3 is running at: -[I 15:33:44.317 NotebookApp] http://localhost:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d -[I 15:33:44.317 NotebookApp] or http://127.0.0.1:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d -[I 15:33:44.317 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). -[C 15:33:44.465 NotebookApp] - - To access the notebook, open this file in a browser: - file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-3168-open.html - Or copy and paste one of these URLs: - http://localhost:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d - or http://127.0.0.1:8888/?token=c72df32a06ab5e4a1817ddbd9d022b611b7c54b9678c1a2d -[W 15:34:53.707 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 15:34:54.205 NotebookApp] Kernel started: 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1, name: python3 -[I 15:35:53.107 NotebookApp] Starting buffering for 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1:277889f27a44462289c8e32fad85a9e7 -[I 15:35:53.375 NotebookApp] Kernel restarted: 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1 -[I 15:35:53.422 NotebookApp] Restoring connection for 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1:277889f27a44462289c8e32fad85a9e7 -[I 15:35:54.441 NotebookApp] Replaying 3 buffered messages -[I 15:36:53.965 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate(nb) -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate_nb(model['content']) -[I 15:38:53.972 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:46:53.966 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:00:53.983 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:02:53.991 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:04:53.984 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:06:53.967 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:08:54.833 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:11:08.042 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:12:53.968 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:14:53.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:16:53.961 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:18:53.981 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:32:53.982 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:34:53.963 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:35:02.665 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:35:03.792 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:36:53.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:38:53.977 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:40:53.968 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:43:44.511 NotebookApp] Kernel interrupted: 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1 -[I 16:44:53.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:46:53.980 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:48:53.970 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:50:53.973 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:51:27.384 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:51:30.412 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:51:44.245 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:52:04.398 NotebookApp] Starting buffering for 7a12c8e4-1969-49a6-88b8-0ab8baeb29c1:277889f27a44462289c8e32fad85a9e7 -[I 07:30:39.001 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag -[I 07:30:39.001 NotebookApp] Jupyter Notebook 6.5.3 is running at: -[I 07:30:39.001 NotebookApp] http://localhost:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 -[I 07:30:39.001 NotebookApp] or http://127.0.0.1:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 -[I 07:30:39.001 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). -[C 07:30:39.117 NotebookApp] - - To access the notebook, open this file in a browser: - file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-7780-open.html - Or copy and paste one of these URLs: - http://localhost:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 - or http://127.0.0.1:8888/?token=bea9e6c7cc93a52b7f2827f0fff8e7c36fee1d960a1df1d8 -[W 07:30:46.544 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 07:30:47.010 NotebookApp] Kernel started: 4aa50906-521b-44c8-997a-aaabcbe91cce, name: python3 -[I 07:34:45.277 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 07:34:45.829 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 07:34:45.838 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 07:34:46.855 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 07:34:47.372 NotebookApp] Replaying 3 buffered messages -[I 07:36:46.859 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 07:38:46.853 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 07:52:46.868 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 08:04:46.856 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\nbformat\__init__.py:129: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate(nb) -C:\Users\pratama\Anaconda3\envs\message_env\lib\site-packages\notebook\services\contents\manager.py:353: MissingIDFieldWarning: Code cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future. - validate_nb(model['content']) -[I 08:06:46.859 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 08:08:46.867 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:00:21.131 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 10:00:23.383 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 10:00:28.151 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 10:00:45.315 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 10:32:46.906 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:34:46.912 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:36:46.908 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:38:46.905 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:40:08.211 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:40:46.919 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:42:46.910 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:43:33.376 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:54:46.918 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 10:56:20.711 NotebookApp] IOPub message rate exceeded. - The notebook server will temporarily stop sending output - to the client in order to avoid crashing it. - To change this limit, set the config variable - `--NotebookApp.iopub_msg_rate_limit`. - - Current values: - NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec) - NotebookApp.rate_limit_window=3.0 (secs) - -[W 10:56:21.612 NotebookApp] iopub messages resumed -[I 10:56:46.987 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:57:17.964 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 10:57:20.324 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 10:58:46.985 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:00:46.914 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:01:50.004 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:02:46.923 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:04:46.928 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:17:41.903 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:17:59.462 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:18:10.674 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:18:43.457 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:18:46.918 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:20:46.932 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:24:46.915 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:26:46.930 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:28:46.929 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:30:46.944 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:32:46.924 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:36:46.934 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:38:46.938 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:40:46.935 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:42:46.941 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:44:46.935 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:48:46.928 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:50:46.946 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:52:46.943 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:54:46.940 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:56:46.944 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:58:46.928 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:00:46.932 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:08:46.937 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:09:29.713 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:10:28.609 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:11:19.600 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 12:11:22.227 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 12:11:22.236 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 12:11:23.267 NotebookApp] Replaying 3 buffered messages -[I 12:12:46.951 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:06:19.736 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 13:06:27.124 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 13:06:27.285 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 13:06:48.378 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 13:06:51.698 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 13:06:59.744 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[I 13:07:13.304 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 13:08:52.216 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 13:09:04.032 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:09:20.165 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:09:20.713 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:09:21.012 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:09:24.714 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:d7a3f65425b0483a91371b372b70c94e -[W 13:09:30.030 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 13:11:11.169 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f39c9d5f301a4841b3479acb50ad1d93 -[I 13:11:11.424 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 13:11:11.483 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:f39c9d5f301a4841b3479acb50ad1d93 -[I 13:11:12.528 NotebookApp] Replaying 3 buffered messages -[I 13:11:30.341 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:13:30.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:13:32.423 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 13:13:41.943 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f39c9d5f301a4841b3479acb50ad1d93 -[I 13:14:20.553 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[I 13:14:20.821 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 13:14:20.825 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[I 13:14:21.851 NotebookApp] Replaying 3 buffered messages -[I 13:16:15.178 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:18:15.956 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:20:15.193 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:20:23.282 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:21:05.740 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[I 13:21:06.297 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 13:21:06.304 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[I 13:21:07.824 NotebookApp] Replaying 3 buffered messages -[I 13:21:37.809 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:22:15.973 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:28:15.190 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:30:15.180 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:32:15.180 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:34:15.183 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:36:15.181 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:38:15.179 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:40:15.190 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:42:15.179 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:44:15.184 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:46:15.196 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:48:15.196 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:50:15.201 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:52:15.187 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:54:15.185 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:56:15.189 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:56:29.258 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:58:15.187 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:59:57.413 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:00:15.184 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:02:15.188 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:02:46.651 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[I 14:02:47.222 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 14:02:47.230 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[I 14:02:48.755 NotebookApp] Replaying 3 buffered messages -[I 14:04:15.184 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:04:38.713 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:06:15.185 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:10:15.185 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:12:15.186 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:14:15.189 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:16:05.738 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:16:15.187 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:18:15.190 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:20:15.203 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:26:15.202 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:28:15.221 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:30:15.196 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:19.312 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:19.876 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:20.450 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:20.488 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:20.647 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:20.831 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:21.031 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:21.477 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:32.233 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 14:39:37.041 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:38.138 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:38.929 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:39:45.003 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:6e98247948e547c88ce1a51d468c41e3 -[W 14:39:50.054 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 14:40:39.724 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 14:40:39.740 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 14:41:19.912 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 14:41:19.912 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 14:41:30.182 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:1b01dcd84282431c8d555e2224d6fe9d -[I 14:41:30.457 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 14:41:30.505 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:1b01dcd84282431c8d555e2224d6fe9d -[I 14:41:31.540 NotebookApp] Replaying 3 buffered messages -[I 14:41:50.406 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:43:50.401 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:00:21.864 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:00:24.094 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 15:00:33.458 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 15:00:40.518 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:1b01dcd84282431c8d555e2224d6fe9d -[I 15:00:51.372 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:c804636ad4a344da831d77a13892fa0f -[I 15:00:51.636 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 15:00:51.662 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:c804636ad4a344da831d77a13892fa0f -[I 15:00:52.678 NotebookApp] Replaying 3 buffered messages -[I 15:01:11.505 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:01:14.540 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:02:46.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:04:46.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:16:45.635 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 15:17:02.422 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:c804636ad4a344da831d77a13892fa0f -[W 15:26:51.997 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 15:26:56.457 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[I 15:26:56.745 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 15:26:56.865 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[I 15:26:57.895 NotebookApp] Replaying 3 buffered messages -[I 15:27:25.573 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 15:28:52.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:30:52.326 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:32:52.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:36:52.345 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:38:52.340 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:46:52.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:48:52.364 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:51:33.774 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[I 15:51:34.573 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 15:51:34.725 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[I 15:51:35.755 NotebookApp] Replaying 3 buffered messages -[I 15:52:01.578 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:52:52.347 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:54:52.345 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:56:06.543 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:56:52.349 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 15:59:09.058 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:00:52.343 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:02:52.353 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:03:05.992 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[I 16:03:06.466 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 16:03:06.472 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[I 16:03:07.509 NotebookApp] Replaying 3 buffered messages -[I 16:04:52.344 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:14:52.352 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:16:52.344 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:18:53.035 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:20:52.333 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:22:52.353 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:28:09.080 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:28:11.476 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to -[W 16:28:11.483 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[W 16:28:11.485 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted -[W 16:28:14.005 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted -[I 16:28:14.369 NotebookApp] Kernel started: 9293def2-127e-47b0-a884-858267c38a6f, name: python3 -[I 16:28:16.699 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb -[W 16:28:16.700 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted -[I 16:28:18.021 NotebookApp] Starting buffering for 9293def2-127e-47b0-a884-858267c38a6f:3173bac4ed4644e586605f299df80666 -[I 16:35:42.591 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 16:36:52.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:56:52.370 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:58:53.031 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:00:52.362 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:02:52.359 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:04:52.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:06:52.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:08:52.368 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:10:53.038 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:12:52.357 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:14:52.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:16:03.788 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:16:52.373 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:18:12.087 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:19:30.490 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:92d0bd1cc15f486393c5916336431beb -[W 17:20:06.792 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 17:20:08.741 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:4073e4c8024c4f54aed5556a95a5c941 -[I 17:21:39.451 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -[W 17:21:45.042 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 17:22:29.826 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 17:22:30.093 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 17:22:30.229 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 17:22:31.258 NotebookApp] Replaying 3 buffered messages -[I 17:23:45.383 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:25:45.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:27:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:29:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:31:45.377 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:33:45.395 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:35:45.386 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:37:45.395 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:39:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:41:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:43:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:45:45.381 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:49:45.384 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:51:45.382 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:53:45.399 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:57:45.389 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:59:45.396 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:01:12.577 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:01:45.397 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:03:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:05:45.391 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:07:45.408 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:09:45.396 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:15:45.386 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:17:45.387 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:19:45.393 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:21:45.404 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 18:22:36.430 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted -[I 18:23:12.089 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 18:23:13.018 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:23:13.025 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 18:23:14.051 NotebookApp] Replaying 3 buffered messages -[I 18:23:15.023 NotebookApp] Starting buffering for 9293def2-127e-47b0-a884-858267c38a6f:92c5707dc0524407a1bd5f99a982098a -[I 18:23:45.400 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:25:45.397 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:27:45.399 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:28:29.380 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:29:45.394 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:31:45.395 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:33:45.400 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:35:45.398 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:36:06.875 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 18:36:07.348 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:36:07.355 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 18:36:08.380 NotebookApp] Replaying 3 buffered messages -[W 18:36:18.441 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy1.ipynb is not trusted -[I 18:37:45.410 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:39:45.412 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:44:21.746 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 18:44:22.333 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:44:22.342 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 18:44:23.874 NotebookApp] Replaying 3 buffered messages -[I 18:46:31.053 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:51:45.393 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:55:00.979 NotebookApp] Starting buffering for 9293def2-127e-47b0-a884-858267c38a6f:82e7cef8a758407e8254464f1eb4836e -[I 18:55:45.409 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:57:45.398 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:23:47.505 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 19:23:55.335 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 19:23:58.242 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:24:08.607 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 19:24:08.887 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 19:24:08.899 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 19:24:09.937 NotebookApp] Replaying 3 buffered messages -[I 19:24:17.214 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 19:24:17.574 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 19:24:17.579 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 19:24:18.618 NotebookApp] Replaying 3 buffered messages -[I 19:25:45.416 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:37:45.420 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:39:45.422 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:41:45.428 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:43:45.426 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:45:45.430 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:57:29.984 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:59:45.431 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:01:45.424 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:03:45.430 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:04:17.081 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:04:17.532 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 20:07:14.305 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 20:07:50.913 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 20:07:57.904 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 20:08:11.663 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 20:08:14.600 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 07:48:04.710 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 07:52:33.238 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 07:52:34.276 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 07:52:34.468 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 07:52:35.497 NotebookApp] Replaying 3 buffered messages -[I 07:52:54.795 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 07:53:45.415 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 07:55:46.010 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 08:07:45.273 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 08:09:45.270 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:27:45.966 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:29:45.976 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:31:45.306 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:35:39.965 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:35:41.646 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to -[W 09:35:41.652 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[W 09:35:41.654 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy2.ipynb is not trusted -[W 09:35:43.333 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy2.ipynb is not trusted -[I 09:35:43.720 NotebookApp] Kernel started: 17bdfebc-5481-4eee-8ed7-cad512fb7ce6, name: python3 -[I 09:35:57.927 NotebookApp] Starting buffering for 17bdfebc-5481-4eee-8ed7-cad512fb7ce6:232616bc88a3469c890340617c6b4dd0 -[I 09:36:09.440 NotebookApp] Kernel shutdown: 9293def2-127e-47b0-a884-858267c38a6f -[I 09:36:12.528 NotebookApp] Kernel shutdown: 17bdfebc-5481-4eee-8ed7-cad512fb7ce6 -[I 09:37:45.306 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:39:45.293 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:41:45.320 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:43:45.305 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:45:45.308 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:50:36.985 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:51:45.307 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:53:45.302 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:55:45.300 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:57:45.967 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 09:59:45.301 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:00:43.391 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 10:00:44.530 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 10:00:44.598 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 10:00:46.143 NotebookApp] Replaying 3 buffered messages -[I 10:01:45.311 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:03:45.301 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:05:45.318 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:07:45.309 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:11:18.028 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:13:19.714 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:13:20.135 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:13:25.690 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 10:13:26.268 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 10:13:26.291 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 10:13:27.794 NotebookApp] Replaying 3 buffered messages -[I 10:13:45.310 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:15:45.306 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:17:45.328 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:19:45.303 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:29:45.318 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:33:45.311 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:35:45.322 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:37:45.328 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:39:45.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:41:45.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:43:45.314 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:45:45.327 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:47:45.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:49:45.316 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:51:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:53:45.329 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:55:45.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:57:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:59:45.323 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:00:15.646 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:01:45.320 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:05:00.330 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:07:45.325 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:09:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:39:45.324 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:39:58.795 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:41:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:41:53.055 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 11:41:53.757 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 11:41:53.763 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 11:41:55.306 NotebookApp] Replaying 3 buffered messages -[I 11:43:45.338 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:44:20.524 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:45:45.336 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:51:45.337 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:52:21.738 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 11:53:45.536 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 11:53:46.121 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 11:53:46.135 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 11:53:47.644 NotebookApp] Replaying 3 buffered messages -[I 11:55:45.332 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:57:45.365 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 12:59:45.357 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:01:45.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 13:28:01.936 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 13:28:02.512 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 13:28:02.519 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 13:28:04.042 NotebookApp] Replaying 3 buffered messages -[I 13:29:45.360 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:10:26.350 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:10:33.749 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:10:45.450 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 14:10:45.905 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 14:10:45.911 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 14:10:46.948 NotebookApp] Replaying 3 buffered messages -[I 14:11:46.033 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:13:45.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:15:45.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:21:45.381 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:23:45.374 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:25:45.371 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:27:45.367 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:28:59.903 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:29:34.026 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:30:05.558 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:31:45.370 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:33:45.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:34:36.616 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 14:34:37.982 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to -[W 14:34:37.984 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[W 14:34:37.986 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb is not trusted -[W 14:34:39.612 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb is not trusted -[I 14:34:39.872 NotebookApp] Kernel started: 7a602e50-a4c8-40f8-b051-3c640784f554, name: python3 -[I 14:34:46.385 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb -[W 14:34:46.385 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy3.ipynb is not trusted -[I 14:34:47.812 NotebookApp] Starting buffering for 7a602e50-a4c8-40f8-b051-3c640784f554:ef83fc089c5d484a86c2d9ddeb5a083e -[I 14:35:45.373 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:00:02.864 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 16:00:18.753 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 16:07:03.351 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 16:07:03.894 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 16:07:03.902 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 16:07:05.437 NotebookApp] Replaying 3 buffered messages -[I 16:07:46.043 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:08:55.206 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:08:57.339 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool.ipynb to -[W 16:08:57.340 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 16:08:59.086 NotebookApp] Kernel started: 2d55f666-8afd-41fc-8cf3-f36f2d4e5ce6, name: python3 -[I 16:09:00.710 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb -[I 16:09:01.500 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb -[I 16:09:02.911 NotebookApp] Starting buffering for 2d55f666-8afd-41fc-8cf3-f36f2d4e5ce6:da9f611659054b4b8a2ddedfb684c4b4 -[I 16:09:45.404 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:12:31.209 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:33:45.909 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 16:33:50.530 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:b8f1c39d0c54419ca8ceed2c178f3567 -[I 16:33:56.849 NotebookApp] Kernel shutdown: 7a602e50-a4c8-40f8-b051-3c640784f554 -[I 16:33:56.850 NotebookApp] Kernel shutdown: 2d55f666-8afd-41fc-8cf3-f36f2d4e5ce6 -[W 16:34:00.830 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 16:36:51.851 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:808d68c0d6b84c568bb654ffc98c5894 -[I 16:36:52.100 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 16:36:52.112 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:808d68c0d6b84c568bb654ffc98c5894 -[I 16:36:53.133 NotebookApp] Replaying 3 buffered messages -[I 16:38:01.045 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:40:01.027 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:42:01.079 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:44:01.045 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:48:01.047 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:50:01.040 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:51:19.435 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:52:01.037 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:54:01.038 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:56:01.058 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 16:58:01.051 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:00:01.044 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:07:34.747 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:14:01.049 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:16:01.042 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:18:01.060 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:20:01.037 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:22:01.046 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:24:01.053 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:26:31.068 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:28:01.051 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:30:01.042 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:32:01.054 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:32:36.361 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:34:01.059 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:36:01.066 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:38:01.055 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:40:01.049 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:40:51.868 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:42:01.061 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:42:49.279 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:44:01.060 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:44:13.978 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:44:23.707 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:45:01.874 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:45:02.609 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:46:01.052 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:48:01.063 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:50:01.067 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:50:05.488 NotebookApp] Kernel started: c550f1b2-b9ef-4f7a-a257-491e36fffe2a, name: python3 -[I 17:50:23.864 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:52:01.056 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:55:03.569 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:55:04.090 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 17:55:08.097 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 17:55:11.376 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:808d68c0d6b84c568bb654ffc98c5894 -[I 17:55:14.497 NotebookApp] Starting buffering for c550f1b2-b9ef-4f7a-a257-491e36fffe2a:bfd505f5c62c4acc86f76af7da4d1916 -[I 17:55:16.516 NotebookApp] Kernel shutdown: c550f1b2-b9ef-4f7a-a257-491e36fffe2a -[W 17:55:20.092 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 17:55:42.353 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 17:55:42.354 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 17:55:55.075 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[W 17:55:55.075 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool.ipynb is not trusted -[I 17:56:02.840 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:806be7e4aa6a476d8cb32e39457515ed -[I 17:56:03.125 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 17:56:03.175 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:806be7e4aa6a476d8cb32e39457515ed -[I 17:56:04.208 NotebookApp] Replaying 3 buffered messages -[I 17:57:20.356 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:01:31.793 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:01:45.110 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 18:01:52.153 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:806be7e4aa6a476d8cb32e39457515ed -[I 18:02:17.907 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:02:35.044 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:03:57.290 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:04:12.950 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:04:20.118 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:003dc2874ccc45c68eda190ebda6d948 -[I 18:04:20.392 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:04:20.399 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:003dc2874ccc45c68eda190ebda6d948 -[W 18:04:21.439 NotebookApp] Got events for closed stream -[I 18:04:21.441 NotebookApp] Replaying 3 buffered messages -[I 18:05:57.294 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:14:08.392 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 18:14:13.342 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:003dc2874ccc45c68eda190ebda6d948 -[I 18:14:30.260 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:15:11.245 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:16:17.837 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:16:49.961 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:17:30.827 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:17:41.277 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:82fcabf8915449b3acb748bc583008ac -[I 18:17:41.532 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:17:41.567 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:82fcabf8915449b3acb748bc583008ac -[W 18:17:42.617 NotebookApp] Got events for closed stream -[W 18:17:42.617 NotebookApp] Got events for closed stream -[I 18:17:42.618 NotebookApp] Replaying 3 buffered messages -[I 18:17:46.326 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:18:17.828 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:20:17.850 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:32:39.031 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:36:19.077 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:36:35.540 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 18:36:40.975 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:36:44.070 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:82fcabf8915449b3acb748bc583008ac -[I 18:38:47.998 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:38:54.504 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:39:26.428 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:e2e4e0a72bc248738480f64a8a432d21 -[I 18:39:26.699 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:39:26.706 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:e2e4e0a72bc248738480f64a8a432d21 -[I 18:39:27.734 NotebookApp] Replaying 3 buffered messages -[I 18:40:48.002 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:45:59.699 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 18:46:05.638 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:e2e4e0a72bc248738480f64a8a432d21 -[I 18:46:39.363 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:47:13.271 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f58786d145214fe2ab864d429eda1327 -[I 18:47:13.536 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:47:13.542 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:f58786d145214fe2ab864d429eda1327 -[I 18:47:14.589 NotebookApp] Replaying 3 buffered messages -[I 18:48:09.840 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:52:11.080 NotebookApp] Kernel interrupted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:52:16.512 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 18:52:19.544 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:f58786d145214fe2ab864d429eda1327 -[I 18:52:42.955 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:53:24.128 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 18:53:31.808 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:8a39b473737e4efb8c91dd2d8d5c8a9e -[I 18:53:32.063 NotebookApp] Kernel restarted: 4aa50906-521b-44c8-997a-aaabcbe91cce -[I 18:53:32.070 NotebookApp] Restoring connection for 4aa50906-521b-44c8-997a-aaabcbe91cce:8a39b473737e4efb8c91dd2d8d5c8a9e -[I 18:53:33.105 NotebookApp] Replaying 3 buffered messages -[I 18:54:23.310 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:06:43.313 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 19:06:53.048 NotebookApp] KernelRestarter: restarting kernel (1/5), keep random ports -WARNING:root:kernel 4aa50906-521b-44c8-997a-aaabcbe91cce restarted -[I 19:06:58.883 NotebookApp] Starting buffering for 4aa50906-521b-44c8-997a-aaabcbe91cce:8a39b473737e4efb8c91dd2d8d5c8a9e -[I 2024-02-15 10:32:38.931 LabApp] JupyterLab extension loaded from C:\Users\pratama\Anaconda3\lib\site-packages\jupyterlab -[I 2024-02-15 10:32:38.931 LabApp] JupyterLab application directory is C:\Users\pratama\Anaconda3\share\jupyter\lab -[I 10:32:38.947 NotebookApp] Serving notebooks from local directory: C:\Users\pratama\Documents\GitHub\MESSAGEix\message_ix\message_ix\tools\lp_diag -[I 10:32:38.947 NotebookApp] Jupyter Notebook 6.4.8 is running at: -[I 10:32:38.947 NotebookApp] http://localhost:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 -[I 10:32:38.947 NotebookApp] or http://127.0.0.1:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 -[I 10:32:38.947 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). -[C 10:32:39.101 NotebookApp] - - To access the notebook, open this file in a browser: - file:///C:/Users/pratama/AppData/Roaming/jupyter/runtime/nbserver-1176-open.html - Or copy and paste one of these URLs: - http://localhost:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 - or http://127.0.0.1:8888/?token=ddb795c2a0875a2dd85fa28ba3b0b06b20c970515e5b3970 -[I 10:42:03.847 NotebookApp] Kernel started: d9d68c56-94c3-431c-87ce-5a5b94bf715a, name: python3 -[I 10:42:08.629 NotebookApp] Starting buffering for d9d68c56-94c3-431c-87ce-5a5b94bf715a:f5eea4b5c15b4e8b8d4b1e5b310f1385 -[I 10:42:08.855 NotebookApp] Kernel restarted: d9d68c56-94c3-431c-87ce-5a5b94bf715a -[I 10:42:08.863 NotebookApp] Restoring connection for d9d68c56-94c3-431c-87ce-5a5b94bf715a:f5eea4b5c15b4e8b8d4b1e5b310f1385 -[I 10:42:09.887 NotebookApp] Replaying 3 buffered messages -[I 10:42:57.803 NotebookApp] Kernel started: 589de64a-edb7-4489-95da-e02afee79343, name: python3 -[I 10:43:21.800 NotebookApp] Starting buffering for 589de64a-edb7-4489-95da-e02afee79343:bbc508fb1f9c4b4486747d585b46468c -[I 10:44:03.809 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:45:14.211 NotebookApp] Starting buffering for 589de64a-edb7-4489-95da-e02afee79343:ef9227ca5c114931b0a85a0fb572b7f6 -[I 10:46:03.810 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:46:54.876 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool.ipynb -[I 10:46:55.758 NotebookApp] Starting buffering for d9d68c56-94c3-431c-87ce-5a5b94bf715a:f5eea4b5c15b4e8b8d4b1e5b310f1385 -[I 10:47:01.255 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb -[I 10:47:01.274 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool-Copy4.ipynb to -[I 10:47:03.139 NotebookApp] Kernel started: 3f2b62f5-4a67-4a70-9c58-ccada69e0f82, name: python3 -[I 10:47:04.277 NotebookApp] Starting buffering for 589de64a-edb7-4489-95da-e02afee79343:cd2364d9e0424e038d64b19f0735f544 -[I 10:47:09.194 NotebookApp] Kernel shutdown: 3f2b62f5-4a67-4a70-9c58-ccada69e0f82 -[I 10:47:09.311 NotebookApp] Kernel shutdown: d9d68c56-94c3-431c-87ce-5a5b94bf715a -[W 10:47:09.781 NotebookApp] 404 DELETE /api/sessions/057a3387-6433-4d32-aacb-4b2f83aee5ae (::1): Session not found: session_id='057a3387-6433-4d32-aacb-4b2f83aee5ae' -[W 10:47:09.781 NotebookApp] Session not found: session_id='057a3387-6433-4d32-aacb-4b2f83aee5ae' -[W 10:47:09.781 NotebookApp] 404 DELETE /api/sessions/057a3387-6433-4d32-aacb-4b2f83aee5ae (::1) 0.920000ms referer=http://localhost:8888/notebooks/%5BPROTOTYPE%5D%20Matrix%20Rescale%20Tool-Copy5.ipynb -[I 10:47:18.628 NotebookApp] Kernel shutdown: 589de64a-edb7-4489-95da-e02afee79343 -[I 10:47:24.933 NotebookApp] Kernel started: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a, name: python3 -[I 10:47:30.143 NotebookApp] Starting buffering for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 -[I 10:47:30.363 NotebookApp] Kernel restarted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 10:47:30.501 NotebookApp] Restoring connection for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 -[I 10:47:32.530 NotebookApp] Replaying 3 buffered messages -[I 10:49:25.695 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 10:51:23.291 NotebookApp] Starting buffering for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 -[I 10:51:23.739 NotebookApp] Kernel restarted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 10:51:23.749 NotebookApp] Restoring connection for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 -[I 10:51:25.267 NotebookApp] Replaying 3 buffered messages -[I 10:53:24.947 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 10:55:24.950 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:03:25.716 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:09:25.707 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:09:58.585 NotebookApp] Starting buffering for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 -[I 11:09:59.024 NotebookApp] Kernel restarted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 11:09:59.034 NotebookApp] Restoring connection for b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a:42cd742f3b1048508d19346d2839b890 -[I 11:10:00.557 NotebookApp] Replaying 3 buffered messages -[I 11:11:25.711 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:21:24.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:23:24.963 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:23:42.631 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 11:25:24.963 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:27:25.700 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:31:25.722 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:32:29.900 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:33:48.763 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:39:24.975 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:43:24.962 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:45:18.736 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:45:41.670 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:45:53.167 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:47:26.276 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:50:46.604 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 11:51:07.352 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 11:53:25.076 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 12:09:19.100 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 12:09:31.963 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 12:09:32.316 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 12:11:25.029 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 12:13:24.981 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 12:17:24.996 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 12:17:27.689 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 12:19:25.862 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb -[I 12:31:40.127 NotebookApp] Copying [PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb to -[W 12:31:40.283 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy5.ipynb is not trusted -[W 12:31:40.285 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[W 12:31:42.716 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 12:31:43.142 NotebookApp] Kernel started: 6174e01d-98ff-4110-b742-89423036f02d, name: python3 -[I 12:33:42.009 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 12:33:42.011 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:21:43.143 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:21:43.149 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:23:43.549 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:23:43.597 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:25:43.260 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:25:43.282 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:26:32.132 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:26:32.132 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:27:43.103 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:27:43.106 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:29:43.741 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:29:43.742 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:31:43.109 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:31:43.110 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:33:43.375 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:33:43.410 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:34:15.383 NotebookApp] Saving file at /[PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb -[W 13:34:15.385 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:35:02.364 NotebookApp] Creating new notebook in -[I 13:35:07.707 NotebookApp] Kernel started: 34fb97db-e849-4790-a4a6-da2ebd9315e4, name: python3 -[I 13:35:11.018 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:11.644 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:12.011 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:12.219 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:12.507 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:12.779 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:12.970 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:35:13.291 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:37:06.848 NotebookApp] Saving file at /Untitled.ipynb -[I 13:43:12.860 NotebookApp] Starting buffering for 6174e01d-98ff-4110-b742-89423036f02d:be7c5a5fa8c640ca89adb8ef01fceee1 -[W 13:43:22.933 NotebookApp] Notebook [PROTOTYPE] Matrix Rescale Tool-Copy6.ipynb is not trusted -[I 13:43:28.067 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:43:28.132 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:43:28.331 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:43:28.789 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:43:28.793 NotebookApp] Kernel interrupted: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[I 13:43:35.176 NotebookApp] Kernel shutdown: b8edfdb5-a3e1-4f37-acf6-34ca0b6a2f7a -[W 13:43:40.017 NotebookApp] 404 DELETE /api/sessions/ff27ede1-dce1-40e9-a7a3-b00150ba634c (::1): Session not found: session_id='ff27ede1-dce1-40e9-a7a3-b00150ba634c' -[W 13:43:40.018 NotebookApp] Session not found: session_id='ff27ede1-dce1-40e9-a7a3-b00150ba634c' -[W 13:43:40.018 NotebookApp] 404 DELETE /api/sessions/ff27ede1-dce1-40e9-a7a3-b00150ba634c (::1) 2.000000ms referer=http://localhost:8888/tree -[I 13:45:07.766 NotebookApp] Saving file at /Untitled.ipynb -[I 13:46:47.249 NotebookApp] Starting buffering for 6174e01d-98ff-4110-b742-89423036f02d:3184662dfb584e21837cd9541f08a27e -[I 13:46:47.814 NotebookApp] Starting buffering for 34fb97db-e849-4790-a4a6-da2ebd9315e4:aa83cceddffc41648ca5ba0420a85323 -[I 13:46:52.639 NotebookApp] Kernel shutdown: 6174e01d-98ff-4110-b742-89423036f02d -[I 13:47:00.878 NotebookApp] Kernel shutdown: 34fb97db-e849-4790-a4a6-da2ebd9315e4 From c2ee35f9493ec3f7d616ec65520c949121d09de2 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga Date: Thu, 2 May 2024 18:06:58 +0200 Subject: [PATCH 25/25] Start merging process --- message_ix/tools/lp_diag/__init__.py | 255 +++++++++++++++++ .../tools/make_scaler/__init__scaler.py | 256 ++++++++++++++++++ 2 files changed, 511 insertions(+) create mode 100644 message_ix/tools/make_scaler/__init__scaler.py diff --git a/message_ix/tools/lp_diag/__init__.py b/message_ix/tools/lp_diag/__init__.py index a178049d2..a8d91622c 100644 --- a/message_ix/tools/lp_diag/__init__.py +++ b/message_ix/tools/lp_diag/__init__.py @@ -2,10 +2,12 @@ # Written by Marek Makowski, ECE Program of IIASA, in March 2023. import math +import os import typing from collections import Counter from typing import List +import ixmp import numpy as np import pandas as pd @@ -946,3 +948,256 @@ def plot_hist(self): .. note:: Not implemented. """ raise NotImplementedError + + +# from here below is the code to create scaling argumens to pass to GAMS +# check with @ywpratama if found any issues + +lp = LPdiag() +mp = ixmp.Platform() + + +def filter_df(data, bounds): + """Extracts matrix elements with coefficient outliers. + + This function extracts elements from a matrix where + the coefficients deviate from a specified threshold. + + Parameters: + ----------- + data : pandas DataFrame + The coefficient matrix, typically generated by + the mps_sum function in LPDiag. + bounds: int or list of 2 integers + Exponent threshold used to identify outlier coefficients. + If a single integer is provided, the bounds are set to +/- that value. + If a list of 2 integers is provided, they represent the lower and + upper bounds of the threshold. + + Examples: + --------- + # Extract elements with coefficient exponents deviating beyond +/-3 + extracted_data = filter_df(data_matrix, 3) + + # Extract elements with coefficients exponents deviating + # beyond the range of -2 to 2 + extracted_data = extract_outliers(data_matrix, [-2, 2]) + """ + + if isinstance(bounds, int): + lo_bound = -bounds + up_bound = bounds + else: + lo_bound = bounds[0] + up_bound = bounds[1] + + df_filtered = data.loc[(data["val"] <= lo_bound) | (data["val"] >= up_bound)] + + return df_filtered + + +def make_logdf(data): + """ + Make log10 of the absolute non zero value element of dataframe. + + """ + log_absdf = data.copy() + + log_absdf.loc[log_absdf["val"] != 0, "val"] = np.log10( + np.absolute(log_absdf.loc[log_absdf["val"] != 0, "val"]) + ) + + return log_absdf + + +def get_lvl_ix(data, lvl): + """ + To get level index from coefficient matrix. + + Parameters: + ----------- + data : pandas DataFrame + The coefficient matrix, typically generated by + the mps_sum function in LPDiag. + lvl : int or str + 0 or "row" for rows and 1 or "col" for columns + + """ + return data.index.get_level_values(lvl) + + +def show_range(data, pretext): + """ + To displace coefficient exponents range. + + """ + + log_absdf = make_logdf(data) + + print( + f"{pretext}:", + "[", + np.int32(np.min(log_absdf)), # lower bound + "|", + np.int32(np.max(log_absdf)), # upper bound + "]", + ) + + +def get_scaler_args(scenario_ref=None, model="", scenario=""): + """ + Function to make gams argument for scaling + + """ + if not scenario_ref: + strings = ["MsgScaler", model, scenario] + else: + strings = ["MsgScaler", scenario_ref.model, scenario_ref.scenario] + + file_name = "_".join(s.replace(" ", "_") for s in strings) + + current_directory = os.getcwd() + two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) + + prescale_args_dir = os.path.join(two_levels_up, f"model/scaler/{file_name}.gms") + + if os.path.exists(prescale_args_dir): + return f"--scaler={file_name}" + else: + print("The referred scenario doesn't have prescaler file!") + print("Please use make_prescaler() function to create one") + + +def make_scaler(path, scen, bounds=4, steps=1, display_range=True): + """ + Process to generate prescale_args in GAMS to improve + matrix coefficients. + + This function shifts matrix coefficient exponents to improve + the scaling properties of the matrix. The function returns + prescale arguments (prescale_args) to be passed to the GAMS model. + + Parameters: + ----------- + path: str + Pathways to locate the mps file. + bounds: int or list of 2 integers + Exponent threshold used to identify outlier coefficients. + If a single integer is provided, the bounds are set to +/- that value. + If a list of 2 integers is provided, they represent + the lower and upper bounds of the threshold. + steps: int + Number of times the prescaler generation process is repeated. + Larger values may lead to more refined prescale_args but + also increase computation time. + show_range: boolean + Option to show the coefficient exponents range before and after scaling. + If True, the function will display the range; otherwise, it will not. + + Returns: + -------- + prescale_args: dict + A dictionary of prescale arguments to be passed to the GAMS model. + """ + lp.read_mps(path) + + data = lp.read_matrix() + + matrix = data + + if display_range is True: + show_range(matrix, "\nUnscaled range ") + + scalers = {"row": [], "col": []} + + counter = 0 + while counter < steps: + for s in scalers.keys(): + # print(matrix) + # calculate log base 10 of the absolute value of the matrix + log_absmatrix = make_logdf(matrix) + + # Create matrix with small and large coefficients + log_absmatrix_solv = filter_df(log_absmatrix, bounds=bounds) + + # Populating row scaler + objective_ix = "_obj" if s == "row" else "constobj" + index_solv = [ + e for e in get_lvl_ix(log_absmatrix_solv, s) if e != objective_ix + ] + + SFs = {k: [] for k in index_solv} + for k in SFs.keys(): + index_val = get_lvl_ix(log_absmatrix, s) == k + dflog_val = log_absmatrix.loc[index_val, "val"] + lb, ub = np.int32(min(dflog_val)), np.int32(max(dflog_val)) + mid = np.int32(np.mean([lb, ub])) + + exp = mid if s == "row" else -mid + + SFs[k] = 10.0 ** (exp) + + # Create DataFrame of row scaler + return_index = list(set(get_lvl_ix(log_absmatrix, s))) + if counter == 0: + multiplier = 1 + else: + multiplier = scalers[s].reindex(return_index).fillna(1) + step_scaler = pd.DataFrame(data=SFs, index=["val"]).transpose() + step_scaler.index.name = s + step_scaler = step_scaler.reindex(return_index).fillna(1) + + # summarize multipliers from previous steps + scalers[s] = step_scaler.mul(multiplier) + + # Create new matrix with scaled rows + matrix = matrix.div(step_scaler) if s == "row" else matrix.mul(step_scaler) + + if display_range is True: + show_range(matrix, f"Scaled range step {counter + 1}") + + # Increment the counter + counter += 1 + + # generating prescaler arguments for GAMS + scaler_dict = {} + for key, df_scaler in scalers.items(): + df_scaler = df_scaler.loc[df_scaler["val"] != 1] + df_scaler_dict = df_scaler["val"].to_dict() + for k, v in df_scaler_dict.items(): + if k == "_obj": + k_ = "_obj.scale" + elif k == "constobj": + k_ = "constobj.scale" + else: + k_ = k.replace("(", ".scale('") + k_ = k_.replace(")", "')") + k_ = k_.replace(",", "','") + scaler_dict.update({k_: v}) + + # add this line to active scaling option + scaler_dict["MESSAGE_LP.scaleopt"] = 1 + + scaler_df = pd.DataFrame(scaler_dict, index=["val"]).transpose() + scaler_df.index = scaler_df.index.rename("key", inplace=False) + + scaler_list = [] + for k, v in scaler_dict.items(): + scaler_list.append(f"{k}={v};") + scaler_args_txt = "\n".join(scaler_list) + + current_directory = os.getcwd() + two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) + + scaler_gms_name = [scen.model, scen.scenario] + scaler_gms_name = "_".join(s.replace(" ", "_") for s in scaler_gms_name) + + scaler_gms_dir = os.path.join( + two_levels_up, f"model/scaler/MsgScaler_{scaler_gms_name}.gms" + ) + + with open(scaler_gms_dir, "w") as txtfile: + # Write some text to the file + txtfile.write(scaler_args_txt) + + return scaler_df diff --git a/message_ix/tools/make_scaler/__init__scaler.py b/message_ix/tools/make_scaler/__init__scaler.py new file mode 100644 index 000000000..7e0967ee0 --- /dev/null +++ b/message_ix/tools/make_scaler/__init__scaler.py @@ -0,0 +1,256 @@ +import os + +import ixmp +import numpy as np +import pandas as pd + +from message_ix.tools.lp_diag import LPdiag + +lp = LPdiag() +mp = ixmp.Platform() + + +def filter_df(data, bounds): + """Extracts matrix elements with coefficient outliers. + + This function extracts elements from a matrix where + the coefficients deviate from a specified threshold. + + Parameters: + ----------- + data : pandas DataFrame + The coefficient matrix, typically generated by + the mps_sum function in LPDiag. + bounds: int or list of 2 integers + Exponent threshold used to identify outlier coefficients. + If a single integer is provided, the bounds are set to +/- that value. + If a list of 2 integers is provided, they represent the lower and + upper bounds of the threshold. + + Examples: + --------- + # Extract elements with coefficient exponents deviating beyond +/-3 + extracted_data = filter_df(data_matrix, 3) + + # Extract elements with coefficients exponents deviating + # beyond the range of -2 to 2 + extracted_data = extract_outliers(data_matrix, [-2, 2]) + """ + + if isinstance(bounds, int): + lo_bound = -bounds + up_bound = bounds + else: + lo_bound = bounds[0] + up_bound = bounds[1] + + df_filtered = data.loc[(data["val"] <= lo_bound) | (data["val"] >= up_bound)] + + return df_filtered + + +def make_logdf(data): + """ + Make log10 of the absolute non zero value element of dataframe. + + """ + log_absdf = data.copy() + + log_absdf.loc[log_absdf["val"] != 0, "val"] = np.log10( + np.absolute(log_absdf.loc[log_absdf["val"] != 0, "val"]) + ) + + return log_absdf + + +def get_lvl_ix(data, lvl): + """ + To get level index from coefficient matrix. + + Parameters: + ----------- + data : pandas DataFrame + The coefficient matrix, typically generated by + the mps_sum function in LPDiag. + lvl : int or str + 0 or "row" for rows and 1 or "col" for columns + + """ + return data.index.get_level_values(lvl) + + +def show_range(data, pretext): + """ + To displace coefficient exponents range. + + """ + + log_absdf = make_logdf(data) + + print( + f"{pretext}:", + "[", + np.int32(np.min(log_absdf)), # lower bound + "|", + np.int32(np.max(log_absdf)), # upper bound + "]", + ) + + +def get_scaler_args(scenario_ref=None, model="", scenario=""): + """ + Function to make gams argument for scaling + + """ + if not scenario_ref: + strings = ["MsgScaler", model, scenario] + else: + strings = ["MsgScaler", scenario_ref.model, scenario_ref.scenario] + + file_name = "_".join(s.replace(" ", "_") for s in strings) + + current_directory = os.getcwd() + two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) + + prescale_args_dir = os.path.join(two_levels_up, f"model/scaler/{file_name}.gms") + + if os.path.exists(prescale_args_dir): + return f"--scaler={file_name}" + else: + print("The referred scenario doesn't have prescaler file!") + print("Please use make_prescaler() function to create one") + + +def make_scaler(path, scen, bounds=4, steps=1, display_range=True): + """ + Process to generate prescale_args in GAMS to improve + matrix coefficients. + + This function shifts matrix coefficient exponents to improve + the scaling properties of the matrix. The function returns + prescale arguments (prescale_args) to be passed to the GAMS model. + + Parameters: + ----------- + path: str + Pathways to locate the mps file. + bounds: int or list of 2 integers + Exponent threshold used to identify outlier coefficients. + If a single integer is provided, the bounds are set to +/- that value. + If a list of 2 integers is provided, they represent + the lower and upper bounds of the threshold. + steps: int + Number of times the prescaler generation process is repeated. + Larger values may lead to more refined prescale_args but + also increase computation time. + show_range: boolean + Option to show the coefficient exponents range before and after scaling. + If True, the function will display the range; otherwise, it will not. + + Returns: + -------- + prescale_args: dict + A dictionary of prescale arguments to be passed to the GAMS model. + """ + lp.read_mps(path) + + data = lp.read_matrix() + + matrix = data + + if display_range is True: + show_range(matrix, "\nUnscaled range ") + + scalers = {"row": [], "col": []} + + counter = 0 + while counter < steps: + for s in scalers.keys(): + # print(matrix) + # calculate log base 10 of the absolute value of the matrix + log_absmatrix = make_logdf(matrix) + + # Create matrix with small and large coefficients + log_absmatrix_solv = filter_df(log_absmatrix, bounds=bounds) + + # Populating row scaler + objective_ix = "_obj" if s == "row" else "constobj" + index_solv = [ + e for e in get_lvl_ix(log_absmatrix_solv, s) if e != objective_ix + ] + + SFs = {k: [] for k in index_solv} + for k in SFs.keys(): + index_val = get_lvl_ix(log_absmatrix, s) == k + dflog_val = log_absmatrix.loc[index_val, "val"] + lb, ub = np.int32(min(dflog_val)), np.int32(max(dflog_val)) + mid = np.int32(np.mean([lb, ub])) + + exp = mid if s == "row" else -mid + + SFs[k] = 10.0 ** (exp) + + # Create DataFrame of row scaler + return_index = list(set(get_lvl_ix(log_absmatrix, s))) + if counter == 0: + multiplier = 1 + else: + multiplier = scalers[s].reindex(return_index).fillna(1) + step_scaler = pd.DataFrame(data=SFs, index=["val"]).transpose() + step_scaler.index.name = s + step_scaler = step_scaler.reindex(return_index).fillna(1) + + # summarize multipliers from previous steps + scalers[s] = step_scaler.mul(multiplier) + + # Create new matrix with scaled rows + matrix = matrix.div(step_scaler) if s == "row" else matrix.mul(step_scaler) + + if display_range is True: + show_range(matrix, f"Scaled range step {counter + 1}") + + # Increment the counter + counter += 1 + + # generating prescaler arguments for GAMS + scaler_dict = {} + for key, df_scaler in scalers.items(): + df_scaler = df_scaler.loc[df_scaler["val"] != 1] + df_scaler_dict = df_scaler["val"].to_dict() + for k, v in df_scaler_dict.items(): + if k == "_obj": + k_ = "_obj.scale" + elif k == "constobj": + k_ = "constobj.scale" + else: + k_ = k.replace("(", ".scale('") + k_ = k_.replace(")", "')") + k_ = k_.replace(",", "','") + scaler_dict.update({k_: v}) + + # add this line to active scaling option + scaler_dict["MESSAGE_LP.scaleopt"] = 1 + + scaler_df = pd.DataFrame(scaler_dict, index=["val"]).transpose() + scaler_df.index = scaler_df.index.rename("key", inplace=False) + + scaler_list = [] + for k, v in scaler_dict.items(): + scaler_list.append(f"{k}={v};") + scaler_args_txt = "\n".join(scaler_list) + + current_directory = os.getcwd() + two_levels_up = os.path.abspath(os.path.join(current_directory, "../..")) + + scaler_gms_name = [scen.model, scen.scenario] + scaler_gms_name = "_".join(s.replace(" ", "_") for s in scaler_gms_name) + + scaler_gms_dir = os.path.join( + two_levels_up, f"model/scaler/MsgScaler_{scaler_gms_name}.gms" + ) + + with open(scaler_gms_dir, "w") as txtfile: + # Write some text to the file + txtfile.write(scaler_args_txt) + + return scaler_df