private void definePersonRolesInHousehold(Household hh, int[] relShp) { // define roles as single, married or child Person[] pp = hh.getPersons(); HashMap<Integer, Integer> coupleCounter = new HashMap<>(); coupleCounter.put(1, 0); coupleCounter.put(2, 0); for (int i = 0; i < pp.length; i++) { // Householder husband/wife unmarried Partner if (relShp[i] == 1 || relShp[i] == 2 || relShp[i] == 19) { int cnt = coupleCounter.get(pp[i].getGender()) + 1; coupleCounter.put(pp[i].getGender(), cnt); } } int numberOfCouples = Math.min(coupleCounter.get(1), coupleCounter.get(2)); int[] marriedPersons = new int[] {numberOfCouples, numberOfCouples}; if (numberOfCouples > 0) { pp[0].setRole(PersonRole.married); marriedPersons[pp[0].getGender() - 1] -= 1; } else pp[0].setRole(PersonRole.single); for (int i = 1; i < pp.length; i++) { if ((relShp[i] == 2 || relShp[i] == 19) && marriedPersons[pp[i].getGender() - 1] > 0) { pp[i].setRole(PersonRole.married); marriedPersons[pp[i].getGender() - 1] -= 1; // natural child adopted child step child grandchild foster child } else if (relShp[i] == 3 || relShp[i] == 4 || relShp[i] == 5 || relShp[i] == 8 || relShp[i] == 20) pp[i].setRole(PersonRole.child); else pp[i].setRole(PersonRole.single); } }
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); } } }