From 58fd672b2833bd872b387d73feb551029a5f380a Mon Sep 17 00:00:00 2001
From: Peter Alexander <peter@blackhillock.co.uk>
Date: Fri, 8 Mar 2019 22:19:58 +0000
Subject: [PATCH] Try to solve demand multiple times until finding a solution

---
 src/ac/ed/lurg/country/AbstractCountryAgent.java  |  2 +-
 src/ac/ed/lurg/country/gams/GamsDemandOutput.java |  4 ++++
 src/ac/ed/lurg/demand/ElasticDemandManager.java   | 13 ++++++++++++-
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/ac/ed/lurg/country/AbstractCountryAgent.java b/src/ac/ed/lurg/country/AbstractCountryAgent.java
index a0ae581c..89cb3ded 100644
--- a/src/ac/ed/lurg/country/AbstractCountryAgent.java
+++ b/src/ac/ed/lurg/country/AbstractCountryAgent.java
@@ -80,7 +80,7 @@ public abstract class AbstractCountryAgent {
 			else
 				priceMarkupFactor = priceMarkupFactors.get(commodity);
 			
-			prices.put(commodity, commPrice);
+			prices.put(commodity, commPrice * priceMarkupFactor);   // * priceMarkupFactor to rebase prices to those provide by G&G
 			LogWriter.println("Price for " + commodity.getGamsName() + " is " + commPrice * priceMarkupFactor + " after markup of " + priceMarkupFactor);
 		}
 		
diff --git a/src/ac/ed/lurg/country/gams/GamsDemandOutput.java b/src/ac/ed/lurg/country/gams/GamsDemandOutput.java
index 85fe7c45..9fb46108 100644
--- a/src/ac/ed/lurg/country/gams/GamsDemandOutput.java
+++ b/src/ac/ed/lurg/country/gams/GamsDemandOutput.java
@@ -41,4 +41,8 @@ public class GamsDemandOutput {
 	public String getStatus() {
 		return status;
 	}
+
+	public void resetForNewAttempt() {
+		utility = (Math.random()-0.5) * 40;
+	}
 }
diff --git a/src/ac/ed/lurg/demand/ElasticDemandManager.java b/src/ac/ed/lurg/demand/ElasticDemandManager.java
index 3b523c30..ad27844b 100644
--- a/src/ac/ed/lurg/demand/ElasticDemandManager.java
+++ b/src/ac/ed/lurg/demand/ElasticDemandManager.java
@@ -41,7 +41,18 @@ public class ElasticDemandManager extends AbstractSSPDemandManager {
 		GamsDemandInput inputData = new GamsDemandInput(c, year, gdpPc, prices, usaGdpPc, previousGamsDemands.get(c));
 
 		// Do the projection
-		GamsDemandOutput gamsOutput = new GamsDemandOptimiser(inputData).getDemandPc();
+		GamsDemandOutput gamsOutput = null;
+		for (int i = 1; i < 50; ++i) {
+			gamsOutput = new GamsDemandOptimiser(inputData).getDemandPc();
+			if (gamsOutput.getStatus().equals("SOLVED"))
+				break;
+			else {
+				LogWriter.printlnError(i + ": Problem solving " + c + ", " + year + " got " + gamsOutput.getStatus());
+				gamsOutput.resetForNewAttempt();
+				inputData = new GamsDemandInput(c, year, gdpPc, prices, usaGdpPc, gamsOutput);
+			}
+		}
+		
 		previousGamsDemands.put(c, gamsOutput);
 		Map<CommodityType, Double> foodPc = gamsOutput.getPlumDemands();
 
-- 
GitLab