private void createJobs() { // method to generate synthetic jobs logger.info(" Generating base year jobs"); TableDataSet jobs = SiloUtil.readCSVfile( ResourceUtil.getProperty(rb, JobDataManager.PROPERTIES_JOB_CONTROL_TOTAL)); new JobType(rb); // jobInventory by [industry][taz] float[][] jobInventory = new float[JobType.getNumberOfJobTypes()][geoData.getHighestZonalId() + 1]; tazByWorkZonePuma = new HashMap<>(); // this HashMap has same content as "HashMap tazByPuma", though is kept // separately in case external workzones will be defined // read employment data // For reasons that are not explained in the documentation, some of the PUMA work zones were // aggregated to the // next higher level. Keep this information. for (int row = 1; row <= jobs.getRowCount(); row++) { int taz = (int) jobs.getValueAt(row, "SMZ"); int pumaOfWorkZone = geoData.getSimplifiedPUMAofZone(taz); if (tazByWorkZonePuma.containsKey(pumaOfWorkZone)) { int[] list = tazByWorkZonePuma.get(pumaOfWorkZone); int[] newList = SiloUtil.expandArrayByOneElement(list, taz); tazByWorkZonePuma.put(pumaOfWorkZone, newList); } else { tazByWorkZonePuma.put(pumaOfWorkZone, new int[] {taz}); } for (int jobTp = 0; jobTp < JobType.getNumberOfJobTypes(); jobTp++) { jobInventory[jobTp][taz] = jobs.getValueAt(row, JobType.getJobType(jobTp) + "00"); } } // create base year employment for (int zone : geoData.getZones()) { for (int jobTp = 0; jobTp < JobType.getNumberOfJobTypes(); jobTp++) { if (jobInventory[jobTp][zone] > 0) { for (int i = 1; i <= jobInventory[jobTp][zone]; i++) { int id = JobDataManager.getNextJobId(); new Job(id, zone, -1, JobType.getJobType(jobTp)); if (id == SiloUtil.trackJj) { SiloUtil.trackWriter.println("Generated job with following attributes:"); Job.getJobFromId(id).logAttributes(SiloUtil.trackWriter); } } } } } identifyVacantJobsByZone(); }
private void savePumsRecord( int pumaZone, int weight, int hhSize, int pumsDdType, int bedRooms, int autos, int rent, int mortgage, int quality, int yearBuilt, int[] gender, int[] age, Race[] race, int[] relShp, int[] occupation, int[] workPumaZone, int[] workState, int[] income) { // add record to PUMS record storage if (pumsDdType == 10 || pumsDdType == -999) return; // skip this record if PUMS dwelling type is 10 (Boat, RV, Van) or -999 (unknown) DwellingType ddType = translateDwellingType(pumsDdType); for (int count = 0; count < weight; count++) { int newDdId = RealEstateDataManager.getNextDwellingId(); int newHhId; if (gender[0] == 0) newHhId = -1; else newHhId = HouseholdDataManager.getNextHouseholdId(); int taz = locateDwelling(pumaZone); int price = getDwellingPrice(rent, mortgage); int selectedYear = selectYear(yearBuilt); new Dwelling(newDdId, taz, newHhId, ddType, bedRooms, quality, price, 0, selectedYear); if (gender[0] == 0) return; // this dwelling is empty, do not create household Household hh = new Household(newHhId, newDdId, taz, hhSize, autos); for (int s = 0; s < hhSize; s++) { int newPpId = HouseholdDataManager.getNextPersonId(); int occ = translateOccupation(occupation[s]); int workplace = -1; if (occ == 1) { if (workPumaZone[s] == 0 || workState[s] == 0) { // no workplace PUMA provided by PUMS (person did not go to work during week interviewed // because of vacation, leave, etc.) workplace = selectWorkplaceByTripLengthFrequencyDistribution( workPumaZone[s], workState[s], taz); } else { // workplace PUMA provided by PUMS // workplace = selectWorkplace(workPumaZone[s], workState[s]); // update: As the distribution of requested workplaces according to PUMS is very // different from the available MSTM employment data all jobs are chosen based on trip // length frequency distributions workplace = selectWorkplaceByTripLengthFrequencyDistribution( workPumaZone[s], workState[s], taz); } if (workplace != -2) { Job.getJobFromId(workplace) .setWorkerID(newPpId); // -2 for jobs outside of the study area } } Person pp = new Person(newPpId, newHhId, age[s], gender[s], race[s], occ, workplace, income[s]); hh.addPersonForInitialSetup(pp); } hh.setType(); hh.setHouseholdRace(); definePersonRolesInHousehold(hh, relShp); // trace persons, households and dwellings for (Person pp : hh.getPersons()) if (pp.getId() == SiloUtil.trackPp) { SiloUtil.trackWriter.println("Generated person with following attributes:"); Person.getPersonFromId(pp.getId()).logAttributes(SiloUtil.trackWriter); } if (newHhId == SiloUtil.trackHh) { SiloUtil.trackWriter.println("Generated household with following attributes:"); Household.getHouseholdFromId(newHhId).logAttributes(SiloUtil.trackWriter); } if (newDdId == SiloUtil.trackDd) { SiloUtil.trackWriter.println("Generated dwelling with following attributes:"); Dwelling.getDwellingFromId(newDdId).logAttributes(SiloUtil.trackWriter); } } }