diff --git a/activitysim/abm/models/location_choice.py b/activitysim/abm/models/location_choice.py index f634bb3fd..8efd0003c 100644 --- a/activitysim/abm/models/location_choice.py +++ b/activitysim/abm/models/location_choice.py @@ -838,19 +838,23 @@ def run_location_choice( ) # - location_logsums - location_sample_df = run_location_logsums( - state, - segment_name, - choosers, - network_los, - location_sample_df, - model_settings, - chunk_size, - chunk_tag=f"{chunk_tag}.logsums", - trace_label=tracing.extend_trace_label( - trace_label, "logsums.%s" % segment_name - ), - ) + # skip logsum calculations if LOGSUM_SETTINGS is None + if model_settings.LOGSUM_SETTINGS: + location_sample_df = run_location_logsums( + state, + segment_name, + choosers, + network_los, + location_sample_df, + model_settings, + chunk_size, + chunk_tag=f"{chunk_tag}.logsums", + trace_label=tracing.extend_trace_label( + trace_label, "logsums.%s" % segment_name + ), + ) + else: + location_sample_df[ALT_LOGSUM] = 0.0 # - location_simulate choices_df = run_location_simulate( diff --git a/activitysim/abm/models/parking_location_choice.py b/activitysim/abm/models/parking_location_choice.py index 995229b69..075bf6174 100644 --- a/activitysim/abm/models/parking_location_choice.py +++ b/activitysim/abm/models/parking_location_choice.py @@ -203,8 +203,10 @@ def choose_parking_location( additional_columns=model_settings.compute_settings.protect_columns, ) + # Passing only the index of the trips table to the interaction_dataset + # See ActivitySim issue #633 destination_sample = logit.interaction_dataset( - state, trips, alternatives, alt_index_id=alt_dest_col_name + state, trips[[]], alternatives, alt_index_id=alt_dest_col_name ) destination_sample.index = np.repeat(trips.index.values, len(alternatives)) destination_sample.index.name = trips.index.name diff --git a/activitysim/abm/models/trip_destination.py b/activitysim/abm/models/trip_destination.py index 0e7cfb98d..79dd1661c 100644 --- a/activitysim/abm/models/trip_destination.py +++ b/activitysim/abm/models/trip_destination.py @@ -1053,16 +1053,21 @@ def choose_trip_destination( return pd.Series(index=trips.index).to_frame("choice"), None # - compute logsums - destination_sample = compute_logsums( - state, - primary_purpose=primary_purpose, - trips=trips, - destination_sample=destination_sample, - tours_merged=tours_merged, - model_settings=model_settings, - skim_hotel=skim_hotel, - trace_label=trace_label, - ) + # If LOGSUM_SETTINGS is set to None, we don't want to compute logsums + if model_settings.LOGSUM_SETTINGS: + destination_sample = compute_logsums( + state, + primary_purpose=primary_purpose, + trips=trips, + destination_sample=destination_sample, + tours_merged=tours_merged, + model_settings=model_settings, + skim_hotel=skim_hotel, + trace_label=trace_label, + ) + else: + destination_sample["od_logsum"] = 0.0 + destination_sample["dp_logsum"] = 0.0 t0 = print_elapsed_time("%s.compute_logsums" % trace_label, t0) @@ -1272,9 +1277,14 @@ def run_trip_destination( state.filesystem, model_settings_file_name ) preprocessor_settings = model_settings.preprocessor - logsum_settings = state.filesystem.read_model_settings( - model_settings.LOGSUM_SETTINGS - ) + + # read in logsum settings if they exist, otherwise logsum calculations are skipped + if model_settings.LOGSUM_SETTINGS: + logsum_settings = state.filesystem.read_model_settings( + model_settings.LOGSUM_SETTINGS + ) + else: + logsum_settings = None logsum_column_name = model_settings.DEST_CHOICE_LOGSUM_COLUMN_NAME want_logsums = logsum_column_name is not None @@ -1342,7 +1352,9 @@ def run_trip_destination( # - filter tours_merged (AFTER copying destination and origin columns to trips) # tours_merged is used for logsums, we filter it here upfront to save space and time - tours_merged_cols = logsum_settings["TOURS_MERGED_CHOOSER_COLUMNS"] + tours_merged_cols = ( + logsum_settings["TOURS_MERGED_CHOOSER_COLUMNS"] if logsum_settings else [] + ) redundant_cols = model_settings.REDUNDANT_TOURS_MERGED_CHOOSER_COLUMNS or [] if redundant_cols: tours_merged_cols = [c for c in tours_merged_cols if c not in redundant_cols] diff --git a/activitysim/abm/models/util/tour_destination.py b/activitysim/abm/models/util/tour_destination.py index 7234355fd..db34a7f1a 100644 --- a/activitysim/abm/models/util/tour_destination.py +++ b/activitysim/abm/models/util/tour_destination.py @@ -894,17 +894,21 @@ def run_tour_destination( ) # - destination_logsums - tour_purpose = segment_name # tour_purpose is segment_name - location_sample_df = run_destination_logsums( - state, - tour_purpose, - persons_merged, - location_sample_df, - model_settings, - network_los, - chunk_size=state.settings.chunk_size, - trace_label=tracing.extend_trace_label(segment_trace_label, "logsums"), - ) + # if LOGSUM_SETTINGS is set to 'None', we skip this step + if model_settings.LOGSUM_SETTINGS: + tour_purpose = segment_name # tour_purpose is segment_name + location_sample_df = run_destination_logsums( + state, + tour_purpose, + persons_merged, + location_sample_df, + model_settings, + network_los, + chunk_size=state.settings.chunk_size, + trace_label=tracing.extend_trace_label(segment_trace_label, "logsums"), + ) + else: + location_sample_df["mode_choice_logsum"] = 0 # - destination_simulate spec_segment_name = segment_name # spec_segment_name is segment_name diff --git a/activitysim/abm/models/util/tour_od.py b/activitysim/abm/models/util/tour_od.py index 96ec9aba8..a74309be8 100644 --- a/activitysim/abm/models/util/tour_od.py +++ b/activitysim/abm/models/util/tour_od.py @@ -1132,20 +1132,24 @@ def run_tour_od( ) # - destination_logsums - od_sample_df = run_od_logsums( - state, - spec_segment_name, - choosers, - od_sample_df, - model_settings, - network_los, - estimator, - chunk_size=chunk_size, - trace_hh_id=trace_hh_id, - trace_label=tracing.extend_trace_label( - trace_label, f"logsums.{segment_name}" - ), - ) + # Skip logsum calculation step if LOGSUM_SETTINGS is None + if model_settings.LOGSUM_SETTINGS: + od_sample_df = run_od_logsums( + state, + spec_segment_name, + choosers, + od_sample_df, + model_settings, + network_los, + estimator, + chunk_size=chunk_size, + trace_hh_id=trace_hh_id, + trace_label=tracing.extend_trace_label( + trace_label, f"logsums.{segment_name}" + ), + ) + else: + od_sample_df["tour_mode_choice_logsum"] = 0.0 # - od_simulate choices = run_od_simulate( diff --git a/activitysim/cli/run.py b/activitysim/cli/run.py index 03258be4b..69b03101b 100644 --- a/activitysim/cli/run.py +++ b/activitysim/cli/run.py @@ -328,6 +328,9 @@ def run(args): config.filter_warnings(state) logging.captureWarnings(capture=True) + activitysim_version = importlib.metadata.version("activitysim") + logger.info(f"ActivitySim Version: {activitysim_version}") + # directories for k in ["configs_dir", "settings_file_name", "data_dir", "output_dir"]: logger.info("SETTING %s: %s" % (k, getattr(state.filesystem, k, None))) diff --git a/activitysim/core/configuration/logit.py b/activitysim/core/configuration/logit.py index 7688ac1bb..a7c615d0c 100644 --- a/activitysim/core/configuration/logit.py +++ b/activitysim/core/configuration/logit.py @@ -212,8 +212,11 @@ class LocationComponentSettings(BaseLogitComponentSettings): SAMPLE_SIZE: int """This many candidate alternatives will be sampled for each choice.""" - LOGSUM_SETTINGS: Path - """Settings for the logsum computation.""" + LOGSUM_SETTINGS: Path | None = None + """ + Settings for the logsum computation. + If None, no logsum is computed and logsum field is populated with zeros. + """ explicit_chunk: float = 0 """