From 58f37876332ddeeacca162a5d8024261ff6472bb Mon Sep 17 00:00:00 2001
From: Peter Alexander <peter@blackhillock.co.uk>
Date: Fri, 15 Mar 2019 16:52:22 +0000
Subject: [PATCH] Changes to stop demand going mad due to rebasing

---
 src/ac/ed/lurg/ModelConfig.java               |  2 +-
 .../ed/lurg/demand/ElasticDemandManager.java  | 50 ++++++-------------
 src/ac/ed/lurg/types/CommodityType.java       |  2 +-
 3 files changed, 17 insertions(+), 37 deletions(-)

diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java
index 00c0c102..9dbca5cd 100755
--- a/src/ac/ed/lurg/ModelConfig.java
+++ b/src/ac/ed/lurg/ModelConfig.java
@@ -279,7 +279,7 @@ public class ModelConfig {
 
 	// Other model parameters
 	public static final boolean CHANGE_DEMAND_YEAR = IS_CALIBRATION_RUN ? false : getBooleanProperty("CHANGE_DEMAND_YEAR", true);
-	public static final double DIETARY_CLOSURE = getDoubleProperty("DIETARY_CLOSURE", 0.0); // Amount diet converges in DIETARY_CLOSURE_GDP_CHANGE rate of GDP shift
+	public static final double DIETARY_CLOSURE = getDoubleProperty("DIETARY_CLOSURE", 0.5); // Amount diet converges in DIETARY_CLOSURE_GDP_CHANGE rate of GDP shift
 	public static final double DIETARY_CLOSURE_GDP_CHANGE = getDoubleProperty("DIETARY_CLOSURE_GDP_CHANGE", 2.0); // 2 is double of GDP
 	public static final double DIETARY_CLOSURE_PARAM = getDoubleProperty("DIETARY_CLOSURE_PARAM", Math.log((1-DIETARY_CLOSURE))/DIETARY_CLOSURE_GDP_CHANGE); // Zero is no dietary closure, number specifies closure rate for changes in GDP per capita, e.g. Math.log(0.5)/2
 	public static final String SSP_SCENARIO = getProperty("SSP_SCENARIO", "SSP1_v9_130325");
diff --git a/src/ac/ed/lurg/demand/ElasticDemandManager.java b/src/ac/ed/lurg/demand/ElasticDemandManager.java
index 90560a6b..7e93525e 100755
--- a/src/ac/ed/lurg/demand/ElasticDemandManager.java
+++ b/src/ac/ed/lurg/demand/ElasticDemandManager.java
@@ -8,6 +8,7 @@ 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.GamsCommodityDemand;
 import ac.ed.lurg.country.gams.GamsDemandInput;
 import ac.ed.lurg.country.gams.GamsDemandOptimiser;
 import ac.ed.lurg.country.gams.GamsDemandOutput;
@@ -83,46 +84,25 @@ public class ElasticDemandManager extends AbstractSSPDemandManager {
 	}
 
 	private String getDamsDemandOutputsHeader() {
-		StringBuffer sbHeader = new StringBuffer("country,year,gdpPc,population");
-
-		for (CommodityType commodity : CommodityType.values())
-			sbHeader.append(",price_" + commodity.getGamsName());
-
-		sbHeader.append(",status,utility,hungerFactor");
-
-		for (CommodityType commodity : CommodityType.values())
-			sbHeader.append(",gamssubs_" + commodity.getGamsName());
-		for (CommodityType commodity : CommodityType.values())
-			sbHeader.append(",gamsdisc_" + commodity.getGamsName());
-		for (CommodityType commodity : CommodityType.getAllFoodItems())
-			sbHeader.append(",plumdemand_" + commodity.getGamsName());
-		for (CommodityType commodity : CommodityType.getAllFoodItems())
-			sbHeader.append(",plumrebased_" + commodity.getGamsName());
-
-		return sbHeader.toString();
+		return "country,year,gdpPc,population,status,utility,hungerFactor,commodity,price,subsistence,discretionary,plumNotRebase,plumRebased";
 	}
 
 	private void writeGamsDemandOutputs(GamsDemandInput inputData, GamsDemandOutput gamsOutput, Map<CommodityType, Double> foodDemands, double population) {
 		try {
 			Map<CommodityType, Double> plumDemands = gamsOutput.getPlumDemands();
-			StringBuffer sbData = new StringBuffer(String.format("%s,%d,%.2f,%.6f", inputData.getCountry(), inputData.getYear(),inputData.getGdpPc(), population));
-
-			for (CommodityType commodity : CommodityType.values())
-				sbData.append(String.format(",%.4f", inputData.getPrices().get(commodity)));
-
-			sbData.append(String.format(",%s,%.6f,%.6f", gamsOutput.getStatus(), gamsOutput.getUtility(),gamsOutput.getHungerFactor()));
-
-			for (CommodityType commodity : CommodityType.values())
-				sbData.append(String.format(",%.4f", gamsOutput.getGamsDemands(commodity).getSubsistence()));
-			for (CommodityType commodity : CommodityType.values())
-				sbData.append(String.format(",%.4f", gamsOutput.getGamsDemands(commodity).getDiscretionary()));
-			for (CommodityType commodity : CommodityType.getAllFoodItems())
-				sbData.append(String.format(",%.4f", plumDemands.get(commodity)));
-			for (CommodityType commodity : CommodityType.getAllFoodItems())
-				sbData.append(String.format(",%.4f", foodDemands.get(commodity)/population));
-
-			outputFile.write(sbData.toString());
-			outputFile.newLine();
+			String initialData = String.format("%s,%d,%.2f,%.6f,%s,%.6f,%.6f", 
+					inputData.getCountry(), inputData.getYear(),inputData.getGdpPc(), population, 
+					gamsOutput.getStatus(), gamsOutput.getUtility(), gamsOutput.getHungerFactor());
+			
+			for (CommodityType commodity : CommodityType.values()) {
+				StringBuffer sbData = new StringBuffer(initialData);
+				GamsCommodityDemand gamsDemand = gamsOutput.getGamsDemands(commodity);
+				sbData.append(String.format(",%s,%.4f", commodity.getGamsName(), inputData.getPrices().get(commodity)));
+				sbData.append(String.format(",%.4f,%.4f", gamsDemand.getSubsistence(), gamsDemand.getDiscretionary()));
+				sbData.append(String.format(",%.4f,%.4f", plumDemands.get(commodity), foodDemands.get(commodity)/population));
+				outputFile.write(sbData.toString());
+				outputFile.newLine();
+			}
 		}
 		catch (IOException e) {
 			LogWriter.print(e);
diff --git a/src/ac/ed/lurg/types/CommodityType.java b/src/ac/ed/lurg/types/CommodityType.java
index 29ceb084..c2f19bce 100644
--- a/src/ac/ed/lurg/types/CommodityType.java
+++ b/src/ac/ed/lurg/types/CommodityType.java
@@ -41,7 +41,7 @@ public enum CommodityType {
 		for (int i=0; i<cropTypeMapping.length; i++)
 			prodPrice += cropTypeMapping[i].getInitialPrice() * defaultDemandFract[i];
 
-		priceMarkupFactor = initialPrice / (prodPrice * getPlumPriceToKcalPriceConversion());
+		priceMarkupFactor = initialPrice * 0.6 / (prodPrice * getPlumPriceToKcalPriceConversion());  // the 0.6 is a temporary hack until we have updated tariff free prices for commodities
 		LogWriter.println("priceMarkupFactor for " + gamsName + " is " + priceMarkupFactor);
 	}
 	
-- 
GitLab