protected void initialize(int[] regionMapData, int[] regionData,
			HashMap<Integer, int[]> regionPolygons, int[] chokePointData, int[] baseLocationData) {
		// regionMap
		assert(regionMapData != null && regionMapData.length == size.getBX() * size.getBY());
		regionMap = regionMapData;
		
		// regions
		regions = new ArrayList<Region>();
		if (regionData != null) {
			for (int index = 0; index < regionData.length; index += Region.numAttributes) {
				int[] coordinates = regionPolygons.get(regionData[index]);
				Region region = new Region(regionData, index, coordinates);
				regions.add(region);
			}
		}
		idToRegion = new HashMap<Integer, Region>();
		for (Region region : regions) {
			idToRegion.put(region.getID(), region);
		}
		
		// choke points
		chokePoints = new ArrayList<ChokePoint>();
		if (chokePointData != null) {
			for (int index = 0; index < chokePointData.length; index += ChokePoint.numAttributes) {
				ChokePoint chokePoint = new ChokePoint(chokePointData, index, idToRegion);
				chokePoints.add(chokePoint);
			}
		}
		
		// base locations
		baseLocations = new ArrayList<BaseLocation>();
		if (baseLocationData != null) {
			for (int index = 0; index < baseLocationData.length; index += BaseLocation.numAttributes) {
				BaseLocation baseLocation = new BaseLocation(baseLocationData, index, idToRegion);
				baseLocations.add(baseLocation);
			}
		}
		
		// connect the region graph
		for (ChokePoint chokePoint : chokePoints) {
			chokePoint.getFirstRegion().addChokePoint(chokePoint);
			chokePoint.getFirstRegion().addConnectedRegion(chokePoint.getSecondRegion());
			chokePoint.getSecondRegion().addChokePoint(chokePoint);
			chokePoint.getSecondRegion().addConnectedRegion(chokePoint.getFirstRegion());
		}
	}