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