Skip to content

Commit

Permalink
Merge pull request #63 from BayAreaMetro/java-remove-taps
Browse files Browse the repository at this point in the history
Remove TAPs from CT-RAMP
  • Loading branch information
AshishKuls authored Feb 12, 2024
2 parents b0048b3 + f203ce8 commit 9e85546
Show file tree
Hide file tree
Showing 67 changed files with 962 additions and 4,575 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ core/release/
*.exe
model-files/runtime/config/pskill.exe
utilities/vta_expresslane_feed_saver/vta_expresslanes_2018*
utilities/sandag-activitysim/*
site/
.DS_Store
1,247 changes: 78 additions & 1,169 deletions core/src/java/com/pb/mtctm2/abm/accessibilities/BestTransitPathCalculator.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.pb.mtctm2.abm.ctramp.HouseholdChoiceModelsTaskJppf;
import com.pb.mtctm2.abm.ctramp.MgraDataManager;
import com.pb.mtctm2.abm.ctramp.ModelStructure;
import com.pb.mtctm2.abm.ctramp.TazDataManager;
import com.pb.mtctm2.abm.ctramp.Util;
import com.pb.common.newmodel.UtilityExpressionCalculator;

Expand Down Expand Up @@ -133,6 +134,8 @@ public final class BuildAccessibilities
private double[][][] nMotorExpUtilities;

private MgraDataManager mgraManager;
private TazDataManager tazManager;
private AutoTazSkimsCalculator tazDistanceCalculator;


// purpose (defined in UEC)
Expand Down Expand Up @@ -243,7 +246,10 @@ public void setupBuildAccessibilities(HashMap<String, String> rbMap)


mgraManager = MgraDataManager.getInstance(rbMap);
tazManager = TazDataManager.getInstance(rbMap);

tazDistanceCalculator = new AutoTazSkimsCalculator(rbMap);
tazDistanceCalculator.computeTazDistanceArrays();

// get dimensions for the accessibilities table
alts = dcUEC.getNumberOfAlternatives();
Expand Down Expand Up @@ -709,6 +715,7 @@ private float[][] submitTasksJPPF(ArrayList<int[]> startEndIndexList, HashMap<St
//pass shared data
DataProvider dataProvider = new MemoryMapDataProvider();
dataProvider.setValue("mgraManager", mgraManager);
dataProvider.setValue("tazDistanceCalculator", tazDistanceCalculator);
dataProvider.setValue("sovExpUtilities", sovExpUtilities);
dataProvider.setValue("hovExpUtilities", hovExpUtilities);
dataProvider.setValue("nMotorExpUtilities", nMotorExpUtilities);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;

import com.pb.common.datafile.TableDataSet;
import com.pb.common.util.Tracer;
import com.pb.mtctm2.abm.ctramp.CtrampApplication;
Expand All @@ -23,7 +24,6 @@
import com.pb.common.newmodel.UtilityExpressionCalculator;

import org.apache.log4j.Logger;

import org.jppf.server.protocol.JPPFTask;
import org.jppf.task.storage.DataProvider;

Expand Down Expand Up @@ -64,7 +64,12 @@ public class DcUtilitiesTaskJppf extends JPPFTask implements Callable<List<Objec

private HashMap<String, String> rbMap;

public static final int WTW = 0;
public static final int WTD = 1;
public static final int DTW = 2;

private AutoAndNonMotorizedSkimsCalculator anm;
private AutoTazSkimsCalculator tazDistanceCalculator;

/**
* Call threaded but not with JPPF
Expand Down Expand Up @@ -167,6 +172,7 @@ public void run()
DataProvider dataProvider = getDataProvider();

mgraManager = (MgraDataManager) dataProvider.getValue("mgraManager");
tazDistanceCalculator = (AutoTazSkimsCalculator) dataProvider.getValue("tazDistanceCalculator");
sovExpUtilities = (double[][][]) dataProvider.getValue("sovExpUtilities");
hovExpUtilities = (double[][][]) dataProvider.getValue("hovExpUtilities");
nMotorExpUtilities = (double[][][]) dataProvider.getValue("nMotorExpUtilities");
Expand All @@ -185,8 +191,6 @@ public void run()
dcUtilityPage = (int) dataProvider.getValue("dcUtilityPage");

rbMap = (HashMap<String, String>) dataProvider.getValue("rbMap");


}
catch (Exception e) {
e.printStackTrace();
Expand Down Expand Up @@ -234,7 +238,10 @@ private List<Object> doWork()
// ntUtilities.setNonMotorUtilsMap(ntUtilitiesMap);

McLogsumsCalculator logsumHelper = new McLogsumsCalculator();
logsumHelper.setupSkimCalculators(rbMap);
logsumHelper.setupSkimCalculators(rbMap);
logsumHelper.setTazDistanceSkimArrays( tazDistanceCalculator.getStoredFromTazToAllTazsDistanceSkims(), tazDistanceCalculator.getStoredToTazFromAllTazsDistanceSkims() );
anm = logsumHelper.getAnmSkimCalculator();

bestPathCalculator = logsumHelper.getBestTransitPathCalculator();

// set up the tracer object
Expand Down Expand Up @@ -272,14 +279,15 @@ private List<Object> doWork()
// DMUs for this UEC
TransitWalkAccessDMU walkDmu = new TransitWalkAccessDMU();
walkDmu.setTransitFareDiscounts(bestPathCalculator.getTransitFareDiscounts());
TransitDriveAccessDMU driveDmu = new TransitDriveAccessDMU();

for (int i = startRange; i <= endRange; i++)
{ // Origin MGRA

int iMgra = mgraManager.getMgras().get(i);

//log zone processed
logger.info("...Origin MGRA "+ iMgra);
//logger.info("...Origin MGRA "+ iMgra);

++originMgras;
mgraNumbers[iMgra] = iMgra;
Expand Down Expand Up @@ -319,11 +327,13 @@ private List<Object> doWork()
if (!sample[jMgra]) continue;

//log zone pair processed
//logger.info("...Origin MGRA "+ iMgra + "...Destination MGRA "+ jMgra);
//logger.info("...Origin MGRA "+ iMgra + "...Destination MGRA "+ jMgra);

if (!hasSizeTerm[jMgra]) continue;

int jTaz = mgraManager.getTaz(jMgra);

float odDistance = (float) anm.getTazDistanceFromTaz(iTaz, ModelStructure.AM_SKIM_PERIOD_INDEX)[jTaz];

if (seek && !trace) continue;

Expand All @@ -342,18 +352,8 @@ private List<Object> doWork()
System.exit(-1);
}

// calculate walk-transit exponentiated utility
// determine the best transit path, which also stores the best utilities array and the best mode
bestPathCalculator.findBestWalkTransitWalkTaps(walkDmu, ModelStructure.MD_SKIM_PERIOD_INDEX, iMgra, jMgra, false, logger);

// sum the exponentiated utilities over modes
double opWTExpUtility = 0;
double[] walkTransitWalkUtilities = bestPathCalculator.getBestUtilities();
for (int k=0; k < walkTransitWalkUtilities.length; k++){
if ( walkTransitWalkUtilities[k] > MIN_EXP_FUNCTION_ARGUMENT )
opWTExpUtility += Math.exp(walkTransitWalkUtilities[k]);
}

// calculate off peak walk-transit utility, it is not exponentiated
double opWTUtility = bestPathCalculator.calcPersonSpecificUtilities(iTaz, jTaz, walkDmu, driveDmu, WTW, iMgra, jMgra, ModelStructure.MD_SKIM_PERIOD_INDEX, false, logger, odDistance);

double pkSovExpUtility = 0;
double pkHovExpUtility = 0;
Expand All @@ -370,16 +370,8 @@ private List<Object> doWork()
System.exit(-1);
}

// determine the best transit path, which also stores the best utilities array and the best mode
bestPathCalculator.findBestWalkTransitWalkTaps(walkDmu, ModelStructure.AM_SKIM_PERIOD_INDEX, iMgra, jMgra, false, logger);

// sum the exponentiated utilities over modes
double pkWTExpUtility = 0;
walkTransitWalkUtilities = bestPathCalculator.getBestUtilities();
for (int k=0; k < walkTransitWalkUtilities.length; k++){
if ( walkTransitWalkUtilities[k] > MIN_EXP_FUNCTION_ARGUMENT )
pkWTExpUtility += Math.exp(walkTransitWalkUtilities[k]);
}
// calculate peak walk-transit utility, it is not exponentiated
double pkWTUtility = bestPathCalculator.calcPersonSpecificUtilities(iTaz, jTaz, walkDmu, driveDmu, WTW, iMgra, jMgra, ModelStructure.AM_SKIM_PERIOD_INDEX, false, logger, odDistance);

double nmExpUtility = 0;
try
Expand All @@ -401,49 +393,49 @@ private List<Object> doWork()
logsums[1] = Math.log(opHovExpUtility);

// 2: Walk-Transit
if (opWTExpUtility > 0) logsums[2] = Math.log(opWTExpUtility);
if (opWTUtility > 0) logsums[2] = opWTUtility;

// 3: Non-Motorized
if (nmExpUtility > 0) logsums[3] = Math.log(nmExpUtility);

// 4: SOVLS_0
logsums[4] = Math.log(opSovExpUtility * expConstants[0][0] + opWTExpUtility
logsums[4] = Math.log(opSovExpUtility * expConstants[0][0] + Math.exp(opWTUtility)
* expConstants[0][2] + nmExpUtility * expConstants[0][3]);
// 5: SOVLS_1
logsums[5] = Math.log(opSovExpUtility * expConstants[1][0] + opWTExpUtility
logsums[5] = Math.log(opSovExpUtility * expConstants[1][0] + Math.exp(opWTUtility)
* expConstants[1][2] + nmExpUtility * expConstants[1][3]);

// 6: SOVLS_2
logsums[6] = Math.log(opSovExpUtility * expConstants[2][0] + opWTExpUtility
logsums[6] = Math.log(opSovExpUtility * expConstants[2][0] + Math.exp(opWTUtility)
* expConstants[2][2] + nmExpUtility * expConstants[2][3]);

// 7: HOVLS_0_OP
logsums[7] = Math.log(opHovExpUtility * expConstants[0][1] + opWTExpUtility
logsums[7] = Math.log(opHovExpUtility * expConstants[0][1] + Math.exp(opWTUtility)
* expConstants[0][2] + nmExpUtility * expConstants[0][3]);

// 8: HOVLS_1_OP
logsums[8] = Math.log(opHovExpUtility * expConstants[1][1] + opWTExpUtility
logsums[8] = Math.log(opHovExpUtility * expConstants[1][1] + Math.exp(opWTUtility)
* expConstants[1][2] + nmExpUtility * expConstants[1][3]);

// 9: HOVLS_2_OP
logsums[9] = Math.log(opHovExpUtility * expConstants[2][1] + opWTExpUtility
logsums[9] = Math.log(opHovExpUtility * expConstants[2][1] + Math.exp(opWTUtility)
* expConstants[2][2] + nmExpUtility * expConstants[2][3]);

// 10: HOVLS_0_PK
logsums[10] = Math.log(pkHovExpUtility * expConstants[0][1] + pkWTExpUtility
logsums[10] = Math.log(pkHovExpUtility * expConstants[0][1] + Math.exp(pkWTUtility)
* expConstants[0][2] + nmExpUtility * expConstants[0][3]);

// 11: HOVLS_1_PK
logsums[11] = Math.log(pkHovExpUtility * expConstants[1][1] + pkWTExpUtility
logsums[11] = Math.log(pkHovExpUtility * expConstants[1][1] + Math.exp(pkWTUtility)
* expConstants[1][2] + nmExpUtility * expConstants[1][3]);

// 12: HOVLS_2_PK
logsums[12] = Math.log(pkHovExpUtility * expConstants[2][1] + pkWTExpUtility
logsums[12] = Math.log(pkHovExpUtility * expConstants[2][1] + Math.exp(pkWTUtility)
* expConstants[2][2] + nmExpUtility * expConstants[2][3]);

// 13: ALL
logsums[13] = Math.log(pkSovExpUtility * expConstants[3][0] + pkHovExpUtility
* expConstants[3][1] + pkWTExpUtility * expConstants[3][2] + nmExpUtility
* expConstants[3][1] + Math.exp(pkWTUtility) * expConstants[3][2] + nmExpUtility
* expConstants[3][3]);

aDmu.setLogsums(logsums);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.pb.mtctm2.abm.ctramp.MatrixDataServerRmi;
import com.pb.mtctm2.abm.ctramp.McLogsumsCalculator;
import com.pb.mtctm2.abm.ctramp.MgraDataManager;
import com.pb.mtctm2.abm.ctramp.TazDataManager;
import com.pb.mtctm2.abm.ctramp.ModelStructure;
import com.pb.mtctm2.abm.ctramp.TransitDriveAccessDMU;
import com.pb.mtctm2.abm.ctramp.Util;
Expand Down Expand Up @@ -50,7 +51,6 @@ public class DriveTransitWalkSkimsCalculator
private static final int EGRESS_TIME_INDEX = 1;
private static final int NA = -999;

private int maxDTWSkimSets = 5;
private int[] NUM_SKIMS;
private double[] defaultSkims;

Expand All @@ -64,22 +64,22 @@ public class DriveTransitWalkSkimsCalculator
// this
// UEC

private MgraDataManager mgraManager;
private int maxTap;
private TazDataManager tazManager;
private int maxTaz;

// skim values array for transit service type(local, premium),
// skim values array for
// depart skim period(am, pm, op),
// and Tap-Tap pair.
private double[][][][][] storedDepartPeriodTapTapSkims;
// and Taz-Taz pair.
private double[][][][] storedDepartPeriodTazTazSkims;

private BestTransitPathCalculator bestPathUEC;

private MatrixDataServerIf ms;

public DriveTransitWalkSkimsCalculator(HashMap<String, String> rbMap)
{
mgraManager = MgraDataManager.getInstance();
maxTap = mgraManager.getMaxTap();
tazManager = TazDataManager.getInstance();
maxTaz = tazManager.getMaxTaz();
}

public void setup(HashMap<String, String> rbMap, Logger logger,
Expand Down Expand Up @@ -109,69 +109,59 @@ public void setup(HashMap<String, String> rbMap, Logger logger,
defaultSkims[j] = NA;
}

// point the stored Array of skims: by Prem or Local, DepartPeriod, O tap, D tap, skim values[] to a shared data store
StoredTransitSkimData storedDataObject = StoredTransitSkimData.getInstance( maxDTWSkimSets, NUM_PERIODS, maxTap );
storedDepartPeriodTapTapSkims = storedDataObject.getStoredDtwDepartPeriodTapTapSkims();
// point the stored Array of skims: by Prem or Local, DepartPeriod, O taz, D taz, skim values[] to a shared data store
StoredTransitSkimData storedDataObject = StoredTransitSkimData.getInstance(NUM_PERIODS, maxTaz );
storedDepartPeriodTazTazSkims = storedDataObject.getStoredDtwDepartPeriodTazTazSkims();

}



/**
* Return the array of drive-transit-walk skims for the ride mode, origin TAP,
* destination TAP, and departure time period.
* Return the array of drive-transit-walk skims for the ride mode, origin TAz,
* destination TAZ, and departure time period.
*
* @param set for set source skims
* @param origTap best Origin TAP for the MGRA pair
* @param workTap best Destination TAP for the MGRA pair
* @param origTaz Origin TAZ for the MGRA pair
* @param workTaz Destination TAZ for the MGRA pair
* @param departPeriod Departure time period - 1 = AM period, 2 = PM period, 3 =
* OffPeak period
* @return Array of 55 skim values for the MGRA pair and departure period
*/
public double[] getDriveTransitWalkSkims(int set, double pDriveTime, double aWalkTime, int origTap, int destTap,
public double[] getDriveTransitWalkSkims(double aWalkTime, int origTaz, int destTaz,
int departPeriod, boolean debug)
{

dmu.setDriveTimeToTap(pDriveTime);
dmu.setMgraTapWalkTime(aWalkTime);
dmu.setMgraStopsWalkTime(aWalkTime);

iv.setOriginZone(origTap);
iv.setDestZone(destTap);
iv.setOriginZone(origTaz);
iv.setDestZone(destTaz);

// allocate space for the origin tap if it hasn't been allocated already
if (storedDepartPeriodTapTapSkims[set][departPeriod][origTap] == null)
if (storedDepartPeriodTazTazSkims[departPeriod][origTaz] == null)
{
storedDepartPeriodTapTapSkims[set][departPeriod][origTap] = new double[maxTap + 1][];
storedDepartPeriodTazTazSkims[departPeriod][origTaz] = new double[maxTaz + 1][];
}

// if the destTap skims are not already stored, calculate them and store
// if the destTaz skims are not already stored, calculate them and store
// them
if (storedDepartPeriodTapTapSkims[set][departPeriod][origTap][destTap] == null)
if (storedDepartPeriodTazTazSkims[departPeriod][origTaz][destTaz] == null)
{
dmu.setTOD(departPeriod);
dmu.setSet(set);
double[] results = driveWalkSkimUEC.solve(iv, dmu, null);
if (debug)
driveWalkSkimUEC.logAnswersArray(primaryLogger, "Drive-Walk Skims");
storedDepartPeriodTapTapSkims[set][departPeriod][origTap][destTap] = results;
storedDepartPeriodTazTazSkims[departPeriod][origTaz][destTaz] = results;
}

try {
storedDepartPeriodTapTapSkims[set][departPeriod][origTap][destTap][ACCESS_TIME_INDEX] = pDriveTime;
storedDepartPeriodTazTazSkims[departPeriod][origTaz][destTaz][EGRESS_TIME_INDEX] = aWalkTime;
}
catch ( Exception e ) {
primaryLogger.error ("departPeriod=" + departPeriod + ", origTap=" + origTap + ", destTap=" + destTap + ", pDriveTime=" + pDriveTime);
primaryLogger.error ("exception setting drive-transit-walk drive access time in stored array.", e);
}

try {
storedDepartPeriodTapTapSkims[set][departPeriod][origTap][destTap][EGRESS_TIME_INDEX] = aWalkTime;
}
catch ( Exception e ) {
primaryLogger.error ("departPeriod=" + departPeriod + ", origTap=" + origTap + ", destTap=" + destTap + ", aWalkTime=" + aWalkTime);
primaryLogger.error ("departPeriod=" + departPeriod + ", origTaz=" + origTaz + ", destTaz=" + destTaz + ", aWalkTime=" + aWalkTime);
primaryLogger.error ("exception setting drive-transit-walk walk egress time in stored array.", e);
}
return storedDepartPeriodTapTapSkims[set][departPeriod][origTap][destTap];
return storedDepartPeriodTazTazSkims[departPeriod][origTaz][destTaz];


}
Expand Down
Loading

0 comments on commit 9e85546

Please sign in to comment.