Skip to content
Snippets Groups Projects
ModelMain.java 3.28 KiB
Newer Older
package ac.ed.lurg;

Peter Alexander's avatar
Peter Alexander committed
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ac.ed.lurg.country.Country;
import ac.ed.lurg.country.CountryAgent;
import ac.ed.lurg.country.CountryAgentCreator;
import ac.ed.lurg.country.CountryBoundaryItem;
import ac.ed.lurg.country.CountryBoundaryReader;
import ac.ed.lurg.demand.DemandManager;
Peter Alexander's avatar
Peter Alexander committed
import ac.ed.lurg.types.CropType;
import ac.ed.lurg.types.ModelFitType;
Peter Alexander's avatar
Peter Alexander committed
import ac.ed.lurg.types.YieldType;
import ac.ed.lurg.utils.LogWriter;
import ac.ed.lurg.yield.YieldRaster;
Peter Alexander's avatar
Peter Alexander committed
import ac.ed.lurg.yield.YieldResponseMapReader;
import ac.sac.raster.RasterKey;
Peter Alexander's avatar
Peter Alexander committed
import ac.sac.raster.RasterSet;

public class ModelMain {

	private Collection<CountryAgent> countryAgents;
	private ModelContext modelContext;
	private Map<Country, List<RasterKey>> countryToKeysMap;
	
	public static void main(String[] args)  {
		ModelMain theModel = new ModelMain();
		theModel.setup();
		theModel.run();
	}
		
	/* setup models, reading inputs, etc. */
	private void setup() {
Peter Alexander's avatar
Peter Alexander committed
		DemandManager demandManager = new DemandManager(ModelFitType.LOGISTIC, "SSP2_v9_130325");

		modelContext = new ModelContext(demandManager);
		countryToKeysMap = getCountryToKeysMap();

		countryAgents = new CountryAgentCreator().getAgents(modelContext);
	}

	private Map<Country, List<RasterKey>>  getCountryToKeysMap() {
		CountryBoundaryReader countryReader = new CountryBoundaryReader();
		RasterSet<CountryBoundaryItem> countryBoundaries = countryReader.getRasterDataFromFile(ModelConfig.COUNTRY_BOUNDARY_FILE);
	
		Map<Country, List<RasterKey>> countryToKeysMap = new HashMap<Country, List<RasterKey>>();

		for (Map.Entry<RasterKey, CountryBoundaryItem> entry : countryBoundaries.entrySet()) {
			List<RasterKey> keys = countryToKeysMap.get(entry.getValue().getCountry());
			
			if (keys == null) {
				keys = new ArrayList<RasterKey>();
				countryToKeysMap.put(entry.getValue().getCountry(), keys);
			}
			
			keys.add(entry.getKey());
 		}
		
		return countryToKeysMap;
	}
	
	/* run the model */
	private void run() {
		for (int i = ModelConfig.START_TIMESTEP; i <= ModelConfig.END_TIMESTEP; i++)
			doTimestep(i);
	}

	private void doTimestep(int timestep) {
		YieldRaster yieldSurfaces = getYieldSurfaces(timestep);
		LogWriter.println("Timestep " + timestep);

		for (CountryAgent ca : countryAgents) {
			LogWriter.println("Country " + ca.getCountry());
			Collection<RasterKey> countryKeys = countryToKeysMap.get(ca.getCountry());
			YieldRaster countryYieldSurfaces = yieldSurfaces.getSubsetRasterForKeys(countryKeys);
			ca.determineProduction(timestep, countryYieldSurfaces);
		}
		
		// examine global trade balance
Peter Alexander's avatar
Peter Alexander committed
	}

	private YieldRaster getYieldSurfaces(int timestep) {
		String rootDir = ModelConfig.YIELD_DIR + File.separator + (timestep + ModelConfig.BASE_YEAR) + File.separator;
		YieldRaster yieldSurfaces = null;
Peter Alexander's avatar
Peter Alexander committed
		
Peter Alexander's avatar
Peter Alexander committed
		for (CropType cropType : CropType.values()) {
			String cropDir = rootDir + cropType.getGamsName() + File.separator;
			
Peter Alexander's avatar
Peter Alexander committed
			for (YieldType yieldType : YieldType.values()) {
				YieldResponseMapReader yieldReader = new YieldResponseMapReader(yieldSurfaces, yieldType, cropType);
				yieldSurfaces = (YieldRaster)yieldReader.getRasterDataFromFile(cropDir + yieldType.getFileName()); 
Peter Alexander's avatar
Peter Alexander committed
			}
Peter Alexander's avatar
Peter Alexander committed
		}
Peter Alexander's avatar
Peter Alexander committed
		return yieldSurfaces;
	}