From 16f66571c4a95130457e796ff2acc46c6d47fd3f Mon Sep 17 00:00:00 2001 From: Peter Alexander <peter@blackhillock.co.uk> Date: Fri, 1 Feb 2019 14:18:28 +0000 Subject: [PATCH] Rebase elastic demand projections --- GAMS/elasticDemand.gms | 2 +- src/ac/ed/lurg/ModelConfig.java | 2 +- .../country/gams/GamsDemandOptimiser.java | 2 +- .../lurg/demand/AbstractSSPDemandManager.java | 16 +++++----- src/ac/ed/lurg/demand/DemandManagerSSP.java | 6 ++-- .../ed/lurg/demand/ElasticDemandManager.java | 31 +++++++++++++------ 6 files changed, 35 insertions(+), 24 deletions(-) diff --git a/GAMS/elasticDemand.gms b/GAMS/elasticDemand.gms index 1b97f1f8..87cbf0ee 100644 --- a/GAMS/elasticDemand.gms +++ b/GAMS/elasticDemand.gms @@ -35,7 +35,7 @@ $gdxin %gdx_prices_and_gdp% $load p=price, m=gdp_pc $gdxin -display p; +display p, m; w.up(j) = 1; diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java index 93d47225..04834360 100644 --- a/src/ac/ed/lurg/ModelConfig.java +++ b/src/ac/ed/lurg/ModelConfig.java @@ -380,5 +380,5 @@ public class ModelConfig { public static final boolean USE_CRAFTY_COUNTRIES = getBooleanProperty("USE_CRAFTY_COUNTRIES", false); public static final String CRAFTY_PRODUCTION_DIR = getProperty("CRAFTY_PRODUCTION_DIR", OUTPUT_DIR + File.separator + "crafty"); - public static final double NON_FOOD_PRICE = getDoubleProperty("NON_FOOD_PRICE", 60.0); + public static final double NON_FOOD_PRICE = getDoubleProperty("NON_FOOD_PRICE", 0.06); } diff --git a/src/ac/ed/lurg/country/gams/GamsDemandOptimiser.java b/src/ac/ed/lurg/country/gams/GamsDemandOptimiser.java index 4f7113f8..1e504268 100644 --- a/src/ac/ed/lurg/country/gams/GamsDemandOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsDemandOptimiser.java @@ -67,7 +67,7 @@ public class GamsDemandOptimiser { CommodityType comm = entry.getKey(); Vector<String> v = new Vector<String>(); v.add(comm.getGamsName()); - double priceComm = entry.getValue(); + double priceComm = entry.getValue() * 1000; LogWriter.println(String.format("%s: \tprice= %.4f", comm.getGamsName(), priceComm)); setGamsParamValue(priceP.addRecord(v), priceComm, 4); } diff --git a/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java b/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java index 55703db8..fba1b407 100644 --- a/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java +++ b/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java @@ -11,8 +11,8 @@ import ac.ed.lurg.utils.LogWriter; public abstract class AbstractSSPDemandManager extends AbstractDemandManager { - private SspManager sspManager; - private String ssp_scenario; + protected SspManager sspManager; + protected String ssp_scenario; protected BaseConsumpManager baseConsumpManager; public AbstractSSPDemandManager(String ssp_scenario, BaseConsumpManager baseConsumpManager, CompositeCountryManager compositeCountryManager) { @@ -24,25 +24,23 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager { @Override Map<CommodityType, Double> getFoodDemand(SingleCountry c, int year, Map<CommodityType, Double> prices) { - SspData baseSspData = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c); SspData sd = sspManager.get(ssp_scenario, year, c); Map<CommodityType, Double> foodDemandMap = new HashMap<CommodityType, Double>(); - if (baseSspData == null || sd == null) { - LogWriter.printlnWarning(String.format("No baseSspData or ssp for %s, baseYr:%d, year:%d, %s, base:%s, sd:%s. Skipping", ssp_scenario, ModelConfig.BASE_YEAR, year, c.getCountryName(), baseSspData, sd)); + if (sd == null) { + LogWriter.printlnWarning(String.format("No ssp for %s, baseYr:%d, year:%d, %s, sd:%s. Skipping", ssp_scenario, ModelConfig.BASE_YEAR, year, c.getCountryName(), sd)); return foodDemandMap; } double gdpPcYear; if((ModelConfig.CONSTANT_DIET_HIGH_INCOME & c.getIncomeGroup().toLowerCase().contains("high")) || (ModelConfig.CONSTANT_DIET_LOW_INCOME & !c.getIncomeGroup().toLowerCase().contains("high"))) - gdpPcYear = baseSspData.getGdpPc(); + gdpPcYear = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c).getGdpPc(); else gdpPcYear= sd.getGdpPc(); LogWriter.println("Got ssp data for " + c.getCountryName() + " of " + sd); - foodDemandMap = getFoodDemandMap(c, baseSspData.getGdpPc(), gdpPcYear * ModelConfig.SSP_GDP_PC_FACTOR, - sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR, prices); + foodDemandMap = getFoodDemandMap(c, gdpPcYear * ModelConfig.SSP_GDP_PC_FACTOR, sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR, prices); if(!ModelConfig.SHOCKS_POSSIBLE){ return foodDemandMap; @@ -60,5 +58,5 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager { return projectedCpc; } - abstract Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double baseGdpPc, double gdpPc, double population, Map<CommodityType, Double> prices); + abstract Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double gdpPc, double population, Map<CommodityType, Double> prices); } diff --git a/src/ac/ed/lurg/demand/DemandManagerSSP.java b/src/ac/ed/lurg/demand/DemandManagerSSP.java index ffc7ac0f..f0435627 100644 --- a/src/ac/ed/lurg/demand/DemandManagerSSP.java +++ b/src/ac/ed/lurg/demand/DemandManagerSSP.java @@ -19,9 +19,11 @@ public class DemandManagerSSP extends AbstractSSPDemandManager { } @Override - Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double baseGdpPc, double gdpPc, double population, Map<CommodityType, Double> prices) { + Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double gdpPc, double population, Map<CommodityType, Double> prices) { Map<CommodityType, Double> aFoodDemandMap = new HashMap<CommodityType, Double>(); - + SspData baseSspData = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c); + double baseGdpPc = baseSspData.getGdpPc(); + for (CommodityType commodity : CommodityType.getAllFoodItems()) { ModelFitType fitType = commodity.isAnimalProduct() ? ModelConfig.DEMAND_ANIMAL_PROD_FIT : ModelConfig.DEMAND_NON_ANIMAL_PROD_FIT; DemandCurve dc = demandCurveManager.get(commodity, fitType); diff --git a/src/ac/ed/lurg/demand/ElasticDemandManager.java b/src/ac/ed/lurg/demand/ElasticDemandManager.java index ccc97dc4..62eb3f18 100644 --- a/src/ac/ed/lurg/demand/ElasticDemandManager.java +++ b/src/ac/ed/lurg/demand/ElasticDemandManager.java @@ -3,36 +3,47 @@ package ac.ed.lurg.demand; import java.util.HashMap; import java.util.Map; +import ac.ed.lurg.ModelConfig; import ac.ed.lurg.country.CompositeCountryManager; import ac.ed.lurg.country.SingleCountry; import ac.ed.lurg.country.gams.GamsDemandOptimiser; import ac.ed.lurg.types.CommodityType; public class ElasticDemandManager extends AbstractSSPDemandManager { - - private Map<CommodityType, Double> baseExpCpc; + protected Map<SingleCountry, Map<CommodityType, Double>> baseCpcCache = new HashMap<SingleCountry, Map<CommodityType, Double>>(); + public ElasticDemandManager(String ssp_scenario, BaseConsumpManager baseConsumpManager, CompositeCountryManager compositeCountryManager) { super(ssp_scenario, baseConsumpManager, compositeCountryManager); } @Override - Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double baseGdpPc, double gdpPc, double population, Map<CommodityType, Double> prices) { - Map<CommodityType, Double> aFoodPc = new GamsDemandOptimiser(c, gdpPc, prices).getDemandPc(); - Map<CommodityType, Double> aFood = new HashMap<CommodityType, Double>(); + Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double gdpPc, double population, Map<CommodityType, Double> prices) { + + // Do the projection + Map<CommodityType, Double> foodPc = new GamsDemandOptimiser(c, gdpPc, prices).getDemandPc(); + + Map<CommodityType, Double> foodDemands = new HashMap<CommodityType, Double>(); + SspData baseSspData = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c); + double baseGdpPc = baseSspData.getGdp(); + + Map<CommodityType, Double> baseExpCpcMap = baseCpcCache.get(c); + if (baseExpCpcMap == null) { // we should only do this in the first year + baseCpcCache.put(c, foodPc); + baseExpCpcMap = foodPc; + } - for (Map.Entry<CommodityType, Double> entry : aFoodPc.entrySet()) { + for (Map.Entry<CommodityType, Double> entry : foodPc.entrySet()) { CommodityType commodity = entry.getKey(); double newExpCpc = entry.getValue(); - //TODO double baseExpCpc = dc.getProjectConsumptionPc(baseGdpPc); - double baseExpCpc = Double.NaN; + double baseExpCpc = baseExpCpcMap.get(commodity); double baseCpc = baseConsumpManager.get(c, commodity); double cpc = rebaseConsumption(baseGdpPc, baseCpc, baseExpCpc, gdpPc, newExpCpc); double d = cpc * population; - aFood.put(commodity, d); + foodDemands.put(commodity, d); } - return aFood; + return foodDemands; } } \ No newline at end of file -- GitLab