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