private void summarizeByPersonRelationship() { // summarize number of people by PersonRole (married, single, child) int[][] roleCounter = new int[101][3]; for (Person pp : Person.getPersonArray()) { if (pp.getGender() == 1) continue; int age = Math.min(100, pp.getAge()); roleCounter[age][pp.getRole().ordinal()]++; } logger.info("Person role distribution for women:"); logger.info("age,single,married,child"); for (int i = 0; i <= 100; i++) logger.info(i + "," + roleCounter[i][0] + "," + roleCounter[i][1] + "," + roleCounter[i][2]); }
public void runSP() { // main method to run the synthetic population generator if (!ResourceUtil.getBooleanProperty(rb, PROPERTIES_RUN_SP)) return; logger.info("Generating synthetic populations of household/persons, dwellings and jobs"); identifyUniquePUMAzones(); readControlTotals(); createJobs(); processPums(); generateAutoOwnership(); // summarizeData.summarizeAutoOwnershipByCounty(); addVacantDwellings(); if (ResourceUtil.getBooleanProperty(rb, PROPERTIES_VALIDATE_SYNTH_POP)) validateHHandDD(); logger.info(" Total number of households created " + Household.getHouseholdCount()); logger.info(" Total number of persons created " + Person.getPersonCount()); logger.info(" Total number of dwellings created " + Dwelling.getDwellingCount()); logger.info(" Total number of jobs created " + Job.getJobCount()); calculateVacancyRate(); if (!jobErrorCounter.isEmpty()) { logger.warn( " Could not find sufficient number of jobs in these PUMA zones (note that most of these " + "zones are outside the MSTM area):"); Set<Integer> list = jobErrorCounter.keySet(); for (Integer puma : list) logger.warn(" -> " + puma + " is missing " + jobErrorCounter.get(puma) + " jobs."); } else { logger.info(" Succeeded in assigning job to every worker."); } // summarizeVacantJobsByRegion(); // summarizeByPersonRelationship(); summarizeData.writeOutSyntheticPopulation(rb, SiloUtil.getBaseYear()); // writeSyntheticPopulation(); logger.info(" Completed generation of synthetic population"); }
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); } } }