예제 #1
0
  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();
  }
예제 #2
0
  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);
      }
    }
  }