diff --git a/Dockerfile b/Dockerfile index e3fbbb5921..fb45bacfcf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,14 +6,14 @@ 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 \ && 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/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 83c8e80a3e..303939ecbb 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,23 +141,32 @@ 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') + 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: + 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) 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() @@ -208,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']] diff --git a/activitysim/abm/models/initialize.py b/activitysim/abm/models/initialize.py index bda6ac76a9..9a0b180067 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, mandatory=True) + + 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/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.yaml b/bay_area/configs/configs/tour_mode_choice.yaml index 5caa0d586d..78a7e87004 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: 50 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 7feb6c8e1a..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 @@ -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'] * (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..fadb47e583 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: 50 # 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 1dbd82d67c..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 @@ -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'] * (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 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