From 56ed47cdc7cb476491c940419daf66c132efe298 Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Tue, 15 Feb 2022 11:19:07 -0800 Subject: [PATCH 1/9] Read RH wait times from skims for austin and sfbay --- ..._choice_annotate_choosers_preprocessor.csv | 29 ++++--------------- ...ode_choice_annotate_trips_preprocessor.csv | 15 ++-------- ..._choice_annotate_choosers_preprocessor.csv | 28 ++++-------------- ...ode_choice_annotate_trips_preprocessor.csv | 17 +++-------- 4 files changed, 19 insertions(+), 70 deletions(-) diff --git a/austin/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv b/austin/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv index 1f27fe7524..38db2f9053 100644 --- a/austin/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv +++ b/austin/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv @@ -31,29 +31,12 @@ local,_DF_IS_TOUR,'tour_type' in df.columns ,origin_walk_time,shortWalk*60/walkSpeed ,destination_walk_time,shortWalk*60/walkSpeed # RIDEHAIL,, -,origin_density_measure,"(reindex(land_use.TOTPOP, df[orig_col_name]) + reindex(land_use.TOTEMP, df[orig_col_name])) / (reindex(land_use.TOTACRE, df[orig_col_name]) / 640)" -,dest_density_measure,"(reindex(land_use.TOTPOP, df[dest_col_name]) + reindex(land_use.TOTEMP, df[dest_col_name])) / (reindex(land_use.TOTACRE, df[dest_col_name]) / 640)" -,origin_density,"pd.cut(origin_density_measure, bins=[-np.inf, 500, 2000, 5000, 15000, np.inf], labels=[5, 4, 3, 2, 1]).astype(int)" -,dest_density,"pd.cut(dest_density_measure, bins=[-np.inf, 500, 2000, 5000, 15000, np.inf], labels=[5, 4, 3, 2, 1]).astype(int)" -,origin_zone_taxi_wait_time_mean,"origin_density.map({k: v for k, v in Taxi_waitTime_mean.items()})" -,origin_zone_taxi_wait_time_sd,"origin_density.map({k: v for k, v in Taxi_waitTime_sd.items()})" -,dest_zone_taxi_wait_time_mean,"dest_density.map({k: v for k, v in Taxi_waitTime_mean.items()})" -,dest_zone_taxi_wait_time_sd,"dest_density.map({k: v for k, v in Taxi_waitTime_sd.items()})" -# ,, Note that the mean and standard deviation are not the values for the distribution itself but of the underlying normal distribution it is derived from -,origTaxiWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_taxi_wait_time_mean, sigma=origin_zone_taxi_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,destTaxiWaitTime,"rng.lognormal_for_df(df, mu=dest_zone_taxi_wait_time_mean, sigma=dest_zone_taxi_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_singleTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_single_waitTime_mean.items()})" -,origin_zone_singleTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_single_waitTime_sd.items()})" -,dest_zone_singleTNC_wait_time_mean,"dest_density.map({k: v for k, v in TNC_single_waitTime_mean.items()})" -,dest_zone_singleTNC_wait_time_sd,"dest_density.map({k: v for k, v in TNC_single_waitTime_sd.items()})" -,origSingleTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_singleTNC_wait_time_mean, sigma=origin_zone_singleTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,destSingleTNCWaitTime,"rng.lognormal_for_df(df, mu=dest_zone_singleTNC_wait_time_mean, sigma=dest_zone_singleTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_sharedTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_shared_waitTime_mean.items()})" -,origin_zone_sharedTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_shared_waitTime_sd.items()})" -,dest_zone_sharedTNC_wait_time_mean,"dest_density.map({k: v for k, v in TNC_shared_waitTime_mean.items()})" -,dest_zone_sharedTNC_wait_time_sd,"dest_density.map({k: v for k, v in TNC_shared_waitTime_sd.items()})" -,origSharedTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_sharedTNC_wait_time_mean, sigma=origin_zone_sharedTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,destSharedTNCWaitTime,"rng.lognormal_for_df(df, mu=dest_zone_sharedTNC_wait_time_mean, sigma=dest_zone_sharedTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" +,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT']" +,destTaxiWaitTime,"dot_skims['RH_SOLO_WAIT']" +,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT']" +,destSingleTNCWaitTime,"dot_skims['RH_SOLO_WAIT']" +,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT']" +,destSharedTNCWaitTime,"dot_skims['RH_POOLED_WAIT']" ,totalWaitTaxi,origTaxiWaitTime + destTaxiWaitTime ,totalWaitSingleTNC,origSingleTNCWaitTime + destSingleTNCWaitTime ,totalWaitSharedTNC,origSharedTNCWaitTime + destSharedTNCWaitTime diff --git a/austin/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv b/austin/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv index ec120ebe10..b3cd1ae432 100644 --- a/austin/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv +++ b/austin/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv @@ -45,18 +45,9 @@ dest terminal time not counted at home,_dest_terminal_time,"np.where(inbound & l ,origin_walk_time,shortWalk*60/walkSpeed ,destination_walk_time,shortWalk*60/walkSpeed # RIDEHAIL,, -,origin_density_measure,"(reindex(land_use.TOTPOP, df[orig_col_name]) + reindex(land_use.TOTEMP, df[orig_col_name])) / (reindex(land_use.TOTACRE, df[orig_col_name]) / 640)" -,origin_density,"pd.cut(origin_density_measure, bins=[-np.inf, 500, 2000, 5000, 15000, np.inf], labels=[5, 4, 3, 2, 1]).astype(int)" -,origin_zone_taxi_wait_time_mean,"origin_density.map({k: v for k, v in Taxi_waitTime_mean.items()})" -,origin_zone_taxi_wait_time_sd,"origin_density.map({k: v for k, v in Taxi_waitTime_sd.items()})" -# ,, Note that the mean and standard deviation are not the values for the distribution itself but of the underlying normal distribution it is derived from -,origTaxiWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_taxi_wait_time_mean, sigma=origin_zone_taxi_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_singleTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_single_waitTime_mean.items()})" -,origin_zone_singleTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_single_waitTime_sd.items()})" -,origSingleTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_singleTNC_wait_time_mean, sigma=origin_zone_singleTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_sharedTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_shared_waitTime_mean.items()})" -,origin_zone_sharedTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_shared_waitTime_sd.items()})" -,origSharedTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_sharedTNC_wait_time_mean, sigma=origin_zone_sharedTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" +,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT']" +,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT']" +,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT']" #,, ,sov_available,odt_skims['SOV_TIME']>0 ,hov2_available,odt_skims['HOV2_TIME']>0 diff --git a/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv b/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv index 7feb6c8e1a..ffe8c02a5c 100644 --- a/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv +++ b/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv @@ -31,29 +31,13 @@ local,_DF_IS_TOUR,'tour_type' in df.columns ,origin_walk_time,shortWalk*60/walkSpeed ,destination_walk_time,shortWalk*60/walkSpeed # RIDEHAIL,, -,origin_density_measure,"(reindex(land_use.TOTPOP, df[orig_col_name]) + reindex(land_use.TOTEMP, df[orig_col_name])) / (reindex(land_use.TOTACRE, df[orig_col_name]) / 640)" -,dest_density_measure,"(reindex(land_use.TOTPOP, df[dest_col_name]) + reindex(land_use.TOTEMP, df[dest_col_name])) / (reindex(land_use.TOTACRE, df[dest_col_name]) / 640)" -,origin_density,"pd.cut(origin_density_measure, bins=[-np.inf, 500, 2000, 5000, 15000, np.inf], labels=[5, 4, 3, 2, 1]).astype(int)" -,dest_density,"pd.cut(dest_density_measure, bins=[-np.inf, 500, 2000, 5000, 15000, np.inf], labels=[5, 4, 3, 2, 1]).astype(int)" -,origin_zone_taxi_wait_time_mean,"origin_density.map({k: v for k, v in Taxi_waitTime_mean.items()})" -,origin_zone_taxi_wait_time_sd,"origin_density.map({k: v for k, v in Taxi_waitTime_sd.items()})" -,dest_zone_taxi_wait_time_mean,"dest_density.map({k: v for k, v in Taxi_waitTime_mean.items()})" -,dest_zone_taxi_wait_time_sd,"dest_density.map({k: v for k, v in Taxi_waitTime_sd.items()})" # ,, Note that the mean and standard deviation are not the values for the distribution itself, but of the underlying normal distribution it is derived from -,origTaxiWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_taxi_wait_time_mean, sigma=origin_zone_taxi_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,destTaxiWaitTime,"rng.lognormal_for_df(df, mu=dest_zone_taxi_wait_time_mean, sigma=dest_zone_taxi_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_singleTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_single_waitTime_mean.items()})" -,origin_zone_singleTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_single_waitTime_sd.items()})" -,dest_zone_singleTNC_wait_time_mean,"dest_density.map({k: v for k, v in TNC_single_waitTime_mean.items()})" -,dest_zone_singleTNC_wait_time_sd,"dest_density.map({k: v for k, v in TNC_single_waitTime_sd.items()})" -,origSingleTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_singleTNC_wait_time_mean, sigma=origin_zone_singleTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,destSingleTNCWaitTime,"rng.lognormal_for_df(df, mu=dest_zone_singleTNC_wait_time_mean, sigma=dest_zone_singleTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_sharedTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_shared_waitTime_mean.items()})" -,origin_zone_sharedTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_shared_waitTime_sd.items()})" -,dest_zone_sharedTNC_wait_time_mean,"dest_density.map({k: v for k, v in TNC_shared_waitTime_mean.items()})" -,dest_zone_sharedTNC_wait_time_sd,"dest_density.map({k: v for k, v in TNC_shared_waitTime_sd.items()})" -,origSharedTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_sharedTNC_wait_time_mean, sigma=origin_zone_sharedTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,destSharedTNCWaitTime,"rng.lognormal_for_df(df, mu=dest_zone_sharedTNC_wait_time_mean, sigma=dest_zone_sharedTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" +,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT']" +,destTaxiWaitTime,"dot_skims['RH_SOLO_WAIT']" +,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT']" +,destSingleTNCWaitTime,"dot_skims['RH_SOLO_WAIT']" +,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT']" +,destSharedTNCWaitTime,"dot_skims['RH_POOLED_WAIT']" ,totalWaitTaxi,origTaxiWaitTime + destTaxiWaitTime ,totalWaitSingleTNC,origSingleTNCWaitTime + destSingleTNCWaitTime ,totalWaitSharedTNC,origSharedTNCWaitTime + destSharedTNCWaitTime diff --git a/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv b/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv index 1dbd82d67c..c1fccdcf2c 100644 --- a/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv +++ b/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv @@ -44,19 +44,10 @@ dest terminal time not counted at home,_dest_terminal_time,"np.where(inbound & l ,drive_transit_available,"np.where(df.outbound, _walk_transit_destination, _walk_transit_origin) & (df.auto_ownership > 0)" ,origin_walk_time,shortWalk*60/walkSpeed ,destination_walk_time,shortWalk*60/walkSpeed -# RIDEHAIL,, -,origin_density_measure,"(reindex(land_use.TOTPOP, df[orig_col_name]) + reindex(land_use.TOTEMP, df[orig_col_name])) / (reindex(land_use.TOTACRE, df[orig_col_name]) / 640)" -,origin_density,"pd.cut(origin_density_measure, bins=[-np.inf, 500, 2000, 5000, 15000, np.inf], labels=[5, 4, 3, 2, 1]).astype(int)" -,origin_zone_taxi_wait_time_mean,"origin_density.map({k: v for k, v in Taxi_waitTime_mean.items()})" -,origin_zone_taxi_wait_time_sd,"origin_density.map({k: v for k, v in Taxi_waitTime_sd.items()})" -# ,, Note that the mean and standard deviation are not the values for the distribution itself, but of the underlying normal distribution it is derived from -,origTaxiWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_taxi_wait_time_mean, sigma=origin_zone_taxi_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_singleTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_single_waitTime_mean.items()})" -,origin_zone_singleTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_single_waitTime_sd.items()})" -,origSingleTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_singleTNC_wait_time_mean, sigma=origin_zone_singleTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" -,origin_zone_sharedTNC_wait_time_mean,"origin_density.map({k: v for k, v in TNC_shared_waitTime_mean.items()})" -,origin_zone_sharedTNC_wait_time_sd,"origin_density.map({k: v for k, v in TNC_shared_waitTime_sd.items()})" -,origSharedTNCWaitTime,"rng.lognormal_for_df(df, mu=origin_zone_sharedTNC_wait_time_mean, sigma=origin_zone_sharedTNC_wait_time_sd, broadcast=True, scale=True).clip(min_waitTime, max_waitTime)" +# RIDEHAIL,, Could just define this in trip_mode_choice.csv but leaving this for now so that we can factor in rejected trips if needed +,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT']" +,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT']" +,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT']" #,, ,sov_available,odt_skims['SOV_TIME']>0 ,hov2_available,odt_skims['HOV2_TIME']>0 From d9787aa77829fbbaa13709969de601d67a233acd Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Tue, 1 Mar 2022 14:58:50 -0800 Subject: [PATCH 2/9] Missed trip penalty --- Dockerfile | 2 +- bay_area/configs/configs/tour_mode_choice.yaml | 1 + ...ur_mode_choice_annotate_choosers_preprocessor.csv | 12 ++++++------ bay_area/configs/configs/trip_mode_choice.yaml | 1 + .../trip_mode_choice_annotate_trips_preprocessor.csv | 6 +++--- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index e3fbbb5921..99f5d7e66b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get --allow-releaseinfo-change update \ && apt-get install -y build-essential zip unzip RUN conda update conda --yes -RUN git clone https://github.com/ual/activitysim.git +RUN git clone -b zn/rh-wait-times-from-skims https://github.com/LBNL-UCB-STI/activitysim.git RUN conda env create --quiet -p $FULL_CONDA_PATH --file activitysim/environment.yml RUN cd activitysim && $FULL_CONDA_PATH/bin/python setup.py install diff --git a/bay_area/configs/configs/tour_mode_choice.yaml b/bay_area/configs/configs/tour_mode_choice.yaml index 5caa0d586d..0686371614 100644 --- a/bay_area/configs/configs/tour_mode_choice.yaml +++ b/bay_area/configs/configs/tour_mode_choice.yaml @@ -127,6 +127,7 @@ CONSTANTS: 5: 0 min_waitTime: 0 max_waitTime: 50 + TNC_missed_trip_penalty: 15 ivt_cost_multiplier: 0.6 ivt_lrt_multiplier: 0.9 diff --git a/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv b/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv index ffe8c02a5c..445aa79002 100644 --- a/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv +++ b/bay_area/configs/configs/tour_mode_choice_annotate_choosers_preprocessor.csv @@ -32,12 +32,12 @@ local,_DF_IS_TOUR,'tour_type' in df.columns ,destination_walk_time,shortWalk*60/walkSpeed # RIDEHAIL,, # ,, Note that the mean and standard deviation are not the values for the distribution itself, but of the underlying normal distribution it is derived from -,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT']" -,destTaxiWaitTime,"dot_skims['RH_SOLO_WAIT']" -,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT']" -,destSingleTNCWaitTime,"dot_skims['RH_SOLO_WAIT']" -,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT']" -,destSharedTNCWaitTime,"dot_skims['RH_POOLED_WAIT']" +,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT'] * (1.0 - odt_skims['RH_SOLO_REJECTIONPROB']) + TNC_missed_trip_penalty * odt_skims['RH_SOLO_REJECTIONPROB']" +,destTaxiWaitTime,"dot_skims['RH_SOLO_WAIT'] * (1.0 - dot_skims['RH_SOLO_REJECTIONPROB']) + TNC_missed_trip_penalty * dot_skims['RH_SOLO_REJECTIONPROB']" +,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT'] * (1.0 - odt_skims['RH_SOLO_REJECTIONPROB']) + TNC_missed_trip_penalty * odt_skims['RH_SOLO_REJECTIONPROB']" +,destSingleTNCWaitTime,"dot_skims['RH_SOLO_WAIT'] * (1.0 - dot_skims['RH_SOLO_REJECTIONPROB']) + TNC_missed_trip_penalty * dot_skims['RH_SOLO_REJECTIONPROB']" +,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT'] * (1.0 - odt_skims['RH_POOLED_REJECTIONPROB']) + TNC_missed_trip_penalty * odt_skims['RH_POOLED_REJECTIONPROB']" +,destSharedTNCWaitTime,"dot_skims['RH_POOLED_WAIT'] * (1.0 - dot_skims['RH_POOLED_REJECTIONPROB']) + TNC_missed_trip_penalty * dot_skims['RH_POOLED_REJECTIONPROB']" ,totalWaitTaxi,origTaxiWaitTime + destTaxiWaitTime ,totalWaitSingleTNC,origSingleTNCWaitTime + destSingleTNCWaitTime ,totalWaitSharedTNC,origSharedTNCWaitTime + destSharedTNCWaitTime diff --git a/bay_area/configs/configs/trip_mode_choice.yaml b/bay_area/configs/configs/trip_mode_choice.yaml index d07bfa6bad..168c7b1a9f 100644 --- a/bay_area/configs/configs/trip_mode_choice.yaml +++ b/bay_area/configs/configs/trip_mode_choice.yaml @@ -157,6 +157,7 @@ CONSTANTS: 5: 0 min_waitTime: 0 max_waitTime: 50 + TNC_missed_trip_penalty: 15 # so far, we can use the same spec as for non-joint tours preprocessor: diff --git a/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv b/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv index c1fccdcf2c..0b096c22e7 100644 --- a/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv +++ b/bay_area/configs/configs/trip_mode_choice_annotate_trips_preprocessor.csv @@ -45,9 +45,9 @@ dest terminal time not counted at home,_dest_terminal_time,"np.where(inbound & l ,origin_walk_time,shortWalk*60/walkSpeed ,destination_walk_time,shortWalk*60/walkSpeed # RIDEHAIL,, Could just define this in trip_mode_choice.csv but leaving this for now so that we can factor in rejected trips if needed -,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT']" -,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT']" -,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT']" +,origTaxiWaitTime,"odt_skims['RH_SOLO_WAIT'] * (1.0 - odt_skims['RH_SOLO_REJECTIONPROB']) + TNC_missed_trip_penalty * odt_skims['RH_SOLO_REJECTIONPROB']" +,origSingleTNCWaitTime,"odt_skims['RH_SOLO_WAIT'] * (1.0 - odt_skims['RH_SOLO_REJECTIONPROB']) + TNC_missed_trip_penalty * odt_skims['RH_SOLO_REJECTIONPROB']" +,origSharedTNCWaitTime,"odt_skims['RH_POOLED_WAIT'] * (1.0 - odt_skims['RH_POOLED_REJECTIONPROB']) + TNC_missed_trip_penalty * odt_skims['RH_POOLED_REJECTIONPROB']" #,, ,sov_available,odt_skims['SOV_TIME']>0 ,hov2_available,odt_skims['HOV2_TIME']>0 From 5668f1ab75d2c094b1bb042b18e11e5e55062265 Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Thu, 17 Mar 2022 16:09:39 -0700 Subject: [PATCH 3/9] load new buffered geoms and use them to define where activities can be created --- activitysim/abm/models/generate_beam_plans.py | 18 ++++++++++++------ activitysim/abm/models/initialize.py | 6 ++++++ bay_area/configs/settings.yaml | 3 +++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/activitysim/abm/models/generate_beam_plans.py b/activitysim/abm/models/generate_beam_plans.py index 83c8e80a3e..7b7ed696d2 100644 --- a/activitysim/abm/models/generate_beam_plans.py +++ b/activitysim/abm/models/generate_beam_plans.py @@ -7,7 +7,7 @@ import logging import warnings -from activitysim.core import pipeline +from activitysim.core import pipeline, orca from activitysim.core import inject logger = logging.getLogger('activitysim') @@ -141,12 +141,18 @@ def generate_beam_plans(): tours = pipeline.get_table('tours') persons = pipeline.get_table('persons') households = pipeline.get_table('households') - land_use = pipeline.get_table('land_use').reset_index() - # re-create zones shapefile - land_use['geometry'] = land_use['geometry'].apply(wkt.loads) - zones = gpd.GeoDataFrame(land_use, geometry='geometry', crs='EPSG:4326') - zones.geometry = zones.geometry.buffer(0) + if orca.is_table('beam_geoms'): + beam_geoms = pipeline.get_table('beam_geoms') + zones = gpd.GeoDataFrame(beam_geoms, geometry='geometry', crs='EPSG:4326') + zones.geometry = zones.geometry.buffer(0) + else: + land_use = pipeline.get_table('land_use').reset_index() + + # re-create zones shapefile + land_use['geometry'] = land_use['geometry'].apply(wkt.loads) + zones = gpd.GeoDataFrame(land_use, geometry='geometry', crs='EPSG:4326') + zones.geometry = zones.geometry.buffer(0) # augment trips table with attrs we need to generate plans trips = get_trip_coords(trips, zones, persons) diff --git a/activitysim/abm/models/initialize.py b/activitysim/abm/models/initialize.py index bda6ac76a9..c497db0c41 100644 --- a/activitysim/abm/models/initialize.py +++ b/activitysim/abm/models/initialize.py @@ -86,6 +86,12 @@ def initialize_landuse(): model_settings = config.read_model_settings('initialize_landuse.yaml', mandatory=True) + beam_geometries_path = config.setting('beam_geometries') + data_file_path = config.data_file_path(beam_geometries_path) + + beam_geom_dataframe = pd.read_csv(data_file_path) + pipeline.rewrap("beam_geoms", beam_geom_dataframe) + annotate_tables(model_settings, trace_label) # create accessibility (only required if multiprocessing wants to slice accessibility) diff --git a/bay_area/configs/settings.yaml b/bay_area/configs/settings.yaml index 7c00d7014d..a62b66f302 100644 --- a/bay_area/configs/settings.yaml +++ b/bay_area/configs/settings.yaml @@ -30,6 +30,9 @@ input_table_list: # input skims skims_file: skims.omx +# input valid geometries +beam_geometries: clipped_tazs.csv + # raise error if any sub-process fails without waiting for others to complete fail_fast: True From 69ff4bcdc45d6582e5038596aff8c09f77060509 Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Fri, 18 Mar 2022 10:03:01 -0700 Subject: [PATCH 4/9] try alternative way of loading geoms from wkt --- Dockerfile | 2 +- activitysim/abm/models/generate_beam_plans.py | 1 + activitysim/abm/models/initialize.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 99f5d7e66b..7e0443db58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get --allow-releaseinfo-change update \ && apt-get install -y build-essential zip unzip RUN conda update conda --yes -RUN git clone -b zn/rh-wait-times-from-skims https://github.com/LBNL-UCB-STI/activitysim.git +RUN git clone -b zn/buffered-road-geoms https://github.com/LBNL-UCB-STI/activitysim.git RUN conda env create --quiet -p $FULL_CONDA_PATH --file activitysim/environment.yml RUN cd activitysim && $FULL_CONDA_PATH/bin/python setup.py install diff --git a/activitysim/abm/models/generate_beam_plans.py b/activitysim/abm/models/generate_beam_plans.py index 7b7ed696d2..8bbdf12e09 100644 --- a/activitysim/abm/models/generate_beam_plans.py +++ b/activitysim/abm/models/generate_beam_plans.py @@ -144,6 +144,7 @@ def generate_beam_plans(): if orca.is_table('beam_geoms'): beam_geoms = pipeline.get_table('beam_geoms') + beam_geoms['geometry'] = gpd.GeoSeries.from_wkt(beam_geoms['geometry']) zones = gpd.GeoDataFrame(beam_geoms, geometry='geometry', crs='EPSG:4326') zones.geometry = zones.geometry.buffer(0) else: diff --git a/activitysim/abm/models/initialize.py b/activitysim/abm/models/initialize.py index c497db0c41..9a0b180067 100644 --- a/activitysim/abm/models/initialize.py +++ b/activitysim/abm/models/initialize.py @@ -87,7 +87,7 @@ def initialize_landuse(): model_settings = config.read_model_settings('initialize_landuse.yaml', mandatory=True) beam_geometries_path = config.setting('beam_geometries') - data_file_path = config.data_file_path(beam_geometries_path) + data_file_path = config.data_file_path(beam_geometries_path, mandatory=True) beam_geom_dataframe = pd.read_csv(data_file_path) pipeline.rewrap("beam_geoms", beam_geom_dataframe) From 97db63933999fda946ec3dbe80e770ce64b1d51a Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Fri, 25 Mar 2022 14:45:05 -0700 Subject: [PATCH 5/9] update missed ridehail penalty --- bay_area/configs/configs/tour_mode_choice.yaml | 2 +- bay_area/configs/configs/trip_mode_choice.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bay_area/configs/configs/tour_mode_choice.yaml b/bay_area/configs/configs/tour_mode_choice.yaml index 0686371614..78a7e87004 100644 --- a/bay_area/configs/configs/tour_mode_choice.yaml +++ b/bay_area/configs/configs/tour_mode_choice.yaml @@ -127,7 +127,7 @@ CONSTANTS: 5: 0 min_waitTime: 0 max_waitTime: 50 - TNC_missed_trip_penalty: 15 + TNC_missed_trip_penalty: 50 ivt_cost_multiplier: 0.6 ivt_lrt_multiplier: 0.9 diff --git a/bay_area/configs/configs/trip_mode_choice.yaml b/bay_area/configs/configs/trip_mode_choice.yaml index 168c7b1a9f..fadb47e583 100644 --- a/bay_area/configs/configs/trip_mode_choice.yaml +++ b/bay_area/configs/configs/trip_mode_choice.yaml @@ -157,7 +157,7 @@ CONSTANTS: 5: 0 min_waitTime: 0 max_waitTime: 50 - TNC_missed_trip_penalty: 15 + TNC_missed_trip_penalty: 50 # so far, we can use the same spec as for non-joint tours preprocessor: From bc5ebc024dbdbc6e0b9effd7e80bcb8bc3ef4b2d Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Fri, 25 Mar 2022 14:47:16 -0700 Subject: [PATCH 6/9] fix dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7e0443db58..fb45bacfcf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ENV FULL_CONDA_PATH $CONDA_DIR/envs/$CONDA_ENV ENV ASIM_PATH /activitysim -ENV ASIM_SUBDIR example +ENV ASIM_SUBDIR examples ENV EXEC_NAME simulation.py RUN apt-get --allow-releaseinfo-change update \ From f9ab958ead1ccb26a0a90bf050a5187fad37c429 Mon Sep 17 00:00:00 2001 From: jlaz Date: Thu, 23 Mar 2023 15:08:04 -0700 Subject: [PATCH 7/9] Added tour_id and tour_mode to BEAM plans output --- activitysim/abm/models/generate_beam_plans.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/activitysim/abm/models/generate_beam_plans.py b/activitysim/abm/models/generate_beam_plans.py index 8bbdf12e09..303939ecbb 100644 --- a/activitysim/abm/models/generate_beam_plans.py +++ b/activitysim/abm/models/generate_beam_plans.py @@ -160,11 +160,13 @@ def generate_beam_plans(): trips['departure_time'] = generate_departure_times(trips, tours) trips['number_of_participants'] = trips['tour_id'].map( tours['number_of_participants']) + trips['tour_mode'] = trips['tour_id'].map( + tours['tour_mode']) # trim trips table cols = [ - 'person_id', 'departure_time', 'purpose', 'origin', - 'destination', 'number_of_participants', 'trip_mode', 'x', 'y'] + 'person_id', 'tour_id', 'departure_time', 'purpose', 'origin', + 'destination', 'number_of_participants', 'tour_mode', 'trip_mode', 'x', 'y'] sorted_trips = trips[cols].sort_values( ['person_id', 'departure_time']).reset_index() @@ -215,10 +217,13 @@ def generate_beam_plans(): final_plans['trip_id'] = final_plans['trip_id'].shift() final_plans['trip_mode'] = final_plans['trip_mode'].shift() + final_plans['tour_id'] = final_plans['tour_id'].shift() + final_plans['tour_mode'] = final_plans['tour_mode'].shift() final_plans['number_of_participants'] = final_plans[ 'number_of_participants'].shift() + final_plans = final_plans[[ - 'trip_id', 'person_id', 'number_of_participants', 'trip_mode', + 'tour_id', 'trip_id', 'person_id', 'number_of_participants', 'tour_mode', 'trip_mode', 'PlanElementIndex', 'ActivityElement', 'ActivityType', 'x', 'y', 'departure_time']] From 6cde949bdbea4fb50081b6e51c68731242e67b0c Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Tue, 2 May 2023 13:26:59 -0700 Subject: [PATCH 8/9] try using extend_table instead of replace_table? --- activitysim/abm/models/generate_beam_plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activitysim/abm/models/generate_beam_plans.py b/activitysim/abm/models/generate_beam_plans.py index 303939ecbb..8d605d5f4a 100644 --- a/activitysim/abm/models/generate_beam_plans.py +++ b/activitysim/abm/models/generate_beam_plans.py @@ -228,7 +228,7 @@ def generate_beam_plans(): 'departure_time']] # save back to pipeline - pipeline.replace_table("plans", final_plans) + pipeline.extend_table("plans", final_plans, axis=1) # summary stats input_cars_per_hh = np.round( From b84c1f87b226cc96a9de8bcc0a7b09ec3cc0e46d Mon Sep 17 00:00:00 2001 From: Zach Needell Date: Tue, 2 May 2023 13:34:39 -0700 Subject: [PATCH 9/9] Revert "try using extend_table instead of replace_table?" This reverts commit 6cde949bdbea4fb50081b6e51c68731242e67b0c. --- activitysim/abm/models/generate_beam_plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activitysim/abm/models/generate_beam_plans.py b/activitysim/abm/models/generate_beam_plans.py index 8d605d5f4a..303939ecbb 100644 --- a/activitysim/abm/models/generate_beam_plans.py +++ b/activitysim/abm/models/generate_beam_plans.py @@ -228,7 +228,7 @@ def generate_beam_plans(): 'departure_time']] # save back to pipeline - pipeline.extend_table("plans", final_plans, axis=1) + pipeline.replace_table("plans", final_plans) # summary stats input_cars_per_hh = np.round(