Skip to content
Snippets Groups Projects
DemandManagerSSP.java 2.41 KiB
Newer Older
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.types.CommodityType;
import ac.ed.lurg.types.ModelFitType;
import ac.ed.lurg.utils.LogWriter;

public class DemandManagerSSP extends AbstractDemandManager {

	private DemandCurveManager demandCurveManager;
	private SspManager sspManager;
	private BaseConsumpManager baseConsumpManager;
	private String ssp_scenario;

	public DemandManagerSSP(String ssp_scenario, BaseConsumpManager baseConsumpManager, CompositeCountryManager compositeCountryManager) {
		super(compositeCountryManager);
		this.ssp_scenario = ssp_scenario;
		this.baseConsumpManager = baseConsumpManager;
		demandCurveManager = new DemandCurveManager();		
		sspManager = new SspManager();
	}

	@Override
	Map<CommodityType, Double> getFoodDemand(SingleCountry c, int year) {
		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.printlnError(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));
			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();

		else gdpPcYear= sd.getGdpPc();
	
		LogWriter.println("Got ssp data for " + c.getCountryName() + " of " + sd);

		for (CommodityType commodity : CommodityType.getAllItems()) {
			ModelFitType fitType = commodity.isAnimalProduct() ? ModelConfig.DEMAND_ANIMAL_PROD_FIT : ModelConfig.DEMAND_NON_ANIMAL_PROD_FIT;
			DemandCurve dc = demandCurveManager.get(commodity, fitType);
			double cpc = dc.getConsumptionPc(baseSspData.getGdpPc(), baseConsumpManager.get(c, commodity), gdpPcYear * ModelConfig.SSP_GDP_PC_FACTOR);
			double d = cpc * sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR;
			foodDemandMap.put(commodity, d);
		}

		if(!ModelConfig.ACTIVE_DIETARY_SHIFT){
			return foodDemandMap;
		}
		return dietaryAdjustment(foodDemandMap, year);