From 0f8d9975df16c7c6ad036a83afe6b6ac5ab3edba Mon Sep 17 00:00:00 2001 From: JoeJimFlood Date: Sat, 25 Mar 2023 14:31:27 -0700 Subject: [PATCH 01/61] Moved 'tot_tours' from nonmandatory_tour_frequency.py to nonmandatory_tour_frequency_alternatives.csv --- .../models/non_mandatory_tour_frequency.py | 3 - ..._mandatory_tour_frequency_alternatives.csv | 194 ++++++++--------- ..._mandatory_tour_frequency_alternatives.csv | 194 ++++++++--------- ..._mandatory_tour_frequency_alternatives.csv | 194 ++++++++--------- ..._mandatory_tour_frequency_alternatives.csv | 200 +++++++++--------- ..._mandatory_tour_frequency_alternatives.csv | 194 ++++++++--------- ..._mandatory_tour_frequency_alternatives.csv | 194 ++++++++--------- 7 files changed, 585 insertions(+), 588 deletions(-) diff --git a/activitysim/abm/models/non_mandatory_tour_frequency.py b/activitysim/abm/models/non_mandatory_tour_frequency.py index 93b36b2f4..1d6493b66 100644 --- a/activitysim/abm/models/non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/non_mandatory_tour_frequency.py @@ -151,12 +151,9 @@ def non_mandatory_tour_frequency(persons, persons_merged, chunk_size, trace_hh_i model_settings = config.read_model_settings(model_settings_file_name) - # FIXME kind of tacky both that we know to add this here and del it below - # 'tot_tours' is used in model_spec expressions alternatives = simulate.read_model_alts( "non_mandatory_tour_frequency_alternatives.csv", set_index=None ) - alternatives["tot_tours"] = alternatives.sum(axis=1) # filter based on results of CDAP choosers = persons_merged.to_frame() diff --git a/activitysim/examples/placeholder_psrc/configs/non_mandatory_tour_frequency_alternatives.csv b/activitysim/examples/placeholder_psrc/configs/non_mandatory_tour_frequency_alternatives.csv index b9765aa75..09e89fae3 100755 --- a/activitysim/examples/placeholder_psrc/configs/non_mandatory_tour_frequency_alternatives.csv +++ b/activitysim/examples/placeholder_psrc/configs/non_mandatory_tour_frequency_alternatives.csv @@ -1,97 +1,97 @@ -escort,shopping,othmaint,othdiscr,eatout,social -0,0,0,0,0,0 -0,0,0,1,0,0 -0,0,0,0,0,1 -0,0,0,1,0,1 -0,0,0,0,1,0 -0,0,0,1,1,0 -0,0,0,0,1,1 -0,0,0,1,1,1 -0,0,1,0,0,0 -0,0,1,1,0,0 -0,0,1,0,0,1 -0,0,1,1,0,1 -0,0,1,0,1,0 -0,0,1,1,1,0 -0,0,1,0,1,1 -0,0,1,1,1,1 -0,1,0,0,0,0 -0,1,0,1,0,0 -0,1,0,0,0,1 -0,1,0,1,0,1 -0,1,0,0,1,0 -0,1,0,1,1,0 -0,1,0,0,1,1 -0,1,0,1,1,1 -0,1,1,0,0,0 -0,1,1,1,0,0 -0,1,1,0,0,1 -0,1,1,1,0,1 -0,1,1,0,1,0 -0,1,1,1,1,0 -0,1,1,0,1,1 -0,1,1,1,1,1 -1,0,0,0,0,0 -1,0,0,1,0,0 -1,0,0,0,0,1 -1,0,0,1,0,1 -1,0,0,0,1,0 -1,0,0,1,1,0 -1,0,0,0,1,1 -1,0,0,1,1,1 -1,0,1,0,0,0 -1,0,1,1,0,0 -1,0,1,0,0,1 -1,0,1,1,0,1 -1,0,1,0,1,0 -1,0,1,1,1,0 -1,0,1,0,1,1 -1,0,1,1,1,1 -1,1,0,0,0,0 -1,1,0,1,0,0 -1,1,0,0,0,1 -1,1,0,1,0,1 -1,1,0,0,1,0 -1,1,0,1,1,0 -1,1,0,0,1,1 -1,1,0,1,1,1 -1,1,1,0,0,0 -1,1,1,1,0,0 -1,1,1,0,0,1 -1,1,1,1,0,1 -1,1,1,0,1,0 -1,1,1,1,1,0 -1,1,1,0,1,1 -1,1,1,1,1,1 -2,0,0,0,0,0 -2,0,0,1,0,0 -2,0,0,0,0,1 -2,0,0,1,0,1 -2,0,0,0,1,0 -2,0,0,1,1,0 -2,0,0,0,1,1 -2,0,0,1,1,1 -2,0,1,0,0,0 -2,0,1,1,0,0 -2,0,1,0,0,1 -2,0,1,1,0,1 -2,0,1,0,1,0 -2,0,1,1,1,0 -2,0,1,0,1,1 -2,0,1,1,1,1 -2,1,0,0,0,0 -2,1,0,1,0,0 -2,1,0,0,0,1 -2,1,0,1,0,1 -2,1,0,0,1,0 -2,1,0,1,1,0 -2,1,0,0,1,1 -2,1,0,1,1,1 -2,1,1,0,0,0 -2,1,1,1,0,0 -2,1,1,0,0,1 -2,1,1,1,0,1 -2,1,1,0,1,0 -2,1,1,1,1,0 -2,1,1,0,1,1 -2,1,1,1,1,1 +escort,shopping,othmaint,othdiscr,eatout,social,tot_tours +0,0,0,0,0,0,0 +0,0,0,1,0,0,1 +0,0,0,0,0,1,1 +0,0,0,1,0,1,2 +0,0,0,0,1,0,1 +0,0,0,1,1,0,2 +0,0,0,0,1,1,2 +0,0,0,1,1,1,3 +0,0,1,0,0,0,1 +0,0,1,1,0,0,2 +0,0,1,0,0,1,2 +0,0,1,1,0,1,3 +0,0,1,0,1,0,2 +0,0,1,1,1,0,3 +0,0,1,0,1,1,3 +0,0,1,1,1,1,4 +0,1,0,0,0,0,1 +0,1,0,1,0,0,2 +0,1,0,0,0,1,2 +0,1,0,1,0,1,3 +0,1,0,0,1,0,2 +0,1,0,1,1,0,3 +0,1,0,0,1,1,3 +0,1,0,1,1,1,4 +0,1,1,0,0,0,2 +0,1,1,1,0,0,3 +0,1,1,0,0,1,3 +0,1,1,1,0,1,4 +0,1,1,0,1,0,3 +0,1,1,1,1,0,4 +0,1,1,0,1,1,4 +0,1,1,1,1,1,5 +1,0,0,0,0,0,1 +1,0,0,1,0,0,2 +1,0,0,0,0,1,2 +1,0,0,1,0,1,3 +1,0,0,0,1,0,2 +1,0,0,1,1,0,3 +1,0,0,0,1,1,3 +1,0,0,1,1,1,4 +1,0,1,0,0,0,2 +1,0,1,1,0,0,3 +1,0,1,0,0,1,3 +1,0,1,1,0,1,4 +1,0,1,0,1,0,3 +1,0,1,1,1,0,4 +1,0,1,0,1,1,4 +1,0,1,1,1,1,5 +1,1,0,0,0,0,2 +1,1,0,1,0,0,3 +1,1,0,0,0,1,3 +1,1,0,1,0,1,4 +1,1,0,0,1,0,3 +1,1,0,1,1,0,4 +1,1,0,0,1,1,4 +1,1,0,1,1,1,5 +1,1,1,0,0,0,3 +1,1,1,1,0,0,4 +1,1,1,0,0,1,4 +1,1,1,1,0,1,5 +1,1,1,0,1,0,4 +1,1,1,1,1,0,5 +1,1,1,0,1,1,5 +1,1,1,1,1,1,6 +2,0,0,0,0,0,2 +2,0,0,1,0,0,3 +2,0,0,0,0,1,3 +2,0,0,1,0,1,4 +2,0,0,0,1,0,3 +2,0,0,1,1,0,4 +2,0,0,0,1,1,4 +2,0,0,1,1,1,5 +2,0,1,0,0,0,3 +2,0,1,1,0,0,4 +2,0,1,0,0,1,4 +2,0,1,1,0,1,5 +2,0,1,0,1,0,4 +2,0,1,1,1,0,5 +2,0,1,0,1,1,5 +2,0,1,1,1,1,6 +2,1,0,0,0,0,3 +2,1,0,1,0,0,4 +2,1,0,0,0,1,4 +2,1,0,1,0,1,5 +2,1,0,0,1,0,4 +2,1,0,1,1,0,5 +2,1,0,0,1,1,5 +2,1,0,1,1,1,6 +2,1,1,0,0,0,4 +2,1,1,1,0,0,5 +2,1,1,0,0,1,5 +2,1,1,1,0,1,6 +2,1,1,0,1,0,5 +2,1,1,1,1,0,6 +2,1,1,0,1,1,6 +2,1,1,1,1,1,7 diff --git a/activitysim/examples/prototype_arc/configs/non_mandatory_tour_frequency_alternatives.csv b/activitysim/examples/prototype_arc/configs/non_mandatory_tour_frequency_alternatives.csv index b9765aa75..09e89fae3 100644 --- a/activitysim/examples/prototype_arc/configs/non_mandatory_tour_frequency_alternatives.csv +++ b/activitysim/examples/prototype_arc/configs/non_mandatory_tour_frequency_alternatives.csv @@ -1,97 +1,97 @@ -escort,shopping,othmaint,othdiscr,eatout,social -0,0,0,0,0,0 -0,0,0,1,0,0 -0,0,0,0,0,1 -0,0,0,1,0,1 -0,0,0,0,1,0 -0,0,0,1,1,0 -0,0,0,0,1,1 -0,0,0,1,1,1 -0,0,1,0,0,0 -0,0,1,1,0,0 -0,0,1,0,0,1 -0,0,1,1,0,1 -0,0,1,0,1,0 -0,0,1,1,1,0 -0,0,1,0,1,1 -0,0,1,1,1,1 -0,1,0,0,0,0 -0,1,0,1,0,0 -0,1,0,0,0,1 -0,1,0,1,0,1 -0,1,0,0,1,0 -0,1,0,1,1,0 -0,1,0,0,1,1 -0,1,0,1,1,1 -0,1,1,0,0,0 -0,1,1,1,0,0 -0,1,1,0,0,1 -0,1,1,1,0,1 -0,1,1,0,1,0 -0,1,1,1,1,0 -0,1,1,0,1,1 -0,1,1,1,1,1 -1,0,0,0,0,0 -1,0,0,1,0,0 -1,0,0,0,0,1 -1,0,0,1,0,1 -1,0,0,0,1,0 -1,0,0,1,1,0 -1,0,0,0,1,1 -1,0,0,1,1,1 -1,0,1,0,0,0 -1,0,1,1,0,0 -1,0,1,0,0,1 -1,0,1,1,0,1 -1,0,1,0,1,0 -1,0,1,1,1,0 -1,0,1,0,1,1 -1,0,1,1,1,1 -1,1,0,0,0,0 -1,1,0,1,0,0 -1,1,0,0,0,1 -1,1,0,1,0,1 -1,1,0,0,1,0 -1,1,0,1,1,0 -1,1,0,0,1,1 -1,1,0,1,1,1 -1,1,1,0,0,0 -1,1,1,1,0,0 -1,1,1,0,0,1 -1,1,1,1,0,1 -1,1,1,0,1,0 -1,1,1,1,1,0 -1,1,1,0,1,1 -1,1,1,1,1,1 -2,0,0,0,0,0 -2,0,0,1,0,0 -2,0,0,0,0,1 -2,0,0,1,0,1 -2,0,0,0,1,0 -2,0,0,1,1,0 -2,0,0,0,1,1 -2,0,0,1,1,1 -2,0,1,0,0,0 -2,0,1,1,0,0 -2,0,1,0,0,1 -2,0,1,1,0,1 -2,0,1,0,1,0 -2,0,1,1,1,0 -2,0,1,0,1,1 -2,0,1,1,1,1 -2,1,0,0,0,0 -2,1,0,1,0,0 -2,1,0,0,0,1 -2,1,0,1,0,1 -2,1,0,0,1,0 -2,1,0,1,1,0 -2,1,0,0,1,1 -2,1,0,1,1,1 -2,1,1,0,0,0 -2,1,1,1,0,0 -2,1,1,0,0,1 -2,1,1,1,0,1 -2,1,1,0,1,0 -2,1,1,1,1,0 -2,1,1,0,1,1 -2,1,1,1,1,1 +escort,shopping,othmaint,othdiscr,eatout,social,tot_tours +0,0,0,0,0,0,0 +0,0,0,1,0,0,1 +0,0,0,0,0,1,1 +0,0,0,1,0,1,2 +0,0,0,0,1,0,1 +0,0,0,1,1,0,2 +0,0,0,0,1,1,2 +0,0,0,1,1,1,3 +0,0,1,0,0,0,1 +0,0,1,1,0,0,2 +0,0,1,0,0,1,2 +0,0,1,1,0,1,3 +0,0,1,0,1,0,2 +0,0,1,1,1,0,3 +0,0,1,0,1,1,3 +0,0,1,1,1,1,4 +0,1,0,0,0,0,1 +0,1,0,1,0,0,2 +0,1,0,0,0,1,2 +0,1,0,1,0,1,3 +0,1,0,0,1,0,2 +0,1,0,1,1,0,3 +0,1,0,0,1,1,3 +0,1,0,1,1,1,4 +0,1,1,0,0,0,2 +0,1,1,1,0,0,3 +0,1,1,0,0,1,3 +0,1,1,1,0,1,4 +0,1,1,0,1,0,3 +0,1,1,1,1,0,4 +0,1,1,0,1,1,4 +0,1,1,1,1,1,5 +1,0,0,0,0,0,1 +1,0,0,1,0,0,2 +1,0,0,0,0,1,2 +1,0,0,1,0,1,3 +1,0,0,0,1,0,2 +1,0,0,1,1,0,3 +1,0,0,0,1,1,3 +1,0,0,1,1,1,4 +1,0,1,0,0,0,2 +1,0,1,1,0,0,3 +1,0,1,0,0,1,3 +1,0,1,1,0,1,4 +1,0,1,0,1,0,3 +1,0,1,1,1,0,4 +1,0,1,0,1,1,4 +1,0,1,1,1,1,5 +1,1,0,0,0,0,2 +1,1,0,1,0,0,3 +1,1,0,0,0,1,3 +1,1,0,1,0,1,4 +1,1,0,0,1,0,3 +1,1,0,1,1,0,4 +1,1,0,0,1,1,4 +1,1,0,1,1,1,5 +1,1,1,0,0,0,3 +1,1,1,1,0,0,4 +1,1,1,0,0,1,4 +1,1,1,1,0,1,5 +1,1,1,0,1,0,4 +1,1,1,1,1,0,5 +1,1,1,0,1,1,5 +1,1,1,1,1,1,6 +2,0,0,0,0,0,2 +2,0,0,1,0,0,3 +2,0,0,0,0,1,3 +2,0,0,1,0,1,4 +2,0,0,0,1,0,3 +2,0,0,1,1,0,4 +2,0,0,0,1,1,4 +2,0,0,1,1,1,5 +2,0,1,0,0,0,3 +2,0,1,1,0,0,4 +2,0,1,0,0,1,4 +2,0,1,1,0,1,5 +2,0,1,0,1,0,4 +2,0,1,1,1,0,5 +2,0,1,0,1,1,5 +2,0,1,1,1,1,6 +2,1,0,0,0,0,3 +2,1,0,1,0,0,4 +2,1,0,0,0,1,4 +2,1,0,1,0,1,5 +2,1,0,0,1,0,4 +2,1,0,1,1,0,5 +2,1,0,0,1,1,5 +2,1,0,1,1,1,6 +2,1,1,0,0,0,4 +2,1,1,1,0,0,5 +2,1,1,0,0,1,5 +2,1,1,1,0,1,6 +2,1,1,0,1,0,5 +2,1,1,1,1,0,6 +2,1,1,0,1,1,6 +2,1,1,1,1,1,7 diff --git a/activitysim/examples/prototype_mtc/configs/non_mandatory_tour_frequency_alternatives.csv b/activitysim/examples/prototype_mtc/configs/non_mandatory_tour_frequency_alternatives.csv index b9765aa75..09e89fae3 100644 --- a/activitysim/examples/prototype_mtc/configs/non_mandatory_tour_frequency_alternatives.csv +++ b/activitysim/examples/prototype_mtc/configs/non_mandatory_tour_frequency_alternatives.csv @@ -1,97 +1,97 @@ -escort,shopping,othmaint,othdiscr,eatout,social -0,0,0,0,0,0 -0,0,0,1,0,0 -0,0,0,0,0,1 -0,0,0,1,0,1 -0,0,0,0,1,0 -0,0,0,1,1,0 -0,0,0,0,1,1 -0,0,0,1,1,1 -0,0,1,0,0,0 -0,0,1,1,0,0 -0,0,1,0,0,1 -0,0,1,1,0,1 -0,0,1,0,1,0 -0,0,1,1,1,0 -0,0,1,0,1,1 -0,0,1,1,1,1 -0,1,0,0,0,0 -0,1,0,1,0,0 -0,1,0,0,0,1 -0,1,0,1,0,1 -0,1,0,0,1,0 -0,1,0,1,1,0 -0,1,0,0,1,1 -0,1,0,1,1,1 -0,1,1,0,0,0 -0,1,1,1,0,0 -0,1,1,0,0,1 -0,1,1,1,0,1 -0,1,1,0,1,0 -0,1,1,1,1,0 -0,1,1,0,1,1 -0,1,1,1,1,1 -1,0,0,0,0,0 -1,0,0,1,0,0 -1,0,0,0,0,1 -1,0,0,1,0,1 -1,0,0,0,1,0 -1,0,0,1,1,0 -1,0,0,0,1,1 -1,0,0,1,1,1 -1,0,1,0,0,0 -1,0,1,1,0,0 -1,0,1,0,0,1 -1,0,1,1,0,1 -1,0,1,0,1,0 -1,0,1,1,1,0 -1,0,1,0,1,1 -1,0,1,1,1,1 -1,1,0,0,0,0 -1,1,0,1,0,0 -1,1,0,0,0,1 -1,1,0,1,0,1 -1,1,0,0,1,0 -1,1,0,1,1,0 -1,1,0,0,1,1 -1,1,0,1,1,1 -1,1,1,0,0,0 -1,1,1,1,0,0 -1,1,1,0,0,1 -1,1,1,1,0,1 -1,1,1,0,1,0 -1,1,1,1,1,0 -1,1,1,0,1,1 -1,1,1,1,1,1 -2,0,0,0,0,0 -2,0,0,1,0,0 -2,0,0,0,0,1 -2,0,0,1,0,1 -2,0,0,0,1,0 -2,0,0,1,1,0 -2,0,0,0,1,1 -2,0,0,1,1,1 -2,0,1,0,0,0 -2,0,1,1,0,0 -2,0,1,0,0,1 -2,0,1,1,0,1 -2,0,1,0,1,0 -2,0,1,1,1,0 -2,0,1,0,1,1 -2,0,1,1,1,1 -2,1,0,0,0,0 -2,1,0,1,0,0 -2,1,0,0,0,1 -2,1,0,1,0,1 -2,1,0,0,1,0 -2,1,0,1,1,0 -2,1,0,0,1,1 -2,1,0,1,1,1 -2,1,1,0,0,0 -2,1,1,1,0,0 -2,1,1,0,0,1 -2,1,1,1,0,1 -2,1,1,0,1,0 -2,1,1,1,1,0 -2,1,1,0,1,1 -2,1,1,1,1,1 +escort,shopping,othmaint,othdiscr,eatout,social,tot_tours +0,0,0,0,0,0,0 +0,0,0,1,0,0,1 +0,0,0,0,0,1,1 +0,0,0,1,0,1,2 +0,0,0,0,1,0,1 +0,0,0,1,1,0,2 +0,0,0,0,1,1,2 +0,0,0,1,1,1,3 +0,0,1,0,0,0,1 +0,0,1,1,0,0,2 +0,0,1,0,0,1,2 +0,0,1,1,0,1,3 +0,0,1,0,1,0,2 +0,0,1,1,1,0,3 +0,0,1,0,1,1,3 +0,0,1,1,1,1,4 +0,1,0,0,0,0,1 +0,1,0,1,0,0,2 +0,1,0,0,0,1,2 +0,1,0,1,0,1,3 +0,1,0,0,1,0,2 +0,1,0,1,1,0,3 +0,1,0,0,1,1,3 +0,1,0,1,1,1,4 +0,1,1,0,0,0,2 +0,1,1,1,0,0,3 +0,1,1,0,0,1,3 +0,1,1,1,0,1,4 +0,1,1,0,1,0,3 +0,1,1,1,1,0,4 +0,1,1,0,1,1,4 +0,1,1,1,1,1,5 +1,0,0,0,0,0,1 +1,0,0,1,0,0,2 +1,0,0,0,0,1,2 +1,0,0,1,0,1,3 +1,0,0,0,1,0,2 +1,0,0,1,1,0,3 +1,0,0,0,1,1,3 +1,0,0,1,1,1,4 +1,0,1,0,0,0,2 +1,0,1,1,0,0,3 +1,0,1,0,0,1,3 +1,0,1,1,0,1,4 +1,0,1,0,1,0,3 +1,0,1,1,1,0,4 +1,0,1,0,1,1,4 +1,0,1,1,1,1,5 +1,1,0,0,0,0,2 +1,1,0,1,0,0,3 +1,1,0,0,0,1,3 +1,1,0,1,0,1,4 +1,1,0,0,1,0,3 +1,1,0,1,1,0,4 +1,1,0,0,1,1,4 +1,1,0,1,1,1,5 +1,1,1,0,0,0,3 +1,1,1,1,0,0,4 +1,1,1,0,0,1,4 +1,1,1,1,0,1,5 +1,1,1,0,1,0,4 +1,1,1,1,1,0,5 +1,1,1,0,1,1,5 +1,1,1,1,1,1,6 +2,0,0,0,0,0,2 +2,0,0,1,0,0,3 +2,0,0,0,0,1,3 +2,0,0,1,0,1,4 +2,0,0,0,1,0,3 +2,0,0,1,1,0,4 +2,0,0,0,1,1,4 +2,0,0,1,1,1,5 +2,0,1,0,0,0,3 +2,0,1,1,0,0,4 +2,0,1,0,0,1,4 +2,0,1,1,0,1,5 +2,0,1,0,1,0,4 +2,0,1,1,1,0,5 +2,0,1,0,1,1,5 +2,0,1,1,1,1,6 +2,1,0,0,0,0,3 +2,1,0,1,0,0,4 +2,1,0,0,0,1,4 +2,1,0,1,0,1,5 +2,1,0,0,1,0,4 +2,1,0,1,1,0,5 +2,1,0,0,1,1,5 +2,1,0,1,1,1,6 +2,1,1,0,0,0,4 +2,1,1,1,0,0,5 +2,1,1,0,0,1,5 +2,1,1,1,0,1,6 +2,1,1,0,1,0,5 +2,1,1,1,1,0,6 +2,1,1,0,1,1,6 +2,1,1,1,1,1,7 diff --git a/activitysim/examples/prototype_mtc_extended/configs/non_mandatory_tour_frequency_alternatives.csv b/activitysim/examples/prototype_mtc_extended/configs/non_mandatory_tour_frequency_alternatives.csv index 0bea47c6f..be633e649 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/non_mandatory_tour_frequency_alternatives.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/non_mandatory_tour_frequency_alternatives.csv @@ -1,100 +1,100 @@ -escort,shopping,othmaint,othdiscr,eatout,social -0,0,0,0,0,0 -0,0,0,1,0,0 -0,0,0,0,0,1 -0,0,0,1,0,1 -0,0,0,0,1,0 -0,0,0,1,1,0 -0,0,0,0,1,1 -0,0,0,1,1,1 -0,0,1,0,0,0 -0,0,1,1,0,0 -0,0,1,0,0,1 -0,0,1,1,0,1 -0,0,1,0,1,0 -0,0,1,1,1,0 -0,0,1,0,1,1 -0,0,1,1,1,1 -0,1,0,0,0,0 -0,1,0,1,0,0 -0,1,0,0,0,1 -0,1,0,1,0,1 -0,1,0,0,1,0 -0,1,0,1,1,0 -0,1,0,0,1,1 -0,1,0,1,1,1 -0,1,1,0,0,0 -0,1,1,1,0,0 -0,1,1,0,0,1 -0,1,1,1,0,1 -0,1,1,0,1,0 -0,1,1,1,1,0 -0,1,1,0,1,1 -0,1,1,1,1,1 -1,0,0,0,0,0 -1,0,0,1,0,0 -1,0,0,0,0,1 -1,0,0,1,0,1 -1,0,0,0,1,0 -1,0,0,1,1,0 -1,0,0,0,1,1 -1,0,0,1,1,1 -1,0,1,0,0,0 -1,0,1,1,0,0 -1,0,1,0,0,1 -1,0,1,1,0,1 -1,0,1,0,1,0 -1,0,1,1,1,0 -1,0,1,0,1,1 -1,0,1,1,1,1 -1,1,0,0,0,0 -1,1,0,1,0,0 -1,1,0,0,0,1 -1,1,0,1,0,1 -1,1,0,0,1,0 -1,1,0,1,1,0 -1,1,0,0,1,1 -1,1,0,1,1,1 -1,1,1,0,0,0 -1,1,1,1,0,0 -1,1,1,0,0,1 -1,1,1,1,0,1 -1,1,1,0,1,0 -1,1,1,1,1,0 -1,1,1,0,1,1 -1,1,1,1,1,1 -2,0,0,0,0,0 -2,0,0,1,0,0 -2,0,0,0,0,1 -2,0,0,1,0,1 -2,0,0,0,1,0 -2,0,0,1,1,0 -2,0,0,0,1,1 -2,0,0,1,1,1 -2,0,1,0,0,0 -2,0,1,1,0,0 -2,0,1,0,0,1 -2,0,1,1,0,1 -2,0,1,0,1,0 -2,0,1,1,1,0 -2,0,1,0,1,1 -2,0,1,1,1,1 -2,1,0,0,0,0 -2,1,0,1,0,0 -2,1,0,0,0,1 -2,1,0,1,0,1 -2,1,0,0,1,0 -2,1,0,1,1,0 -2,1,0,0,1,1 -2,1,0,1,1,1 -2,1,1,0,0,0 -2,1,1,1,0,0 -2,1,1,0,0,1 -2,1,1,1,0,1 -2,1,1,0,1,0 -2,1,1,1,1,0 -2,1,1,0,1,1 -2,1,1,1,1,1 -# extension for flexible ids demonstration,,,,, -# should be removed for actual model run,,,,, -0,0,0,2,0,0 +escort,shopping,othmaint,othdiscr,eatout,social,tot_tours +0,0,0,0,0,0,0 +0,0,0,1,0,0,1 +0,0,0,0,0,1,1 +0,0,0,1,0,1,2 +0,0,0,0,1,0,1 +0,0,0,1,1,0,2 +0,0,0,0,1,1,2 +0,0,0,1,1,1,3 +0,0,1,0,0,0,1 +0,0,1,1,0,0,2 +0,0,1,0,0,1,2 +0,0,1,1,0,1,3 +0,0,1,0,1,0,2 +0,0,1,1,1,0,3 +0,0,1,0,1,1,3 +0,0,1,1,1,1,4 +0,1,0,0,0,0,1 +0,1,0,1,0,0,2 +0,1,0,0,0,1,2 +0,1,0,1,0,1,3 +0,1,0,0,1,0,2 +0,1,0,1,1,0,3 +0,1,0,0,1,1,3 +0,1,0,1,1,1,4 +0,1,1,0,0,0,2 +0,1,1,1,0,0,3 +0,1,1,0,0,1,3 +0,1,1,1,0,1,4 +0,1,1,0,1,0,3 +0,1,1,1,1,0,4 +0,1,1,0,1,1,4 +0,1,1,1,1,1,5 +1,0,0,0,0,0,1 +1,0,0,1,0,0,2 +1,0,0,0,0,1,2 +1,0,0,1,0,1,3 +1,0,0,0,1,0,2 +1,0,0,1,1,0,3 +1,0,0,0,1,1,3 +1,0,0,1,1,1,4 +1,0,1,0,0,0,2 +1,0,1,1,0,0,3 +1,0,1,0,0,1,3 +1,0,1,1,0,1,4 +1,0,1,0,1,0,3 +1,0,1,1,1,0,4 +1,0,1,0,1,1,4 +1,0,1,1,1,1,5 +1,1,0,0,0,0,2 +1,1,0,1,0,0,3 +1,1,0,0,0,1,3 +1,1,0,1,0,1,4 +1,1,0,0,1,0,3 +1,1,0,1,1,0,4 +1,1,0,0,1,1,4 +1,1,0,1,1,1,5 +1,1,1,0,0,0,3 +1,1,1,1,0,0,4 +1,1,1,0,0,1,4 +1,1,1,1,0,1,5 +1,1,1,0,1,0,4 +1,1,1,1,1,0,5 +1,1,1,0,1,1,5 +1,1,1,1,1,1,6 +2,0,0,0,0,0,2 +2,0,0,1,0,0,3 +2,0,0,0,0,1,3 +2,0,0,1,0,1,4 +2,0,0,0,1,0,3 +2,0,0,1,1,0,4 +2,0,0,0,1,1,4 +2,0,0,1,1,1,5 +2,0,1,0,0,0,3 +2,0,1,1,0,0,4 +2,0,1,0,0,1,4 +2,0,1,1,0,1,5 +2,0,1,0,1,0,4 +2,0,1,1,1,0,5 +2,0,1,0,1,1,5 +2,0,1,1,1,1,6 +2,1,0,0,0,0,3 +2,1,0,1,0,0,4 +2,1,0,0,0,1,4 +2,1,0,1,0,1,5 +2,1,0,0,1,0,4 +2,1,0,1,1,0,5 +2,1,0,0,1,1,5 +2,1,0,1,1,1,6 +2,1,1,0,0,0,4 +2,1,1,1,0,0,5 +2,1,1,0,0,1,5 +2,1,1,1,0,1,6 +2,1,1,0,1,0,5 +2,1,1,1,1,0,6 +2,1,1,0,1,1,6 +2,1,1,1,1,1,7 +# extension for flexible ids demonstration,,,,,,0 +# should be removed for actual model run,,,,,,0 +0,0,0,2,0,0,2 diff --git a/activitysim/examples/prototype_mwcog/configs/non_mandatory_tour_frequency_alternatives.csv b/activitysim/examples/prototype_mwcog/configs/non_mandatory_tour_frequency_alternatives.csv index b9765aa75..09e89fae3 100644 --- a/activitysim/examples/prototype_mwcog/configs/non_mandatory_tour_frequency_alternatives.csv +++ b/activitysim/examples/prototype_mwcog/configs/non_mandatory_tour_frequency_alternatives.csv @@ -1,97 +1,97 @@ -escort,shopping,othmaint,othdiscr,eatout,social -0,0,0,0,0,0 -0,0,0,1,0,0 -0,0,0,0,0,1 -0,0,0,1,0,1 -0,0,0,0,1,0 -0,0,0,1,1,0 -0,0,0,0,1,1 -0,0,0,1,1,1 -0,0,1,0,0,0 -0,0,1,1,0,0 -0,0,1,0,0,1 -0,0,1,1,0,1 -0,0,1,0,1,0 -0,0,1,1,1,0 -0,0,1,0,1,1 -0,0,1,1,1,1 -0,1,0,0,0,0 -0,1,0,1,0,0 -0,1,0,0,0,1 -0,1,0,1,0,1 -0,1,0,0,1,0 -0,1,0,1,1,0 -0,1,0,0,1,1 -0,1,0,1,1,1 -0,1,1,0,0,0 -0,1,1,1,0,0 -0,1,1,0,0,1 -0,1,1,1,0,1 -0,1,1,0,1,0 -0,1,1,1,1,0 -0,1,1,0,1,1 -0,1,1,1,1,1 -1,0,0,0,0,0 -1,0,0,1,0,0 -1,0,0,0,0,1 -1,0,0,1,0,1 -1,0,0,0,1,0 -1,0,0,1,1,0 -1,0,0,0,1,1 -1,0,0,1,1,1 -1,0,1,0,0,0 -1,0,1,1,0,0 -1,0,1,0,0,1 -1,0,1,1,0,1 -1,0,1,0,1,0 -1,0,1,1,1,0 -1,0,1,0,1,1 -1,0,1,1,1,1 -1,1,0,0,0,0 -1,1,0,1,0,0 -1,1,0,0,0,1 -1,1,0,1,0,1 -1,1,0,0,1,0 -1,1,0,1,1,0 -1,1,0,0,1,1 -1,1,0,1,1,1 -1,1,1,0,0,0 -1,1,1,1,0,0 -1,1,1,0,0,1 -1,1,1,1,0,1 -1,1,1,0,1,0 -1,1,1,1,1,0 -1,1,1,0,1,1 -1,1,1,1,1,1 -2,0,0,0,0,0 -2,0,0,1,0,0 -2,0,0,0,0,1 -2,0,0,1,0,1 -2,0,0,0,1,0 -2,0,0,1,1,0 -2,0,0,0,1,1 -2,0,0,1,1,1 -2,0,1,0,0,0 -2,0,1,1,0,0 -2,0,1,0,0,1 -2,0,1,1,0,1 -2,0,1,0,1,0 -2,0,1,1,1,0 -2,0,1,0,1,1 -2,0,1,1,1,1 -2,1,0,0,0,0 -2,1,0,1,0,0 -2,1,0,0,0,1 -2,1,0,1,0,1 -2,1,0,0,1,0 -2,1,0,1,1,0 -2,1,0,0,1,1 -2,1,0,1,1,1 -2,1,1,0,0,0 -2,1,1,1,0,0 -2,1,1,0,0,1 -2,1,1,1,0,1 -2,1,1,0,1,0 -2,1,1,1,1,0 -2,1,1,0,1,1 -2,1,1,1,1,1 +escort,shopping,othmaint,othdiscr,eatout,social,tot_tours +0,0,0,0,0,0,0 +0,0,0,1,0,0,1 +0,0,0,0,0,1,1 +0,0,0,1,0,1,2 +0,0,0,0,1,0,1 +0,0,0,1,1,0,2 +0,0,0,0,1,1,2 +0,0,0,1,1,1,3 +0,0,1,0,0,0,1 +0,0,1,1,0,0,2 +0,0,1,0,0,1,2 +0,0,1,1,0,1,3 +0,0,1,0,1,0,2 +0,0,1,1,1,0,3 +0,0,1,0,1,1,3 +0,0,1,1,1,1,4 +0,1,0,0,0,0,1 +0,1,0,1,0,0,2 +0,1,0,0,0,1,2 +0,1,0,1,0,1,3 +0,1,0,0,1,0,2 +0,1,0,1,1,0,3 +0,1,0,0,1,1,3 +0,1,0,1,1,1,4 +0,1,1,0,0,0,2 +0,1,1,1,0,0,3 +0,1,1,0,0,1,3 +0,1,1,1,0,1,4 +0,1,1,0,1,0,3 +0,1,1,1,1,0,4 +0,1,1,0,1,1,4 +0,1,1,1,1,1,5 +1,0,0,0,0,0,1 +1,0,0,1,0,0,2 +1,0,0,0,0,1,2 +1,0,0,1,0,1,3 +1,0,0,0,1,0,2 +1,0,0,1,1,0,3 +1,0,0,0,1,1,3 +1,0,0,1,1,1,4 +1,0,1,0,0,0,2 +1,0,1,1,0,0,3 +1,0,1,0,0,1,3 +1,0,1,1,0,1,4 +1,0,1,0,1,0,3 +1,0,1,1,1,0,4 +1,0,1,0,1,1,4 +1,0,1,1,1,1,5 +1,1,0,0,0,0,2 +1,1,0,1,0,0,3 +1,1,0,0,0,1,3 +1,1,0,1,0,1,4 +1,1,0,0,1,0,3 +1,1,0,1,1,0,4 +1,1,0,0,1,1,4 +1,1,0,1,1,1,5 +1,1,1,0,0,0,3 +1,1,1,1,0,0,4 +1,1,1,0,0,1,4 +1,1,1,1,0,1,5 +1,1,1,0,1,0,4 +1,1,1,1,1,0,5 +1,1,1,0,1,1,5 +1,1,1,1,1,1,6 +2,0,0,0,0,0,2 +2,0,0,1,0,0,3 +2,0,0,0,0,1,3 +2,0,0,1,0,1,4 +2,0,0,0,1,0,3 +2,0,0,1,1,0,4 +2,0,0,0,1,1,4 +2,0,0,1,1,1,5 +2,0,1,0,0,0,3 +2,0,1,1,0,0,4 +2,0,1,0,0,1,4 +2,0,1,1,0,1,5 +2,0,1,0,1,0,4 +2,0,1,1,1,0,5 +2,0,1,0,1,1,5 +2,0,1,1,1,1,6 +2,1,0,0,0,0,3 +2,1,0,1,0,0,4 +2,1,0,0,0,1,4 +2,1,0,1,0,1,5 +2,1,0,0,1,0,4 +2,1,0,1,1,0,5 +2,1,0,0,1,1,5 +2,1,0,1,1,1,6 +2,1,1,0,0,0,4 +2,1,1,1,0,0,5 +2,1,1,0,0,1,5 +2,1,1,1,0,1,6 +2,1,1,0,1,0,5 +2,1,1,1,1,0,6 +2,1,1,0,1,1,6 +2,1,1,1,1,1,7 diff --git a/activitysim/examples/prototype_semcog/configs/non_mandatory_tour_frequency_alternatives.csv b/activitysim/examples/prototype_semcog/configs/non_mandatory_tour_frequency_alternatives.csv index b9765aa75..09e89fae3 100755 --- a/activitysim/examples/prototype_semcog/configs/non_mandatory_tour_frequency_alternatives.csv +++ b/activitysim/examples/prototype_semcog/configs/non_mandatory_tour_frequency_alternatives.csv @@ -1,97 +1,97 @@ -escort,shopping,othmaint,othdiscr,eatout,social -0,0,0,0,0,0 -0,0,0,1,0,0 -0,0,0,0,0,1 -0,0,0,1,0,1 -0,0,0,0,1,0 -0,0,0,1,1,0 -0,0,0,0,1,1 -0,0,0,1,1,1 -0,0,1,0,0,0 -0,0,1,1,0,0 -0,0,1,0,0,1 -0,0,1,1,0,1 -0,0,1,0,1,0 -0,0,1,1,1,0 -0,0,1,0,1,1 -0,0,1,1,1,1 -0,1,0,0,0,0 -0,1,0,1,0,0 -0,1,0,0,0,1 -0,1,0,1,0,1 -0,1,0,0,1,0 -0,1,0,1,1,0 -0,1,0,0,1,1 -0,1,0,1,1,1 -0,1,1,0,0,0 -0,1,1,1,0,0 -0,1,1,0,0,1 -0,1,1,1,0,1 -0,1,1,0,1,0 -0,1,1,1,1,0 -0,1,1,0,1,1 -0,1,1,1,1,1 -1,0,0,0,0,0 -1,0,0,1,0,0 -1,0,0,0,0,1 -1,0,0,1,0,1 -1,0,0,0,1,0 -1,0,0,1,1,0 -1,0,0,0,1,1 -1,0,0,1,1,1 -1,0,1,0,0,0 -1,0,1,1,0,0 -1,0,1,0,0,1 -1,0,1,1,0,1 -1,0,1,0,1,0 -1,0,1,1,1,0 -1,0,1,0,1,1 -1,0,1,1,1,1 -1,1,0,0,0,0 -1,1,0,1,0,0 -1,1,0,0,0,1 -1,1,0,1,0,1 -1,1,0,0,1,0 -1,1,0,1,1,0 -1,1,0,0,1,1 -1,1,0,1,1,1 -1,1,1,0,0,0 -1,1,1,1,0,0 -1,1,1,0,0,1 -1,1,1,1,0,1 -1,1,1,0,1,0 -1,1,1,1,1,0 -1,1,1,0,1,1 -1,1,1,1,1,1 -2,0,0,0,0,0 -2,0,0,1,0,0 -2,0,0,0,0,1 -2,0,0,1,0,1 -2,0,0,0,1,0 -2,0,0,1,1,0 -2,0,0,0,1,1 -2,0,0,1,1,1 -2,0,1,0,0,0 -2,0,1,1,0,0 -2,0,1,0,0,1 -2,0,1,1,0,1 -2,0,1,0,1,0 -2,0,1,1,1,0 -2,0,1,0,1,1 -2,0,1,1,1,1 -2,1,0,0,0,0 -2,1,0,1,0,0 -2,1,0,0,0,1 -2,1,0,1,0,1 -2,1,0,0,1,0 -2,1,0,1,1,0 -2,1,0,0,1,1 -2,1,0,1,1,1 -2,1,1,0,0,0 -2,1,1,1,0,0 -2,1,1,0,0,1 -2,1,1,1,0,1 -2,1,1,0,1,0 -2,1,1,1,1,0 -2,1,1,0,1,1 -2,1,1,1,1,1 +escort,shopping,othmaint,othdiscr,eatout,social,tot_tours +0,0,0,0,0,0,0 +0,0,0,1,0,0,1 +0,0,0,0,0,1,1 +0,0,0,1,0,1,2 +0,0,0,0,1,0,1 +0,0,0,1,1,0,2 +0,0,0,0,1,1,2 +0,0,0,1,1,1,3 +0,0,1,0,0,0,1 +0,0,1,1,0,0,2 +0,0,1,0,0,1,2 +0,0,1,1,0,1,3 +0,0,1,0,1,0,2 +0,0,1,1,1,0,3 +0,0,1,0,1,1,3 +0,0,1,1,1,1,4 +0,1,0,0,0,0,1 +0,1,0,1,0,0,2 +0,1,0,0,0,1,2 +0,1,0,1,0,1,3 +0,1,0,0,1,0,2 +0,1,0,1,1,0,3 +0,1,0,0,1,1,3 +0,1,0,1,1,1,4 +0,1,1,0,0,0,2 +0,1,1,1,0,0,3 +0,1,1,0,0,1,3 +0,1,1,1,0,1,4 +0,1,1,0,1,0,3 +0,1,1,1,1,0,4 +0,1,1,0,1,1,4 +0,1,1,1,1,1,5 +1,0,0,0,0,0,1 +1,0,0,1,0,0,2 +1,0,0,0,0,1,2 +1,0,0,1,0,1,3 +1,0,0,0,1,0,2 +1,0,0,1,1,0,3 +1,0,0,0,1,1,3 +1,0,0,1,1,1,4 +1,0,1,0,0,0,2 +1,0,1,1,0,0,3 +1,0,1,0,0,1,3 +1,0,1,1,0,1,4 +1,0,1,0,1,0,3 +1,0,1,1,1,0,4 +1,0,1,0,1,1,4 +1,0,1,1,1,1,5 +1,1,0,0,0,0,2 +1,1,0,1,0,0,3 +1,1,0,0,0,1,3 +1,1,0,1,0,1,4 +1,1,0,0,1,0,3 +1,1,0,1,1,0,4 +1,1,0,0,1,1,4 +1,1,0,1,1,1,5 +1,1,1,0,0,0,3 +1,1,1,1,0,0,4 +1,1,1,0,0,1,4 +1,1,1,1,0,1,5 +1,1,1,0,1,0,4 +1,1,1,1,1,0,5 +1,1,1,0,1,1,5 +1,1,1,1,1,1,6 +2,0,0,0,0,0,2 +2,0,0,1,0,0,3 +2,0,0,0,0,1,3 +2,0,0,1,0,1,4 +2,0,0,0,1,0,3 +2,0,0,1,1,0,4 +2,0,0,0,1,1,4 +2,0,0,1,1,1,5 +2,0,1,0,0,0,3 +2,0,1,1,0,0,4 +2,0,1,0,0,1,4 +2,0,1,1,0,1,5 +2,0,1,0,1,0,4 +2,0,1,1,1,0,5 +2,0,1,0,1,1,5 +2,0,1,1,1,1,6 +2,1,0,0,0,0,3 +2,1,0,1,0,0,4 +2,1,0,0,0,1,4 +2,1,0,1,0,1,5 +2,1,0,0,1,0,4 +2,1,0,1,1,0,5 +2,1,0,0,1,1,5 +2,1,0,1,1,1,6 +2,1,1,0,0,0,4 +2,1,1,1,0,0,5 +2,1,1,0,0,1,5 +2,1,1,1,0,1,6 +2,1,1,0,1,0,5 +2,1,1,1,1,0,6 +2,1,1,0,1,1,6 +2,1,1,1,1,1,7 From 7becd2d8506e1e57cb08f876bc833abdc873f2e0 Mon Sep 17 00:00:00 2001 From: Bo Wen <56280490+bwentl@users.noreply.github.com> Date: Thu, 11 May 2023 16:10:28 -0700 Subject: [PATCH 02/61] add chunking and caching of alt_values use feather and pickle for faster loading split x_ca processing into idca using chunking_size --- .../estimation/larch/location_choice.py | 66 ++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/activitysim/estimation/larch/location_choice.py b/activitysim/estimation/larch/location_choice.py index 74a426e71..d287f334e 100644 --- a/activitysim/estimation/larch/location_choice.py +++ b/activitysim/estimation/larch/location_choice.py @@ -1,6 +1,8 @@ import os from pathlib import Path from typing import Collection +import pickle +from datetime import datetime import numpy as np import pandas as pd @@ -44,6 +46,7 @@ def location_choice_model( settings_file="{name}_model_settings.yaml", landuse_file="{name}_landuse.csv", return_data=False, + chunking_size=None, ): model_selector = name.replace("_location", "") model_selector = model_selector.replace("_destination", "") @@ -57,12 +60,37 @@ def _read_csv(filename, **kwargs): filename = filename.format(name=name) return pd.read_csv(os.path.join(edb_directory, filename), **kwargs) + def _read_feather(filename, **kwargs): + filename = filename.format(name=name) + return pd.read_feather(os.path.join(edb_directory, filename), **kwargs) + + def _to_feather(df, filename, **kwargs): + filename = filename.format(name=name) + return df.to_feather(os.path.join(edb_directory, filename), **kwargs) + + def _read_pickle(filename, **kwargs): + filename = filename.format(name=name) + return pd.read_pickle(os.path.join(edb_directory, filename)) + + def _to_pickle(df, filename, **kwargs): + filename = filename.format(name=name) + return df.to_pickle(os.path.join(edb_directory, filename)) + + def _file_exists(filename): + filename = filename.format(name=name) + return os.path.exists(os.path.join(edb_directory, filename)) + coefficients = _read_csv( coefficients_file, index_col="coefficient_name", ) spec = _read_csv(spec_file, comment="#") - alt_values = _read_csv(alt_values_file) + alt_values_fea_file = alt_values_file.replace(".csv", ".fea") + if os.path.exists(os.path.join(edb_directory, alt_values_fea_file.format(name=name))): + alt_values = _read_feather(alt_values_fea_file) + else: + alt_values = _read_csv(alt_values_file) + _to_feather(df=alt_values, filename=alt_values_fea_file) chooser_data = _read_csv(chooser_file) landuse = _read_csv(landuse_file, index_col="zone_id") master_size_spec = _read_csv(size_spec_file) @@ -148,7 +176,41 @@ def _read_csv(filename, **kwargs): chooser_index_name = chooser_data.columns[0] x_co = chooser_data.set_index(chooser_index_name) - x_ca = cv_to_ca(alt_values.set_index([chooser_index_name, alt_values.columns[1]])) + + def split(a, n): + k, m = divmod(len(a), n) + return (a[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)) + + x_ca_pickle_file = "{name}_x_ca.pkl" + if chunking_size == None: + x_ca = cv_to_ca(alt_values.set_index([chooser_index_name, alt_values.columns[1]])) + elif _file_exists(x_ca_pickle_file): + time_start = datetime.now() + x_ca = _read_pickle(x_ca_pickle_file) + print( + f"x_ca data loaded from {name}_x_ca.fea - time elapsed {(datetime.now() - time_start).total_seconds()}" + ) + else: + time_start = datetime.now() + # calculate num_chunks based on chunking_size (or max number of rows per chunk) + num_chunks = int(len(alt_values) / chunking_size) + all_person_ids = list(alt_values["person_id"].unique()) + split_ids = list(split(all_person_ids, num_chunks)) + x_ca_list = [] + i = 0 + for chunk_ids in split_ids: + alt_values_i = alt_values[alt_values["person_id"].isin(chunk_ids)] + x_ca_i = cv_to_ca( + alt_values_i.set_index([chooser_index_name, alt_values_i.columns[1]])) + x_ca_list.append(x_ca_i) + print( + f"\rx_ca_i compute done for chunk {i}/{num_chunks} - time elapsed {(datetime.now() - time_start).total_seconds()}" + ) + i = i + 1 + x_ca = pd.concat(x_ca_list, axis=0) + _to_pickle(df=x_ca, filename=x_ca_pickle_file) + print( + f"x_ca compute done - time elapsed {(datetime.now() - time_start).total_seconds()}") if CHOOSER_SEGMENT_COLUMN_NAME is not None: # label segments with names From 0e5d3bf56fefc47662955f54ec963cf7f8bcf615 Mon Sep 17 00:00:00 2001 From: Bo Wen <56280490+bwentl@users.noreply.github.com> Date: Fri, 23 Jun 2023 09:57:57 -0700 Subject: [PATCH 03/61] add alt_values_to_feather option and update comments default behavior does not change, to enable use of feather and the use of chunking, do this: # load from original model, data = component_model(modelname, return_data=True, alt_values_to_feather=True, chunking_size=chunking_size) --- activitysim/estimation/larch/location_choice.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/activitysim/estimation/larch/location_choice.py b/activitysim/estimation/larch/location_choice.py index d287f334e..38a304543 100644 --- a/activitysim/estimation/larch/location_choice.py +++ b/activitysim/estimation/larch/location_choice.py @@ -46,6 +46,7 @@ def location_choice_model( settings_file="{name}_model_settings.yaml", landuse_file="{name}_landuse.csv", return_data=False, + alt_values_to_feather=False, chunking_size=None, ): model_selector = name.replace("_location", "") @@ -85,12 +86,15 @@ def _file_exists(filename): index_col="coefficient_name", ) spec = _read_csv(spec_file, comment="#") + + # read alternative values either as csv or feather file alt_values_fea_file = alt_values_file.replace(".csv", ".fea") if os.path.exists(os.path.join(edb_directory, alt_values_fea_file.format(name=name))): alt_values = _read_feather(alt_values_fea_file) else: alt_values = _read_csv(alt_values_file) - _to_feather(df=alt_values, filename=alt_values_fea_file) + if alt_values_to_feather: + _to_feather(df=alt_values, filename=alt_values_fea_file) chooser_data = _read_csv(chooser_file) landuse = _read_csv(landuse_file, index_col="zone_id") master_size_spec = _read_csv(size_spec_file) @@ -181,10 +185,12 @@ def split(a, n): k, m = divmod(len(a), n) return (a[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)) + # process x_ca with cv_to_ca with or without chunking x_ca_pickle_file = "{name}_x_ca.pkl" if chunking_size == None: x_ca = cv_to_ca(alt_values.set_index([chooser_index_name, alt_values.columns[1]])) elif _file_exists(x_ca_pickle_file): + # if pickle file from previous x_ca processing exist, load it to save time time_start = datetime.now() x_ca = _read_pickle(x_ca_pickle_file) print( @@ -208,6 +214,7 @@ def split(a, n): ) i = i + 1 x_ca = pd.concat(x_ca_list, axis=0) + # save final x_ca result as pickle file to save time for future data loading _to_pickle(df=x_ca, filename=x_ca_pickle_file) print( f"x_ca compute done - time elapsed {(datetime.now() - time_start).total_seconds()}") From 425467e32bc91cb6b0db32fe546449130f38039d Mon Sep 17 00:00:00 2001 From: Bo Wen <56280490+bwentl@users.noreply.github.com> Date: Fri, 23 Jun 2023 10:18:33 -0700 Subject: [PATCH 04/61] format code with black --- activitysim/estimation/larch/location_choice.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/activitysim/estimation/larch/location_choice.py b/activitysim/estimation/larch/location_choice.py index 38a304543..a93002418 100644 --- a/activitysim/estimation/larch/location_choice.py +++ b/activitysim/estimation/larch/location_choice.py @@ -89,7 +89,9 @@ def _file_exists(filename): # read alternative values either as csv or feather file alt_values_fea_file = alt_values_file.replace(".csv", ".fea") - if os.path.exists(os.path.join(edb_directory, alt_values_fea_file.format(name=name))): + if os.path.exists( + os.path.join(edb_directory, alt_values_fea_file.format(name=name)) + ): alt_values = _read_feather(alt_values_fea_file) else: alt_values = _read_csv(alt_values_file) @@ -183,12 +185,14 @@ def _file_exists(filename): def split(a, n): k, m = divmod(len(a), n) - return (a[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)) + return (a[i * k + min(i, m) : (i + 1) * k + min(i + 1, m)] for i in range(n)) # process x_ca with cv_to_ca with or without chunking x_ca_pickle_file = "{name}_x_ca.pkl" if chunking_size == None: - x_ca = cv_to_ca(alt_values.set_index([chooser_index_name, alt_values.columns[1]])) + x_ca = cv_to_ca( + alt_values.set_index([chooser_index_name, alt_values.columns[1]]) + ) elif _file_exists(x_ca_pickle_file): # if pickle file from previous x_ca processing exist, load it to save time time_start = datetime.now() @@ -207,7 +211,8 @@ def split(a, n): for chunk_ids in split_ids: alt_values_i = alt_values[alt_values["person_id"].isin(chunk_ids)] x_ca_i = cv_to_ca( - alt_values_i.set_index([chooser_index_name, alt_values_i.columns[1]])) + alt_values_i.set_index([chooser_index_name, alt_values_i.columns[1]]) + ) x_ca_list.append(x_ca_i) print( f"\rx_ca_i compute done for chunk {i}/{num_chunks} - time elapsed {(datetime.now() - time_start).total_seconds()}" @@ -217,7 +222,8 @@ def split(a, n): # save final x_ca result as pickle file to save time for future data loading _to_pickle(df=x_ca, filename=x_ca_pickle_file) print( - f"x_ca compute done - time elapsed {(datetime.now() - time_start).total_seconds()}") + f"x_ca compute done - time elapsed {(datetime.now() - time_start).total_seconds()}" + ) if CHOOSER_SEGMENT_COLUMN_NAME is not None: # label segments with names From 84a2a0cdb6c3254aee93eddcd89d0195004d26e9 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 12 Jul 2023 15:02:04 -0400 Subject: [PATCH 05/61] trying pandas categorical dtype --- .../abm/models/mandatory_tour_frequency.py | 6 ++++- activitysim/abm/models/tour_mode_choice.py | 2 +- activitysim/abm/models/trip_destination.py | 2 +- activitysim/abm/models/trip_mode_choice.py | 2 +- activitysim/abm/models/util/canonical_ids.py | 2 +- activitysim/abm/models/util/tour_frequency.py | 4 ++++ activitysim/core/interaction_simulate.py | 23 +++++++++++++++++++ ..._frequency_annotate_tours_preprocessor.csv | 1 + 8 files changed, 37 insertions(+), 5 deletions(-) diff --git a/activitysim/abm/models/mandatory_tour_frequency.py b/activitysim/abm/models/mandatory_tour_frequency.py index 166c671e0..804b3c3d4 100644 --- a/activitysim/abm/models/mandatory_tour_frequency.py +++ b/activitysim/abm/models/mandatory_tour_frequency.py @@ -23,7 +23,9 @@ def add_null_results(state, trace_label, mandatory_tour_frequency_settings): logger.info("Skipping %s: add_null_results", trace_label) persons = state.get_dataframe("persons") - persons["mandatory_tour_frequency"] = "" + persons["mandatory_tour_frequency"] = pd.categorical( + "", categories=["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False + ) tours = pd.DataFrame() tours["tour_category"] = None @@ -110,6 +112,8 @@ def mandatory_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) + cat_type = pd.api.types.CategoricalDtype(["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False) + choices = choices.astype(cat_type) if estimator: estimator.write_choices(choices) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index c56547b26..d2feb66a9 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -314,7 +314,7 @@ def tour_mode_choice_simulate( choices_list = [] for tour_purpose, tours_segment in primary_tours_merged.groupby( - segment_column_name + segment_column_name, observed=True ): logger.info( "tour_mode_choice_simulate tour_type '%s' (%s tours)" diff --git a/activitysim/abm/models/trip_destination.py b/activitysim/abm/models/trip_destination.py index 4b0384cec..00e3f467c 100644 --- a/activitysim/abm/models/trip_destination.py +++ b/activitysim/abm/models/trip_destination.py @@ -1300,7 +1300,7 @@ def run_trip_destination( # - choose destination for nth_trips, segmented by primary_purpose choices_list = [] - for primary_purpose, trips_segment in nth_trips.groupby("primary_purpose"): + for primary_purpose, trips_segment in nth_trips.groupby("primary_purpose", observed=True): choices, destination_sample = choose_trip_destination( state, primary_purpose, diff --git a/activitysim/abm/models/trip_mode_choice.py b/activitysim/abm/models/trip_mode_choice.py index 8f3e9f418..498e8c21c 100644 --- a/activitysim/abm/models/trip_mode_choice.py +++ b/activitysim/abm/models/trip_mode_choice.py @@ -168,7 +168,7 @@ def trip_mode_choice( choices_list = [] cols_to_keep_list = [] - for primary_purpose, trips_segment in trips_merged.groupby("primary_purpose"): + for primary_purpose, trips_segment in trips_merged.groupby("primary_purpose", observed=True): segment_trace_label = tracing.extend_trace_label(trace_label, primary_purpose) logger.info( diff --git a/activitysim/abm/models/util/canonical_ids.py b/activitysim/abm/models/util/canonical_ids.py index 0ca1a1d3b..de5ed8ca8 100644 --- a/activitysim/abm/models/util/canonical_ids.py +++ b/activitysim/abm/models/util/canonical_ids.py @@ -383,7 +383,7 @@ def set_tour_index( assert tour_num_col in tours.columns # create string tour_id corresonding to keys in possible_tours (e.g. 'work1', 'j_shopping2') - tours["tour_id"] = tours.tour_type + tours[tour_num_col].map(str) + tours["tour_id"] = tours.tour_type.astype(str) + tours[tour_num_col].map(str) if parent_tour_num_col: # we need to distinguish between subtours of different work tours diff --git a/activitysim/abm/models/util/tour_frequency.py b/activitysim/abm/models/util/tour_frequency.py index 9c9d8a567..0a6241a15 100644 --- a/activitysim/abm/models/util/tour_frequency.py +++ b/activitysim/abm/models/util/tour_frequency.py @@ -57,6 +57,8 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # reformat with the columns given below tours = tour_counts.stack().reset_index() tours.columns = [parent_col, "tour_type", "tour_type_count"] + cat_tour_type = pd.api.types.CategoricalDtype(["work","school","univ","escort","eatout","shopping","social","othmaint","othdiscr", "eat", "business","maint", "atwork"], ordered=False) + tours["tour_type"] = tours["tour_type"].astype(cat_tour_type) """ tour_type tour_type_count @@ -99,6 +101,8 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # do not enforce this here, other categories are possible # assert tour_category in ["mandatory", "non_mandatory", "atwork", "joint"] tours["tour_category"] = tour_category + cat_tour_category = pd.api.types.CategoricalDtype(["mandatory","joint","non_mandatory","atwork"], ordered=False) + tours["tour_category"] = tours["tour_category"].astype(cat_tour_category) # for joint tours, the correct number will be filled in after participation step tours["number_of_participants"] = 1 diff --git a/activitysim/core/interaction_simulate.py b/activitysim/core/interaction_simulate.py index 88dbfc73d..cb6ae01aa 100644 --- a/activitysim/core/interaction_simulate.py +++ b/activitysim/core/interaction_simulate.py @@ -12,6 +12,10 @@ import numpy as np import pandas as pd +import psutil +import os +import io + from . import chunk, config, logit, simulate, tracing, workflow logger = logging.getLogger(__name__) @@ -76,6 +80,25 @@ def eval_interaction_utilities( trace_label = tracing.extend_trace_label(trace_label, "eval_interaction_utils") logger.info("Running eval_interaction_utilities on %s rows" % df.shape[0]) + logger.info("Writing out interaction df info") + + buffer = io.StringIO() + df.info(memory_usage = 'deep', buf=buffer) + s = buffer.getvalue() + with open(os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.info.txt"), "w", encoding="utf-8") as f: + f.write(s) + + df.memory_usage(deep = True).to_csv( + os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.memory_usage_deep.txt") + ) + + df.memory_usage().to_csv( + os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.memory_usage.txt") + ) + + process = psutil.Process(os.getpid()) + logger.info("PID RSS when writing out interaction df info: %s" % process.memory_info().rss) + sharrow_enabled = state.settings.sharrow if locals_d is not None and locals_d.get("_sharrow_skip", False): diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv index d7b2f1d61..a497131a6 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -4,6 +4,7 @@ Description,Target,Expression # e.g. univ segment means there will be a spec called stop_frequency_univ.csv,, # so the 'school' tour_type can treat univ and non-univ school tours differently,, ,primary_purpose,"df.tour_type.where((df.tour_type != 'school') | ~df.is_university, 'univ')" +# assigning category columns a new value can be problematic ,primary_purpose,"primary_purpose.where(df.tour_category!='atwork', 'atwork')" #,, ,distance_in_miles,od_skims['DIST'] From 228cc28a4b02fbca443bccc4d07f625962e51f21 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Sun, 16 Jul 2023 22:38:03 -0400 Subject: [PATCH 06/61] sweeping out string variables --- activitysim/abm/models/atwork_subtour_frequency.py | 7 ++++++- activitysim/abm/models/cdap.py | 2 ++ activitysim/abm/models/joint_tour_composition.py | 6 +++++- activitysim/abm/models/joint_tour_frequency.py | 4 +++- activitysim/abm/models/joint_tour_participation.py | 2 +- activitysim/abm/models/mandatory_tour_frequency.py | 2 +- activitysim/abm/models/stop_frequency.py | 2 ++ activitysim/abm/models/tour_mode_choice.py | 5 +++++ activitysim/abm/models/trip_purpose.py | 8 ++++++-- activitysim/abm/models/util/mode.py | 7 +++++-- activitysim/abm/models/util/tour_frequency.py | 8 +++++++- activitysim/abm/models/util/trip.py | 1 + activitysim/abm/models/util/vectorize_tour_scheduling.py | 7 +++++-- activitysim/core/util.py | 3 +++ 14 files changed, 52 insertions(+), 12 deletions(-) diff --git a/activitysim/abm/models/atwork_subtour_frequency.py b/activitysim/abm/models/atwork_subtour_frequency.py index 7bbee371f..ed856bbde 100644 --- a/activitysim/abm/models/atwork_subtour_frequency.py +++ b/activitysim/abm/models/atwork_subtour_frequency.py @@ -22,7 +22,10 @@ def add_null_results(state, trace_label, tours): logger.info("Skipping %s: add_null_results", trace_label) - tours["atwork_subtour_frequency"] = np.nan + cat_type = pd.api.types.CategoricalDtype(["", "no_subtours","eat","business1","maint","business2","eat_business"], ordered=False) + choices = choices.astype(cat_type) + tours["atwork_subtour_frequency"] = "" + tours["atwork_subtour_frequency"] = tours["atwork_subtour_frequency"].astype(cat_type) state.add_table("tours", tours) @@ -100,6 +103,8 @@ def atwork_subtour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) + cat_type = pd.api.types.CategoricalDtype(["", "no_subtours","eat","business1","maint","business2","eat_business"], ordered=False) + choices = choices.astype(cat_type) if estimator: estimator.write_choices(choices) diff --git a/activitysim/abm/models/cdap.py b/activitysim/abm/models/cdap.py index f4d148a41..524b03586 100644 --- a/activitysim/abm/models/cdap.py +++ b/activitysim/abm/models/cdap.py @@ -206,6 +206,8 @@ def cdap_simulate( estimator.end_estimation() choices = choices.reindex(persons.index) + cap_cat_type = pd.api.types.CategoricalDtype(["", "M", "N", "H"], ordered=False) + choices = choices.astype(cap_cat_type) persons["cdap_activity"] = choices expressions.assign_columns( diff --git a/activitysim/abm/models/joint_tour_composition.py b/activitysim/abm/models/joint_tour_composition.py index 50c458e7a..ac58c6e1f 100644 --- a/activitysim/abm/models/joint_tour_composition.py +++ b/activitysim/abm/models/joint_tour_composition.py @@ -22,6 +22,8 @@ def add_null_results(state, trace_label, tours): logger.info("Skipping %s: add_null_results" % trace_label) tours["composition"] = "" + cat_type = pd.api.types.CategoricalDtype(["", "adults", "children", "mixed"], ordered=False) + tours["composition"] = tours["composition"].astype(cat_type) state.add_table("tours", tours) @@ -106,6 +108,8 @@ def joint_tour_composition( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) + cat_type = pd.api.types.CategoricalDtype(["", "adults", "children", "mixed"], ordered=False) + choices = choices.astype(cat_type) if estimator: estimator.write_choices(choices) @@ -117,7 +121,7 @@ def joint_tour_composition( joint_tours["composition"] = choices # reindex since we ran model on a subset of households - tours["composition"] = choices.reindex(tours.index).fillna("").astype(str) + tours["composition"] = choices.reindex(tours.index).fillna("") state.add_table("tours", tours) tracing.print_summary( diff --git a/activitysim/abm/models/joint_tour_frequency.py b/activitysim/abm/models/joint_tour_frequency.py index 66996ce1d..819b18afb 100644 --- a/activitysim/abm/models/joint_tour_frequency.py +++ b/activitysim/abm/models/joint_tour_frequency.py @@ -98,6 +98,8 @@ def joint_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) + cat_type = pd.api.types.CategoricalDtype(["0_tours","1_Shop","1_Main","1_Eat","1_Visit","1_Disc","2_SS","2_SM","2_SE","2_SV","2_SD","2_MM","2_ME","2_MV","2_MD","2_EE","2_EV","2_ED","2_VV","2_VD","2_DD"], ordered=False) + choices = choices.astype(cat_type) if estimator: estimator.write_choices(choices) @@ -130,7 +132,7 @@ def joint_tour_frequency( # we expect there to be an alt with no tours - which we can use to backfill non-travelers no_tours_alt = (alternatives.sum(axis=1) == 0).index[0] households["joint_tour_frequency"] = ( - choices.reindex(households.index).fillna(no_tours_alt).astype(str) + choices.reindex(households.index).fillna(no_tours_alt) ) households["num_hh_joint_tours"] = ( diff --git a/activitysim/abm/models/joint_tour_participation.py b/activitysim/abm/models/joint_tour_participation.py index 066ef703c..f61fe66a5 100644 --- a/activitysim/abm/models/joint_tour_participation.py +++ b/activitysim/abm/models/joint_tour_participation.py @@ -90,7 +90,7 @@ def get_tour_satisfaction(candidates, participate): x = ( candidates[cols] - .groupby(["tour_id", "composition"]) + .groupby(["tour_id", "composition"], observed=True) .agg( participants=("adult", "size"), adults=("adult", "sum"), diff --git a/activitysim/abm/models/mandatory_tour_frequency.py b/activitysim/abm/models/mandatory_tour_frequency.py index 804b3c3d4..550550810 100644 --- a/activitysim/abm/models/mandatory_tour_frequency.py +++ b/activitysim/abm/models/mandatory_tour_frequency.py @@ -147,7 +147,7 @@ def mandatory_tour_frequency( # need to reindex as we only handled persons with cdap_activity == 'M' persons["mandatory_tour_frequency"] = ( - choices.reindex(persons.index).fillna("").astype(str) + choices.reindex(persons.index).fillna("") ) expressions.assign_columns( diff --git a/activitysim/abm/models/stop_frequency.py b/activitysim/abm/models/stop_frequency.py index 484a93cb1..d28c1f62c 100644 --- a/activitysim/abm/models/stop_frequency.py +++ b/activitysim/abm/models/stop_frequency.py @@ -167,6 +167,8 @@ def stop_frequency( # convert indexes to alternative names choices = pd.Series(segment_spec.columns[choices.values], index=choices.index) + cat_type = pd.api.types.CategoricalDtype(segment_spec.columns.tolist(), ordered=False) + choices = choices.astype(cat_type) if estimator: estimator.write_choices(choices) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index d2feb66a9..9bb39356a 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -69,12 +69,15 @@ def create_logsum_trips( pandas.DataFrame Table of trips: 2 per tour, with O/D and purpose inherited from tour """ + stop_freq_cat_type = pd.api.types.CategoricalDtype(["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False) stop_frequency_alts = state.get_injectable("stop_frequency_alts") stop_freq = "0out_0in" # no intermediate stops tours["stop_frequency"] = stop_freq + tours["stop_frequency"] = tours["stop_frequency"].astype(stop_freq_cat_type) tours["primary_purpose"] = tours["tour_purpose"] trips = trip.initialize_from_tours(state, tours, stop_frequency_alts) trips["stop_frequency"] = stop_freq + outbound = trips["outbound"] trips["depart"] = reindex(tours.start, trips.tour_id) trips.loc[~outbound, "depart"] = reindex(tours.end, trips.loc[~outbound, "tour_id"]) @@ -86,10 +89,12 @@ def create_logsum_trips( state, model_settings, segment_name, trace_label ) + mode_cat_type = pd.api.types.CategoricalDtype(tour_mode_alts + [""], ordered=False) # repeat rows from the trips table iterating over tour mode logsum_trips = pd.DataFrame() for tour_mode in tour_mode_alts: trips["tour_mode"] = tour_mode + trips["tour_mode"] = trips["tour_mode"].astype(mode_cat_type) logsum_trips = pd.concat((logsum_trips, trips), ignore_index=True) assert len(logsum_trips) == len(trips) * len(tour_mode_alts) logsum_trips.index.name = "trip_id" diff --git a/activitysim/abm/models/trip_purpose.py b/activitysim/abm/models/trip_purpose.py index 7af387e21..d4edd7bd1 100644 --- a/activitysim/abm/models/trip_purpose.py +++ b/activitysim/abm/models/trip_purpose.py @@ -163,6 +163,7 @@ def choose_intermediate_trip_purpose( state.tracing.trace_df(rands, "%s.rands" % trace_label, columns=[None, "rand"]) choices = choices.map(pd.Series(purpose_cols)) + choices = choices.astype(trips["primary_purpose"].dtype) return choices @@ -210,14 +211,17 @@ def run_trip_purpose(state: workflow.State, trips_df, estimator, trace_label): # - last trip of outbound tour gets primary_purpose last_trip = trips_df.trip_num == trips_df.trip_count purpose = trips_df.primary_purpose[last_trip & trips_df.outbound] + print(purpose.value_counts(dropna = False)) result_list.append(purpose) logger.info("assign purpose to %s last outbound trips", purpose.shape[0]) # - last trip of inbound tour gets home (or work for atwork subtours) purpose = trips_df.primary_purpose[last_trip & ~trips_df.outbound] + print(purpose.value_counts(dropna = False)) purpose = pd.Series( np.where(purpose == "atwork", "work", "home"), index=purpose.index - ) + ).astype(trips_df.primary_purpose.dtype) + print(purpose.value_counts(dropna = False)) result_list.append(purpose) logger.info("assign purpose to %s last inbound trips", purpose.shape[0]) @@ -255,7 +259,7 @@ def run_trip_purpose(state: workflow.State, trips_df, estimator, trace_label): trace_label=chunk_trace_label, chunk_sizer=chunk_sizer, ) - + print(choices.value_counts(dropna = False)) result_list.append(choices) chunk_sizer.log_df(trace_label, f"result_list", result_list) diff --git a/activitysim/abm/models/util/mode.py b/activitysim/abm/models/util/mode.py index 8a75ae8b6..254f3fdb3 100644 --- a/activitysim/abm/models/util/mode.py +++ b/activitysim/abm/models/util/mode.py @@ -83,6 +83,8 @@ def mode_choice_simulate( choices[mode_column_name] = choices[mode_column_name].map( dict(list(zip(list(range(len(alts))), alts))) ) + cat_type = pd.api.types.CategoricalDtype(alts.tolist() + [""], ordered=False) + choices[mode_column_name] = choices[mode_column_name].astype(cat_type) return choices @@ -131,8 +133,9 @@ def run_tour_mode_choice_simulate( assert ("in_period" not in choosers) and ("out_period" not in choosers) in_time = skims["in_time_col_name"] out_time = skims["out_time_col_name"] - choosers["in_period"] = network_los.skim_time_period_label(choosers[in_time]) - choosers["out_period"] = network_los.skim_time_period_label(choosers[out_time]) + time_cat_type = pd.api.types.CategoricalDtype(list(set(network_los.skim_time_periods["labels"])), ordered=False) + choosers["in_period"] = network_los.skim_time_period_label(choosers[in_time]).astype(time_cat_type) + choosers["out_period"] = network_los.skim_time_period_label(choosers[out_time]).astype(time_cat_type) expressions.annotate_preprocessors( state, choosers, locals_dict, skims, model_settings, trace_label diff --git a/activitysim/abm/models/util/tour_frequency.py b/activitysim/abm/models/util/tour_frequency.py index 0a6241a15..7ba275fa9 100644 --- a/activitysim/abm/models/util/tour_frequency.py +++ b/activitysim/abm/models/util/tour_frequency.py @@ -57,7 +57,7 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # reformat with the columns given below tours = tour_counts.stack().reset_index() tours.columns = [parent_col, "tour_type", "tour_type_count"] - cat_tour_type = pd.api.types.CategoricalDtype(["work","school","univ","escort","eatout","shopping","social","othmaint","othdiscr", "eat", "business","maint", "atwork"], ordered=False) + cat_tour_type = pd.api.types.CategoricalDtype(["work","school","univ","escort","eatout","shopping","social","othmaint","othdiscr", "eat", "business","maint", "atwork", "home"], ordered=False) tours["tour_type"] = tours["tour_type"].astype(cat_tour_type) """ @@ -697,6 +697,8 @@ def create_joint_tours( tours_purp.columns = [parent_col, "tour_id_temp", "tour_type"] tours_purp["tour_id_temp"] = range(1, 1 + len(tours_purp)) tours_purp["tour_type"] = tours_purp["tour_type"].map(tour_type_dict) + cat_tour_type = pd.api.types.CategoricalDtype(["work","school","univ","escort","eatout","shopping","social","othmaint","othdiscr", "eat", "business","maint", "atwork", "home"], ordered=False) + tours_purp["tour_type"] = tours_purp["tour_type"].astype(cat_tour_type) """ tour_id_temp tour_type @@ -715,6 +717,8 @@ def create_joint_tours( tours_comp.columns = [parent_col, "tour_id_temp", "composition"] tours_comp["tour_id_temp"] = range(1, 1 + len(tours_comp)) tours_comp["composition"] = tours_comp["composition"].map(tour_comp_dict) + cat_tour_comp = pd.api.types.CategoricalDtype(["adults","children","mixed"], ordered=False) + tours_comp["composition"] = tours_comp["composition"].astype(cat_tour_comp) """ tour_id_temp tour_composition @@ -756,6 +760,8 @@ def create_joint_tours( # set these here to ensure consistency across different tour categories assert tour_category in ["mandatory", "non_mandatory", "atwork", "joint"] tours["tour_category"] = tour_category + cat_tour_category = pd.api.types.CategoricalDtype(["mandatory","joint","non_mandatory","atwork"], ordered=False) + tours["tour_category"] = tours["tour_category"].astype(cat_tour_category) # for joint tours, the correct number will be filled in after participation step tours["number_of_participants"] = 1 diff --git a/activitysim/abm/models/util/trip.py b/activitysim/abm/models/util/trip.py index 36a676e17..6fcc4010b 100644 --- a/activitysim/abm/models/util/trip.py +++ b/activitysim/abm/models/util/trip.py @@ -168,6 +168,7 @@ def initialize_from_tours( """ OUTBOUND_ALT = "out" + direction_cat_type = pd.api.types.CategoricalDtype(["out","in"], ordered=False) assert OUTBOUND_ALT in stop_frequency_alts.columns # get the actual alternatives for each person - have to go back to the diff --git a/activitysim/abm/models/util/vectorize_tour_scheduling.py b/activitysim/abm/models/util/vectorize_tour_scheduling.py index 775d84b7b..2bda3d502 100644 --- a/activitysim/abm/models/util/vectorize_tour_scheduling.py +++ b/activitysim/abm/models/util/vectorize_tour_scheduling.py @@ -189,6 +189,8 @@ def dedupe_alt_tdd(state: workflow.State, alt_tdd, tour_purpose, trace_label): state, tracing.extend_trace_label(trace_label, "dedupe_alt_tdd") ) as chunk_sizer: if tdd_segments is not None: + tdd_segments["time_period"] = tdd_segments["time_period"].astype(alt_tdd["out_period"].dtype) + dedupe_columns = ["out_period", "in_period"] # tdd_alt_segments is optionally segmented by tour purpose @@ -331,8 +333,9 @@ def compute_tour_scheduling_logsums( # FIXME:MEMORY # These two lines each generate a massive array of strings, # using a bunch of RAM and slowing things down. - alt_tdd["out_period"] = network_los.skim_time_period_label(alt_tdd["start"]) - alt_tdd["in_period"] = network_los.skim_time_period_label(alt_tdd["end"]) + time_cat_type = pd.api.types.CategoricalDtype(list(set(network_los.skim_time_periods["labels"])), ordered=False) + alt_tdd["out_period"] = network_los.skim_time_period_label(alt_tdd["start"]).astype(time_cat_type) + alt_tdd["in_period"] = network_los.skim_time_period_label(alt_tdd["end"]).astype(time_cat_type) alt_tdd["duration"] = alt_tdd["end"] - alt_tdd["start"] diff --git a/activitysim/core/util.py b/activitysim/core/util.py index e56460f43..20fa7e86a 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -351,6 +351,9 @@ def assign_in_place(df, df2): "assign_in_place changed dtype %s of column %s to %s" % (old_dtype, c, df[c].dtype) ) + + if isinstance(old_dtype, pd.api.types.CategoricalDtype): + continue # if both df and df2 column were ints, but result is not if ( From c128447561a08879887cf64215882cae0d5036ec Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 25 Jul 2023 11:02:38 -0400 Subject: [PATCH 07/61] telecommute freq string --- activitysim/abm/models/telecommute_frequency.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/activitysim/abm/models/telecommute_frequency.py b/activitysim/abm/models/telecommute_frequency.py index 8629909aa..7e7dcd00e 100755 --- a/activitysim/abm/models/telecommute_frequency.py +++ b/activitysim/abm/models/telecommute_frequency.py @@ -86,6 +86,8 @@ def telecommute_frequency( ) choices = pd.Series(model_spec.columns[choices.values], index=choices.index) + telecommute_frequency_cat = pd.api.types.CategoricalDtype(["", "No_Telecommute","1_day_week","2_3_days_week","4_days_week"], ordered=False) + choices = choices.astype(telecommute_frequency_cat) if estimator: estimator.write_choices(choices) @@ -96,7 +98,7 @@ def telecommute_frequency( estimator.end_estimation() persons["telecommute_frequency"] = ( - choices.reindex(persons.index).fillna("").astype(str) + choices.reindex(persons.index).fillna("") ) state.add_table("persons", persons) From 93c427f8766919a1fc374c95e9cf24a75ac4801f Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 25 Jul 2023 11:02:54 -0400 Subject: [PATCH 08/61] vehicle type strings --- activitysim/abm/models/vehicle_type_choice.py | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/activitysim/abm/models/vehicle_type_choice.py b/activitysim/abm/models/vehicle_type_choice.py index c674ed62b..a9b4528b7 100644 --- a/activitysim/abm/models/vehicle_type_choice.py +++ b/activitysim/abm/models/vehicle_type_choice.py @@ -231,7 +231,7 @@ def construct_model_alternatives( else: # eliminate alternatives if no vehicle type data alts_wide = alts_wide[alts_wide._merge != "left_only"] - alts_wide.drop(columns="_merge", inplace=True) + alts_wide.drop(columns="_merge", inplace=True) # if this happens, alt_wide length will not match alt_long # converting age to integer to allow interactions in utilities alts_wide["age"] = alts_wide["age"].astype(int) @@ -341,6 +341,8 @@ def iterate_vehicle_type_choice( else: vehicle_type_data = None + # initialize categorical type for vehicle_type + vehicle_type_cat = "category" # - Preparing alternatives # create alts on-the-fly as cartesian product of categorical values if alts_cats_dict: @@ -348,11 +350,25 @@ def iterate_vehicle_type_choice( alts_wide, alts_long = construct_model_alternatives( state, model_settings, alts_cats_dict, vehicle_type_data ) + # convert alternative names to categoricals + # body_type, fuel_type, vehicle_type + # age should be a int becuase it is used as a numeric value in utilities + body_type_cat = pd.api.types.CategoricalDtype(alts_cats_dict["body_type"], ordered = False) + fuel_type_cat = pd.api.types.CategoricalDtype(alts_cats_dict["fuel_type"], ordered = False) + vehicle_type_cat = pd.api.types.CategoricalDtype(list(set(alts_wide["vehicle_type"])) + [""], ordered = False) + + alts_wide["body_type"] = alts_wide["body_type"].astype(body_type_cat) + alts_wide["fuel_type"] = alts_wide["fuel_type"].astype(fuel_type_cat) + alts_wide["vehicle_type"] = alts_wide["vehicle_type"].astype(vehicle_type_cat) else: alts_wide = alts_long = None + alts = model_spec.columns + vehicle_type_cat = pd.api.types.CategoricalDtype(list(set(alts)) + [""], ordered = False) + # - preparing choosers for iterating vehicles_merged["already_owned_veh"] = "" + vehicles_merged["already_owned_veh"] = vehicles_merged["already_owned_veh"].astype(vehicle_type_cat) logger.info("Running %s with %d vehicles", trace_label, len(vehicles_merged)) all_choosers = [] all_choices = [] @@ -450,6 +466,9 @@ def iterate_vehicle_type_choice( state, choices, model_settings, trace_label ) + # convert vehicle_type to categorical + choices["vehicle_type"] = choices["vehicle_type"].astype(vehicle_type_cat) + vehicles_merged.loc[choices.index, "already_owned_veh"] = choices[ "vehicle_type" ] @@ -464,6 +483,7 @@ def iterate_vehicle_type_choice( additional_cols = model_settings.get("COLS_TO_INCLUDE_IN_VEHICLE_TABLE") if additional_cols: additional_cols.append("vehicle_type") + vehicle_type_data["vehicle_type"] = vehicle_type_data["vehicle_type"].astype(vehicle_type_cat) all_choices = ( all_choices.reset_index() .merge(vehicle_type_data[additional_cols], how="left", on="vehicle_type") From e91a11508dc18afe729b5c7c62e4ef18be446adc Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 25 Jul 2023 12:44:23 -0400 Subject: [PATCH 09/61] categorical is not recognized by numpy --- activitysim/core/assign.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/activitysim/core/assign.py b/activitysim/core/assign.py index d504d6378..d50a174dc 100644 --- a/activitysim/core/assign.py +++ b/activitysim/core/assign.py @@ -358,17 +358,21 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): globals_dict = {} expr_values = to_series(eval(expression, globals_dict, _locals_dict)) - if ( - sharrow_enabled - and np.issubdtype(expr_values.dtype, np.floating) - and expr_values.dtype.itemsize < 4 - ): - # promote to float32, numba is not presently compatible with - # any float less than 32 (i.e., float16) - # see https://github.com/numba/numba/issues/4402 - # note this only applies to floats, signed and unsigned - # integers are readily supported down to 1 byte - expr_values = expr_values.astype(np.float32) + if sharrow_enabled: + if isinstance(expr_values.dtype, pd.api.types.CategoricalDtype): + None + elif( + np.issubdtype(expr_values.dtype, np.floating) + and expr_values.dtype.itemsize < 4 + ): + # promote to float32, numba is not presently compatible with + # any float less than 32 (i.e., float16) + # see https://github.com/numba/numba/issues/4402 + # note this only applies to floats, signed and unsigned + # integers are readily supported down to 1 byte + expr_values = expr_values.astype(np.float32) + else: + None np.seterr(**save_err) np.seterrcall(saved_handler) From 0de0043ff9e005343b83db048f1328f9531f1dec Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 25 Jul 2023 12:44:54 -0400 Subject: [PATCH 10/61] df info verbose --- activitysim/core/interaction_simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activitysim/core/interaction_simulate.py b/activitysim/core/interaction_simulate.py index cb6ae01aa..3d7bf0690 100644 --- a/activitysim/core/interaction_simulate.py +++ b/activitysim/core/interaction_simulate.py @@ -83,7 +83,7 @@ def eval_interaction_utilities( logger.info("Writing out interaction df info") buffer = io.StringIO() - df.info(memory_usage = 'deep', buf=buffer) + df.info(memory_usage = 'deep', buf=buffer, verbose=True, show_counts=True) s = buffer.getvalue() with open(os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.info.txt"), "w", encoding="utf-8") as f: f.write(s) From 224474c0d93bb3b357374a83a8bb659e4be2598b Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 2 Aug 2023 12:44:36 -0400 Subject: [PATCH 11/61] categoricals for school escorting --- activitysim/abm/models/school_escorting.py | 9 +++++++++ .../abm/models/util/school_escort_tours_trips.py | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/activitysim/abm/models/school_escorting.py b/activitysim/abm/models/school_escorting.py index 9c1e438dc..7ca546f5f 100644 --- a/activitysim/abm/models/school_escorting.py +++ b/activitysim/abm/models/school_escorting.py @@ -219,6 +219,10 @@ def create_school_escorting_bundles_table(choosers, tours, stage): ) bundles["bundle_num"] = bundles.groupby("household_id").cumcount() + 1 + # school escorting direction category + escort_direction_cat = pd.api.types.CategoricalDtype(["outbound","inbound"], ordered=False) + bundles["school_escort_direction"] = bundles["school_escort_direction"].astype(escort_direction_cat) + # initialize values bundles["chauf_type_num"] = 0 @@ -284,9 +288,11 @@ def create_school_escorting_bundles_table(choosers, tours, stage): # odd chauf_type_num means ride share, even means pure escort # this comes from the way the alternatives file is constructed where chauf_id is # incremented for each possible chauffeur and for each tour type + escort_type_cat = pd.api.types.CategoricalDtype(["pure_escort","ride_share"], ordered = False) bundles["escort_type"] = np.where( bundles["chauf_type_num"].mod(2) == 1, "ride_share", "pure_escort" ) + bundles["escort_type"] = bundles["escort_type"].astype(escort_type_cat) # This is just pulled from the pre-processor. Will break if removed or renamed in pre-processor # I think this is still a better implmentation than re-calculating here... @@ -527,6 +533,9 @@ def school_escorting( escort_bundles ) + school_escort_trips["primary_purpose"] = school_escort_trips["primary_purpose"].astype(state.get_dataframe("tours")["tour_type"].dtype) + school_escort_trips["purpose"] = school_escort_trips["purpose"].astype(state.get_dataframe("tours")["tour_type"].dtype) + # update pipeline state.add_table("households", households) state.add_table("tours", tours) diff --git a/activitysim/abm/models/util/school_escort_tours_trips.py b/activitysim/abm/models/util/school_escort_tours_trips.py index 64101c45e..1245d7b6e 100644 --- a/activitysim/abm/models/util/school_escort_tours_trips.py +++ b/activitysim/abm/models/util/school_escort_tours_trips.py @@ -314,6 +314,12 @@ def add_pure_escort_tours(tours, school_escort_tours): def add_school_escorting_type_to_tours_table(escort_bundles, tours): school_tour = (tours.tour_type == "school") & (tours.tour_num == 1) + + escort_type_cat = pd.api.types.CategoricalDtype(["pure_escort","ride_share"], ordered = False) + tours["school_esc_outbound"] = pd.NA + tours["school_esc_inbound"] = pd.NA + tours["school_esc_outbound"] = tours["school_esc_outbound"].astype(escort_type_cat) + tours["school_esc_inbound"] = tours["school_esc_inbound"].astype(escort_type_cat) for school_escort_direction in ["outbound", "inbound"]: for escort_type in ["ride_share", "pure_escort"]: @@ -466,6 +472,10 @@ def merge_school_escort_trips_into_pipeline(state: workflow.State): trips["origin"] = trips["origin"].astype(int) trips["destination"] = trips["destination"].astype(int) + # converting to categoricals + trips["school_escort_direction"] = trips["school_escort_direction"].astype("category") + trips["escort_participants"] = trips["escort_participants"].astype("category") + # updating trip_id now that we have all trips trips = canonical_ids.set_trip_index(state, trips) school_escort_trip_id_map = { @@ -554,8 +564,12 @@ def create_pure_school_escort_tours(state: workflow.State, bundles): pe_tours["person_id"] = pe_tours["chauf_id"] pe_tours["tour_category"] = "non_mandatory" + # convert tour category to categorical + pe_tours["tour_category"] = pe_tours["tour_category"].astype(state.get_dataframe("tours").tour_category.dtype) pe_tours["number_of_participants"] = 1 pe_tours["tour_type"] = "escort" + # convert tour type to categorical + pe_tours["tour_type"] = pe_tours["tour_type"].astype(state.get_dataframe("tours").tour_type.dtype) pe_tours["school_esc_outbound"] = np.where( pe_tours["school_escort_direction"] == "outbound", "pure_escort", pd.NA ) From 575ef45ea7fa6f495f19cc17aedbaa209f8f4cae Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 2 Aug 2023 12:45:02 -0400 Subject: [PATCH 12/61] categoricals for vehicle allocation --- activitysim/abm/models/vehicle_allocation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/activitysim/abm/models/vehicle_allocation.py b/activitysim/abm/models/vehicle_allocation.py index 372ed464d..16a35d0a1 100644 --- a/activitysim/abm/models/vehicle_allocation.py +++ b/activitysim/abm/models/vehicle_allocation.py @@ -225,6 +225,7 @@ def vehicle_allocation( # creating a column for choice of each occupancy level tours_veh_occup_col = f"vehicle_occup_{occup}" tours[tours_veh_occup_col] = choices["choice"] + tours[tours_veh_occup_col] = tours[tours_veh_occup_col].astype("category") tours_veh_occup_cols.append(tours_veh_occup_col) if estimator: From ef6fbbf9f6c3609ab49fb5fec612910e5b1f973e Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 2 Aug 2023 13:21:27 -0400 Subject: [PATCH 13/61] add condition for pandas categoricals --- activitysim/abm/models/trip_destination.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/activitysim/abm/models/trip_destination.py b/activitysim/abm/models/trip_destination.py index 00e3f467c..28459073a 100644 --- a/activitysim/abm/models/trip_destination.py +++ b/activitysim/abm/models/trip_destination.py @@ -849,11 +849,18 @@ def trip_destination_simulate( skims = skim_hotel.sample_skims(presample=False) - if not np.issubdtype(trips["trip_period"].dtype, np.integer): + if isinstance(trips["trip_period"].dtype, pd.api.types.CategoricalDtype): if hasattr(skims["odt_skims"], "map_time_periods"): trip_period_idx = skims["odt_skims"].map_time_periods(trips) if trip_period_idx is not None: trips["trip_period"] = trip_period_idx + elif not np.issubdtype(trips["trip_period"].dtype, np.integer): + if hasattr(skims["odt_skims"], "map_time_periods"): + trip_period_idx = skims["odt_skims"].map_time_periods(trips) + if trip_period_idx is not None: + trips["trip_period"] = trip_period_idx + else: + None locals_dict = config.get_model_constants(model_settings).copy() locals_dict.update( @@ -1287,7 +1294,15 @@ def run_trip_destination( trace_label=nth_trace_label, ) - if not np.issubdtype(nth_trips["trip_period"].dtype, np.integer): + if isinstance(nth_trips["trip_period"].dtype, pd.api.types.CategoricalDtype): + skims = network_los.get_default_skim_dict() + if hasattr(skims, "map_time_periods_from_series"): + trip_period_idx = skims.map_time_periods_from_series( + nth_trips["trip_period"] + ) + if trip_period_idx is not None: + nth_trips["trip_period"] = trip_period_idx + elif not np.issubdtype(nth_trips["trip_period"].dtype, np.integer): skims = network_los.get_default_skim_dict() if hasattr(skims, "map_time_periods_from_series"): trip_period_idx = skims.map_time_periods_from_series( @@ -1295,6 +1310,8 @@ def run_trip_destination( ) if trip_period_idx is not None: nth_trips["trip_period"] = trip_period_idx + else: + None logger.info("Running %s with %d trips", nth_trace_label, nth_trips.shape[0]) From 9a582daaf30eb51167330729bb7e482d8444d95a Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 2 Aug 2023 13:22:09 -0400 Subject: [PATCH 14/61] adhoc string variables to categoricals --- activitysim/core/util.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 20fa7e86a..5cfc08fe2 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -374,6 +374,10 @@ def assign_in_place(df, df2): df[new_columns] = df2[new_columns] + for c in new_columns: + if pd.api.types.is_object_dtype(df[c]): + df[c] = df[c].astype("category") + def df_from_dict(values, index=None): From fabd596a1c18ca94f9f47efb73d98b7b629eda5c Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 21 Aug 2023 22:01:09 -0400 Subject: [PATCH 15/61] auto downcast for interim variables --- activitysim/core/assign.py | 2 ++ activitysim/core/util.py | 72 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/activitysim/core/assign.py b/activitysim/core/assign.py index d50a174dc..75f61ae63 100644 --- a/activitysim/core/assign.py +++ b/activitysim/core/assign.py @@ -423,4 +423,6 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): # we stored result in dict - convert to df variables = util.df_from_dict(variables, index=df.index) + util.auto_opt_pd_dtypes(variables, inplace=True) + return variables, trace_results, trace_assigned_locals diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 5cfc08fe2..df3eabe53 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -20,6 +20,9 @@ import pyarrow.csv as csv import pyarrow.parquet as pq import yaml +import numbers + +from typing import Optional logger = logging.getLogger(__name__) @@ -313,7 +316,7 @@ def quick_loc_series(loc_list, target_series): return df.right -def assign_in_place(df, df2): +def assign_in_place(df, df2, downcast_float=False): """ update existing row values in df from df2, adding columns to df if they are not there @@ -323,6 +326,8 @@ def assign_in_place(df, df2): assignment left-hand-side (dest) df2: pd.DataFrame assignment right-hand-side (source) + downcast_float: bool + if True, downcast float columns if possible Returns ------- @@ -377,7 +382,70 @@ def assign_in_place(df, df2): for c in new_columns: if pd.api.types.is_object_dtype(df[c]): df[c] = df[c].astype("category") - + + auto_opt_pd_dtypes(df, downcast_float, inplace=True) + + +def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) -> Optional[pd.DataFrame]: + """ + Automatically downcast Number dtypes for minimal possible, + will not touch other (datetime, str, object, etc) + + Parameters + ---------- + df_ : pd.DataFrame + assignment left-hand-side (dest) + downcast_float: bool + if True, downcast float columns if possible + inplace: bool + if False, will return a copy of input dataset + + Returns + ------- + `None` if `inplace=True` or dataframe if `inplace=False` + + """ + df = df_ if inplace else df_.copy() + + for col in df.columns: + dtype = df[col].dtype + if "density" in col: + None + # Skip optimizing floats for precision concerns + if pd.api.types.is_float_dtype(dtype): + if not downcast_float: + continue + else: + # there is a bug in pandas to_numeric + # when convert int and floats gt 16777216 + # https://github.com/pandas-dev/pandas/issues/43693 + # https://github.com/pandas-dev/pandas/issues/23676#issuecomment-438488603 + if df[col].max() >= 16777216: + continue + else: + df[col] = pd.to_numeric(df[col], downcast='float') + # Skip if the column is already categorical + if pd.api.types.is_categorical_dtype(dtype): + continue + # Handle integer types + if pd.api.types.is_integer_dtype(dtype): + # there is a bug in pandas to_numeric + # when convert int and floats gt 16777216 + # https://github.com/pandas-dev/pandas/issues/43693 + # https://github.com/pandas-dev/pandas/issues/23676#issuecomment-438488603 + if df[col].max() >= 16777216: + continue + # else: + # df[col] = pd.to_numeric(df[col], downcast='integer') + # continue + if df[col].min() >= 0: + df[col] = pd.to_numeric(df[col], downcast='unsigned') + else: + df[col] = pd.to_numeric(df[col], downcast='integer') + + if not inplace: + return df + def df_from_dict(values, index=None): From 44538775c9adffa5d46828549e88823223991296 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 21 Aug 2023 22:07:45 -0400 Subject: [PATCH 16/61] not use unsigned int --- activitysim/core/util.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/activitysim/core/util.py b/activitysim/core/util.py index df3eabe53..36017e96b 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -435,13 +435,15 @@ def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) - # https://github.com/pandas-dev/pandas/issues/23676#issuecomment-438488603 if df[col].max() >= 16777216: continue - # else: - # df[col] = pd.to_numeric(df[col], downcast='integer') - # continue - if df[col].min() >= 0: - df[col] = pd.to_numeric(df[col], downcast='unsigned') else: df[col] = pd.to_numeric(df[col], downcast='integer') + continue + # there are calcualtions in asim that expect results in negative values + # operations on two unsigned types will not produce negative values + # if df[col].min() >= 0: + # df[col] = pd.to_numeric(df[col], downcast='unsigned') + # else: + # df[col] = pd.to_numeric(df[col], downcast='integer') if not inplace: return df From 6f64dd2ea013fb0247017a74afe726160e2aaca5 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 21 Aug 2023 22:08:39 -0400 Subject: [PATCH 17/61] numeric overflow on chaperone weights --- activitysim/abm/models/school_escorting.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/activitysim/abm/models/school_escorting.py b/activitysim/abm/models/school_escorting.py index 7ca546f5f..60be8f8f5 100644 --- a/activitysim/abm/models/school_escorting.py +++ b/activitysim/abm/models/school_escorting.py @@ -64,9 +64,9 @@ def determine_escorting_participants(choosers, persons, model_settings): ] chaperones["chaperone_weight"] = ( - (persontype_weight * chaperones[ptype_col]) - + (gender_weight * np.where(chaperones[sex_col] == 1, 1, 2)) - + (age_weight * np.where(chaperones[age_col] > 25, 1, 0)) + (persontype_weight * chaperones[ptype_col].astype("int64")) + + (gender_weight * np.where(chaperones[sex_col].astype("int64") == 1, 1, 2)) + + (age_weight * np.where(chaperones[age_col].astype("int64") > 25, 1, 0)) ) chaperones["chaperone_num"] = ( From e4206338ec261bca04cd5d2c06603679c4abf201 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 21 Aug 2023 22:09:17 -0400 Subject: [PATCH 18/61] numeric overflow in veh type preprocessor --- .../vehicle_type_choice_annotate_choosers_preprocessor.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activitysim/examples/prototype_mtc_extended/configs/vehicle_type_choice_annotate_choosers_preprocessor.csv b/activitysim/examples/prototype_mtc_extended/configs/vehicle_type_choice_annotate_choosers_preprocessor.csv index d0a98ff3c..c190f781f 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/vehicle_type_choice_annotate_choosers_preprocessor.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/vehicle_type_choice_annotate_choosers_preprocessor.csv @@ -1,6 +1,6 @@ Description,Target,Expression total household distance to work,total_hh_dist_to_work,persons.groupby('household_id')['distance_to_work'].sum().reindex(df.household_id).fillna(0) -total household distance to work capped at 100 mi per worker,total_hh_dist_to_work_cap,"np.where(total_hh_dist_to_work > (100*df.num_workers.values), 100*df.num_workers.values, total_hh_dist_to_work)" +total household distance to work capped at 100 mi per worker,total_hh_dist_to_work_cap,"np.where(total_hh_dist_to_work > (100*df.num_workers.astype('int64').values), 100*df.num_workers.astype('int64').values, total_hh_dist_to_work)" average household distance to work,avg_hh_dist_to_work,persons.groupby('household_id')['distance_to_work'].mean().reindex(df.household_id).fillna(0) household density per square mile,hh_per_mi,(df.TOTHH.values / df.TOTACRE.values) * 640 number of vehicles is greater than the number of drivers,hh_veh_gt_drivers,"np.where(df.auto_ownership > df.num_drivers, 1, 0)" From 5c7ee3432dcd9d374e060fde9e7845298252a6f1 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 21 Aug 2023 22:09:55 -0400 Subject: [PATCH 19/61] downcast tour variables in source code --- .../abm/models/util/school_escort_tours_trips.py | 6 ++++++ activitysim/abm/models/util/tour_frequency.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/activitysim/abm/models/util/school_escort_tours_trips.py b/activitysim/abm/models/util/school_escort_tours_trips.py index 1245d7b6e..f7bc2d05c 100644 --- a/activitysim/abm/models/util/school_escort_tours_trips.py +++ b/activitysim/abm/models/util/school_escort_tours_trips.py @@ -536,6 +536,12 @@ def recompute_tour_count_statistics(state: workflow.State): tours["tour_num"] = grouped.cumcount() + 1 tours["tour_count"] = tours["tour_num"] + grouped.cumcount(ascending=False) + # downcast + tours["tour_count"] = tours["tour_count"].astype("int8") + tours["tour_num"] = tours["tour_num"].astype("int8") + tours["tour_type_num"] = tours["tour_type_num"].astype("int8") + tours["tour_type_count"] = tours["tour_type_count"].astype("int8") + state.add_table("tours", tours) diff --git a/activitysim/abm/models/util/tour_frequency.py b/activitysim/abm/models/util/tour_frequency.py index 7ba275fa9..cc6b06ba9 100644 --- a/activitysim/abm/models/util/tour_frequency.py +++ b/activitysim/abm/models/util/tour_frequency.py @@ -110,6 +110,13 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # index is arbitrary but don't want any duplicates in index tours.reset_index(drop=True, inplace=True) + # downcast + tours["tour_count"] = tours["tour_count"].astype("int8") + tours["tour_num"] = tours["tour_num"].astype("int8") + tours["tour_type_num"] = tours["tour_type_num"].astype("int8") + tours["tour_type_count"] = tours["tour_type_count"].astype("int8") + tours["number_of_participants"] = tours["number_of_participants"].astype("int8") + return tours @@ -769,4 +776,11 @@ def create_joint_tours( # index is arbitrary but don't want any duplicates in index tours.reset_index(drop=True, inplace=True) + # downcast + tours["tour_count"] = tours["tour_count"].astype("int8") + tours["tour_num"] = tours["tour_num"].astype("int8") + tours["tour_type_num"] = tours["tour_type_num"].astype("int8") + tours["tour_type_count"] = tours["tour_type_count"].astype("int8") + tours["number_of_participants"] = tours["number_of_participants"].astype("int8") + return tours From 282885dbe6075739a7d43a2a9e5c28063638079b Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 6 Oct 2023 13:33:15 -0400 Subject: [PATCH 20/61] condition the temps --- activitysim/core/assign.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/activitysim/core/assign.py b/activitysim/core/assign.py index 75f61ae63..44a4c84d4 100644 --- a/activitysim/core/assign.py +++ b/activitysim/core/assign.py @@ -396,7 +396,8 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): # just keeping track of temps so we can chunk.log_df if is_temp(target): - temps[target] = expr_values + if chunk_log: + temps[target] = expr_values else: variables[target] = expr_values From e06bd7d08b302dd419a3dc4b52376cf811206ad8 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 6 Oct 2023 13:42:57 -0400 Subject: [PATCH 21/61] sort time period cat in tour scheduling --- .../abm/models/util/vectorize_tour_scheduling.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/activitysim/abm/models/util/vectorize_tour_scheduling.py b/activitysim/abm/models/util/vectorize_tour_scheduling.py index 2bda3d502..ce93c8951 100644 --- a/activitysim/abm/models/util/vectorize_tour_scheduling.py +++ b/activitysim/abm/models/util/vectorize_tour_scheduling.py @@ -1,6 +1,7 @@ # ActivitySim # See full license in LICENSE.txt. from __future__ import annotations +from collections import OrderedDict import logging @@ -143,7 +144,9 @@ def _compute_logsums( if preprocessor_settings: simulate.set_skim_wrapper_targets(choosers, skims) - + logger.info( + f"{trace_label} start preprocessing prior to compute_logsums for {choosers.shape[0]} choosers {alt_tdd.shape[0]} alts" + ) expressions.assign_columns( state, df=choosers, @@ -151,6 +154,9 @@ def _compute_logsums( locals_dict=locals_dict, trace_label=trace_label, ) + logger.info( + f"{trace_label} end preprocessing prior to compute_logsums for {choosers.shape[0]} choosers {alt_tdd.shape[0]} alts" + ) # - compute logsums logsum_spec = state.filesystem.read_model_spec( @@ -333,7 +339,7 @@ def compute_tour_scheduling_logsums( # FIXME:MEMORY # These two lines each generate a massive array of strings, # using a bunch of RAM and slowing things down. - time_cat_type = pd.api.types.CategoricalDtype(list(set(network_los.skim_time_periods["labels"])), ordered=False) + time_cat_type = pd.api.types.CategoricalDtype(list(OrderedDict.fromkeys(network_los.skim_time_periods["labels"])), ordered=True) alt_tdd["out_period"] = network_los.skim_time_period_label(alt_tdd["start"]).astype(time_cat_type) alt_tdd["in_period"] = network_los.skim_time_period_label(alt_tdd["end"]).astype(time_cat_type) From 9018aa49e73b6740ae17d0d9a5aa437905a853cb Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 6 Oct 2023 13:43:34 -0400 Subject: [PATCH 22/61] add loggings --- activitysim/core/interaction_sample_simulate.py | 7 ++++++- activitysim/core/interaction_simulate.py | 2 ++ activitysim/core/util.py | 2 -- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/activitysim/core/interaction_sample_simulate.py b/activitysim/core/interaction_sample_simulate.py index 274940b30..83910fe57 100644 --- a/activitysim/core/interaction_sample_simulate.py +++ b/activitysim/core/interaction_sample_simulate.py @@ -131,8 +131,13 @@ def _interaction_sample_simulate( # assert alternatives.index.name == choosers.index.name # asserting the index names are the same tells us nothing about the underlying data so why? - + logger.info( + f"{trace_label} start merging choosers and alternatives to create interaction_df" + ) interaction_df = alternatives.join(choosers, how="left", rsuffix="_chooser") + logger.info( + f"{trace_label} end merging choosers and alternatives to create interaction_df" + ) if log_alt_losers: # logit.interaction_dataset adds ALT_CHOOSER_ID column if log_alt_losers is True diff --git a/activitysim/core/interaction_simulate.py b/activitysim/core/interaction_simulate.py index 3d7bf0690..0b32f8dec 100644 --- a/activitysim/core/interaction_simulate.py +++ b/activitysim/core/interaction_simulate.py @@ -426,12 +426,14 @@ def to_series(x): # if sh_flow is not None and trace_rows is not None and trace_rows.any(): assert type(trace_rows) == np.ndarray + logger.info("sh_flow load dataarray") sh_utility_fat = sh_flow.load_dataarray( # sh_flow.tree.replace_datasets( # df=df.iloc[trace_rows], # ), dtype=np.float32, ) + logger.info("finish sh_flow load dataarray") sh_utility_fat = sh_utility_fat[trace_rows, :] sh_utility_fat = sh_utility_fat.to_dataframe("vals") try: diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 36017e96b..42f63de1f 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -409,8 +409,6 @@ def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) - for col in df.columns: dtype = df[col].dtype - if "density" in col: - None # Skip optimizing floats for precision concerns if pd.api.types.is_float_dtype(dtype): if not downcast_float: From 7cffe4fb91f79b4541d7bbf18ba8f95004912835 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 6 Oct 2023 13:55:57 -0400 Subject: [PATCH 23/61] formatting --- .../abm/models/atwork_subtour_frequency.py | 14 +++-- .../abm/models/joint_tour_composition.py | 8 ++- .../abm/models/joint_tour_frequency.py | 31 +++++++++-- .../abm/models/mandatory_tour_frequency.py | 12 +++-- activitysim/abm/models/school_escorting.py | 20 +++++-- activitysim/abm/models/stop_frequency.py | 4 +- .../abm/models/telecommute_frequency.py | 9 ++-- activitysim/abm/models/tour_mode_choice.py | 6 ++- activitysim/abm/models/trip_destination.py | 8 ++- activitysim/abm/models/trip_mode_choice.py | 4 +- activitysim/abm/models/trip_purpose.py | 8 +-- activitysim/abm/models/util/mode.py | 12 +++-- .../models/util/school_escort_tours_trips.py | 18 +++++-- activitysim/abm/models/util/tour_frequency.py | 52 +++++++++++++++++-- activitysim/abm/models/util/trip.py | 2 +- .../models/util/vectorize_tour_scheduling.py | 17 ++++-- activitysim/abm/models/vehicle_type_choice.py | 29 ++++++++--- activitysim/core/assign.py | 2 +- .../core/interaction_sample_simulate.py | 8 +-- activitysim/core/interaction_simulate.py | 26 +++++++--- activitysim/core/util.py | 18 ++++--- 21 files changed, 231 insertions(+), 77 deletions(-) diff --git a/activitysim/abm/models/atwork_subtour_frequency.py b/activitysim/abm/models/atwork_subtour_frequency.py index ed856bbde..579223a4a 100644 --- a/activitysim/abm/models/atwork_subtour_frequency.py +++ b/activitysim/abm/models/atwork_subtour_frequency.py @@ -22,10 +22,15 @@ def add_null_results(state, trace_label, tours): logger.info("Skipping %s: add_null_results", trace_label) - cat_type = pd.api.types.CategoricalDtype(["", "no_subtours","eat","business1","maint","business2","eat_business"], ordered=False) + cat_type = pd.api.types.CategoricalDtype( + ["", "no_subtours", "eat", "business1", "maint", "business2", "eat_business"], + ordered=False, + ) choices = choices.astype(cat_type) tours["atwork_subtour_frequency"] = "" - tours["atwork_subtour_frequency"] = tours["atwork_subtour_frequency"].astype(cat_type) + tours["atwork_subtour_frequency"] = tours["atwork_subtour_frequency"].astype( + cat_type + ) state.add_table("tours", tours) @@ -103,7 +108,10 @@ def atwork_subtour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) - cat_type = pd.api.types.CategoricalDtype(["", "no_subtours","eat","business1","maint","business2","eat_business"], ordered=False) + cat_type = pd.api.types.CategoricalDtype( + ["", "no_subtours", "eat", "business1", "maint", "business2", "eat_business"], + ordered=False, + ) choices = choices.astype(cat_type) if estimator: diff --git a/activitysim/abm/models/joint_tour_composition.py b/activitysim/abm/models/joint_tour_composition.py index ac58c6e1f..4c576fad0 100644 --- a/activitysim/abm/models/joint_tour_composition.py +++ b/activitysim/abm/models/joint_tour_composition.py @@ -22,7 +22,9 @@ def add_null_results(state, trace_label, tours): logger.info("Skipping %s: add_null_results" % trace_label) tours["composition"] = "" - cat_type = pd.api.types.CategoricalDtype(["", "adults", "children", "mixed"], ordered=False) + cat_type = pd.api.types.CategoricalDtype( + ["", "adults", "children", "mixed"], ordered=False + ) tours["composition"] = tours["composition"].astype(cat_type) state.add_table("tours", tours) @@ -108,7 +110,9 @@ def joint_tour_composition( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) - cat_type = pd.api.types.CategoricalDtype(["", "adults", "children", "mixed"], ordered=False) + cat_type = pd.api.types.CategoricalDtype( + ["", "adults", "children", "mixed"], ordered=False + ) choices = choices.astype(cat_type) if estimator: diff --git a/activitysim/abm/models/joint_tour_frequency.py b/activitysim/abm/models/joint_tour_frequency.py index 819b18afb..6e25d481c 100644 --- a/activitysim/abm/models/joint_tour_frequency.py +++ b/activitysim/abm/models/joint_tour_frequency.py @@ -98,7 +98,32 @@ def joint_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) - cat_type = pd.api.types.CategoricalDtype(["0_tours","1_Shop","1_Main","1_Eat","1_Visit","1_Disc","2_SS","2_SM","2_SE","2_SV","2_SD","2_MM","2_ME","2_MV","2_MD","2_EE","2_EV","2_ED","2_VV","2_VD","2_DD"], ordered=False) + cat_type = pd.api.types.CategoricalDtype( + [ + "0_tours", + "1_Shop", + "1_Main", + "1_Eat", + "1_Visit", + "1_Disc", + "2_SS", + "2_SM", + "2_SE", + "2_SV", + "2_SD", + "2_MM", + "2_ME", + "2_MV", + "2_MD", + "2_EE", + "2_EV", + "2_ED", + "2_VV", + "2_VD", + "2_DD", + ], + ordered=False, + ) choices = choices.astype(cat_type) if estimator: @@ -131,8 +156,8 @@ def joint_tour_frequency( # we expect there to be an alt with no tours - which we can use to backfill non-travelers no_tours_alt = (alternatives.sum(axis=1) == 0).index[0] - households["joint_tour_frequency"] = ( - choices.reindex(households.index).fillna(no_tours_alt) + households["joint_tour_frequency"] = choices.reindex(households.index).fillna( + no_tours_alt ) households["num_hh_joint_tours"] = ( diff --git a/activitysim/abm/models/mandatory_tour_frequency.py b/activitysim/abm/models/mandatory_tour_frequency.py index 550550810..e7d686082 100644 --- a/activitysim/abm/models/mandatory_tour_frequency.py +++ b/activitysim/abm/models/mandatory_tour_frequency.py @@ -24,7 +24,9 @@ def add_null_results(state, trace_label, mandatory_tour_frequency_settings): persons = state.get_dataframe("persons") persons["mandatory_tour_frequency"] = pd.categorical( - "", categories=["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False + "", + categories=["", "work1", "work2", "school1", "school2", "work_and_school"], + ordered=False, ) tours = pd.DataFrame() @@ -112,7 +114,9 @@ def mandatory_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) - cat_type = pd.api.types.CategoricalDtype(["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False) + cat_type = pd.api.types.CategoricalDtype( + ["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False + ) choices = choices.astype(cat_type) if estimator: @@ -146,9 +150,7 @@ def mandatory_tour_frequency( persons = state.get_dataframe("persons") # need to reindex as we only handled persons with cdap_activity == 'M' - persons["mandatory_tour_frequency"] = ( - choices.reindex(persons.index).fillna("") - ) + persons["mandatory_tour_frequency"] = choices.reindex(persons.index).fillna("") expressions.assign_columns( state, diff --git a/activitysim/abm/models/school_escorting.py b/activitysim/abm/models/school_escorting.py index 60be8f8f5..8a4385e3c 100644 --- a/activitysim/abm/models/school_escorting.py +++ b/activitysim/abm/models/school_escorting.py @@ -220,8 +220,12 @@ def create_school_escorting_bundles_table(choosers, tours, stage): bundles["bundle_num"] = bundles.groupby("household_id").cumcount() + 1 # school escorting direction category - escort_direction_cat = pd.api.types.CategoricalDtype(["outbound","inbound"], ordered=False) - bundles["school_escort_direction"] = bundles["school_escort_direction"].astype(escort_direction_cat) + escort_direction_cat = pd.api.types.CategoricalDtype( + ["outbound", "inbound"], ordered=False + ) + bundles["school_escort_direction"] = bundles["school_escort_direction"].astype( + escort_direction_cat + ) # initialize values bundles["chauf_type_num"] = 0 @@ -288,7 +292,9 @@ def create_school_escorting_bundles_table(choosers, tours, stage): # odd chauf_type_num means ride share, even means pure escort # this comes from the way the alternatives file is constructed where chauf_id is # incremented for each possible chauffeur and for each tour type - escort_type_cat = pd.api.types.CategoricalDtype(["pure_escort","ride_share"], ordered = False) + escort_type_cat = pd.api.types.CategoricalDtype( + ["pure_escort", "ride_share"], ordered=False + ) bundles["escort_type"] = np.where( bundles["chauf_type_num"].mod(2) == 1, "ride_share", "pure_escort" ) @@ -533,8 +539,12 @@ def school_escorting( escort_bundles ) - school_escort_trips["primary_purpose"] = school_escort_trips["primary_purpose"].astype(state.get_dataframe("tours")["tour_type"].dtype) - school_escort_trips["purpose"] = school_escort_trips["purpose"].astype(state.get_dataframe("tours")["tour_type"].dtype) + school_escort_trips["primary_purpose"] = school_escort_trips[ + "primary_purpose" + ].astype(state.get_dataframe("tours")["tour_type"].dtype) + school_escort_trips["purpose"] = school_escort_trips["purpose"].astype( + state.get_dataframe("tours")["tour_type"].dtype + ) # update pipeline state.add_table("households", households) diff --git a/activitysim/abm/models/stop_frequency.py b/activitysim/abm/models/stop_frequency.py index d28c1f62c..0c9dff9ef 100644 --- a/activitysim/abm/models/stop_frequency.py +++ b/activitysim/abm/models/stop_frequency.py @@ -167,7 +167,9 @@ def stop_frequency( # convert indexes to alternative names choices = pd.Series(segment_spec.columns[choices.values], index=choices.index) - cat_type = pd.api.types.CategoricalDtype(segment_spec.columns.tolist(), ordered=False) + cat_type = pd.api.types.CategoricalDtype( + segment_spec.columns.tolist(), ordered=False + ) choices = choices.astype(cat_type) if estimator: diff --git a/activitysim/abm/models/telecommute_frequency.py b/activitysim/abm/models/telecommute_frequency.py index 7e7dcd00e..0cfbbfa8c 100755 --- a/activitysim/abm/models/telecommute_frequency.py +++ b/activitysim/abm/models/telecommute_frequency.py @@ -86,7 +86,10 @@ def telecommute_frequency( ) choices = pd.Series(model_spec.columns[choices.values], index=choices.index) - telecommute_frequency_cat = pd.api.types.CategoricalDtype(["", "No_Telecommute","1_day_week","2_3_days_week","4_days_week"], ordered=False) + telecommute_frequency_cat = pd.api.types.CategoricalDtype( + ["", "No_Telecommute", "1_day_week", "2_3_days_week", "4_days_week"], + ordered=False, + ) choices = choices.astype(telecommute_frequency_cat) if estimator: @@ -97,9 +100,7 @@ def telecommute_frequency( estimator.write_override_choices(choices) estimator.end_estimation() - persons["telecommute_frequency"] = ( - choices.reindex(persons.index).fillna("") - ) + persons["telecommute_frequency"] = choices.reindex(persons.index).fillna("") state.add_table("persons", persons) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index 9bb39356a..dc37e9353 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -69,7 +69,9 @@ def create_logsum_trips( pandas.DataFrame Table of trips: 2 per tour, with O/D and purpose inherited from tour """ - stop_freq_cat_type = pd.api.types.CategoricalDtype(["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False) + stop_freq_cat_type = pd.api.types.CategoricalDtype( + ["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False + ) stop_frequency_alts = state.get_injectable("stop_frequency_alts") stop_freq = "0out_0in" # no intermediate stops tours["stop_frequency"] = stop_freq @@ -77,7 +79,7 @@ def create_logsum_trips( tours["primary_purpose"] = tours["tour_purpose"] trips = trip.initialize_from_tours(state, tours, stop_frequency_alts) trips["stop_frequency"] = stop_freq - + outbound = trips["outbound"] trips["depart"] = reindex(tours.start, trips.tour_id) trips.loc[~outbound, "depart"] = reindex(tours.end, trips.loc[~outbound, "tour_id"]) diff --git a/activitysim/abm/models/trip_destination.py b/activitysim/abm/models/trip_destination.py index 28459073a..1ecc287b6 100644 --- a/activitysim/abm/models/trip_destination.py +++ b/activitysim/abm/models/trip_destination.py @@ -1294,7 +1294,9 @@ def run_trip_destination( trace_label=nth_trace_label, ) - if isinstance(nth_trips["trip_period"].dtype, pd.api.types.CategoricalDtype): + if isinstance( + nth_trips["trip_period"].dtype, pd.api.types.CategoricalDtype + ): skims = network_los.get_default_skim_dict() if hasattr(skims, "map_time_periods_from_series"): trip_period_idx = skims.map_time_periods_from_series( @@ -1317,7 +1319,9 @@ def run_trip_destination( # - choose destination for nth_trips, segmented by primary_purpose choices_list = [] - for primary_purpose, trips_segment in nth_trips.groupby("primary_purpose", observed=True): + for primary_purpose, trips_segment in nth_trips.groupby( + "primary_purpose", observed=True + ): choices, destination_sample = choose_trip_destination( state, primary_purpose, diff --git a/activitysim/abm/models/trip_mode_choice.py b/activitysim/abm/models/trip_mode_choice.py index 498e8c21c..c322c75ff 100644 --- a/activitysim/abm/models/trip_mode_choice.py +++ b/activitysim/abm/models/trip_mode_choice.py @@ -168,7 +168,9 @@ def trip_mode_choice( choices_list = [] cols_to_keep_list = [] - for primary_purpose, trips_segment in trips_merged.groupby("primary_purpose", observed=True): + for primary_purpose, trips_segment in trips_merged.groupby( + "primary_purpose", observed=True + ): segment_trace_label = tracing.extend_trace_label(trace_label, primary_purpose) logger.info( diff --git a/activitysim/abm/models/trip_purpose.py b/activitysim/abm/models/trip_purpose.py index d4edd7bd1..6b287daa3 100644 --- a/activitysim/abm/models/trip_purpose.py +++ b/activitysim/abm/models/trip_purpose.py @@ -211,17 +211,17 @@ def run_trip_purpose(state: workflow.State, trips_df, estimator, trace_label): # - last trip of outbound tour gets primary_purpose last_trip = trips_df.trip_num == trips_df.trip_count purpose = trips_df.primary_purpose[last_trip & trips_df.outbound] - print(purpose.value_counts(dropna = False)) + print(purpose.value_counts(dropna=False)) result_list.append(purpose) logger.info("assign purpose to %s last outbound trips", purpose.shape[0]) # - last trip of inbound tour gets home (or work for atwork subtours) purpose = trips_df.primary_purpose[last_trip & ~trips_df.outbound] - print(purpose.value_counts(dropna = False)) + print(purpose.value_counts(dropna=False)) purpose = pd.Series( np.where(purpose == "atwork", "work", "home"), index=purpose.index ).astype(trips_df.primary_purpose.dtype) - print(purpose.value_counts(dropna = False)) + print(purpose.value_counts(dropna=False)) result_list.append(purpose) logger.info("assign purpose to %s last inbound trips", purpose.shape[0]) @@ -259,7 +259,7 @@ def run_trip_purpose(state: workflow.State, trips_df, estimator, trace_label): trace_label=chunk_trace_label, chunk_sizer=chunk_sizer, ) - print(choices.value_counts(dropna = False)) + print(choices.value_counts(dropna=False)) result_list.append(choices) chunk_sizer.log_df(trace_label, f"result_list", result_list) diff --git a/activitysim/abm/models/util/mode.py b/activitysim/abm/models/util/mode.py index 254f3fdb3..63c2993eb 100644 --- a/activitysim/abm/models/util/mode.py +++ b/activitysim/abm/models/util/mode.py @@ -133,9 +133,15 @@ def run_tour_mode_choice_simulate( assert ("in_period" not in choosers) and ("out_period" not in choosers) in_time = skims["in_time_col_name"] out_time = skims["out_time_col_name"] - time_cat_type = pd.api.types.CategoricalDtype(list(set(network_los.skim_time_periods["labels"])), ordered=False) - choosers["in_period"] = network_los.skim_time_period_label(choosers[in_time]).astype(time_cat_type) - choosers["out_period"] = network_los.skim_time_period_label(choosers[out_time]).astype(time_cat_type) + time_cat_type = pd.api.types.CategoricalDtype( + list(set(network_los.skim_time_periods["labels"])), ordered=False + ) + choosers["in_period"] = network_los.skim_time_period_label( + choosers[in_time] + ).astype(time_cat_type) + choosers["out_period"] = network_los.skim_time_period_label( + choosers[out_time] + ).astype(time_cat_type) expressions.annotate_preprocessors( state, choosers, locals_dict, skims, model_settings, trace_label diff --git a/activitysim/abm/models/util/school_escort_tours_trips.py b/activitysim/abm/models/util/school_escort_tours_trips.py index f7bc2d05c..833edee70 100644 --- a/activitysim/abm/models/util/school_escort_tours_trips.py +++ b/activitysim/abm/models/util/school_escort_tours_trips.py @@ -314,8 +314,10 @@ def add_pure_escort_tours(tours, school_escort_tours): def add_school_escorting_type_to_tours_table(escort_bundles, tours): school_tour = (tours.tour_type == "school") & (tours.tour_num == 1) - - escort_type_cat = pd.api.types.CategoricalDtype(["pure_escort","ride_share"], ordered = False) + + escort_type_cat = pd.api.types.CategoricalDtype( + ["pure_escort", "ride_share"], ordered=False + ) tours["school_esc_outbound"] = pd.NA tours["school_esc_inbound"] = pd.NA tours["school_esc_outbound"] = tours["school_esc_outbound"].astype(escort_type_cat) @@ -473,7 +475,9 @@ def merge_school_escort_trips_into_pipeline(state: workflow.State): trips["destination"] = trips["destination"].astype(int) # converting to categoricals - trips["school_escort_direction"] = trips["school_escort_direction"].astype("category") + trips["school_escort_direction"] = trips["school_escort_direction"].astype( + "category" + ) trips["escort_participants"] = trips["escort_participants"].astype("category") # updating trip_id now that we have all trips @@ -571,11 +575,15 @@ def create_pure_school_escort_tours(state: workflow.State, bundles): pe_tours["tour_category"] = "non_mandatory" # convert tour category to categorical - pe_tours["tour_category"] = pe_tours["tour_category"].astype(state.get_dataframe("tours").tour_category.dtype) + pe_tours["tour_category"] = pe_tours["tour_category"].astype( + state.get_dataframe("tours").tour_category.dtype + ) pe_tours["number_of_participants"] = 1 pe_tours["tour_type"] = "escort" # convert tour type to categorical - pe_tours["tour_type"] = pe_tours["tour_type"].astype(state.get_dataframe("tours").tour_type.dtype) + pe_tours["tour_type"] = pe_tours["tour_type"].astype( + state.get_dataframe("tours").tour_type.dtype + ) pe_tours["school_esc_outbound"] = np.where( pe_tours["school_escort_direction"] == "outbound", "pure_escort", pd.NA ) diff --git a/activitysim/abm/models/util/tour_frequency.py b/activitysim/abm/models/util/tour_frequency.py index cc6b06ba9..60febd7d8 100644 --- a/activitysim/abm/models/util/tour_frequency.py +++ b/activitysim/abm/models/util/tour_frequency.py @@ -57,7 +57,25 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # reformat with the columns given below tours = tour_counts.stack().reset_index() tours.columns = [parent_col, "tour_type", "tour_type_count"] - cat_tour_type = pd.api.types.CategoricalDtype(["work","school","univ","escort","eatout","shopping","social","othmaint","othdiscr", "eat", "business","maint", "atwork", "home"], ordered=False) + cat_tour_type = pd.api.types.CategoricalDtype( + [ + "work", + "school", + "univ", + "escort", + "eatout", + "shopping", + "social", + "othmaint", + "othdiscr", + "eat", + "business", + "maint", + "atwork", + "home", + ], + ordered=False, + ) tours["tour_type"] = tours["tour_type"].astype(cat_tour_type) """ @@ -101,7 +119,9 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # do not enforce this here, other categories are possible # assert tour_category in ["mandatory", "non_mandatory", "atwork", "joint"] tours["tour_category"] = tour_category - cat_tour_category = pd.api.types.CategoricalDtype(["mandatory","joint","non_mandatory","atwork"], ordered=False) + cat_tour_category = pd.api.types.CategoricalDtype( + ["mandatory", "joint", "non_mandatory", "atwork"], ordered=False + ) tours["tour_category"] = tours["tour_category"].astype(cat_tour_category) # for joint tours, the correct number will be filled in after participation step @@ -704,7 +724,25 @@ def create_joint_tours( tours_purp.columns = [parent_col, "tour_id_temp", "tour_type"] tours_purp["tour_id_temp"] = range(1, 1 + len(tours_purp)) tours_purp["tour_type"] = tours_purp["tour_type"].map(tour_type_dict) - cat_tour_type = pd.api.types.CategoricalDtype(["work","school","univ","escort","eatout","shopping","social","othmaint","othdiscr", "eat", "business","maint", "atwork", "home"], ordered=False) + cat_tour_type = pd.api.types.CategoricalDtype( + [ + "work", + "school", + "univ", + "escort", + "eatout", + "shopping", + "social", + "othmaint", + "othdiscr", + "eat", + "business", + "maint", + "atwork", + "home", + ], + ordered=False, + ) tours_purp["tour_type"] = tours_purp["tour_type"].astype(cat_tour_type) """ @@ -724,7 +762,9 @@ def create_joint_tours( tours_comp.columns = [parent_col, "tour_id_temp", "composition"] tours_comp["tour_id_temp"] = range(1, 1 + len(tours_comp)) tours_comp["composition"] = tours_comp["composition"].map(tour_comp_dict) - cat_tour_comp = pd.api.types.CategoricalDtype(["adults","children","mixed"], ordered=False) + cat_tour_comp = pd.api.types.CategoricalDtype( + ["adults", "children", "mixed"], ordered=False + ) tours_comp["composition"] = tours_comp["composition"].astype(cat_tour_comp) """ @@ -767,7 +807,9 @@ def create_joint_tours( # set these here to ensure consistency across different tour categories assert tour_category in ["mandatory", "non_mandatory", "atwork", "joint"] tours["tour_category"] = tour_category - cat_tour_category = pd.api.types.CategoricalDtype(["mandatory","joint","non_mandatory","atwork"], ordered=False) + cat_tour_category = pd.api.types.CategoricalDtype( + ["mandatory", "joint", "non_mandatory", "atwork"], ordered=False + ) tours["tour_category"] = tours["tour_category"].astype(cat_tour_category) # for joint tours, the correct number will be filled in after participation step diff --git a/activitysim/abm/models/util/trip.py b/activitysim/abm/models/util/trip.py index 6fcc4010b..c6d8e5075 100644 --- a/activitysim/abm/models/util/trip.py +++ b/activitysim/abm/models/util/trip.py @@ -168,7 +168,7 @@ def initialize_from_tours( """ OUTBOUND_ALT = "out" - direction_cat_type = pd.api.types.CategoricalDtype(["out","in"], ordered=False) + direction_cat_type = pd.api.types.CategoricalDtype(["out", "in"], ordered=False) assert OUTBOUND_ALT in stop_frequency_alts.columns # get the actual alternatives for each person - have to go back to the diff --git a/activitysim/abm/models/util/vectorize_tour_scheduling.py b/activitysim/abm/models/util/vectorize_tour_scheduling.py index ce93c8951..ed61703e2 100644 --- a/activitysim/abm/models/util/vectorize_tour_scheduling.py +++ b/activitysim/abm/models/util/vectorize_tour_scheduling.py @@ -195,7 +195,9 @@ def dedupe_alt_tdd(state: workflow.State, alt_tdd, tour_purpose, trace_label): state, tracing.extend_trace_label(trace_label, "dedupe_alt_tdd") ) as chunk_sizer: if tdd_segments is not None: - tdd_segments["time_period"] = tdd_segments["time_period"].astype(alt_tdd["out_period"].dtype) + tdd_segments["time_period"] = tdd_segments["time_period"].astype( + alt_tdd["out_period"].dtype + ) dedupe_columns = ["out_period", "in_period"] @@ -339,9 +341,16 @@ def compute_tour_scheduling_logsums( # FIXME:MEMORY # These two lines each generate a massive array of strings, # using a bunch of RAM and slowing things down. - time_cat_type = pd.api.types.CategoricalDtype(list(OrderedDict.fromkeys(network_los.skim_time_periods["labels"])), ordered=True) - alt_tdd["out_period"] = network_los.skim_time_period_label(alt_tdd["start"]).astype(time_cat_type) - alt_tdd["in_period"] = network_los.skim_time_period_label(alt_tdd["end"]).astype(time_cat_type) + time_cat_type = pd.api.types.CategoricalDtype( + list(OrderedDict.fromkeys(network_los.skim_time_periods["labels"])), + ordered=True, + ) + alt_tdd["out_period"] = network_los.skim_time_period_label(alt_tdd["start"]).astype( + time_cat_type + ) + alt_tdd["in_period"] = network_los.skim_time_period_label(alt_tdd["end"]).astype( + time_cat_type + ) alt_tdd["duration"] = alt_tdd["end"] - alt_tdd["start"] diff --git a/activitysim/abm/models/vehicle_type_choice.py b/activitysim/abm/models/vehicle_type_choice.py index a9b4528b7..83c26a91d 100644 --- a/activitysim/abm/models/vehicle_type_choice.py +++ b/activitysim/abm/models/vehicle_type_choice.py @@ -231,7 +231,9 @@ def construct_model_alternatives( else: # eliminate alternatives if no vehicle type data alts_wide = alts_wide[alts_wide._merge != "left_only"] - alts_wide.drop(columns="_merge", inplace=True) # if this happens, alt_wide length will not match alt_long + alts_wide.drop( + columns="_merge", inplace=True + ) # if this happens, alt_wide length will not match alt_long # converting age to integer to allow interactions in utilities alts_wide["age"] = alts_wide["age"].astype(int) @@ -353,9 +355,15 @@ def iterate_vehicle_type_choice( # convert alternative names to categoricals # body_type, fuel_type, vehicle_type # age should be a int becuase it is used as a numeric value in utilities - body_type_cat = pd.api.types.CategoricalDtype(alts_cats_dict["body_type"], ordered = False) - fuel_type_cat = pd.api.types.CategoricalDtype(alts_cats_dict["fuel_type"], ordered = False) - vehicle_type_cat = pd.api.types.CategoricalDtype(list(set(alts_wide["vehicle_type"])) + [""], ordered = False) + body_type_cat = pd.api.types.CategoricalDtype( + alts_cats_dict["body_type"], ordered=False + ) + fuel_type_cat = pd.api.types.CategoricalDtype( + alts_cats_dict["fuel_type"], ordered=False + ) + vehicle_type_cat = pd.api.types.CategoricalDtype( + list(set(alts_wide["vehicle_type"])) + [""], ordered=False + ) alts_wide["body_type"] = alts_wide["body_type"].astype(body_type_cat) alts_wide["fuel_type"] = alts_wide["fuel_type"].astype(fuel_type_cat) @@ -363,12 +371,15 @@ def iterate_vehicle_type_choice( else: alts_wide = alts_long = None alts = model_spec.columns - vehicle_type_cat = pd.api.types.CategoricalDtype(list(set(alts)) + [""], ordered = False) - + vehicle_type_cat = pd.api.types.CategoricalDtype( + list(set(alts)) + [""], ordered=False + ) # - preparing choosers for iterating vehicles_merged["already_owned_veh"] = "" - vehicles_merged["already_owned_veh"] = vehicles_merged["already_owned_veh"].astype(vehicle_type_cat) + vehicles_merged["already_owned_veh"] = vehicles_merged["already_owned_veh"].astype( + vehicle_type_cat + ) logger.info("Running %s with %d vehicles", trace_label, len(vehicles_merged)) all_choosers = [] all_choices = [] @@ -483,7 +494,9 @@ def iterate_vehicle_type_choice( additional_cols = model_settings.get("COLS_TO_INCLUDE_IN_VEHICLE_TABLE") if additional_cols: additional_cols.append("vehicle_type") - vehicle_type_data["vehicle_type"] = vehicle_type_data["vehicle_type"].astype(vehicle_type_cat) + vehicle_type_data["vehicle_type"] = vehicle_type_data["vehicle_type"].astype( + vehicle_type_cat + ) all_choices = ( all_choices.reset_index() .merge(vehicle_type_data[additional_cols], how="left", on="vehicle_type") diff --git a/activitysim/core/assign.py b/activitysim/core/assign.py index 44a4c84d4..57cb871e0 100644 --- a/activitysim/core/assign.py +++ b/activitysim/core/assign.py @@ -361,7 +361,7 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): if sharrow_enabled: if isinstance(expr_values.dtype, pd.api.types.CategoricalDtype): None - elif( + elif ( np.issubdtype(expr_values.dtype, np.floating) and expr_values.dtype.itemsize < 4 ): diff --git a/activitysim/core/interaction_sample_simulate.py b/activitysim/core/interaction_sample_simulate.py index 83910fe57..6e32719f8 100644 --- a/activitysim/core/interaction_sample_simulate.py +++ b/activitysim/core/interaction_sample_simulate.py @@ -132,12 +132,12 @@ def _interaction_sample_simulate( # assert alternatives.index.name == choosers.index.name # asserting the index names are the same tells us nothing about the underlying data so why? logger.info( - f"{trace_label} start merging choosers and alternatives to create interaction_df" - ) + f"{trace_label} start merging choosers and alternatives to create interaction_df" + ) interaction_df = alternatives.join(choosers, how="left", rsuffix="_chooser") logger.info( - f"{trace_label} end merging choosers and alternatives to create interaction_df" - ) + f"{trace_label} end merging choosers and alternatives to create interaction_df" + ) if log_alt_losers: # logit.interaction_dataset adds ALT_CHOOSER_ID column if log_alt_losers is True diff --git a/activitysim/core/interaction_simulate.py b/activitysim/core/interaction_simulate.py index 0b32f8dec..87fae14f4 100644 --- a/activitysim/core/interaction_simulate.py +++ b/activitysim/core/interaction_simulate.py @@ -83,21 +83,35 @@ def eval_interaction_utilities( logger.info("Writing out interaction df info") buffer = io.StringIO() - df.info(memory_usage = 'deep', buf=buffer, verbose=True, show_counts=True) + df.info(memory_usage="deep", buf=buffer, verbose=True, show_counts=True) s = buffer.getvalue() - with open(os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.info.txt"), "w", encoding="utf-8") as f: + with open( + os.path.join( + state.filesystem.output_dir, trace_label + ".interaction_df.info.txt" + ), + "w", + encoding="utf-8", + ) as f: f.write(s) - df.memory_usage(deep = True).to_csv( - os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.memory_usage_deep.txt") + df.memory_usage(deep=True).to_csv( + os.path.join( + state.filesystem.output_dir, + trace_label + ".interaction_df.memory_usage_deep.txt", + ) ) df.memory_usage().to_csv( - os.path.join(state.filesystem.output_dir, trace_label+".interaction_df.memory_usage.txt") + os.path.join( + state.filesystem.output_dir, + trace_label + ".interaction_df.memory_usage.txt", + ) ) process = psutil.Process(os.getpid()) - logger.info("PID RSS when writing out interaction df info: %s" % process.memory_info().rss) + logger.info( + "PID RSS when writing out interaction df info: %s" % process.memory_info().rss + ) sharrow_enabled = state.settings.sharrow diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 42f63de1f..8c20beb35 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -356,7 +356,7 @@ def assign_in_place(df, df2, downcast_float=False): "assign_in_place changed dtype %s of column %s to %s" % (old_dtype, c, df[c].dtype) ) - + if isinstance(old_dtype, pd.api.types.CategoricalDtype): continue @@ -386,7 +386,9 @@ def assign_in_place(df, df2, downcast_float=False): auto_opt_pd_dtypes(df, downcast_float, inplace=True) -def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) -> Optional[pd.DataFrame]: +def auto_opt_pd_dtypes( + df_: pd.DataFrame, downcast_float=False, inplace=False +) -> Optional[pd.DataFrame]: """ Automatically downcast Number dtypes for minimal possible, will not touch other (datetime, str, object, etc) @@ -399,14 +401,14 @@ def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) - if True, downcast float columns if possible inplace: bool if False, will return a copy of input dataset - + Returns ------- `None` if `inplace=True` or dataframe if `inplace=False` """ df = df_ if inplace else df_.copy() - + for col in df.columns: dtype = df[col].dtype # Skip optimizing floats for precision concerns @@ -421,7 +423,7 @@ def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) - if df[col].max() >= 16777216: continue else: - df[col] = pd.to_numeric(df[col], downcast='float') + df[col] = pd.to_numeric(df[col], downcast="float") # Skip if the column is already categorical if pd.api.types.is_categorical_dtype(dtype): continue @@ -434,7 +436,7 @@ def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) - if df[col].max() >= 16777216: continue else: - df[col] = pd.to_numeric(df[col], downcast='integer') + df[col] = pd.to_numeric(df[col], downcast="integer") continue # there are calcualtions in asim that expect results in negative values # operations on two unsigned types will not produce negative values @@ -442,10 +444,10 @@ def auto_opt_pd_dtypes(df_: pd.DataFrame, downcast_float=False, inplace=False) - # df[col] = pd.to_numeric(df[col], downcast='unsigned') # else: # df[col] = pd.to_numeric(df[col], downcast='integer') - + if not inplace: return df - + def df_from_dict(values, index=None): From 3fd3ed5b71e91ded68eb577a40028375ea766d24 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 6 Oct 2023 14:04:25 -0400 Subject: [PATCH 24/61] update dependencies --- conda-environments/github-actions-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/conda-environments/github-actions-tests.yml b/conda-environments/github-actions-tests.yml index e4d44e8d7..c7cfd39e5 100644 --- a/conda-environments/github-actions-tests.yml +++ b/conda-environments/github-actions-tests.yml @@ -21,6 +21,7 @@ dependencies: - platformdirs = 3.2.* - psutil = 5.9.* - pyarrow = 11.* +- pydantic = 1.10.* - pypyr = 5.8.* - pytables >= 3.5.1,<3.7 # orca's constraint - pytest = 7.2.* From be8c08747e08cd3f0d479e7dd45aaa7ed518a7ca Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Thu, 7 Dec 2023 14:14:24 -0500 Subject: [PATCH 25/61] update unit tests under util\test --- .../abm/models/util/test/test_mandatory_tour_frequency.py | 2 +- .../abm/models/util/test/test_non_mandatory_tour_frequency.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py b/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py index 0fdb5e1e6..bbdcf13bd 100644 --- a/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py +++ b/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py @@ -59,7 +59,7 @@ def test_mtf(): ) pdt.assert_series_equal( - mandatory_tours.tour_type, + mandatory_tours.tour_type.astype(str), pd.Series( ["work", "work", "school", "work", "school", "school", "school"], index=idx, diff --git a/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py b/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py index 6f25a8735..0c28174d4 100644 --- a/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py @@ -41,7 +41,7 @@ def test_nmtf(): ) pdt.assert_series_equal( - nmt.tour_type, + nmt.tour_type.astype(str), pd.Series( ["shopping", "escort", "escort", "othmaint"], index=idx, name="tour_type" ), From 0a34951fe4e275336e9d2118cb9534700a6c86e8 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Thu, 7 Dec 2023 15:19:31 -0500 Subject: [PATCH 26/61] update unit tests under abm.test --- .../test/test_mandatory_tour_frequency.py | 4 ++ .../abm/test/test_pipeline/test_pipeline.py | 8 ++-- activitysim/core/interaction_simulate.py | 40 ++++++++++--------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py b/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py index bbdcf13bd..47152dafe 100644 --- a/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py +++ b/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py @@ -56,6 +56,7 @@ def test_mtf(): pdt.assert_series_equal( mandatory_tours.person_id, pd.Series([10, 20, 20, 30, 30, 40, 40], index=idx, name="person_id"), + check_dtype=False, ) pdt.assert_series_equal( @@ -71,14 +72,17 @@ def test_mtf(): pdt.assert_series_equal( mandatory_tours.tour_num, pd.Series([1, 1, 2, 2, 1, 1, 2], index=idx, name="tour_num"), + check_dtype=False, ) pdt.assert_series_equal( mandatory_tours.destination, pd.Series([10, 20, 2, 30, 3, 4, 4], index=idx, name="destination"), + check_dtype=False, ) pdt.assert_series_equal( mandatory_tours.origin, pd.Series([100, 200, 200, 300, 300, 400, 400], index=idx, name="origin"), + check_dtype=False, ) diff --git a/activitysim/abm/test/test_pipeline/test_pipeline.py b/activitysim/abm/test/test_pipeline/test_pipeline.py index 6afb7cb8f..d5b4253b6 100644 --- a/activitysim/abm/test/test_pipeline/test_pipeline.py +++ b/activitysim/abm/test/test_pipeline/test_pipeline.py @@ -151,7 +151,7 @@ def regress_mini_mtf(state: workflow.State): Name: mandatory_tour_frequency, dtype: object """ pdt.assert_series_equal( - mtf_choice.reindex(per_ids), expected_choice, check_dtype=False + mtf_choice.astype(str).reindex(per_ids), expected_choice, check_dtype=False ) @@ -332,6 +332,8 @@ def regress_tour_modes(tours_df): mode_cols = ["tour_mode", "person_id", "tour_type", "tour_num", "tour_category"] tours_df = tours_df[tours_df.household_id == HH_ID] + # convert tour_category from categorical to string for comparison + tours_df.tour_category = tours_df.tour_category.astype(str) tours_df = tours_df.sort_values(by=["person_id", "tour_category", "tour_num"]) print("mode_df\n%s" % tours_df[mode_cols]) @@ -369,8 +371,8 @@ def regress_tour_modes(tours_df): assert len(tours_df) == len(EXPECT_PERSON_IDS) assert (tours_df.person_id.values == EXPECT_PERSON_IDS).all() - assert (tours_df.tour_type.values == EXPECT_TOUR_TYPES).all() - assert (tours_df.tour_mode.values == EXPECT_MODES).all() + assert (tours_df.tour_type.astype(str).values == EXPECT_TOUR_TYPES).all() + assert (tours_df.tour_mode.astype(str).values == EXPECT_MODES).all() def regress(state: workflow.State): diff --git a/activitysim/core/interaction_simulate.py b/activitysim/core/interaction_simulate.py index 87fae14f4..436e1a168 100644 --- a/activitysim/core/interaction_simulate.py +++ b/activitysim/core/interaction_simulate.py @@ -85,28 +85,30 @@ def eval_interaction_utilities( buffer = io.StringIO() df.info(memory_usage="deep", buf=buffer, verbose=True, show_counts=True) s = buffer.getvalue() - with open( - os.path.join( - state.filesystem.output_dir, trace_label + ".interaction_df.info.txt" - ), - "w", - encoding="utf-8", - ) as f: - f.write(s) - - df.memory_usage(deep=True).to_csv( - os.path.join( - state.filesystem.output_dir, - trace_label + ".interaction_df.memory_usage_deep.txt", + # check if output dir exists + if os.path.exists(state.filesystem.output_dir): + with open( + os.path.join( + state.filesystem.output_dir, trace_label + ".interaction_df.info.txt" + ), + "w", + encoding="utf-8", + ) as f: + f.write(s) + + df.memory_usage(deep=True).to_csv( + os.path.join( + state.filesystem.output_dir, + trace_label + ".interaction_df.memory_usage_deep.txt", + ) ) - ) - df.memory_usage().to_csv( - os.path.join( - state.filesystem.output_dir, - trace_label + ".interaction_df.memory_usage.txt", + df.memory_usage().to_csv( + os.path.join( + state.filesystem.output_dir, + trace_label + ".interaction_df.memory_usage.txt", + ) ) - ) process = psutil.Process(os.getpid()) logger.info( From cbe63103d039ed82c45f76bc3c4f0059cbb0b303 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Thu, 7 Dec 2023 17:32:39 -0500 Subject: [PATCH 27/61] make int downcast an option --- activitysim/core/assign.py | 4 +++- activitysim/core/util.py | 10 +++++++--- .../extensions/stop_frequency_university_parking.py | 5 +++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/activitysim/core/assign.py b/activitysim/core/assign.py index 57cb871e0..40864a3e6 100644 --- a/activitysim/core/assign.py +++ b/activitysim/core/assign.py @@ -424,6 +424,8 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): # we stored result in dict - convert to df variables = util.df_from_dict(variables, index=df.index) - util.auto_opt_pd_dtypes(variables, inplace=True) + util.auto_opt_pd_dtypes( + variables, downcast_int=False, downcast_float=False, inplace=True + ) return variables, trace_results, trace_assigned_locals diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 8c20beb35..ee00b219c 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -316,7 +316,7 @@ def quick_loc_series(loc_list, target_series): return df.right -def assign_in_place(df, df2, downcast_float=False): +def assign_in_place(df, df2, downcast_int=False, downcast_float=False): """ update existing row values in df from df2, adding columns to df if they are not there @@ -383,11 +383,11 @@ def assign_in_place(df, df2, downcast_float=False): if pd.api.types.is_object_dtype(df[c]): df[c] = df[c].astype("category") - auto_opt_pd_dtypes(df, downcast_float, inplace=True) + auto_opt_pd_dtypes(df, downcast_int, downcast_float, inplace=True) def auto_opt_pd_dtypes( - df_: pd.DataFrame, downcast_float=False, inplace=False + df_: pd.DataFrame, downcast_int=False, downcast_float=False, inplace=False ) -> Optional[pd.DataFrame]: """ Automatically downcast Number dtypes for minimal possible, @@ -397,6 +397,8 @@ def auto_opt_pd_dtypes( ---------- df_ : pd.DataFrame assignment left-hand-side (dest) + downcast_int: bool + if True, downcast int columns if possible downcast_float: bool if True, downcast float columns if possible inplace: bool @@ -429,6 +431,8 @@ def auto_opt_pd_dtypes( continue # Handle integer types if pd.api.types.is_integer_dtype(dtype): + if not downcast_int: + continue # there is a bug in pandas to_numeric # when convert int and floats gt 16777216 # https://github.com/pandas-dev/pandas/issues/43693 diff --git a/activitysim/examples/production_semcog/extensions/stop_frequency_university_parking.py b/activitysim/examples/production_semcog/extensions/stop_frequency_university_parking.py index 7264fed35..10573ba98 100644 --- a/activitysim/examples/production_semcog/extensions/stop_frequency_university_parking.py +++ b/activitysim/examples/production_semcog/extensions/stop_frequency_university_parking.py @@ -124,6 +124,11 @@ def stop_frequency_university_parking( park_trips = park_to_campus | park_from_campus + # check if parking_name is in the purpose category + if not parking_name in trip_choosers.purpose.cat.categories: + trip_choosers.purpose = trip_choosers.purpose.cat.add_categories( + [parking_name] + ) trip_choosers.loc[park_trips, "purpose"] = parking_name trip_choosers.loc[park_trips, "destination_logsum"] = pd.NA trip_choosers.loc[park_trips, "destination"] = trip_choosers.loc[ From e4e73d3f9c44ddc500cbba1087a80b0e166435d5 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 11 Dec 2023 11:07:51 -0500 Subject: [PATCH 28/61] test moving str comp out of utility evaluation --- ..._frequency_annotate_tours_preprocessor.csv | 3 ++ .../configs/stop_frequency_eatout.csv | 8 +-- .../configs/stop_frequency_shopping.csv | 2 +- .../configs/stop_frequency_social.csv | 8 +-- ..._frequency_annotate_tours_preprocessor.csv | 3 +- .../configs/stop_frequency_eatout.csv | 2 +- ..._frequency_annotate_tours_preprocessor.csv | 51 +++++++++++++++++++ .../configs/stop_frequency_escort.csv | 4 +- .../configs/stop_frequency_school.csv | 4 +- .../configs/stop_frequency_univ.csv | 4 +- .../configs/stop_frequency_work.csv | 4 +- 11 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv diff --git a/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv index d7b2f1d61..4b77fbb9c 100755 --- a/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv +++ b/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -45,3 +45,6 @@ AccesibilityADestination off-peak transit,_dest_trOpRetail,"reindex(accessibilit AccesibilityAtDestination if transit,pracc,"pracc.where(~tour_mode_is_transit, _dest_trPkRetail.where(_tour_starts_in_peak, _dest_trOpRetail))" AccesibilityAtDestination if non_motorized,pracc,"pracc.where(~tour_mode_is_non_motorized, reindex(accessibility.nmRetail, df.destination))" ,destination_area_type,"reindex(land_use.area_type, df.destination)" +,is_mixed,df.composition=='mixed' +,is_adults_tour,df.composition=='adults' +,is_social,df.primary_purpose=='social' diff --git a/activitysim/examples/placeholder_psrc/configs/stop_frequency_eatout.csv b/activitysim/examples/placeholder_psrc/configs/stop_frequency_eatout.csv index bd0174ceb..75480c187 100644 --- a/activitysim/examples/placeholder_psrc/configs/stop_frequency_eatout.csv +++ b/activitysim/examples/placeholder_psrc/configs/stop_frequency_eatout.csv @@ -27,7 +27,7 @@ util_number_of_visit_tours_tours_undertaken_by_the_person,Number of visit tours util_number_of_shop_tours_undertaken_by_the_houshold,Number of shop tours undertaken by the houshold,num_hh_shop_tours,,,,,,,,,,,,,,,, util_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,Number of persons participating in the tour.Outgoing stops interaction,is_joint * number_of_participants,,,,,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction util_number_of_persons_participating_in_the_tour_return_stops_interaction,Number of persons participating in the tour.Return stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, -util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,composition=='mixed',,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour +util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,is_mixed,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour util_am_peak_departure_between_6am_and_7_am_including_interacted_with_outbound_tours,AM Peak departure between 6AM and 7 AM (including) Interacted with outbound tours,(start>5) & (start<8),,,,,,,,,,,,,,,, util_arrival_later_than_17_00_,Arrival later than 17:00.,(end > 16),,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_ util_evening_arrival_19_00_interacted_with_return_tours,Evening Arrival (>=19:00) Interacted with return tours,(end > 18),,,,,,,,,,,,,,,, @@ -47,6 +47,6 @@ util_alternative_specific_constant_for_the_total_number_of_stops,Alternative spe util_alternative_specific_constant_for_outbound_stops_on_joint_tours,Alternative specific constant for outbound stops on joint tours,is_joint,,,,,-1.783,-1.783,-1.783,-1.783,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in util_alternative_specific_constant_for_return_stops_on_joint_tours,Alternative specific constant for return stops on joint tours,is_joint,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379 util_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours,Alternative specific constant for the total number of stops on joint tours,is_joint,,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,1.497,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,1.497,1.497 -util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,primary_purpose == 'social',,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour -util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,primary_purpose == 'social',,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour -util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,primary_purpose == 'social',,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg +util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,is_social,,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour +util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,is_social,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour +util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,is_social,,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg diff --git a/activitysim/examples/placeholder_psrc/configs/stop_frequency_shopping.csv b/activitysim/examples/placeholder_psrc/configs/stop_frequency_shopping.csv index bf7d02ede..80b8e285a 100644 --- a/activitysim/examples/placeholder_psrc/configs/stop_frequency_shopping.csv +++ b/activitysim/examples/placeholder_psrc/configs/stop_frequency_shopping.csv @@ -27,7 +27,7 @@ util_number_of_visit_tours_tours_undertaken_by_the_person,Number of visit tours util_number_of_shop_tours_undertaken_by_the_houshold,Number of shop tours undertaken by the houshold,num_hh_shop_tours,,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold util_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,Number of persons participating in the tour.Outgoing stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, util_number_of_persons_participating_in_the_tour_return_stops_interaction,Number of persons participating in the tour.Return stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, -util_dummy_for_only_adults_participate_in_the_tour,Dummy for only adults participate in the tour,composition=='adults',,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour +util_dummy_for_only_adults_participate_in_the_tour,Dummy for only adults participate in the tour,is_adults_tour,,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour util_am_peak_departure_between_6am_and_7_am_including_interacted_with_outbound_tours,AM Peak departure between 6AM and 7 AM (including) Interacted with outbound tours,(start>5) & (start<8),,,,,,,,,,,,,,,, util_arrival_later_than_17_00_,Arrival later than 17:00.,(end > 16),,,,,,,,,,,,,,,, util_evening_arrival_19_00_interacted_with_return_tours,Evening Arrival (>=19:00) Interacted with return tours,(end > 18),,,,,,,,,,,,,,,, diff --git a/activitysim/examples/placeholder_psrc/configs/stop_frequency_social.csv b/activitysim/examples/placeholder_psrc/configs/stop_frequency_social.csv index f331514b0..0d64a60c6 100644 --- a/activitysim/examples/placeholder_psrc/configs/stop_frequency_social.csv +++ b/activitysim/examples/placeholder_psrc/configs/stop_frequency_social.csv @@ -27,7 +27,7 @@ util_number_of_visit_tours_tours_undertaken_by_the_person,Number of visit tours util_number_of_shop_tours_undertaken_by_the_houshold,Number of shop tours undertaken by the houshold,num_hh_shop_tours,,,,,,,,,,,,,,,, util_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,Number of persons participating in the tour.Outgoing stops interaction,is_joint * number_of_participants,,,,,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction util_number_of_persons_participating_in_the_tour_return_stops_interaction,Number of persons participating in the tour.Return stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, -util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,composition=='mixed',,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour +util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,is_mixed,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour util_am_peak_departure_between_6am_and_7_am_including_interacted_with_outbound_tours,AM Peak departure between 6AM and 7 AM (including) Interacted with outbound tours,(start>5) & (start<8),,,,,,,,,,,,,,,, util_arrival_later_than_17_00_,Arrival later than 17:00.,(end > 16),,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_ util_evening_arrival_19_00_interacted_with_return_tours,Evening Arrival (>=19:00) Interacted with return tours,(end > 18),,,,,,,,,,,,,,,, @@ -47,6 +47,6 @@ util_alternative_specific_constant_for_the_total_number_of_stops,Alternative spe util_alternative_specific_constant_for_outbound_stops_on_joint_tours,Alternative specific constant for outbound stops on joint tours,is_joint,,,,,-1.783,-1.783,-1.783,-1.783,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in util_alternative_specific_constant_for_return_stops_on_joint_tours,Alternative specific constant for return stops on joint tours,is_joint,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,-3.379 util_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours,Alternative specific constant for the total number of stops on joint tours,is_joint,,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,1.497,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,1.497,1.497 -util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,primary_purpose == 'social',,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour -util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,primary_purpose == 'social',,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour -util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,primary_purpose == 'social',,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg +util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,is_social,,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour +util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,is_social,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour +util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,is_social,,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv index a497131a6..e8772c7f8 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -4,7 +4,7 @@ Description,Target,Expression # e.g. univ segment means there will be a spec called stop_frequency_univ.csv,, # so the 'school' tour_type can treat univ and non-univ school tours differently,, ,primary_purpose,"df.tour_type.where((df.tour_type != 'school') | ~df.is_university, 'univ')" -# assigning category columns a new value can be problematic +# assigning category columns a new value can be problematic,, ,primary_purpose,"primary_purpose.where(df.tour_category!='atwork', 'atwork')" #,, ,distance_in_miles,od_skims['DIST'] @@ -46,3 +46,4 @@ AccesibilityADestination off-peak transit,_dest_trOpRetail,"reindex(accessibilit AccesibilityAtDestination if transit,pracc,"pracc.where(~tour_mode_is_transit, _dest_trPkRetail.where(_tour_starts_in_peak, _dest_trOpRetail))" AccesibilityAtDestination if non_motorized,pracc,"pracc.where(~tour_mode_is_non_motorized, reindex(accessibility.nmRetail, df.destination))" ,destination_area_type,"reindex(land_use.area_type, df.destination)" +,is_mixed,df.composition=='mixed' diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv index f3a1d8505..2d23ce82f 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv @@ -27,7 +27,7 @@ util_number_of_visit_tours_tours_undertaken_by_the_person,Number of visit tours util_number_of_shop_tours_undertaken_by_the_houshold,Number of shop tours undertaken by the houshold,num_hh_shop_tours,,,,,,,,,,,,,,,, util_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,Number of persons participating in the tour.Outgoing stops interaction,is_joint * number_of_participants,,,,,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction util_number_of_persons_participating_in_the_tour_return_stops_interaction,Number of persons participating in the tour.Return stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, -util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,composition=='mixed',,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour +util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,is_mixed,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour util_am_peak_departure_between_6am_and_7_am_including_interacted_with_outbound_tours,AM Peak departure between 6AM and 7 AM (including) Interacted with outbound tours,(start>5) & (start<8),,,,,,,,,,,,,,,, util_arrival_later_than_17_00_,Arrival later than 17:00.,(end > 16),,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_ util_evening_arrival_19_00_interacted_with_return_tours,Evening Arrival (>=19:00) Interacted with return tours,(end > 18),,,,,,,,,,,,,,,, diff --git a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv new file mode 100644 index 000000000..e6b005d85 --- /dev/null +++ b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -0,0 +1,51 @@ +Description,Target,Expression +#,, +# define primary_purpose to use for slicing choosers with a value that identifies the spec to be used ,, +# e.g. univ segment means there will be a spec called stop_frequency_univ.csv,, +# so the 'school' tour_type can treat univ and non-univ school tours differently,, +,primary_purpose,"df.tour_type.where((df.tour_type != 'school') | ~df.is_university, 'univ')" +# assigning category columns a new value can be problematic +,primary_purpose,"primary_purpose.where(df.tour_category!='atwork', 'atwork')" +#,, +,distance_in_miles,od_skims['DIST'] +#,, +,is_joint,df.tour_category=='joint' +,_HH_PERSON_COUNT,"lambda exp, persons: persons.query(exp).groupby('household_id').size()" +,num_full,"reindex_i(_HH_PERSON_COUNT('ptype == %s' % PEMPLOY_FULL, persons), df.household_id)" +,num_part,"reindex_i(_HH_PERSON_COUNT('ptype == %s' % PEMPLOY_PART, persons), df.household_id)" +,num_student,"reindex_i(_HH_PERSON_COUNT('pstudent != %s' % PSTUDENT_NOT, persons), df.household_id)" +Num Kids between 0 and 4 (including) years old,num_age_0_4,"reindex_i(_HH_PERSON_COUNT('age < 5', persons), df.household_id)" +Num kids between 4 and 15 (including) years old,num_age_5_15,"reindex_i(_HH_PERSON_COUNT('(age >= 5) & (age <16)', persons), df.household_id)" +Number of Adults (>= 16 years old),num_adult,"reindex_i(_HH_PERSON_COUNT('age >= 16', persons), df.household_id)" +,more_cars_than_workers,df.auto_ownership >= (num_full + num_part) +,tour_mode_is_transit,df.tour_mode.isin(TRANSIT_MODES) +,tour_mode_is_drive_transit,df.tour_mode.isin(DRIVE_TO_TRANSIT_MODES) +,tour_mode_is_non_motorized,df.tour_mode.isin(NONMOTORIZED_MODES) +#,, +#num_work_tours already defined,, +school but not university,num_school_tours,"reindex_i(df[primary_purpose==SCHOOL_TOUR].groupby('person_id').size(), df.person_id)" +,num_univ_tours,(df.is_university) * num_school_tours +#num_escort_tours already defined,, +# indiv tour counts should not include joint tours by point_person,, +,num_shop_tours,"reindex_i(df[~is_joint & (df.tour_type==SHOP_TOUR)].groupby('person_id').size(), df.person_id)" +,num_maint_tours,"reindex_i(df[~is_joint & (df.tour_type==MAINT_TOUR)].groupby('person_id').size(), df.person_id)" +,num_eatout_tours,"reindex_i(df[~is_joint & (df.tour_type==EATOUT_TOUR)].groupby('person_id').size(), df.person_id)" +,num_social_tours,"reindex_i(df[~is_joint & (df.tour_type==SOCIAL_TOUR)].groupby('person_id').size(), df.person_id)" +#,, +Number of subtours in the tour,num_atwork_subtours,"df.atwork_subtour_frequency.map(num_atwork_subtours_map, na_action='ignore').fillna(0).astype(np.int8)" +#,, +Number of hh shop tours including joint,num_hh_shop_tours,"reindex_i(df[df.tour_type==SHOP_TOUR].groupby('household_id').size(), df.person_id)" +Number of hh maint tours including joint,num_hh_maint_tours,"reindex_i(df[df.tour_type==MAINT_TOUR].groupby('household_id').size(), df.person_id)" +tourStartsInPeakPeriod,_tour_starts_in_peak,(network_los.skim_time_period_label(df.start) == 'AM') | (network_los.skim_time_period_label(df.start) == 'PM') +AccesibilityAtOrigin fallback,hhacc,0 +AccesibilityAtOrigin if transit,hhacc,"hhacc.where(~tour_mode_is_transit, df.trPkRetail.where(_tour_starts_in_peak, df.trOpRetail))" +AccesibilityAtOrigin if non_motorized,hhacc,"hhacc.where(~tour_mode_is_non_motorized, df.nmRetail)" +AccesibilityADestination fallback,pracc,0 +AccesibilityADestination peak transit,_dest_trPkRetail,"reindex(accessibility.trPkRetail, df.destination)" +AccesibilityADestination off-peak transit,_dest_trOpRetail,"reindex(accessibility.trOpRetail, df.destination)" +AccesibilityAtDestination if transit,pracc,"pracc.where(~tour_mode_is_transit, _dest_trPkRetail.where(_tour_starts_in_peak, _dest_trOpRetail))" +AccesibilityAtDestination if non_motorized,pracc,"pracc.where(~tour_mode_is_non_motorized, reindex(accessibility.nmRetail, df.destination))" +,destination_area_type,"reindex(land_use.area_type, df.destination)" +,is_mixed,df.composition=='mixed' +,is_outbound_school_escort,"(df.school_esc_outbound.isin(['ride_share', 'pure_escort']))" +,is_inbound_school_escort,"(df.school_esc_inbound.isin(['ride_share', 'pure_escort']))" \ No newline at end of file diff --git a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_escort.csv b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_escort.csv index e522097e5..1f67721f4 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_escort.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_escort.csv @@ -45,5 +45,5 @@ util_alternative_specific_constant_for_outbound_stops_on_joint_tours,Alternative util_alternative_specific_constant_for_return_stops_on_joint_tours,Alternative specific constant for return stops on joint tours,is_joint,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in util_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours,Alternative specific constant for the total number of stops on joint tours,is_joint,,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in # added for school escorting,,,,,,,,,,,,,,,,,, -util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,"(school_esc_outbound.isin(['ride_share', 'pure_escort']))",,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail -util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,"(school_esc_inbound.isin(['ride_share', 'pure_escort']))",,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail +util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,is_outbound_school_escort,,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail +util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,is_inbound_school_escort,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail diff --git a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_school.csv b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_school.csv index 9aa97f549..28b5c594c 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_school.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_school.csv @@ -42,5 +42,5 @@ util_alternative_specific_constant_for_outbound_stops,Alternative specific const util_alternative_specific_constant_for_return_stops,Alternative specific constant for return stops,1,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in util_alternative_specific_constant_for_the_total_number_of_stops,Alternative specific constant for the total number of stops,1,,,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in # No stops for half tour that includes school escorting,,,,,,,,,,,,,,,,,, -util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,"(school_esc_outbound.isin(['ride_share', 'pure_escort']))",,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail -util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,"(school_esc_inbound.isin(['ride_share', 'pure_escort']))",,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail +util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,is_outbound_school_escort,,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail +util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,is_inbound_school_escort,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail diff --git a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_univ.csv b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_univ.csv index 8b4b53031..001ff9b37 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_univ.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_univ.csv @@ -42,5 +42,5 @@ util_alternative_specific_constant_for_outbound_stops,Alternative specific const util_alternative_specific_constant_for_return_stops,Alternative specific constant for return stops,1,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in,,coef_alternative_specific_constant_for_return_stops_0out_1in,coef_alternative_specific_constant_for_return_stops_0out_2in,coef_alternative_specific_constant_for_return_stops_0out_3in util_alternative_specific_constant_for_the_total_number_of_stops,Alternative specific constant for the total number of stops,1,,,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in # No stops for half tour that includes school escorting,,,,,,,,,,,,,,,,,, -util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,"(school_esc_outbound.isin(['ride_share', 'pure_escort']))",,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail -util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,"(school_esc_inbound.isin(['ride_share', 'pure_escort']))",,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail +util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,is_outbound_school_escort,,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail +util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,is_inbound_school_escort,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail diff --git a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_work.csv b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_work.csv index 764064c83..3357951c5 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_work.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_work.csv @@ -43,5 +43,5 @@ util_alternative_specific_constant_for_return_stops,Alternative specific constan util_alternative_specific_constant_for_the_total_number_of_stops,Alternative specific constant for the total number of stops,1,,,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_2out_3in util_number_of_subtours_in_the_tour,Number of subtours in the tour,num_atwork_subtours,,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour,coef_number_of_subtours_in_the_tour # No stops for half tour that includes school escorting,,,,,,,,,,,,,,,,,, -util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,"(school_esc_outbound.isin(['ride_share', 'pure_escort']))",,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail -util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,"(school_esc_inbound.isin(['ride_share', 'pure_escort']))",,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail +util_no_stops_to_school_escorting,Do not allow stops for school escort half-tour -- outbound,is_outbound_school_escort,,,,,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail,coef_unavail +util_no_stops_from_school_escorting,Do not allow stops for school escort half-tour -- inbound,is_inbound_school_escort,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail,,coef_unavail,coef_unavail,coef_unavail From 51f9a24da3c20b5b5f7f26e1a2b91ebbdf413dcb Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Mon, 11 Dec 2023 15:11:13 -0500 Subject: [PATCH 29/61] fix mtc and sandag ci tests --- .../stop_frequency_annotate_tours_preprocessor.csv | 2 +- .../stop_frequency_annotate_tours_preprocessor.csv | 2 ++ .../prototype_mtc/configs/stop_frequency_eatout.csv | 6 +++--- .../prototype_mtc/configs/stop_frequency_shopping.csv | 2 +- .../prototype_mtc/configs/stop_frequency_social.csv | 8 ++++---- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv index 4b77fbb9c..faa80422a 100755 --- a/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv +++ b/activitysim/examples/placeholder_psrc/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -47,4 +47,4 @@ AccesibilityAtDestination if non_motorized,pracc,"pracc.where(~tour_mode_is_non_ ,destination_area_type,"reindex(land_use.area_type, df.destination)" ,is_mixed,df.composition=='mixed' ,is_adults_tour,df.composition=='adults' -,is_social,df.primary_purpose=='social' +,is_social,primary_purpose=='social' diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv index e8772c7f8..675fe4c2d 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -47,3 +47,5 @@ AccesibilityAtDestination if transit,pracc,"pracc.where(~tour_mode_is_transit, _ AccesibilityAtDestination if non_motorized,pracc,"pracc.where(~tour_mode_is_non_motorized, reindex(accessibility.nmRetail, df.destination))" ,destination_area_type,"reindex(land_use.area_type, df.destination)" ,is_mixed,df.composition=='mixed' +,is_adults_tour,df.composition=='adults' +,is_social,primary_purpose=='social' diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv index 2d23ce82f..5765af299 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_eatout.csv @@ -47,6 +47,6 @@ util_alternative_specific_constant_for_the_total_number_of_stops,Alternative spe util_alternative_specific_constant_for_outbound_stops_on_joint_tours,Alternative specific constant for outbound stops on joint tours,is_joint,,,,,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in util_alternative_specific_constant_for_return_stops_on_joint_tours,Alternative specific constant for return stops on joint tours,is_joint,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in util_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours,Alternative specific constant for the total number of stops on joint tours,is_joint,,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in -util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,primary_purpose == 'social',,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour -util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,primary_purpose == 'social',,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour -util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,primary_purpose == 'social',,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg +util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,is_social,,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour +util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,is_social,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour +util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,is_social,,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_shopping.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_shopping.csv index 195c6504b..5150da4be 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_shopping.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_shopping.csv @@ -27,7 +27,7 @@ util_number_of_visit_tours_tours_undertaken_by_the_person,Number of visit tours util_number_of_shop_tours_undertaken_by_the_houshold,Number of shop tours undertaken by the houshold,num_hh_shop_tours,,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold,coef_number_of_shop_tours_undertaken_by_the_houshold util_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,Number of persons participating in the tour.Outgoing stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, util_number_of_persons_participating_in_the_tour_return_stops_interaction,Number of persons participating in the tour.Return stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, -util_dummy_for_only_adults_participate_in_the_tour,Dummy for only adults participate in the tour,composition=='adults',,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour +util_dummy_for_only_adults_participate_in_the_tour,Dummy for only adults participate in the tour,is_adults_tour,,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour,coef_dummy_for_only_adults_participate_in_the_tour util_am_peak_departure_between_6am_and_7_am_including_interacted_with_outbound_tours,AM Peak departure between 6AM and 7 AM (including) Interacted with outbound tours,(start>5) & (start<8),,,,,,,,,,,,,,,, util_arrival_later_than_17_00_,Arrival later than 17:00.,(end > 16),,,,,,,,,,,,,,,, util_evening_arrival_19_00_interacted_with_return_tours,Evening Arrival (>=19:00) Interacted with return tours,(end > 18),,,,,,,,,,,,,,,, diff --git a/activitysim/examples/prototype_mtc/configs/stop_frequency_social.csv b/activitysim/examples/prototype_mtc/configs/stop_frequency_social.csv index 3a0e2eda9..84e6f6ef7 100644 --- a/activitysim/examples/prototype_mtc/configs/stop_frequency_social.csv +++ b/activitysim/examples/prototype_mtc/configs/stop_frequency_social.csv @@ -27,7 +27,7 @@ util_number_of_visit_tours_tours_undertaken_by_the_person,Number of visit tours util_number_of_shop_tours_undertaken_by_the_houshold,Number of shop tours undertaken by the houshold,num_hh_shop_tours,,,,,,,,,,,,,,,, util_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,Number of persons participating in the tour.Outgoing stops interaction,is_joint * number_of_participants,,,,,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction,coef_number_of_persons_participating_in_the_tour_outgoing_stops_interaction util_number_of_persons_participating_in_the_tour_return_stops_interaction,Number of persons participating in the tour.Return stops interaction,is_joint * number_of_participants,,,,,,,,,,,,,,,, -util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,composition=='mixed',,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour +util_at_least_one_kid_and_one_adult_participate_in_the_tour,At least one kid and one adult participate in the tour,is_mixed,,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour,coef_at_least_one_kid_and_one_adult_participate_in_the_tour util_am_peak_departure_between_6am_and_7_am_including_interacted_with_outbound_tours,AM Peak departure between 6AM and 7 AM (including) Interacted with outbound tours,(start>5) & (start<8),,,,,,,,,,,,,,,, util_arrival_later_than_17_00_,Arrival later than 17:00.,(end > 16),,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_,coef_arrival_later_than_17_00_ util_evening_arrival_19_00_interacted_with_return_tours,Evening Arrival (>=19:00) Interacted with return tours,(end > 18),,,,,,,,,,,,,,,, @@ -47,6 +47,6 @@ util_alternative_specific_constant_for_the_total_number_of_stops,Alternative spe util_alternative_specific_constant_for_outbound_stops_on_joint_tours,Alternative specific constant for outbound stops on joint tours,is_joint,,,,,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_1out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_2out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in,coef_alternative_specific_constant_for_outbound_stops_on_joint_tours_3out_0in util_alternative_specific_constant_for_return_stops_on_joint_tours,Alternative specific constant for return stops on joint tours,is_joint,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in,,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_1in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_return_stops_on_joint_tours_0out_3in util_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours,Alternative specific constant for the total number of stops on joint tours,is_joint,,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_0out_2in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_1out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in,coef_alternative_specific_constant_for_the_total_number_of_stops_on_joint_tours_2out_3in -util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,primary_purpose == 'social',,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour -util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,primary_purpose == 'social',,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour -util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,primary_purpose == 'social',,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg +util_dummy_for_an_outbound_visiting_tour,Dummy for an outbound visiting tour,is_social,,,,,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour,coef_dummy_for_an_outbound_visiting_tour +util_dummy_for_a_return_visiting_tour,Dummy for a return visiting tour,is_social,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour,coef_dummy_for_a_return_visiting_tour +util_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,Dummy for a visiting tour with both outbound and return leg,is_social,,,,,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg,coef_dummy_for_a_visiting_tour_with_both_outbound_and_return_leg From e1e5d41a8a11fe2ae03572a8110a60a30d575277 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 12 Dec 2023 12:09:53 -0500 Subject: [PATCH 30/61] get categories from alternatives --- .../abm/models/atwork_subtour_frequency.py | 10 ++++- .../abm/models/joint_tour_composition.py | 2 +- .../abm/models/joint_tour_frequency.py | 30 ++++---------- .../abm/models/mandatory_tour_frequency.py | 8 +++- .../models/non_mandatory_tour_frequency.py | 6 +++ .../abm/models/telecommute_frequency.py | 2 +- activitysim/abm/models/tour_mode_choice.py | 4 +- activitysim/abm/models/trip_purpose.py | 13 ++++++ activitysim/abm/models/util/tour_frequency.py | 40 ------------------- activitysim/core/workflow/state.py | 10 +++++ ..._frequency_annotate_tours_preprocessor.csv | 2 + 11 files changed, 57 insertions(+), 70 deletions(-) diff --git a/activitysim/abm/models/atwork_subtour_frequency.py b/activitysim/abm/models/atwork_subtour_frequency.py index 579223a4a..52dc62c04 100644 --- a/activitysim/abm/models/atwork_subtour_frequency.py +++ b/activitysim/abm/models/atwork_subtour_frequency.py @@ -23,7 +23,7 @@ def add_null_results(state, trace_label, tours): logger.info("Skipping %s: add_null_results", trace_label) cat_type = pd.api.types.CategoricalDtype( - ["", "no_subtours", "eat", "business1", "maint", "business2", "eat_business"], + [""], ordered=False, ) choices = choices.astype(cat_type) @@ -109,7 +109,7 @@ def atwork_subtour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - ["", "no_subtours", "eat", "business1", "maint", "business2", "eat_business"], + alternatives.index.tolist()+[""], ordered=False, ) choices = choices.astype(cat_type) @@ -133,6 +133,12 @@ def atwork_subtour_frequency( subtours = process_atwork_subtours(state, work_tours, alternatives) + # convert purpose to pandas categoricals + purpose_type = pd.api.types.CategoricalDtype( + alternatives.columns.tolist()+["atwork"], ordered=False + ) + subtours["tour_type"] = subtours["tour_type"].astype(purpose_type) + tours = state.extend_table("tours", subtours) state.tracing.register_traceable_table("tours", subtours) diff --git a/activitysim/abm/models/joint_tour_composition.py b/activitysim/abm/models/joint_tour_composition.py index 4c576fad0..db7ce88eb 100644 --- a/activitysim/abm/models/joint_tour_composition.py +++ b/activitysim/abm/models/joint_tour_composition.py @@ -111,7 +111,7 @@ def joint_tour_composition( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - ["", "adults", "children", "mixed"], ordered=False + model_spec.columns.tolist()+[""], ordered=False ) choices = choices.astype(cat_type) diff --git a/activitysim/abm/models/joint_tour_frequency.py b/activitysim/abm/models/joint_tour_frequency.py index 6e25d481c..dc02bd4a2 100644 --- a/activitysim/abm/models/joint_tour_frequency.py +++ b/activitysim/abm/models/joint_tour_frequency.py @@ -99,29 +99,7 @@ def joint_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - [ - "0_tours", - "1_Shop", - "1_Main", - "1_Eat", - "1_Visit", - "1_Disc", - "2_SS", - "2_SM", - "2_SE", - "2_SV", - "2_SD", - "2_MM", - "2_ME", - "2_MV", - "2_MD", - "2_EE", - "2_EV", - "2_ED", - "2_VV", - "2_VD", - "2_DD", - ], + model_spec.columns.tolist(), ordered=False, ) choices = choices.astype(cat_type) @@ -147,6 +125,12 @@ def joint_tour_frequency( joint_tours = process_joint_tours(state, choices, alternatives, temp_point_persons) + # convert purpose to pandas categoricals + purpose_type = pd.api.types.CategoricalDtype( + alternatives.columns.tolist(), ordered=False + ) + joint_tours["tour_type"] = joint_tours["tour_type"].astype(purpose_type) + tours = state.extend_table("tours", joint_tours) state.tracing.register_traceable_table("tours", joint_tours) diff --git a/activitysim/abm/models/mandatory_tour_frequency.py b/activitysim/abm/models/mandatory_tour_frequency.py index e7d686082..5e87d6729 100644 --- a/activitysim/abm/models/mandatory_tour_frequency.py +++ b/activitysim/abm/models/mandatory_tour_frequency.py @@ -115,7 +115,7 @@ def mandatory_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - ["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False + model_spec.columns.tolist()+[""], ordered=False ) choices = choices.astype(cat_type) @@ -142,6 +142,12 @@ def mandatory_tour_frequency( state, persons=choosers, mandatory_tour_frequency_alts=alternatives ) + # convert purpose to pandas categoricals + purpose_type = pd.api.types.CategoricalDtype( + alternatives.columns.tolist()+["univ","home","escort"], ordered=False + ) + mandatory_tours["tour_type"] = mandatory_tours["tour_type"].astype(purpose_type) + tours = state.extend_table("tours", mandatory_tours) state.tracing.register_traceable_table("tours", mandatory_tours) state.get_rn_generator().add_channel("tours", mandatory_tours) diff --git a/activitysim/abm/models/non_mandatory_tour_frequency.py b/activitysim/abm/models/non_mandatory_tour_frequency.py index 86a794102..554fe7ee0 100644 --- a/activitysim/abm/models/non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/non_mandatory_tour_frequency.py @@ -354,6 +354,12 @@ def non_mandatory_tour_frequency( ) assert len(non_mandatory_tours) == extended_tour_counts.sum().sum() + # convert purpose to pandas categoricals + purpose_type = pd.api.types.CategoricalDtype( + alternatives.columns.tolist(), ordered=False + ) + non_mandatory_tours["tour_type"] = non_mandatory_tours["tour_type"].astype(purpose_type) + if estimator: # make sure they created the right tours survey_tours = estimation.manager.get_survey_table("tours").sort_index() diff --git a/activitysim/abm/models/telecommute_frequency.py b/activitysim/abm/models/telecommute_frequency.py index 0cfbbfa8c..7ce13377c 100755 --- a/activitysim/abm/models/telecommute_frequency.py +++ b/activitysim/abm/models/telecommute_frequency.py @@ -87,7 +87,7 @@ def telecommute_frequency( choices = pd.Series(model_spec.columns[choices.values], index=choices.index) telecommute_frequency_cat = pd.api.types.CategoricalDtype( - ["", "No_Telecommute", "1_day_week", "2_3_days_week", "4_days_week"], + model_spec.columns.tolist()+[""], ordered=False, ) choices = choices.astype(telecommute_frequency_cat) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index aee99993a..5935f6cac 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -68,10 +68,10 @@ def create_logsum_trips( pandas.DataFrame Table of trips: 2 per tour, with O/D and purpose inherited from tour """ + stop_frequency_alts = state.get_injectable("stop_frequency_alts") stop_freq_cat_type = pd.api.types.CategoricalDtype( - ["", "work1", "work2", "school1", "school2", "work_and_school"], ordered=False + stop_frequency_alts.index.tolist()+[""], ordered=False ) - stop_frequency_alts = state.get_injectable("stop_frequency_alts") stop_freq = "0out_0in" # no intermediate stops tours["stop_frequency"] = stop_freq tours["stop_frequency"] = tours["stop_frequency"].astype(stop_freq_cat_type) diff --git a/activitysim/abm/models/trip_purpose.py b/activitysim/abm/models/trip_purpose.py index 6b287daa3..6fed5d42f 100644 --- a/activitysim/abm/models/trip_purpose.py +++ b/activitysim/abm/models/trip_purpose.py @@ -163,6 +163,12 @@ def choose_intermediate_trip_purpose( state.tracing.trace_df(rands, "%s.rands" % trace_label, columns=[None, "rand"]) choices = choices.map(pd.Series(purpose_cols)) + # expand the purpose categorical + for p in purpose_cols: + if not p in trips.primary_purpose.cat.categories: + trips.primary_purpose = trips.primary_purpose.cat.add_categories( + [p] + ) choices = choices.astype(trips["primary_purpose"].dtype) return choices @@ -208,6 +214,13 @@ def run_trip_purpose(state: workflow.State, trips_df, estimator, trace_label): result_list = [] + # add home to purpose categorical + # check if parking_name is in the purpose category + if not "home" in trips_df.primary_purpose.cat.categories: + trips_df.primary_purpose = trips_df.primary_purpose.cat.add_categories( + ["home"] + ) + # - last trip of outbound tour gets primary_purpose last_trip = trips_df.trip_num == trips_df.trip_count purpose = trips_df.primary_purpose[last_trip & trips_df.outbound] diff --git a/activitysim/abm/models/util/tour_frequency.py b/activitysim/abm/models/util/tour_frequency.py index 60febd7d8..c82da52d5 100644 --- a/activitysim/abm/models/util/tour_frequency.py +++ b/activitysim/abm/models/util/tour_frequency.py @@ -57,26 +57,6 @@ def create_tours(tour_counts, tour_category, parent_col="person_id"): # reformat with the columns given below tours = tour_counts.stack().reset_index() tours.columns = [parent_col, "tour_type", "tour_type_count"] - cat_tour_type = pd.api.types.CategoricalDtype( - [ - "work", - "school", - "univ", - "escort", - "eatout", - "shopping", - "social", - "othmaint", - "othdiscr", - "eat", - "business", - "maint", - "atwork", - "home", - ], - ordered=False, - ) - tours["tour_type"] = tours["tour_type"].astype(cat_tour_type) """ tour_type tour_type_count @@ -724,26 +704,6 @@ def create_joint_tours( tours_purp.columns = [parent_col, "tour_id_temp", "tour_type"] tours_purp["tour_id_temp"] = range(1, 1 + len(tours_purp)) tours_purp["tour_type"] = tours_purp["tour_type"].map(tour_type_dict) - cat_tour_type = pd.api.types.CategoricalDtype( - [ - "work", - "school", - "univ", - "escort", - "eatout", - "shopping", - "social", - "othmaint", - "othdiscr", - "eat", - "business", - "maint", - "atwork", - "home", - ], - ordered=False, - ) - tours_purp["tour_type"] = tours_purp["tour_type"].astype(cat_tour_type) """ tour_id_temp tour_type diff --git a/activitysim/core/workflow/state.py b/activitysim/core/workflow/state.py index 22bbbf045..72c8253b0 100644 --- a/activitysim/core/workflow/state.py +++ b/activitysim/core/workflow/state.py @@ -1080,6 +1080,16 @@ def extend_table(self, table_name, df, axis=0): new_df_columns = [c for c in df.columns if c not in table_df.columns] df = df[new_df_columns] missing_df_str_columns = [] + + # union categoricals + for c in table_df.columns.intersection(df.columns): + if isinstance(table_df[c].dtype,pd.api.types.CategoricalDtype): + if isinstance(df[c].dtype,pd.api.types.CategoricalDtype): + from pandas.api.types import union_categoricals + + uc = union_categoricals([table_df[c], df[c]]) + table_df[c]=pd.Categorical(table_df[c],categories=uc.categories) + df[c]=pd.Categorical(df[c],categories=uc.categories) # preserve existing column order df = pd.concat([table_df, df], sort=False, axis=axis) diff --git a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv index e6b005d85..bc9a798e3 100644 --- a/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv +++ b/activitysim/examples/prototype_mtc_extended/configs/stop_frequency_annotate_tours_preprocessor.csv @@ -47,5 +47,7 @@ AccesibilityAtDestination if transit,pracc,"pracc.where(~tour_mode_is_transit, _ AccesibilityAtDestination if non_motorized,pracc,"pracc.where(~tour_mode_is_non_motorized, reindex(accessibility.nmRetail, df.destination))" ,destination_area_type,"reindex(land_use.area_type, df.destination)" ,is_mixed,df.composition=='mixed' +,is_adults_tour,df.composition=='adults' +,is_social,primary_purpose=='social' ,is_outbound_school_escort,"(df.school_esc_outbound.isin(['ride_share', 'pure_escort']))" ,is_inbound_school_escort,"(df.school_esc_inbound.isin(['ride_share', 'pure_escort']))" \ No newline at end of file From ed2ae9621dd2355ea242f5afc630618404dbba1b Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 12 Dec 2023 12:13:35 -0500 Subject: [PATCH 31/61] black formatting --- activitysim/abm/models/atwork_subtour_frequency.py | 4 ++-- activitysim/abm/models/joint_tour_composition.py | 2 +- activitysim/abm/models/mandatory_tour_frequency.py | 4 ++-- .../abm/models/non_mandatory_tour_frequency.py | 4 +++- activitysim/abm/models/telecommute_frequency.py | 2 +- activitysim/abm/models/tour_mode_choice.py | 2 +- activitysim/abm/models/trip_purpose.py | 8 ++------ activitysim/core/workflow/state.py | 12 +++++++----- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/activitysim/abm/models/atwork_subtour_frequency.py b/activitysim/abm/models/atwork_subtour_frequency.py index 52dc62c04..053821918 100644 --- a/activitysim/abm/models/atwork_subtour_frequency.py +++ b/activitysim/abm/models/atwork_subtour_frequency.py @@ -109,7 +109,7 @@ def atwork_subtour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - alternatives.index.tolist()+[""], + alternatives.index.tolist() + [""], ordered=False, ) choices = choices.astype(cat_type) @@ -135,7 +135,7 @@ def atwork_subtour_frequency( # convert purpose to pandas categoricals purpose_type = pd.api.types.CategoricalDtype( - alternatives.columns.tolist()+["atwork"], ordered=False + alternatives.columns.tolist() + ["atwork"], ordered=False ) subtours["tour_type"] = subtours["tour_type"].astype(purpose_type) diff --git a/activitysim/abm/models/joint_tour_composition.py b/activitysim/abm/models/joint_tour_composition.py index db7ce88eb..f1469ceb2 100644 --- a/activitysim/abm/models/joint_tour_composition.py +++ b/activitysim/abm/models/joint_tour_composition.py @@ -111,7 +111,7 @@ def joint_tour_composition( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - model_spec.columns.tolist()+[""], ordered=False + model_spec.columns.tolist() + [""], ordered=False ) choices = choices.astype(cat_type) diff --git a/activitysim/abm/models/mandatory_tour_frequency.py b/activitysim/abm/models/mandatory_tour_frequency.py index 5e87d6729..74a377adc 100644 --- a/activitysim/abm/models/mandatory_tour_frequency.py +++ b/activitysim/abm/models/mandatory_tour_frequency.py @@ -115,7 +115,7 @@ def mandatory_tour_frequency( # convert indexes to alternative names choices = pd.Series(model_spec.columns[choices.values], index=choices.index) cat_type = pd.api.types.CategoricalDtype( - model_spec.columns.tolist()+[""], ordered=False + model_spec.columns.tolist() + [""], ordered=False ) choices = choices.astype(cat_type) @@ -144,7 +144,7 @@ def mandatory_tour_frequency( # convert purpose to pandas categoricals purpose_type = pd.api.types.CategoricalDtype( - alternatives.columns.tolist()+["univ","home","escort"], ordered=False + alternatives.columns.tolist() + ["univ", "home", "escort"], ordered=False ) mandatory_tours["tour_type"] = mandatory_tours["tour_type"].astype(purpose_type) diff --git a/activitysim/abm/models/non_mandatory_tour_frequency.py b/activitysim/abm/models/non_mandatory_tour_frequency.py index 554fe7ee0..022153d33 100644 --- a/activitysim/abm/models/non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/non_mandatory_tour_frequency.py @@ -358,7 +358,9 @@ def non_mandatory_tour_frequency( purpose_type = pd.api.types.CategoricalDtype( alternatives.columns.tolist(), ordered=False ) - non_mandatory_tours["tour_type"] = non_mandatory_tours["tour_type"].astype(purpose_type) + non_mandatory_tours["tour_type"] = non_mandatory_tours["tour_type"].astype( + purpose_type + ) if estimator: # make sure they created the right tours diff --git a/activitysim/abm/models/telecommute_frequency.py b/activitysim/abm/models/telecommute_frequency.py index 7ce13377c..26ca671f2 100755 --- a/activitysim/abm/models/telecommute_frequency.py +++ b/activitysim/abm/models/telecommute_frequency.py @@ -87,7 +87,7 @@ def telecommute_frequency( choices = pd.Series(model_spec.columns[choices.values], index=choices.index) telecommute_frequency_cat = pd.api.types.CategoricalDtype( - model_spec.columns.tolist()+[""], + model_spec.columns.tolist() + [""], ordered=False, ) choices = choices.astype(telecommute_frequency_cat) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index 5935f6cac..eaa2f1e5d 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -70,7 +70,7 @@ def create_logsum_trips( """ stop_frequency_alts = state.get_injectable("stop_frequency_alts") stop_freq_cat_type = pd.api.types.CategoricalDtype( - stop_frequency_alts.index.tolist()+[""], ordered=False + stop_frequency_alts.index.tolist() + [""], ordered=False ) stop_freq = "0out_0in" # no intermediate stops tours["stop_frequency"] = stop_freq diff --git a/activitysim/abm/models/trip_purpose.py b/activitysim/abm/models/trip_purpose.py index 6fed5d42f..afd5ec995 100644 --- a/activitysim/abm/models/trip_purpose.py +++ b/activitysim/abm/models/trip_purpose.py @@ -166,9 +166,7 @@ def choose_intermediate_trip_purpose( # expand the purpose categorical for p in purpose_cols: if not p in trips.primary_purpose.cat.categories: - trips.primary_purpose = trips.primary_purpose.cat.add_categories( - [p] - ) + trips.primary_purpose = trips.primary_purpose.cat.add_categories([p]) choices = choices.astype(trips["primary_purpose"].dtype) return choices @@ -217,9 +215,7 @@ def run_trip_purpose(state: workflow.State, trips_df, estimator, trace_label): # add home to purpose categorical # check if parking_name is in the purpose category if not "home" in trips_df.primary_purpose.cat.categories: - trips_df.primary_purpose = trips_df.primary_purpose.cat.add_categories( - ["home"] - ) + trips_df.primary_purpose = trips_df.primary_purpose.cat.add_categories(["home"]) # - last trip of outbound tour gets primary_purpose last_trip = trips_df.trip_num == trips_df.trip_count diff --git a/activitysim/core/workflow/state.py b/activitysim/core/workflow/state.py index 72c8253b0..479b032c7 100644 --- a/activitysim/core/workflow/state.py +++ b/activitysim/core/workflow/state.py @@ -1080,16 +1080,18 @@ def extend_table(self, table_name, df, axis=0): new_df_columns = [c for c in df.columns if c not in table_df.columns] df = df[new_df_columns] missing_df_str_columns = [] - + # union categoricals for c in table_df.columns.intersection(df.columns): - if isinstance(table_df[c].dtype,pd.api.types.CategoricalDtype): - if isinstance(df[c].dtype,pd.api.types.CategoricalDtype): + if isinstance(table_df[c].dtype, pd.api.types.CategoricalDtype): + if isinstance(df[c].dtype, pd.api.types.CategoricalDtype): from pandas.api.types import union_categoricals uc = union_categoricals([table_df[c], df[c]]) - table_df[c]=pd.Categorical(table_df[c],categories=uc.categories) - df[c]=pd.Categorical(df[c],categories=uc.categories) + table_df[c] = pd.Categorical( + table_df[c], categories=uc.categories + ) + df[c] = pd.Categorical(df[c], categories=uc.categories) # preserve existing column order df = pd.concat([table_df, df], sort=False, axis=axis) From e02b0b4a1406256e690db472685cf6f356d996dd Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 15 Dec 2023 20:27:54 -0500 Subject: [PATCH 32/61] add `downcast_int` and `downcast_float` into settings --- .../abm/models/atwork_subtour_destination.py | 14 +++++++++++-- .../abm/models/atwork_subtour_mode_choice.py | 4 +++- .../abm/models/atwork_subtour_scheduling.py | 4 +++- .../abm/models/joint_tour_destination.py | 14 +++++++++++-- .../abm/models/joint_tour_participation.py | 7 ++++++- .../abm/models/joint_tour_scheduling.py | 4 +++- .../abm/models/mandatory_scheduling.py | 4 +++- .../abm/models/non_mandatory_destination.py | 14 +++++++++++-- .../abm/models/non_mandatory_scheduling.py | 4 +++- .../abm/models/parking_location_choice.py | 14 +++++++++++-- activitysim/abm/models/stop_frequency.py | 21 ++++++++++++++++--- activitysim/abm/models/tour_mode_choice.py | 11 ++++++++-- activitysim/abm/models/trip_destination.py | 19 ++++++++++++++--- activitysim/abm/models/trip_mode_choice.py | 11 ++++++++-- .../models/trip_purpose_and_destination.py | 7 ++++++- activitysim/abm/models/util/trip.py | 7 ++++++- activitysim/core/assign.py | 5 ++++- activitysim/core/configuration/top.py | 18 ++++++++++++++++ activitysim/core/expressions.py | 8 +++++-- 19 files changed, 161 insertions(+), 29 deletions(-) diff --git a/activitysim/abm/models/atwork_subtour_destination.py b/activitysim/abm/models/atwork_subtour_destination.py index e545e2b34..593962d1e 100644 --- a/activitysim/abm/models/atwork_subtour_destination.py +++ b/activitysim/abm/models/atwork_subtour_destination.py @@ -83,11 +83,21 @@ def atwork_subtour_destination( estimator.end_estimation() subtours[destination_column_name] = choices_df["choice"] - assign_in_place(tours, subtours[[destination_column_name]]) + assign_in_place( + tours, + subtours[[destination_column_name]], + state.settings.downcast_int, + state.settings.downcast_int, + ) if want_logsums: subtours[logsum_column_name] = choices_df["logsum"] - assign_in_place(tours, subtours[[logsum_column_name]]) + assign_in_place( + tours, + subtours[[logsum_column_name]], + state.settings.downcast_int, + state.settings.downcast_int, + ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/atwork_subtour_mode_choice.py b/activitysim/abm/models/atwork_subtour_mode_choice.py index a989572c9..09f107ac9 100644 --- a/activitysim/abm/models/atwork_subtour_mode_choice.py +++ b/activitysim/abm/models/atwork_subtour_mode_choice.py @@ -185,7 +185,9 @@ def atwork_subtour_mode_choice( "%s choices" % trace_label, choices_df[mode_column_name], value_counts=True ) - assign_in_place(tours, choices_df) + assign_in_place( + tours, choices_df, state.settings.downcast_int, state.settings.downcast_int + ) state.add_table("tours", tours) # - annotate tours table diff --git a/activitysim/abm/models/atwork_subtour_scheduling.py b/activitysim/abm/models/atwork_subtour_scheduling.py index f6c71351d..e16199c74 100644 --- a/activitysim/abm/models/atwork_subtour_scheduling.py +++ b/activitysim/abm/models/atwork_subtour_scheduling.py @@ -101,7 +101,9 @@ def atwork_subtour_scheduling( choices.to_frame("tdd"), tdd_alts, left_on=["tdd"], right_index=True, how="left" ) - assign_in_place(tours, tdd_choices) + assign_in_place( + tours, tdd_choices, state.settings.downcast_int, state.settings.downcast_int + ) state.add_table("tours", tours) if trace_hh_id: diff --git a/activitysim/abm/models/joint_tour_destination.py b/activitysim/abm/models/joint_tour_destination.py index d94658b78..1312e15cd 100644 --- a/activitysim/abm/models/joint_tour_destination.py +++ b/activitysim/abm/models/joint_tour_destination.py @@ -81,12 +81,22 @@ def joint_tour_destination( # add column as we want joint_tours table for tracing. joint_tours["destination"] = choices_df.choice - assign_in_place(tours, joint_tours[["destination"]]) + assign_in_place( + tours, + joint_tours[["destination"]], + state.settings.downcast_int, + state.settings.downcast_int, + ) state.add_table("tours", tours) if want_logsums: joint_tours[logsum_column_name] = choices_df["logsum"] - assign_in_place(tours, joint_tours[[logsum_column_name]]) + assign_in_place( + tours, + joint_tours[[logsum_column_name]], + state.settings.downcast_int, + state.settings.downcast_int, + ) tracing.print_summary("destination", joint_tours.destination, describe=True) diff --git a/activitysim/abm/models/joint_tour_participation.py b/activitysim/abm/models/joint_tour_participation.py index f61fe66a5..bd08d6654 100644 --- a/activitysim/abm/models/joint_tour_participation.py +++ b/activitysim/abm/models/joint_tour_participation.py @@ -441,7 +441,12 @@ def joint_tour_participation( # update number_of_participants which was initialized to 1 joint_tours["number_of_participants"] = participants.groupby("tour_id").size() - assign_in_place(tours, joint_tours[["person_id", "number_of_participants"]]) + assign_in_place( + tours, + joint_tours[["person_id", "number_of_participants"]], + state.settings.downcast_int, + state.settings.downcast_int, + ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/joint_tour_scheduling.py b/activitysim/abm/models/joint_tour_scheduling.py index 0a488757a..0b20208dc 100644 --- a/activitysim/abm/models/joint_tour_scheduling.py +++ b/activitysim/abm/models/joint_tour_scheduling.py @@ -140,7 +140,9 @@ def joint_tour_scheduling( choices.to_frame("tdd"), tdd_alts, left_on=["tdd"], right_index=True, how="left" ) - assign_in_place(tours, choices) + assign_in_place( + tours, choices, state.settings.downcast_int, state.settings.downcast_int + ) state.add_table("tours", tours) # updated df for tracing diff --git a/activitysim/abm/models/mandatory_scheduling.py b/activitysim/abm/models/mandatory_scheduling.py index 2e5401bf1..594d3dd54 100644 --- a/activitysim/abm/models/mandatory_scheduling.py +++ b/activitysim/abm/models/mandatory_scheduling.py @@ -62,7 +62,9 @@ def mandatory_tour_scheduling( tour_segment_col, ) - assign_in_place(tours, choices) + assign_in_place( + tours, choices, state.settings.downcast_int, state.settings.downcast_int + ) state.add_table("tours", tours) # updated df for tracing diff --git a/activitysim/abm/models/non_mandatory_destination.py b/activitysim/abm/models/non_mandatory_destination.py index 7ca5c4e90..acf288b8d 100644 --- a/activitysim/abm/models/non_mandatory_destination.py +++ b/activitysim/abm/models/non_mandatory_destination.py @@ -100,11 +100,21 @@ def non_mandatory_tour_destination( [pure_school_escort_tours, non_mandatory_tours] ).set_index(nm_tour_index) - assign_in_place(tours, non_mandatory_tours[["destination"]]) + assign_in_place( + tours, + non_mandatory_tours[["destination"]], + state.settings.downcast_int, + state.settings.downcast_int, + ) if want_logsums: non_mandatory_tours[logsum_column_name] = choices_df["logsum"] - assign_in_place(tours, non_mandatory_tours[[logsum_column_name]]) + assign_in_place( + tours, + non_mandatory_tours[[logsum_column_name]], + state.settings.downcast_int, + state.settings.downcast_int, + ) assert all( ~tours["destination"].isna() diff --git a/activitysim/abm/models/non_mandatory_scheduling.py b/activitysim/abm/models/non_mandatory_scheduling.py index d8cb9e187..c9cc650fb 100644 --- a/activitysim/abm/models/non_mandatory_scheduling.py +++ b/activitysim/abm/models/non_mandatory_scheduling.py @@ -47,7 +47,9 @@ def non_mandatory_tour_scheduling( tour_segment_col, ) - assign_in_place(tours, choices) + assign_in_place( + tours, choices, state.settings.downcast_int, state.settings.downcast_int + ) state.add_table("tours", tours) # updated df for tracing diff --git a/activitysim/abm/models/parking_location_choice.py b/activitysim/abm/models/parking_location_choice.py index dbec927be..6ff8d64fe 100644 --- a/activitysim/abm/models/parking_location_choice.py +++ b/activitysim/abm/models/parking_location_choice.py @@ -269,7 +269,12 @@ def run_parking_destination( if fail_some_trips_for_testing: parking_df = parking_df.drop(parking_df.index[0]) - assign_in_place(trips, parking_df.to_frame(parking_location_column_name)) + assign_in_place( + trips, + parking_df.to_frame(parking_location_column_name), + state.settings.downcast_int, + state.settings.downcast_int, + ) trips[parking_location_column_name] = trips[ parking_location_column_name ].fillna(-1) @@ -348,7 +353,12 @@ def parking_location( trace_label=trace_label, ) - assign_in_place(trips_df, parking_locations.to_frame(alt_destination_col_name)) + assign_in_place( + trips_df, + parking_locations.to_frame(alt_destination_col_name), + state.settings.downcast_int, + state.settings.downcast_int, + ) state.add_table("trips", trips_df) diff --git a/activitysim/abm/models/stop_frequency.py b/activitysim/abm/models/stop_frequency.py index 0c9dff9ef..2c349b97e 100644 --- a/activitysim/abm/models/stop_frequency.py +++ b/activitysim/abm/models/stop_frequency.py @@ -93,7 +93,12 @@ def stop_frequency( trace_label=trace_label, ) - assign_in_place(tours_merged, annotations) + assign_in_place( + tours_merged, + annotations, + state.settings.downcast_int, + state.settings.downcast_int, + ) tracing.print_summary( "stop_frequency segments", tours_merged.primary_purpose, value_counts=True @@ -187,13 +192,23 @@ def stop_frequency( tracing.print_summary("stop_frequency", choices, value_counts=True) # add stop_frequency choices to tours table - assign_in_place(tours, choices.to_frame("stop_frequency")) + assign_in_place( + tours, + choices.to_frame("stop_frequency"), + state.settings.downcast_int, + state.settings.downcast_int, + ) # FIXME should have added this when tours created? assert "primary_purpose" not in tours if "primary_purpose" not in tours.columns: # if not already there, then it will have been added by stop_freq_annotate_tours_preprocessor - assign_in_place(tours, tours_merged[["primary_purpose"]]) + assign_in_place( + tours, + tours_merged[["primary_purpose"]], + state.settings.downcast_int, + state.settings.downcast_int, + ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index eaa2f1e5d..61d320cc4 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -403,11 +403,18 @@ def tour_mode_choice_simulate( ) # so we can trace with annotations - assign_in_place(primary_tours, choices_df) + assign_in_place( + primary_tours, + choices_df, + state.settings.downcast_int, + state.settings.downcast_int, + ) # update tours table with mode choice (and optionally logsums) all_tours = tours - assign_in_place(all_tours, choices_df) + assign_in_place( + all_tours, choices_df, state.settings.downcast_int, state.settings.downcast_int + ) if state.is_table("school_escort_tours") & model_settings.get( "FORCE_ESCORTEE_CHAUFFEUR_MODE_MATCH", True diff --git a/activitysim/abm/models/trip_destination.py b/activitysim/abm/models/trip_destination.py index 1ecc287b6..f96333a5c 100644 --- a/activitysim/abm/models/trip_destination.py +++ b/activitysim/abm/models/trip_destination.py @@ -1374,18 +1374,31 @@ def run_trip_destination( # - assign choices to this trip's destinations # if estimator, then the choices will already have been overridden by trip_destination_simulate # because we need to overwrite choices before any failed choices are suppressed - assign_in_place(trips, destinations_df.choice.to_frame("destination")) + assign_in_place( + trips, + destinations_df.choice.to_frame("destination"), + state.settings.downcast_int, + state.settings.downcast_int, + ) if want_logsums: assert "logsum" in destinations_df.columns assign_in_place( - trips, destinations_df.logsum.to_frame(logsum_column_name) + trips, + destinations_df.logsum.to_frame(logsum_column_name), + state.settings.downcast_int, + state.settings.downcast_int, ) # - assign choice to next trip's origin destinations_df.index = nth_trips.next_trip_id.reindex( destinations_df.index ) - assign_in_place(trips, destinations_df.choice.to_frame("origin")) + assign_in_place( + trips, + destinations_df.choice.to_frame("origin"), + state.settings.downcast_int, + state.settings.downcast_int, + ) del trips["next_trip_id"] diff --git a/activitysim/abm/models/trip_mode_choice.py b/activitysim/abm/models/trip_mode_choice.py index 1b8a82ceb..745833324 100644 --- a/activitysim/abm/models/trip_mode_choice.py +++ b/activitysim/abm/models/trip_mode_choice.py @@ -249,7 +249,12 @@ def trip_mode_choice( ) # so we can trace with annotations - assign_in_place(trips_segment, choices) + assign_in_place( + trips_segment, + choices, + state.settings.downcast_int, + state.settings.downcast_int, + ) state.tracing.trace_df( trips_segment, @@ -300,7 +305,9 @@ def trip_mode_choice( cols_to_keep_df = pd.concat(cols_to_keep_list) choices_df = pd.concat([choices_df, cols_to_keep_df], axis=1) - assign_in_place(trips_df, choices_df) + assign_in_place( + trips_df, choices_df, state.settings.downcast_int, state.settings.downcast_int + ) if state.is_table("school_escort_tours") & model_settings.get( "FORCE_ESCORTEE_CHAUFFEUR_MODE_MATCH", True diff --git a/activitysim/abm/models/trip_purpose_and_destination.py b/activitysim/abm/models/trip_purpose_and_destination.py index 3e7baf2b0..390d9199f 100644 --- a/activitysim/abm/models/trip_purpose_and_destination.py +++ b/activitysim/abm/models/trip_purpose_and_destination.py @@ -216,7 +216,12 @@ def trip_purpose_and_destination( ) trips_df = trips - assign_in_place(trips_df, processed_trips) + assign_in_place( + trips_df, + processed_trips, + state.settings.downcast_int, + state.settings.downcast_int, + ) trips_df = cleanup_failed_trips(trips_df) diff --git a/activitysim/abm/models/util/trip.py b/activitysim/abm/models/util/trip.py index c6d8e5075..489a02eb8 100644 --- a/activitysim/abm/models/util/trip.py +++ b/activitysim/abm/models/util/trip.py @@ -84,7 +84,12 @@ def cleanup_failed_trips(trips): ascending=False ) - assign_in_place(trips, patch_trips[["trip_num", "trip_count"]]) + assign_in_place( + trips, + patch_trips[["trip_num", "trip_count"]], + state.settings.downcast_int, + state.settings.downcast_int, + ) # origin needs to match the previous destination # (leaving first origin alone as it's already set correctly) diff --git a/activitysim/core/assign.py b/activitysim/core/assign.py index 40864a3e6..f832e6b59 100644 --- a/activitysim/core/assign.py +++ b/activitysim/core/assign.py @@ -425,7 +425,10 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): variables = util.df_from_dict(variables, index=df.index) util.auto_opt_pd_dtypes( - variables, downcast_int=False, downcast_float=False, inplace=True + variables, + downcast_int=state.settings.downcast_int, + downcast_float=state.settings.downcast_float, + inplace=True, ) return variables, trace_results, trace_assigned_locals diff --git a/activitysim/core/configuration/top.py b/activitysim/core/configuration/top.py index 3fd38baee..2ed0f96cd 100644 --- a/activitysim/core/configuration/top.py +++ b/activitysim/core/configuration/top.py @@ -635,6 +635,24 @@ class Settings(PydanticBase, extra="allow", validate_assignment=True): the results from the previous time that step was run. """ + downcast_int: bool = False + """ + automatically downcasting integer variables. + + Use of this setting should be tested by the region to confirm result consistency. + + .. versionadded:: 1.3 + """ + + downcast_float: bool = False + """ + automatically downcasting float variables. + + Use of this setting should be tested by the region to confirm result consistency. + + .. versionadded:: 1.3 + """ + other_settings: dict[str, Any] = None def _get_attr(self, attr): diff --git a/activitysim/core/expressions.py b/activitysim/core/expressions.py index b57eca94c..3d4125858 100644 --- a/activitysim/core/expressions.py +++ b/activitysim/core/expressions.py @@ -153,7 +153,9 @@ def assign_columns( results = compute_columns(state, df, model_settings, locals_dict, trace_label) - assign_in_place(df, results) + assign_in_place( + df, results, state.settings.downcast_int, state.settings.downcast_float + ) # ################################################################################################## @@ -188,7 +190,9 @@ def annotate_preprocessors( trace_label=trace_label, ) - assign_in_place(df, results) + assign_in_place( + df, results, state.settings.downcast_int, state.settings.downcast_float + ) def filter_chooser_columns(choosers, chooser_columns): From 3aefc5979a46095ba72ec29cd22915aeac259f80 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Fri, 15 Dec 2023 20:29:22 -0500 Subject: [PATCH 33/61] fix primary purpose in school escorting --- .../abm/models/util/school_escort_tours_trips.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/activitysim/abm/models/util/school_escort_tours_trips.py b/activitysim/abm/models/util/school_escort_tours_trips.py index 833edee70..42108dfbd 100644 --- a/activitysim/abm/models/util/school_escort_tours_trips.py +++ b/activitysim/abm/models/util/school_escort_tours_trips.py @@ -446,6 +446,19 @@ def merge_school_escort_trips_into_pipeline(state: workflow.State): # for better merge with trips created in stop frequency school_escort_trips["failed"] = False + # make sure the pandas categorical columns share the same categories before cancat + # union categoricals + for c in trips.columns.intersection(school_escort_trips.columns): + if isinstance(trips[c].dtype, pd.api.types.CategoricalDtype): + if isinstance(school_escort_trips[c].dtype, pd.api.types.CategoricalDtype): + from pandas.api.types import union_categoricals + + uc = union_categoricals([trips[c], school_escort_trips[c]]) + trips[c] = pd.Categorical(trips[c], categories=uc.categories) + school_escort_trips[c] = pd.Categorical( + school_escort_trips[c], categories=uc.categories + ) + trips = pd.concat( [ trips, From 21fdb9fb011d350ba2e4dc807fa99bd7db7239f8 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 27 Dec 2023 16:23:31 -0500 Subject: [PATCH 34/61] sort mode categories --- activitysim/abm/models/util/mode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activitysim/abm/models/util/mode.py b/activitysim/abm/models/util/mode.py index f46055912..a006dd903 100644 --- a/activitysim/abm/models/util/mode.py +++ b/activitysim/abm/models/util/mode.py @@ -83,7 +83,7 @@ def mode_choice_simulate( choices[mode_column_name] = choices[mode_column_name].map( dict(list(zip(list(range(len(alts))), alts))) ) - cat_type = pd.api.types.CategoricalDtype(alts.tolist() + [""], ordered=False) + cat_type = pd.api.types.CategoricalDtype([""] + alts.tolist(), ordered=True) choices[mode_column_name] = choices[mode_column_name].astype(cat_type) return choices From 379c4f4e65a2580fe34e936e51c64e017d116cbf Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 27 Dec 2023 16:23:53 -0500 Subject: [PATCH 35/61] fix estimation tests --- activitysim/core/estimation.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/activitysim/core/estimation.py b/activitysim/core/estimation.py index 8077e3318..5282b70d3 100644 --- a/activitysim/core/estimation.py +++ b/activitysim/core/estimation.py @@ -690,6 +690,23 @@ def get_survey_values(self, model_values, table_name, column_names): values[c] = survey_values + # if the categorical column exists in the model data, use the same data type + if isinstance(model_values, pd.Series): + if isinstance(model_values.dtype, pd.api.types.CategoricalDtype): + for v in values[c].dropna().unique(): + if not v in model_values.cat.categories: + model_values = model_values.cat.add_categories([v]) + values[c] = values[c].astype(model_values.dtype) + elif isinstance(model_values, pd.DataFrame): + if c in model_values.columns: + if isinstance(model_values[c].dtype, pd.api.types.CategoricalDtype): + for v in values[c].dropna().unique(): + if not v in model_values[c].cat.categories: + model_values[c] = model_values[c].cat.add_categories( + [v] + ) + values[c] = values[c].astype(model_values[c].dtype) + return values[column_name] if column_name else values From 78db977b36a21c4eb8ca50fd5d9928e6e3ca9f2d Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Tue, 2 Jan 2024 11:13:39 -0500 Subject: [PATCH 36/61] fix typo --- activitysim/abm/models/atwork_subtour_destination.py | 4 ++-- activitysim/abm/models/atwork_subtour_mode_choice.py | 2 +- activitysim/abm/models/atwork_subtour_scheduling.py | 2 +- activitysim/abm/models/joint_tour_destination.py | 4 ++-- activitysim/abm/models/joint_tour_participation.py | 2 +- activitysim/abm/models/joint_tour_scheduling.py | 2 +- activitysim/abm/models/mandatory_scheduling.py | 2 +- activitysim/abm/models/non_mandatory_destination.py | 4 ++-- activitysim/abm/models/non_mandatory_scheduling.py | 2 +- activitysim/abm/models/parking_location_choice.py | 4 ++-- activitysim/abm/models/stop_frequency.py | 6 +++--- activitysim/abm/models/tour_mode_choice.py | 7 +++++-- activitysim/abm/models/trip_destination.py | 6 +++--- activitysim/abm/models/trip_mode_choice.py | 4 ++-- activitysim/abm/models/trip_purpose_and_destination.py | 2 +- activitysim/abm/models/util/trip.py | 2 +- activitysim/core/util.py | 2 ++ 17 files changed, 31 insertions(+), 26 deletions(-) diff --git a/activitysim/abm/models/atwork_subtour_destination.py b/activitysim/abm/models/atwork_subtour_destination.py index 593962d1e..cd37f14d3 100644 --- a/activitysim/abm/models/atwork_subtour_destination.py +++ b/activitysim/abm/models/atwork_subtour_destination.py @@ -87,7 +87,7 @@ def atwork_subtour_destination( tours, subtours[[destination_column_name]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) if want_logsums: @@ -96,7 +96,7 @@ def atwork_subtour_destination( tours, subtours[[logsum_column_name]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/atwork_subtour_mode_choice.py b/activitysim/abm/models/atwork_subtour_mode_choice.py index 09f107ac9..397b98248 100644 --- a/activitysim/abm/models/atwork_subtour_mode_choice.py +++ b/activitysim/abm/models/atwork_subtour_mode_choice.py @@ -186,7 +186,7 @@ def atwork_subtour_mode_choice( ) assign_in_place( - tours, choices_df, state.settings.downcast_int, state.settings.downcast_int + tours, choices_df, state.settings.downcast_int, state.settings.downcast_float ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/atwork_subtour_scheduling.py b/activitysim/abm/models/atwork_subtour_scheduling.py index e16199c74..f3ffadeb4 100644 --- a/activitysim/abm/models/atwork_subtour_scheduling.py +++ b/activitysim/abm/models/atwork_subtour_scheduling.py @@ -102,7 +102,7 @@ def atwork_subtour_scheduling( ) assign_in_place( - tours, tdd_choices, state.settings.downcast_int, state.settings.downcast_int + tours, tdd_choices, state.settings.downcast_int, state.settings.downcast_float ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/joint_tour_destination.py b/activitysim/abm/models/joint_tour_destination.py index 1312e15cd..e07df6529 100644 --- a/activitysim/abm/models/joint_tour_destination.py +++ b/activitysim/abm/models/joint_tour_destination.py @@ -85,7 +85,7 @@ def joint_tour_destination( tours, joint_tours[["destination"]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) state.add_table("tours", tours) @@ -95,7 +95,7 @@ def joint_tour_destination( tours, joint_tours[[logsum_column_name]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) tracing.print_summary("destination", joint_tours.destination, describe=True) diff --git a/activitysim/abm/models/joint_tour_participation.py b/activitysim/abm/models/joint_tour_participation.py index bd08d6654..e8aa21a0c 100644 --- a/activitysim/abm/models/joint_tour_participation.py +++ b/activitysim/abm/models/joint_tour_participation.py @@ -445,7 +445,7 @@ def joint_tour_participation( tours, joint_tours[["person_id", "number_of_participants"]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/joint_tour_scheduling.py b/activitysim/abm/models/joint_tour_scheduling.py index 0b20208dc..2c97e2dc3 100644 --- a/activitysim/abm/models/joint_tour_scheduling.py +++ b/activitysim/abm/models/joint_tour_scheduling.py @@ -141,7 +141,7 @@ def joint_tour_scheduling( ) assign_in_place( - tours, choices, state.settings.downcast_int, state.settings.downcast_int + tours, choices, state.settings.downcast_int, state.settings.downcast_float ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/mandatory_scheduling.py b/activitysim/abm/models/mandatory_scheduling.py index 594d3dd54..64fc26215 100644 --- a/activitysim/abm/models/mandatory_scheduling.py +++ b/activitysim/abm/models/mandatory_scheduling.py @@ -63,7 +63,7 @@ def mandatory_tour_scheduling( ) assign_in_place( - tours, choices, state.settings.downcast_int, state.settings.downcast_int + tours, choices, state.settings.downcast_int, state.settings.downcast_float ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/non_mandatory_destination.py b/activitysim/abm/models/non_mandatory_destination.py index acf288b8d..2af6e3287 100644 --- a/activitysim/abm/models/non_mandatory_destination.py +++ b/activitysim/abm/models/non_mandatory_destination.py @@ -104,7 +104,7 @@ def non_mandatory_tour_destination( tours, non_mandatory_tours[["destination"]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) if want_logsums: @@ -113,7 +113,7 @@ def non_mandatory_tour_destination( tours, non_mandatory_tours[[logsum_column_name]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) assert all( diff --git a/activitysim/abm/models/non_mandatory_scheduling.py b/activitysim/abm/models/non_mandatory_scheduling.py index c9cc650fb..4e444107b 100644 --- a/activitysim/abm/models/non_mandatory_scheduling.py +++ b/activitysim/abm/models/non_mandatory_scheduling.py @@ -48,7 +48,7 @@ def non_mandatory_tour_scheduling( ) assign_in_place( - tours, choices, state.settings.downcast_int, state.settings.downcast_int + tours, choices, state.settings.downcast_int, state.settings.downcast_float ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/parking_location_choice.py b/activitysim/abm/models/parking_location_choice.py index 6ff8d64fe..d14c69fee 100644 --- a/activitysim/abm/models/parking_location_choice.py +++ b/activitysim/abm/models/parking_location_choice.py @@ -273,7 +273,7 @@ def run_parking_destination( trips, parking_df.to_frame(parking_location_column_name), state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) trips[parking_location_column_name] = trips[ parking_location_column_name @@ -357,7 +357,7 @@ def parking_location( trips_df, parking_locations.to_frame(alt_destination_col_name), state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) state.add_table("trips", trips_df) diff --git a/activitysim/abm/models/stop_frequency.py b/activitysim/abm/models/stop_frequency.py index 2c349b97e..10b6cc5b7 100644 --- a/activitysim/abm/models/stop_frequency.py +++ b/activitysim/abm/models/stop_frequency.py @@ -97,7 +97,7 @@ def stop_frequency( tours_merged, annotations, state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) tracing.print_summary( @@ -196,7 +196,7 @@ def stop_frequency( tours, choices.to_frame("stop_frequency"), state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) # FIXME should have added this when tours created? @@ -207,7 +207,7 @@ def stop_frequency( tours, tours_merged[["primary_purpose"]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) state.add_table("tours", tours) diff --git a/activitysim/abm/models/tour_mode_choice.py b/activitysim/abm/models/tour_mode_choice.py index 61d320cc4..b0e5c3686 100644 --- a/activitysim/abm/models/tour_mode_choice.py +++ b/activitysim/abm/models/tour_mode_choice.py @@ -407,13 +407,16 @@ def tour_mode_choice_simulate( primary_tours, choices_df, state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) # update tours table with mode choice (and optionally logsums) all_tours = tours assign_in_place( - all_tours, choices_df, state.settings.downcast_int, state.settings.downcast_int + all_tours, + choices_df, + state.settings.downcast_int, + state.settings.downcast_float, ) if state.is_table("school_escort_tours") & model_settings.get( diff --git a/activitysim/abm/models/trip_destination.py b/activitysim/abm/models/trip_destination.py index f96333a5c..42f586b1d 100644 --- a/activitysim/abm/models/trip_destination.py +++ b/activitysim/abm/models/trip_destination.py @@ -1378,7 +1378,7 @@ def run_trip_destination( trips, destinations_df.choice.to_frame("destination"), state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) if want_logsums: assert "logsum" in destinations_df.columns @@ -1386,7 +1386,7 @@ def run_trip_destination( trips, destinations_df.logsum.to_frame(logsum_column_name), state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) # - assign choice to next trip's origin @@ -1397,7 +1397,7 @@ def run_trip_destination( trips, destinations_df.choice.to_frame("origin"), state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) del trips["next_trip_id"] diff --git a/activitysim/abm/models/trip_mode_choice.py b/activitysim/abm/models/trip_mode_choice.py index 745833324..27a14ae4c 100644 --- a/activitysim/abm/models/trip_mode_choice.py +++ b/activitysim/abm/models/trip_mode_choice.py @@ -253,7 +253,7 @@ def trip_mode_choice( trips_segment, choices, state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) state.tracing.trace_df( @@ -306,7 +306,7 @@ def trip_mode_choice( choices_df = pd.concat([choices_df, cols_to_keep_df], axis=1) assign_in_place( - trips_df, choices_df, state.settings.downcast_int, state.settings.downcast_int + trips_df, choices_df, state.settings.downcast_int, state.settings.downcast_float ) if state.is_table("school_escort_tours") & model_settings.get( diff --git a/activitysim/abm/models/trip_purpose_and_destination.py b/activitysim/abm/models/trip_purpose_and_destination.py index 390d9199f..e61a71805 100644 --- a/activitysim/abm/models/trip_purpose_and_destination.py +++ b/activitysim/abm/models/trip_purpose_and_destination.py @@ -220,7 +220,7 @@ def trip_purpose_and_destination( trips_df, processed_trips, state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) trips_df = cleanup_failed_trips(trips_df) diff --git a/activitysim/abm/models/util/trip.py b/activitysim/abm/models/util/trip.py index 489a02eb8..909738b3e 100644 --- a/activitysim/abm/models/util/trip.py +++ b/activitysim/abm/models/util/trip.py @@ -88,7 +88,7 @@ def cleanup_failed_trips(trips): trips, patch_trips[["trip_num", "trip_count"]], state.settings.downcast_int, - state.settings.downcast_int, + state.settings.downcast_float, ) # origin needs to match the previous destination diff --git a/activitysim/core/util.py b/activitysim/core/util.py index ee00b219c..1876063e2 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -326,6 +326,8 @@ def assign_in_place(df, df2, downcast_int=False, downcast_float=False): assignment left-hand-side (dest) df2: pd.DataFrame assignment right-hand-side (source) + downcast_int: bool + if True, downcast int columns if possible downcast_float: bool if True, downcast float columns if possible Returns From 08f3be89643730f1b88e68f0448a6fe27008677f Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 31 Jan 2024 13:44:22 -0500 Subject: [PATCH 37/61] remove code in comments --- activitysim/core/util.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 1876063e2..f2e273063 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -444,12 +444,10 @@ def auto_opt_pd_dtypes( else: df[col] = pd.to_numeric(df[col], downcast="integer") continue - # there are calcualtions in asim that expect results in negative values - # operations on two unsigned types will not produce negative values - # if df[col].min() >= 0: - # df[col] = pd.to_numeric(df[col], downcast='unsigned') - # else: - # df[col] = pd.to_numeric(df[col], downcast='integer') + # Initially thought of using unsigned integers, BUT: + # There are calculations in asim (e.g., UECs) that expect results in negative values, + # and operations on two unsigned types will not produce negative values, + # therefore, we did not use unsigned integers. if not inplace: return df From cfe034a14a3aec8a58fe7d340b66d2f0c942d0b7 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 31 Jan 2024 14:46:37 -0500 Subject: [PATCH 38/61] add check column type in the tests in util/test --- .../test/test_mandatory_tour_frequency.py | 27 +++++++++++++------ .../test/test_non_mandatory_tour_frequency.py | 21 ++++++++++----- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py b/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py index 47152dafe..8f2df86e8 100644 --- a/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py +++ b/activitysim/abm/models/util/test/test_mandatory_tour_frequency.py @@ -59,14 +59,25 @@ def test_mtf(): check_dtype=False, ) - pdt.assert_series_equal( - mandatory_tours.tour_type.astype(str), - pd.Series( - ["work", "work", "school", "work", "school", "school", "school"], - index=idx, - name="tour_type", - ), - ) + # check if the tour_type variable is pandas categorical + if isinstance(mandatory_tours.tour_type.dtype, pd.api.types.CategoricalDtype): + pdt.assert_series_equal( + mandatory_tours.tour_type.astype(str), + pd.Series( + ["work", "work", "school", "work", "school", "school", "school"], + index=idx, + name="tour_type", + ), + ) + else: + pdt.assert_series_equal( + mandatory_tours.tour_type, + pd.Series( + ["work", "work", "school", "work", "school", "school", "school"], + index=idx, + name="tour_type", + ), + ) # tour_nums for work_and_school non-worker should be flipped pdt.assert_series_equal( diff --git a/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py b/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py index 0c28174d4..fba49138e 100644 --- a/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py @@ -40,9 +40,18 @@ def test_nmtf(): nmt.person_id, pd.Series([0, 2, 2, 3], index=idx, name="person_id") ) - pdt.assert_series_equal( - nmt.tour_type.astype(str), - pd.Series( - ["shopping", "escort", "escort", "othmaint"], index=idx, name="tour_type" - ), - ) + # check if the tour_type variable is pandas categorical + if isinstance(nmt.tour_type.dtype, pd.api.types.CategoricalDtype): + pdt.assert_series_equal( + nmt.tour_type.astype(str), + pd.Series( + ["shopping", "escort", "escort", "othmaint"], index=idx, name="tour_type" + ), + ) + else: + pdt.assert_series_equal( + nmt.tour_type, + pd.Series( + ["shopping", "escort", "escort", "othmaint"], index=idx, name="tour_type" + ), + ) From 83d9e67fa3c9ad057679fb4897b5f86407de5502 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 31 Jan 2024 15:13:45 -0500 Subject: [PATCH 39/61] remove unwanted tracing @jpn-- I'm gonna remove these files. I used them to write out the memory of each column in the interaction_df. It was useful when I did the diagnosis, but probably not needed in actual implementation. --- activitysim/core/interaction_simulate.py | 39 ------------------------ 1 file changed, 39 deletions(-) diff --git a/activitysim/core/interaction_simulate.py b/activitysim/core/interaction_simulate.py index 48650b1a1..7288d4952 100644 --- a/activitysim/core/interaction_simulate.py +++ b/activitysim/core/interaction_simulate.py @@ -12,10 +12,6 @@ import numpy as np import pandas as pd -import psutil -import os -import io - from . import chunk, config, logit, simulate, tracing, workflow logger = logging.getLogger(__name__) @@ -80,41 +76,6 @@ def eval_interaction_utilities( trace_label = tracing.extend_trace_label(trace_label, "eval_interaction_utils") logger.info("Running eval_interaction_utilities on %s rows" % df.shape[0]) - logger.info("Writing out interaction df info") - - buffer = io.StringIO() - df.info(memory_usage="deep", buf=buffer, verbose=True, show_counts=True) - s = buffer.getvalue() - # check if output dir exists - if os.path.exists(state.filesystem.output_dir): - with open( - os.path.join( - state.filesystem.output_dir, trace_label + ".interaction_df.info.txt" - ), - "w", - encoding="utf-8", - ) as f: - f.write(s) - - df.memory_usage(deep=True).to_csv( - os.path.join( - state.filesystem.output_dir, - trace_label + ".interaction_df.memory_usage_deep.txt", - ) - ) - - df.memory_usage().to_csv( - os.path.join( - state.filesystem.output_dir, - trace_label + ".interaction_df.memory_usage.txt", - ) - ) - - process = psutil.Process(os.getpid()) - logger.info( - "PID RSS when writing out interaction df info: %s" % process.memory_info().rss - ) - sharrow_enabled = state.settings.sharrow if locals_d is not None and locals_d.get("_sharrow_skip", False): From 3c60efc4e7375cef8a2a9d992e4e27c677139ac9 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 31 Jan 2024 16:01:25 -0500 Subject: [PATCH 40/61] blacken --- .../models/util/test/test_non_mandatory_tour_frequency.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py b/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py index fba49138e..6dc8f591e 100644 --- a/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/util/test/test_non_mandatory_tour_frequency.py @@ -45,13 +45,17 @@ def test_nmtf(): pdt.assert_series_equal( nmt.tour_type.astype(str), pd.Series( - ["shopping", "escort", "escort", "othmaint"], index=idx, name="tour_type" + ["shopping", "escort", "escort", "othmaint"], + index=idx, + name="tour_type", ), ) else: pdt.assert_series_equal( nmt.tour_type, pd.Series( - ["shopping", "escort", "escort", "othmaint"], index=idx, name="tour_type" + ["shopping", "escort", "escort", "othmaint"], + index=idx, + name="tour_type", ), ) From a9dd3831e23e3c58e7ba1c86c7866074540933a9 Mon Sep 17 00:00:00 2001 From: Sijia Wang Date: Wed, 31 Jan 2024 21:36:09 -0500 Subject: [PATCH 41/61] move comment --- activitysim/abm/models/vehicle_type_choice.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/activitysim/abm/models/vehicle_type_choice.py b/activitysim/abm/models/vehicle_type_choice.py index 5192d23d8..d29aef7e5 100644 --- a/activitysim/abm/models/vehicle_type_choice.py +++ b/activitysim/abm/models/vehicle_type_choice.py @@ -230,10 +230,9 @@ def construct_model_alternatives( ), f"missing vehicle data for alternatives:\n {missing_alts}" else: # eliminate alternatives if no vehicle type data + # if this happens, alts_wide is not the same length as alts_long alts_wide = alts_wide[alts_wide._merge != "left_only"] - alts_wide.drop( - columns="_merge", inplace=True - ) # if this happens, alt_wide length will not match alt_long + alts_wide.drop(columns="_merge", inplace=True) # converting age to integer to allow interactions in utilities alts_wide["age"] = alts_wide["age"].astype(int) From ccc195c070db0a7241711f9277b34448bfe9df2a Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Fri, 2 Feb 2024 11:11:08 -0600 Subject: [PATCH 42/61] relax progressive checks for categorical dtypes --- activitysim/core/workflow/checkpoint.py | 33 ++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/activitysim/core/workflow/checkpoint.py b/activitysim/core/workflow/checkpoint.py index b553460a2..8771b4129 100644 --- a/activitysim/core/workflow/checkpoint.py +++ b/activitysim/core/workflow/checkpoint.py @@ -958,7 +958,9 @@ def restore_from(self, location: Path, checkpoint_name: str = LAST_CHECKPOINT): self.load(checkpoint_name, store=from_store) logger.debug(f"checkpoint.restore_from of {checkpoint_name} complete") - def check_against(self, location: Path, checkpoint_name: str): + def check_against( + self, location: Path, checkpoint_name: str, strict_categoricals: bool = False + ): """ Check that the tables in this State match those in an archived pipeline. @@ -966,6 +968,11 @@ def check_against(self, location: Path, checkpoint_name: str): ---------- location : Path-like checkpoint_name : str + strict_categoricals : bool, default False + If True, check that categorical columns have the same categories + in both the current state and the checkpoint. Otherwise, the dtypes + of categorical columns are ignored, and only the values themselves are + checked to confirm they match. Raises ------ @@ -1033,9 +1040,27 @@ def check_against(self, location: Path, checkpoint_name: str): local_table[ref_table.columns], ref_table, check_dtype=False ) except Exception as err: - raise AssertionError( - f"checkpoint {checkpoint_name!r} table {table_name!r}, {str(err)}" - ) + if not strict_categoricals: + try: + pd.testing.assert_frame_equal( + local_table[ref_table.columns], + ref_table, + check_dtype=False, + check_categorical=False, + ) + except Exception as err2: + raise AssertionError( + f"checkpoint {checkpoint_name!r} table {table_name!r}, {str(err)}" + ) + else: + warnings.warn( + f"checkpoint {checkpoint_name!r} table {table_name!r}, " + f"values match but categorical dtype does not" + ) + else: + raise AssertionError( + f"checkpoint {checkpoint_name!r} table {table_name!r}, {str(err)}" + ) else: logger.info(f"table {table_name!r}: ok") From f81211ad3fe3283d8f82e8a02b5cba70715ff320 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Fri, 2 Feb 2024 11:34:02 -0600 Subject: [PATCH 43/61] update pointers --- activitysim/examples/external_example_manifest.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/activitysim/examples/external_example_manifest.yaml b/activitysim/examples/external_example_manifest.yaml index 0be270636..5face8e8e 100644 --- a/activitysim/examples/external_example_manifest.yaml +++ b/activitysim/examples/external_example_manifest.yaml @@ -13,11 +13,11 @@ # prototype_mtc: - url: https://github.com/jpn--/activitysim-prototype-mtc/archive/refs/tags/v1.3.1.tar.gz + url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.1.tar.gz sha256: ec53c6e72da1444bd5808de8c644cea75db284dfcc419b776575ba532b3ccb87 assets: test/prototype_mtc_reference_pipeline.zip: - url: https://github.com/jpn--/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip + url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0 estimation_example: From 54afbb0f466df2cc324070d2da81e62eecfb5dba Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Mon, 5 Feb 2024 18:10:02 -0600 Subject: [PATCH 44/61] use empty string as NaN --- activitysim/core/workflow/checkpoint.py | 2 +- activitysim/core/workflow/state.py | 27 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/activitysim/core/workflow/checkpoint.py b/activitysim/core/workflow/checkpoint.py index 8771b4129..b7fe5900a 100644 --- a/activitysim/core/workflow/checkpoint.py +++ b/activitysim/core/workflow/checkpoint.py @@ -1050,7 +1050,7 @@ def check_against( ) except Exception as err2: raise AssertionError( - f"checkpoint {checkpoint_name!r} table {table_name!r}, {str(err)}" + f"checkpoint {checkpoint_name!r} table {table_name!r}, {str(err)}\nfrom: {str(err2)}" ) else: warnings.warn( diff --git a/activitysim/core/workflow/state.py b/activitysim/core/workflow/state.py index 479b032c7..e00e20c94 100644 --- a/activitysim/core/workflow/state.py +++ b/activitysim/core/workflow/state.py @@ -1082,16 +1082,23 @@ def extend_table(self, table_name, df, axis=0): missing_df_str_columns = [] # union categoricals - for c in table_df.columns.intersection(df.columns): - if isinstance(table_df[c].dtype, pd.api.types.CategoricalDtype): - if isinstance(df[c].dtype, pd.api.types.CategoricalDtype): - from pandas.api.types import union_categoricals - - uc = union_categoricals([table_df[c], df[c]]) - table_df[c] = pd.Categorical( - table_df[c], categories=uc.categories - ) - df[c] = pd.Categorical(df[c], categories=uc.categories) + for c in table_df.columns: + if c in df.columns: + if isinstance(table_df[c].dtype, pd.api.types.CategoricalDtype): + if isinstance(df[c].dtype, pd.api.types.CategoricalDtype): + from pandas.api.types import union_categoricals + + uc = union_categoricals([table_df[c], df[c]]) + table_df[c] = pd.Categorical( + table_df[c], categories=uc.categories + ) + df[c] = pd.Categorical(df[c], categories=uc.categories) + else: + # when the existing categorical type has an empty string as a category, + # we will use that as the missing value instead of NaN + if isinstance(table_df[c].dtype, pd.api.types.CategoricalDtype): + if "" in table_df[c].cat.categories: + missing_df_str_columns.append(c) # preserve existing column order df = pd.concat([table_df, df], sort=False, axis=axis) From 277bbb81a6a51ef0b54b7c20182e33c47a367687 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Tue, 6 Feb 2024 09:28:25 -0600 Subject: [PATCH 45/61] update mtc_ext progressive test for categorical outputs --- activitysim/core/test/__init__.py | 1 + activitysim/core/test/_tools.py | 40 +++++++++++++++++ ...totype_mtc_extended_reference_pipeline.zip | Bin 460258 -> 435093 bytes .../test/test_mtc_extended.py | 42 ++++++------------ 4 files changed, 54 insertions(+), 29 deletions(-) diff --git a/activitysim/core/test/__init__.py b/activitysim/core/test/__init__.py index 9b942d5d2..487f43a34 100644 --- a/activitysim/core/test/__init__.py +++ b/activitysim/core/test/__init__.py @@ -14,4 +14,5 @@ assert_equal, assert_frame_substantively_equal, run_if_exists, + progressive_checkpoint_test, ) diff --git a/activitysim/core/test/_tools.py b/activitysim/core/test/_tools.py index 930f25d40..b8f338ce9 100644 --- a/activitysim/core/test/_tools.py +++ b/activitysim/core/test/_tools.py @@ -139,3 +139,43 @@ def assert_equal(x, y): # pytest.approx() does not support nested data structures for x_, y_ in zip(x, y): assert x_ == pytest.approx(y_) + + +def progressive_checkpoint_test( + state, ref_target: Path, expected_models: list[str], name: str = "unnamed-example" +) -> None: + """ + Compare the results of a pipeline to a reference pipeline. + + Parameters + ---------- + state : workflow.State + ref_target : Path + Location of the reference pipeline file. If this file does not exist, + it will be created (and the test will fail). + expected_models : list[str] + List of model names to run and compare results against the reference + pipeline. + name : str, optional + Name of the test example used in logging, by default "unnamed-example" + """ + + for step_name in expected_models: + state.run.by_name(step_name) + if ref_target.exists(): + try: + state.checkpoint.check_against(ref_target, checkpoint_name=step_name) + except Exception: + print(f"> {name} {step_name}: ERROR") + raise + else: + print(f"> {name} {step_name}: ok") + else: + print(f"> {name} {step_name}: regenerated") + + # generate the reference pipeline if it did not exist + if not ref_target.exists(): + state.checkpoint.store.make_zip_archive(ref_target) + raise RuntimeError( + f"Reference pipeline {ref_target} did not exist, so it was created." + ) diff --git a/activitysim/examples/prototype_mtc_extended/test/prototype_mtc_extended_reference_pipeline.zip b/activitysim/examples/prototype_mtc_extended/test/prototype_mtc_extended_reference_pipeline.zip index d53f41c2809279e3017833e667e81832d2e48f75..9dda15936a35bda218c318510038abcd741ecfbb 100644 GIT binary patch delta 285697 zcmV(?K-a(GiyW258h=nr0|XQR000O8LQ6(i=WHHx))D{!@=yQ(6951JV`yb#YjAIA zZgg`laA9(Bb!BwbTMuj-=XF0yqD(uoEz3HFk||eG?2BW|<{yc&>AIPZqC`rOXo;3c zicZShKZ%r%Jeq$*k%`wd%T_lnGSA4mAn**YForfu(qc9ycZ_}T6Fd%AJl zgJW$Nc5Rb$D~4f_SUjByF=38byO zm$;oUvc!cW49|s9**FK-g$Tp7z~i|D2dJsUVk9=dRe$r7CYI_r5;wp=6u?j^A(0KG zgmfYVbf?o?jLCM47_ohTf@9M>%xUfTo|8*5LLvn>?J#dah{RGyM=?x4Xux{3Iw2Y9 ziD6o5>(|=Kk?B;`JidhUL7bDS78kTeTFE$_4 z28~e)IKzT!zSEbVm7-{#OX3(lj!*W1_q5{8c(ZX3+qbhYj(`+r89J#HT1cdaXzaXg zLy0C?1K&UYDzNPO-yZ@}->rXy$A6}~36C$1Zq^<1>3@H| zA8D3-GXGtS*IJ3! zTh=06aTyahI}Tc)MYNwo0C$OjPBpN#Vb;%KhGN9Ra070X`T4FIb5VG~TKe(^XlQ)) zg$Emm8+h4wb%<>U@kLrb)1ZHI!CrS936S4z|P z@q-%TZDU!d);xXr{1VlAPosZdL%g+%_^|WtQR}I0$x;>Q;b0YFQk|as9Di|P_uZq@ zi}#gvx+hPM;=EL&7kY_nJ$H{rZxUsV+GVR0igJm0j+LnP#$Mw6J)b;^ER>?iYC-`;@^0MaggNFY9`5Ar+LI(2(!txMCQ2x`DX-0C92OU99eJ9V)BaSxR+lY5e3t z;`V`0s_`@)DEjXH%LvZuvVV647w%noR)r_u22Z|eDXUw~>`|_t*R}ezxUE5F<6CCp zJ=5yNekOIlVJqw2hsuD8`a`=GZyJ8liBW!-NaA>KdyDRuuw z1Aeh#9N#8t|2566rx83{zU#~T8)&dCCWH`9W*Bo`0<_AuGyGz}b!O zkr}wHTDoY^)?;~tHfphR&g<^C4>c3d{aV?oTPjkM7aR3g8i|V!67PLpovWg~K5oE& z0QPDV?e&`G*0GxQl2`AABwAuZTz~6WRYhKDvRak7#@L>>oYqjPwY5UIu0Dpq_u=MM z8Bsr-H)7K!4BKJtpMRd4Tgse0yIV)R>@1sdlQbQ=)TIBgk@(gSarO8b?f5edenm5m zZxQV%+?uIr#*S(WNV*XU9@SOQpSB^P1ioLUe`_VVsQpfN!G$(q=k|=YMX&$q@9b_O zF1yRBZ_BG5%0yzUkjY!%R}K2N;EZ+=Zw{-mR@DCxZY{=~dw&B+yn?GJ1eom=Bo)!* zDnygB50w$`ERdrH3eU0Slk>Y8{S^&yag2C#RE4b~>H+*n5p^evL@Ngb1>kBvSH}JX zV1L3>#;z~VsDl5hMt@C1oSPtC9bcp04dO?O8te*-%Z@4b$rM!BsX!*zp$$6*_Mehe zwS_5pU%9H$|9?P3d}EThdZGqDMc7xH@wXetAsiy$ml~fyVpr z5oEqn0Qrr4W6n@Gi!~0hL5C&rZy#@ySdQXRck;02hW5j8v0Il{rxe3_@IB=wllFca zuIt3G2Mc|>qmsVelsP5DWk&$`oZORSGRvOS$rhrQ0e{=vGc+@^^xXGveEfg#ft^MC zvA?`1+H&#pubcEwX^G1|;$^QoYsCdI;{!!MGCVAvKnf;Sa3bZ{Q}Q4qX4Md14@zQA zo-jnGV{FlnUeUk?ATG@kZwA&BbLxrtqlc@bP62w^+H(3>KN{V;f?zCZsW<(dI za4Uwl>}{xO!SBV!jUqLSl{>k6+sD7&X6(bnqz6qabw7*r=%Kt*C>^Qlx5=i-`XSO0 zX@BoW`dqPtA|+63J4k72)ap{Q6>D56@tTT4nUs~PC@Jw4Wjk(CuwX?7C>>HtwWQ-J z>5P=5lr2afYO9v3;z&>eA&tDX#?cm#EwoCYkOPv;(tA3L9k)B~z-y=tc}Y^oR}}Sr zDX;+z`g%9Z>)W{ApeFLh^=~({b$aI-mw%s)w&9&?+SQ}6weB6B`t(ie*W0Lf=b;W= zfpxBF>r-{su`aAzp|(M#(|T4T`tuWd524e);b=$0hUPd5iAlpRjF0ugrsI}FjKHU( zv1ISj?o*HTF2XbT)tjJV^IUIVcP~oQ;6W_S^Kb`=R3ZhpX7RTWhoAj+@i&KlTYt_x z0ylYvA(1;*;45b{7vXp|B!8C2CHgi3kd8$d*kK}sbTpnV4G8oC$E48nD3_wpzsG{7 zkM+Wu2`m@^k<3hw96Zu{Mgm5TqPHRq?X85QMDVHbAsx^3b(ay8veIhVvY`s8z>Y)X z)nbbyg9E2x$wyWaU(8plrAtTFSAS*M`Bg2rYIuF6SEjku0F)@|fuV4QssWG;*F(A( zTGeEi2J5JIA%k8)eF@e2Vo^!6tKrljTwg@$>3B7$+O+k;rJT9fLZ?1seKD>j$FIh_ z*4g#g73wLz+778bV|_8!ikEebl&UeZZqZRzh^Pscj@KnFNvjIgm{dtruYY}C8;m;L z`r;{;MAZnSBkP==DW8&cIv?dFRkhga@w)h)wD?l>y-K3GB0-hUib#q?>x)FCxT{7} zgK(XFQrQ~osJ~b*B{*~(iZvAJyVu0 z9XvE}XrT8DW@sV3-V^?#`G418h8G7-=wq3mAxUzI%zqvt$pO+aPmYk}JUKKkK65x^ z;~DflTpAzCoXFo7xrpPV=-VNFBO-^{311F0;$nc_admQw#Cr}VSY3=7N(;tKN`u*k49}_+CPJ6(yV_uIX*;2n16n6n2AlnGcr@S zUt)$v2S=R~w!%H1zaOy&P9h!!S-d??N4-4f^5u{me?J`D(UDZ}B+$BS7TT3bjt-4Q zDZein9I>Zo{T3e4(J^0=9s)iw2jBwP7Q2}XIQTqPUz+lJmV&OC2$Bu7DaOsuv2H#i z@*NsmnvKT!+5V~gxPRYgp7ndftZNwQ1orTyXRY={&^;#d<9##Uhh zGl^^#==bF|*oNU*s|W1kiO)v)Bo*-5@^gdnpnrKWU@hw~>-Q`K1D+h^AB)p2-pp+* z&I}W^n`w((pns8#{NW|AUrr4x;~raLUG_Q3g>3EmR$scsvI&N*0q!vK>4VgV+`G%)z{D z(CS-UwM{K{*r#K$pnpm=2C#lx9L3GT{sSzQ4Cj;R7Js!zsHks&9a{aqXRIFZJ$o_$ zYX&h0&WaI;NA`38_8S*fjRm<`EBLo{c@ECC9K@XTEQ(E5+ZWwqjkyx;Qj1R)Pf{!Ts z#YXvSGz|9k@NkADgYF5nb*erOH!dz0;;||=`G48B(YSbfKg$2RAAPSfWSlDYTDhmv2#emTVMmc^q6Vc3J$rv-qPv0sJl* z45<3974{U!UFJ79A6p?0y94=G)Cc*9JR(ON9hsMb~4PY`bx;H)qQtjIRrl6^OR zKYx`luVBy8e&S*75(9NCi)x10oyW~Y`OKPdyT{^;dt-4^(R}SM+KjhnW&^0+_Qa8V zR{hL6O!vdzxm8a_5u_2iMbo%3;Qn#c}o`T zX)By*Huw#B3M2A?_yy+{gR#T+NA9Vl`Pe+mznUtD-^9M{Olh`ZtihmDh z#l|67`XG#C!Pmw9Afi7xxnwe-cHz{_RH3;jX+^>$H0FvgK|WwE=CRq~(=_kU!+$z;jN z>ydC&-tfcQ)7IaOiLaddInP|lpn$6YV@6km+%m9=|SU6g0y1pKB- z{mm8ni$+{S9W73>BmBAP1M>AOzCS4Xmr&(jiv0>udtwr{R=@K=ZGRQlw{|aP$|0Cw ztDQ#tYQ-OPajW;S@}7b4n1ALGzZ(7{E>*F=Rg4!oQ9k%=O@B8_{ip1=@G+tJxytz! z{wIQPDE48+aimvGevBA5PE1}cB-ym?&BYu7)%+s%U}jfBSC-k-g91C^AtnoC8c zP@!3)=2qVG-^%~(m)8QB=c`M=eUn^pYz=3@!a?C_5J7Wg1t>@-sBYA($;39b; zyb(SKUxXiG1HvB>fCxkcA%YPhh)_frA{-Hch(tsoq7fSrF^GCZ1ELYpglI+_Yr-F2Z)D=M~MCzTx?7hZf=qiK2b)fAXE|a5epD% z2z7)8Vj)5ku?V4s&_*mq=pcWVAaoIc&_n1W3=oEhJ&3)CeTe;tbi@I~LBt_M1|k!2 z7?FiIf;fsehR8-7N1Q;MMC2e&A#xF?5qXHWh$+N7#5CeP;sfF%;uGRC;tS#{9+pI= z^^jQb2^qnPU_-DYI1ro&E(AA%2f>TrL)ar65RQm7h_#4y2q%Oy!Uccfif}`?BRml6 z5&v68Tti$(+(1+!ZX&7>w-D8c8bmGPHlpt58NnvQN*f``;uAT9JVF6MK`0`q2pWPw z&=Cv-6Y(>Q*oH_%Y)2#^b|8`wI}y7OyAdgfR7BeUff3IT&k-*WqllM?SBTe$F~l3h zIAQ`Z`Lm2*Gt(ql;*)=6h~)??gf+qju>xU>utTgwtU|2*KQQ7V;u4|=QH&@-Tt-|$ zlp@Ly<%p|@il1i$n$B2Ko zO#K}r{>?J=KQVt|@qKR6FJFDXJ&KYpw_h zBRb29ER{GqOLxF!)+|=weeI6pOu!@IK*s9N~ zR6170t5Pj}i%+f7`PK~0q3m1yi^p0G1eQ#X-4XzjkfESHmuj`3p`f*)kg-HiwUDX& z@oHfUwa3*ntqf&qL~O0BjYLsqgH$o)h;B`dJq zOz~*sc)enFyzo-$iKO`r)SNV%rL^2b!40&$oD+Wy#JS>u26|z&Y$Kz%)yAB8xhJ@h zS=ztXT&aBIQlnDESi8CM_380O_gj(BwY4e8_)7CZZnn&>a;eQ8#UQxBE3z% z-Bdo^z1@s@DyMxZ<6@_cxl-9=ySd6ukrjUy^Xt_*EY#X;S6FJ?3+=Gf9M0)jw)pK( z$8um-=(I8vva_`|mJI8(HkC=YMVFOy+E}P|+2TpwcCPTSGE(TWwYBr;vRmzOs%zz% zpf0;r>!RLvt#aOsad+K;esJGox6*!nMp(DK*Qrz84t^!W-Hw4Z3U}9pw%M&(8-9N; z?C#pg$LXuqML#RKyDsKU*D9yj_iyhy#j{g-oD)RX_qZe}s7s{r3eG6+S_x*~y*57~MP&%A@-@oEbw`0Kd_fz)+Dp|zWU=l3s3#=Ae zwI--mGNLc2PT_Q4aFhDezK~WU#Rs9C)~nXyNg^JE^|%~diw3Sd2=5EJyEfus)Vl`} z{o52DMh>NWK8zYUb^2lS=*7G1Hohu*_i*FbO>w7~@%n|2VkX;GIc=J{7x8~+)AaD^ zN3oyYK7ABN;-L1&vk9+u-pny8vVSv|>>=kZJVa^#7QXpC&RhAlru(-F8dD!9h^+K_ zyiH<#-s426;2xLlbEBspZLCwt@NM>9f8Q7^(OC8*$ z*1pPfKv;-} zSAd_plefDlSuBZPEP0(+{36N$3We)uWKEKR(kFSC6Ch;{tfLQUFuYAh-`1509}^;}FHH%kuf1(7!Ak&_ z<fFkFr4$E-($kf9say#ss!{Y>3rffdrK}Qg>|1(9I*fqEy(v25Hwd5@*U+n%GojN&TlH-R4Hk7IOPRl< z!HlvQXVx5L!r_yWrXS`I5LmWc$NVZg8qDELt6C+)gc*f<6F&6PAggg-p1SF`PD^Ab^cArm|#`23_774r$LAV6pb-gHt&)Fq_B`*m;-+ zmR(+y-J6&|S^YvIF@pv)(L=94@25emo%-DDZuA?6#|7?ZG$?h|)loP~110k}%gQU5 zpk#8u%V~cK`C&ejpY4F+QJz>JQQ&vb`d-QW<}Fd-ze~>PQ;6ZS$$vd4dLw)ftT9 zBTN`g9n}VYzv7j_C=Zu`!?H0XH9c=iz2xmv5_A9D4l7M-8%z8ld z3F^eC^(E8wkC^b#osjF+B%na6!_gLX!e_nEt1dMq7^Dh{STgHg6@Wv*8cefBn?TKKI11~DbLK$`Olc(_nCkB z+R2}Q&!Rg%AJ;-VIjo!3#wfw4^RsJ5vIxjf7L6|7Nx)aeh);>25yu8@epuaj^Nsc>xX}y5R$<>;^$f5!-wCGn|;_x z$wCQC2g8#cG6^Uoja4f35YS0;ylQ{Dn+g3zI&sHPcfRbcNeIXMV9pR}VZr19=_Tx>?^J{iCn5S2R|F0Krdp9yH+k1I#p+d*Vt!ag)B%lt#e)(hALm5mY>h`Y^cTp?@6mUq4AqzwibPiq@4G%iw+t z2NQR)qTagO7+qe6ewNune;R*EBjA$algZ^<8PJug##OFOgQZqs(_E`*FfWyUq&}4a zluUhh@44u=X3tHRENE~;>_u%5o=f{db!SF34Ky|!%X%L|gXb?7n_fXbFKia#`_fGV z?~8^X-?I^LnrGJe{8rR6m19e@` zFEPN8X{qz<1Fqv#dvmuS>h#4WwiRa>;L-c?(4hr*E*bsn6H95}%dzb+%Sf3}J$t^Zopa78>wBVBdBA3F?_Fi?$_|37XDggOjLlMyl&( zzj8o*@aZ0ZX@-6{E-kh@kp>fQj^w#%(!eF&n9KeW6V?@N-{;ds1Kw-mt?oTEko66F z7I=;c#v1L#@*ioSSdsTZO@si6`^lVw2bpkjlfZe~J2b4z%DR8#bBIe>cZ@rTILhLXv&aNmcG{^e*NHPtu-bqRoyysq|1fOmBHf015K)W$x zS7QXmSt=#I1nX4%`GW^7=F=d`zjNgZXBt>vro1mIVF0su_w(a^G`OCd8W3wm1IN1$ z&B|@CzFX~LUOj({`zXn(P{sXp-tV|qYRv>;%6w`f@-^mEmfFAs4H80j$WCEg8hhWo zp59D@?awk5C2+q!Y7hU z0F!`~{w;=*FVQ~>-kTjj-YgL7$G2{$&VzV1 zZdt>+G#SGr5t?gt-5xp9G^)f9 ze0YChV1M-vIg>kCi$X^_&$!*bb3{9GY^eUENy|~4nCZ!9gST6b>Bf`TdE`x7v-J|V zL<#r0*5d|Af(lD>OxsQv?UGRU8LDeLX_6*wlq_%7o@2J3YM1X`-+s#ckcvk`j#)>p zWtL{x^P&2V)627A8;`=$&OGZJ({#e4q4R&tiae`ROHVEB%C|eWy2NL=q3i6bLg$)f z1@rE6_QhUZ`5ukk=N(G}hZ|0r-@UN5BJ%C?;l{fKPL=WOycCO`LYL|!QTqC(o{MgE zX$t1K7WXcBG#yg+ebRKV$g?%uXeY(8x7fQg&+hE{=H3$Do9OI))5{-S-z52I`t6ISEst)*kytqRs8;=zo7uR<7+$UYH@9*LQ7rPT z9#?JSlhp7VX?=WayP%BmE~@oF^$tN1+RAfYZ38tsB~;fpMxA8_gm)_C>BY%E@*nldf)tNG+ z^;3EBm*Y;nxoEQa4{y#*-Vp9dow>Y6561=fmuW_M1Z-@bNpb2Y;9W|G+kI@iu6hTR zEfS?eb)xu8pGpGG2)dlxd6@}eOQt&(y+awCaj0`(HXYV=w%MQ9$b{bW_cCiG=ukpA z5=0lG0|8~*p3Q2V!Zu+SU8jPB33i)!GipEM_(dl>@99PP`+r;?f3%YcryV>jk{b!Q zR&~bZ##;gmU5-9F*2RQi(f!t6@8LKTAKb{tM~7LNT-tpLuzdi@ZN{GnQ0r;wzkHVf zj{NqMITx{Q|C0PVN{$YDp73&(u+Twp#O}pgM$VNw$^P zp2X%yrGJFP5wd^|J{|f(yctYLB%clGpCDkGF<96pNr&mPdK?c>wplNDU0Z_t zw$v|e3&Zsm$=nrNiDQ{PPvIm#-pBc(&G!cGv&*!NtNA(;RPK`8xo6VBH&uQ0aTz+C zxV`c26v2emI)%eLr37s8uZpXCNkFT3SW1gG6An~VN`Jhj(?R2Ck5j559X6Es(yn2A z6%21hiQ{!nHHQ`xXFAwy6S}+4mI=9YczZ+eJPHp*GQH5Rg_E;Amf`&dzBQ6Uw+T4x zTcumtitWCRvYq0493w83&-PNFgSkPI#;#d(C>mIwq7sa4%SY2pKP@__j6~=SA%9BS z@~Kx+n18Tp_SVEm5*-%p%6=M$`_U%bU0EN;1SiAbW_v+8q=O01IKIyLrG^&M1O0Q> zHA7vA4v$UJJ9WNb8<*YMc%%T!rpj!Uw~Og;h;q8EU6~G1ucY@YJY|CNEf4!?9{N+G zaQBud>I zZ9DlK$Mb7>+lGvNF@ODHXV-<1>$v`voa4K&oqYY^_4C(p1O#Ua z%nrr8Ot5`Gt5}a?mN#q1u|5KlFE*CWMmw@Hp8iiiG9W+oNSy)Z%f{0&`;Onic%^5% z8H6%n)~R>5khRs?JG3UhH~tD{r186Kp@r8wy(C z`k|7GHtWz~m{Sl|L^I)@!qcRBPA~0tyz~2amFL_O@%Se z`i)1DGnw#Wv|8mD1$E&O?~@E(I`kZhT`@a{31=@TH^w198&=k;W-X+He1F9H6P$^3b5eksvLt*XXxfMmYs!93O4Hk_0A@XY%Y8v@tid>y*Z^E&%;p_4bx4`aMv3 z!RE?x9RJqrDm{aI^Deok(2V&g-CZQ~@;m|YPWfRklbEng=#y##@>yiX{iKWN=YpMH zuQ_m^aylE9wLHT387z0WV}C%0#HWR~RG3US(WLpn6YIx~qif$M;(j_dFK_ZRV8WId zoy8Ha2*}Ib%UJ#%oZP*mj{m*LMeR6Tp4)>r*1KupY7KrVRKYpT}OjSgPlWr3iw%)2|ENOSDoF~InR=RPy!Prge?g$nA{ z$w1F;UaS|+>QQnBZ-1d5DMjPM$ipWub5*T_aD1_T9IS_aYt4Nd`U-i}^Yv!jB#!@8Ym7NX8Cm@*+>F-3tTzqi>UIi)SU73e;oE#I@cnk;0 zq8{C;B|B2Fj&m0InD$pPA;o`ic_HQ%ZS+a=1=IndE!9gT?D75{&aDC%M~3xhJ!y=a z{>r3HgM(NfUw?A1RKxp@`|@fZME=&XSF(vbWWu!ZJAGD}cPZ92 z&$Ji27tx_&f&M`HBPK{)+4KGp)|H$$FP}@+6X5gi`hS;Wn5Q-FHdW`p67V+e`m!^q zTjJZOr>n0qVXNnzMiG5F+#PJVQHZ)o*?i!7Ul|jo2Nkc)UxM|l^L|b`K?mY!Qe)h4 zCg^(}lrZC_L-g^Ob`tW|zqe^m^$M(aQ`VC{B6Nr;X^3pVIA)!X7QJH0geA>-UsAEY zv#>;SY=1}pI5)7QZ=XQj5Nn!#jr%aZZ(;Tx^U@)=^S&7Br)p`U^D?}zZ(>)Z+$83A zhWE^U!>H#QZ#C8+e?}zr`S+t=WmrSRx3w^UXTQX)-PkuIGmkV4aMB?qgLm^|%$G36 z?G@wL-*{Qne%OoWzF=DWEC$DDZR;#mHmons`+sD|XXAbywNf=ikq;@;1;zCkZ&%q< zT&J%RaALS=Lf04jla$x{`LG^m(ix7cu^xJ=^E{ZHh5Dw&;BUg~T&JC+p3b4eKC6vw z1$Pt;qyF;!Q4!R26}3+i)OaQs>iN8@ zK!3ep*c>ivt|5Sx`n<&d3=>F6nO60f7cO((zO8ylK^TBgn6ujY zvOU&|rLf;99OEMRK|X0p3i~c)|M%-Lk96dA8Kq*sEc;l_xD4ydq6e4fH{f~Zrlw>+ z!u^-~byCLJncz2Q*sug&A8z2iJg5rK!4{_e3iay1wPza&?h~-*^%-?-?C-kHmw$|g zH8HR*_|}Kwx;`&%9&EtAQFup2=QhlDbE)$9F63o}MC6to80U*)@yj_98L&<3be-H0 z>`Tc+mg7kRGS)t|eI&+&GQGM67gGYl+(Zw~`Ah?YrJ=on*0@h^K9(+w$LPm^hJNgu zbRxJoHkx96x#HQXh3h8G~75p@!P7|;)yMr?lc||$&^)(gu*OS`lsgHGo|7hm!Egu+AQo&=iJA;7B zbGSeo`-^2q1Fz<0GN7XCi^M)9>|0dFwC4vA;J5N&%gre|2z^b6-DQUU^nYK-P&)gq zUbXLVaAd$KL;1XzJ-ENcd(;B02p9|*$lV>sfHi^I7v6ZG4u|gP33VXg?7Wp+OKllI zid(QZ=^z1nGl@85)Wt<7``o0LFd*X0n!4UJe4gsr(1&w_lg9md4_`6h^O;#!O$rED zeD(6plWwRV9uv9VWmqrdV}EEi*e?}~Z%|IcM=kI72cHfshP z^f_?TK9K3=RG2Bhn0c%S)7 z1MaiMVsSE_bIX5X2Coo{N(B^aUQg7EW5XR7XjDHBjU-)1l(?N zY1k&h1d-!u{iily{XKo8_#O5Y32V$1V)7YS=ef6~VBfE{sDJ%VE%v_;cRdz%$2y|v zB-Nykb(4EGY&1h1y|hugIR@+9zQ`VJ6JMOC@^YVcV}EYHqBo(o68E`~+B_fYWxE}J zcLDNu-?F3oe=R?%5W;WA#L8vR!QKw~>;C#Az)qnO9cFY&i+0k+;5m?_{44&M} z#(u{Az_B>gDIv`x?_JT3?1#h#RRtyl+%ERe!F`4ZeQ6PH{FYBnCfsgJ$O!jdwiNUI z70aZSJg)Dw*S7m$9RvJghD?+;(BNWm-#n+q1WepA2~);%z4)kCY*R%8=_At1Te%4^ z^}60C%xOm;emGUv0du1U;<5eXKip40UtJ3y*-=ojYmFaUy*M{ zb}#)Gp+1Bh<8OP5>nvB;oFsS~`InaR z*HJR^sMWVdVIDW?z@^!qQ7#0WK4*U=N{@h|1bBE|+=i~`D(80V`$Q_-0mc#&x-7DH4-#D8Y4z5(q#wNgj1n(NLW2)76FanqPFWbsK9OUs#L;+ z3Y(Xx6XIL2htcU6^w>&;YXWRSUT7zkC+I|=4;}9GDZRUk&lP((+xXL{pi8LoRpBh@ z%y{wU(?u$Xmr?Tg{i!g}@^apS78(RitSS>xr-Ej7=bEqI_DQ4m(EZU7`+vDBawDlg zd$A*-5ceA&uk2V9NC*2WfsE(&RA4I>DW|4WVMA%l#(^+8kTnk7XgNX!1J;dO9~`Da z+?S2fW1DEuR9Pmu-IWTK*F?3%W>LXmA(LgxlW#pFo4VLRDkMFBm*!wWg*i^IoFC?4 ztqWezSint%;j`Ngj-^n+dw)v$E-%*J;nvfZrK2dV{ zBo+Mir5Cqsp+jQF-hfl5snAxtZn$PI6$S%uI_OFfpe{Zzb;Fbj(tq?f2G*HWXw^)) ze~FzA*rE@0oT9>&-W$$oXQ?nWXePIjiw;%Krbp=|R9NF0!7p4!g?CX>p$R-#(`V+H z9JHfCw&$%3p&e9+aDU92IE6F1?njat6E_qB@(HM|#} z#=gZ_#wYIm(|9TbCyj1X-bRI#afxf&u?Jb5t9vy9<2SQQK%pArb2n^I*)xU?BDX&X z@}b|dqfECZoTI||gO3V!s?edm%#SPjI2B@T9$$||-sL*c$bW|&33zjUr+4ZKDr`Hy zg`nX6>!Ys;A7G_J=OQWL@#|DLup(dV%zi4Y9@-faWr5e<90^Nup~CIBHH0?Cw_=C% zF@Y60Q*R6zXYr(hXw0h$oKFwb_G;;q*Y31>7{`bpVKVXLsYQIAg6oczJ|EZ zMlUs_!>&9N^<3nWqSHims2>%gzgXP0=Ee0x)=*|-P=8@niT7Dey#Jk+_L$WiIv9T1 zQB)_7@mejt)*JI!Xq24xZX*poX}rJf&qsxatLU{t$lIE*5rrVlj83OJN9XEPNjgkE6TIx3v=Yf;GJro-2`w+Ho;(a$`a708KHSfA!( zo`Eyk*ngeo_ktU!(7|SVMIG~IcYjhAH_pld?QOhg)}Zd>*79|4r-BTra_Os2*y~EM z1#u@)!L|0w;S%&`YrC<9Es203$;)1&$g}G_k8CA3;`y34&HUm=2OD4g`JZl4p?K@{ z`E&65d3L*`#(42dsN{&N(&6Hgt6gG+RM1{|X?7N#yUJ$RuoGvr>?_P2B|rs1gNnyK zaet^A*&~r2Vsr=>Y?O`9qXG*#ufzuPZ*k+Uwe%+;KB1dEf-?kcYns%si5xODNQ&QW<-Zb2eBwxuOcLUmUylh zL4_6S$LYf%IGcutCZ1KGLXX_&3{QNW49iOYCe83*e{$bZh@wM)_&R2aQJ92ACmw_@<|gnyML z6`l*fpN^S_y7e@2XA;&Ikw9)ofj5eJ@@iNTcu83jV#{~2!8ME%heE+iKBz4tF zD!e%7`@jijGOZ7_Wyi2?-3wlDvm5s{Vs%x6KbwHm#Txq-uSH(@du^kJP{FEu*Oa0m z0p|kZ;$AADz9^m@iX>tDrR-Wb9Di`eG&v-D5&0msy{%MhITc#^MecQJ)8Sa@K8b7S zhnWU_&u3#Eb;vIinj=q#-5m>DccA{eNIU0G+fpIMQ;su3i4L`aeV6_5I)|`Cx!ffx zT-L3qLvynO&SAdYHm-JKL4Q0sSh~CuXZ#!Qn^?q=_tSCDG#AHz`+qQi{Ouqd zU1d}qzte8f;y>J>6!#*QhbzTr3lOn@cTm_@T_C%77_2OB5EhVWyJbCu4<8kdS-qKF`q;A)4NL3f*9ch@S!J{)_Zrccc=BK1B6+QI4s zhZ_?nzY%1}k;0_ryCnETgB2qQ+^f;cwqg&1g?rPx*}NySE{0=Us`;~)fA+NG=%<{9 zySel-{1L{w&`aWVzxgo8wyYrY^DN-6$$pm_zU7v} z?(t0yw|Mto$W!NBdVH3$A2u3jfJd^NE%hwd&mSQg-hM7qO=2*YG3$#Nfqug$>y8lZ zd8G+NVzdN}84+MGy0m(0aZCH*ALdlmR%TcE;JuEJb=A$l0W#OiEhytqZcW8YK0TokazDR>!cr?eUZQ?r0(hptMq)I^ci2h?fU@jR&RhxSP z-mlFFc=4_SS?;KKoHMdNRC$Pz&Rh@{*{v~6y&;@E7PEOQX$$S1S zIJ>tGbJr{l-jt~n221-%!{N4485_qK`td5^3QfoQZq#&h{Ue5~bXLgt@+bb<3t;cG zFRL(x%uFJU%bq?Q5^snAt^|7qSJG^#ZZvqaR>Kx0A(e7TpGk$>6^V;?&+Jw+EIK6z!U?8$#&jjv|@JCuneJ0^&9Z0Q$gAN4XNt-*Lc;2-M^ zp!B)Geza3OiFEiJo9gOjUApT(^qe!HK3^Ip6WyNCaUey5MqUS zZ0Y*^CkI}p=b6s|AR2+CDRZ5sxAQUHi28x?(3&YxZR>e%QNcd}1`S7BbK=u`a)Gx3 z{!(To#7kj!yWZE`V`i@hvX^2LBiV$9>XP3as0LHSMI!g1%GD@kJ@H3{-g8bp3*0zc z4uig6T>5kaYKh>Qv2QKrhm0_#qv0cGvM1AjyA2`A`_WH8oy~xS1g=q!!^>flf@@wb z5|-LuU!J4&wXCpfCi)1^SF9)DZ+xqggZ|Q05J<0ErHO+_sGo1xt8e$K+7e%s&BP2R zFKiaSzMqh*DBjupcwF*ORNbX1Q96;cp)Ze#d^WzxM!X;o#ahsF=Jig_t<`>hSYMSO zf)SilRYW`x$Dj^}Vjm(xpF^p^C&PUvfL5@!N(Q&7m87C2wl=ss2lROHt7DQ1QtT0G0~K3k4Hp|#5%Oj z7fOrho+iVl+Kz}-j1^i;p1Y}&Q=-hWiMnte)&u~24+dSq@E3z=1izGLo>-h^a|ilC z-?z%F4x}f+v}Q+qY`1%n={+RTtOo0QURS>%+n!HEmk)bYcGJYrLdRMQ`jsnbl$Hll%pz zq}2|nN*-d1r&e;?@e|+njGu8CM%uG<4pw|3L}Q8^-Q+cV)yLS-FW~+2iIBU`0PPD1 zwX4LqdiS0>rlBBGi2la~{tLYoG0gt$(Yohs>8HdA5726sMv&X>I}#vXc<6|c&V_lf zv*bGaeMR|?5Vp@|CAN0T;vLUnsJq5#Er0+#)#=9_>+w%vJAxn)tw$gnBj|LP6A$qr zsY$E|%1uy9PA$*ppl7`PCF&UOg*uO-#jX^D0lpFymn$f{(Be0wQPs!u9q+Gt8NX&Z zI|@C%b}zXLetHn;S-q_CQtAta3?>&k`_^0uFe?=d5P--2oZ5=J!BJhPZQOr)(Yywx zs$UV~G{B9*_$)`%y+G#Ple{K4m#%A*o!ITnHoE?p<{Uh_;oyc-0M$ojiS0U*pBAt4;4_U^ zl$J<)yg_ySZOY7L{(a8#I^_hBF6lg7_N@caLS-Yuj%OGiL*0IZ$ z!8TS^^Ha1#S^dq-g&0$YVU*DsUWsX8(vmZAC*iTl#UcM6esMF6xp+g*#ek=~gb3y2 z2*#}9fI)9-_(0GBjrFwAKR@t3veJ62zlh1tz%O)@Hux*;3Ft^?2Hoqi0=X8gR8I5{ zeb44TisEqp<@vN1Qs5b|Hs~7H67C&0vt2OYp8_eSu#M$SZa2nD!s4KpU(8NT;Wjc0mr-?W}uw1Wn^7cSx?jT8+5Sr_4?syEk3T z$qqvGCxtmf@pQH!udF$Twsy3{5F8_cf4bw~HJ@KD7?QQMDk9%+cYzE&a$F-&M<4BB z@{HloqqLdy{+y6rB7^vNsvZ3#I}Qbma+zRUgv+E8as51HW#H1-eT)*^ajnagkTmYR z$jcehsdOw3#qx-O4c1;gO<#X~XectR`$`14$XlyH&6>eC#G{qRGG0s`{DB6>j#!;- zsL3u$`t2uAPnyEbS0MijK~~A4&5RQ5H~3K1Z*>^16$QtJ8{w`gRo+p)9mb9)Nf?uo zumMk%)n$@FrLM27l&5cPu#~w%Gu!Q}#Xnu=(~sg-ud+r z-|${MyO(qRMtjD<4`hX&k0YgZnM{e1JX~~lL>}t(`llHHchQ9?q>BoKUn47PF)*~< z-BZc#Yqnq?g#acgN59gkmfQr$(<$&?0`mFr=7+J}1N!(X?1f>tPx2HB{_vv{1_rhZ zBKUR${!qd`oD{;(Buwc5Jkk8hD+>#zdrI~A&{||32fenT>=(0uh=}z7XJEju;pV8~ zaX=O#FQS$3D4jI^;|BDWm^slWIDWBYqHBR!VU`b2;l$Br;|~j)Y=dI2A(K5k2q)xc z@&2{%ssNva{tU*DAsE%&3H*3X;=>wG4~st{Y_bEI`uiZ98+bu}RtGUWn9_K2jhP)2 z&I+{Y(|Bl4hmw1NZ0wRD1`-vO{ zXm~ZeoYJ^Hql-KQi%xuTT3uO@_TBlsL(Ytjb)d2m8-#L)v37NKQldFPqebUdY$~Hn z|70-^@ypYEJNjM+H4$7SuY7$v&4o$!y%_oq9}*PO=JOZ|B`6!IFqOGiyO|<*8Y>J7 zlkvsCiG6KRVSRZ>J*c5je%aw9qGA{W*pcwY3}Ese{2H)&;I=j1Sf38xh+Cbyx40&) z%Pj8Ca$K|q6l#Ae+sDy&EsgZB-ly^_W2)7EkKA&n`fDz?Yp%rvUi*j#y*zPOSE>?j zU40}!g7|~ESzn(R`~^*nUYq^c?S%ug4^X&ImW0n*rIQ|Ygj;hK25wvAri}4X)_#=C zZ&0apt0n-c-C!63yhUi4iT+2UzZ7p$u}*k0#%SrvI`Yueb1)1c0Kq8TL%m!6?->8T z`@N^~)8Qm$xBXnUNAS^0b>Q2nuPtEp?##FQr-)1-O5e~@HE$@kbZu6wMD<$&Fu4Av z*1iA*%|e88>?`kwI#I5}UaxJJbiRTvUtiuMS6<+nFGDx6!981$iS^tX=vl*o8e>&jYmi@|c2;Ft1nqk9JIx%ope0BpfQN0GDyxxQv#4GpM#oYx5yJiQA zotzB%#Z%#S+eKm&PfDxx(R21nyUo;ebjac9C=!CcutH0dsjkI)2;S_~pcv{}S5qxM zJ%Uindq!>MAx4;__MEK?XNWoX6*-q59R|q1;VIM&3fN@^clE59dN^U+qCox{UUcr{z55o4B+ci zZu1)dJ#58Hb!toLQtr4yH$*YBDid0`(nEFM+W}am$S27rfnIPX2f;e9U`6alRzXk= zu=hn+fD&@s4>^Uk4}aB(9DK_x3HJ1~f0R7Ns0|}E%a`k+Rngu`d|Q}(Q*n3z7|T|2 z0WdE2^QmGJ=i6M*JRjE#r}_-=5f5eNsmHTCCOGZG$q`9QAq_w1>q@|=O z*AV)iKfnIu{fYZidm^WTsiLI9rsAZ6G#bEM+0(M&tN)Q$AgciORS*hX6H_&;)O{?? z3bQCS1t{LeyP?j_$K2R{_U05B_h+=_L;JL_K@|eAc$yON+u7lIp>;HbrwUW6w$?vF zR$ZGyP3#1=6V2(D&3^PQsu{n+EWriP%5u$*$09VoB&>>lF|Iv~rqdXD;+?i~@XtFz z7S7_$9^NAOiWpU}`^5$L=O)5#mVLN;jkG~aeO|c}kacx-Ip~@?u@l|he=o9h4yRVX zsSi)mx8%ZtZ;l9>N5T{p_Ims`!XUNz4WG-Qb0p=b*!OU8=(Mo{MVSVg!OKM=Ipc~3 zxT*#xB&s+ewK+5KvkNn5)dmhFXyYXh2tZu}U~-_2o0@bM&PBx1sX z6@FRHK^t=YyR6sYcH&EBxg}&warFJy_%r7u+gx7=$ zBNxN`T^PIosFhyI{L(@o#Z7H>%~`hu%Ey=I^@pO|-QUD0*@+hTVSiof<7G7XQHuQA zXd9GNaK{B<5Y60yh#x#}fs{4Xe)HKLJ`HSXA9Ypm$k#P!;i3uGgks#fpwqeY1a(9OtI{A6stZeuwSA2O0o zYc@{C(1&P|3YK=RH*~xBqxOpF#e;9_XRlX+tV$EBK3_JQC#x><*Xp40lD~WOc-~Oy zC)3V_;xaoi4s6&SuG>Gu*HsW4@Jg%~pT0--k3;Cho_O6PZ8qc@_0{>Sq%#fNjnHbY zFasRB&t!%j!2D8Xqo;7b>*F;xA4#LU1c(=zouOq$_P2!LXfRfO(}|iX>qnMfWR9`gB)61MMHx z%1@FZ3iPCUWvH)6BuF~5V!dV-UDj83Bw@E-54g6KfB*%1dT~rPB?8YD=KDG_3?_!^ zpWSxP;vUIsw_eOb@3<)c&02XWw1-47h`odP56ehZbwzAavMflwrb7hkjUrc*vw;aB zxPmHp46JGNSRn15_Kg)TTTO_VT@rCO_Qqc0nGQ7;UZom24LNX?7+*0m82M-WVnKip zBV*+baHW-#!w4f3`}=pN54?!r60^_+4Ji`|O`Ek)c%O}aC<>Z-9LZ-`oEA5GY#-33?b9o*$)L@Qejnth68UCEr5R$9s(%b#2k5r1BFx%yFYl?->g<5 zkJx)}&daAW{K|Xr^4(t3=}?l$GBXXSWI{?vhRj@+y62+3cGMcK9@8#Y0R zt*kVvqd#OFkMNK@TGOm^ukM4qb*{Pm>e~LKbrB^rKE}fB1vW?ToVaky zt+faUQ%o2uLAB^JosSQqLi-rDqmfF-O9ewAE6(xkxlggw@0{K+L%X2`f>hhSK8%Tu z487K?GyNK1z1MZv%0gtS35rT7ru$%Zi+q&m&}g);8#A>w#qhJKWUO_=Mrd82xET<8 ziJ>SB1w1Wv+^rN4@@*nu4|x%u8LKri7hnBSpS zNdN1}h=Rmm?!vK0`2!iaTB>IefH-2Aagjx0fWvS-%n>y`ihd`J<$C+0)- zG~yI5GFrfM`lP#Jf1nQ)SxVkB6F&hEk#W#{^?erAVO6=dMr4wy`u^$tJ%gxN{F}XU z%5Rl(dL;2b_x1_=%(U44FVQ~^#@s4*&~DLp+KtEQ($+PTK|pq{rKTxoUd^-8U8hC_ zPkFVTu_I+7NZALy#cc?FM_;0cS7`*cg3BCHz%~V*tFZIHsQsokN>(}A?8O4mv#&$? z=raD+VlcM0R(;y*RJHr5=cid~hQ{a0N0Cn{R?##p{!bz;Y0u4<;wacmco+@$=}gH3kZ(_>U>8S`ob^&shjm*Y#6`Y;l#uoH_Q<9F2q{#D zLg4G;T*^HSZY33#8yJ{)-4OA!I(^1WpMRl>trKeb_BaT6%9*P9`Iez;4=k8Ovj4P5 zj1~7W)~^rm&a}vzgu5)I6=IOD4ICJ?jD86yi1YJZK9Irv*u|N1K3A~}^lDh21Qa*j z8cp!Pd(!PX%KS1~rlI>J1EaIg5G2;yb9451QTXL6UFO5K*c(%;X>RU(yEA5gGii8f zk>iKR3d|!?B=x)=6ruS^S{UR82AzM^CjnWbF&p0yjK5nHBPoz=2mCp+h72uQeyBmm zI2!C{+n8srE9_Fpbt@j#1-OC6gg|0Y^-BrZD$t|y*XzL{{CBVA!9MdBrKO7d-qHRR zS4#r3Y;HG2tgs)>^GhfVJDyN>+yMlu&uu>O!>=5Mh0nBPphzZ1(BB3>!45N{q6${6 z+N;3oAQ~HmB|-|Jf0j>Y&iyZWqfnvDa_ErU%UO76W zhuElP#gj=hftD?Q#Si06%L6zI-vWTYrKT%^U#7Vi96z)FB6de81 zTf$(v%UduIL}Yy)@>L5M*iGd=`FZqv8CiZ77yHA}E7Lt+1$Vnm?vos~KTbf{8n=0P z?*4Dd^T2H4m!^P=?|@Gqyd>dr*T`BjAv?LcIiKhJIi#}V@gAmphMx#drzO(obP`cE z`K_i4^vizNlPu*R@f}e~&s9PUD>+1J`}ta?`QW!t%b!bmme#d^{(S7u6yHDn7jcsP zA0HJ(NyxN6RnmXnpGZYNWe3GMJVdzCW}EWkjlTI{2p>*Qq@)AcD{I*s*_kh%3rTzW zmT!MvRMh;Vm8?A%OgiQ+rYrP>1jot8evWR=9VK-UMyA8S z_E~2M)Bgpx>9uBKNfeZeuo`65v5OX9cfmp{NrL|Aqsp{-ri%gOG9xVAE6Ca1Wy5#v z>mRBJ>rd}WZ^ccIr(6fl@V%mEuKp6bA5xOeB)}_jEH&Fjwfnc!Oua9NeGWaM^xU*= zQZ0Ja{82DEFN4f|?^7=Z0=uSXbh^4h2{U;2lbL>vYGI_$rV-XNC-=>kr)d;y{15Gg z?|6Bftt+e4DR@{FfPDYvXoTE%o#^u#|ALEB1%6Hew6Ga_!@x%Z-5RJ}Vd37t6+NlQ zQc|$g?W33kML9&GyT?7qFgnBVSM@>;gnSzBUL>?8W%%z}uNpQeCEN4N!GAZo1u`I7O!$5#fkSfg+5qp}yt~sYjNT$zQ6i@a`CI+*c>b(c zMN(k308#YvTiDwl(&xI@hFw7S#kYXjTD>AQvM^*gyMy$?QZD-oR zTj{l48LHMdIha0Qn1+6!bF z34Wc*3X&vdYVPaQ6?_`p86%DJaS=C->qN4izq$qR)ZHX=If2>Bcnz1k zi=+#ysTTJidJ}e2_ObTic$IeFZXzqH={7Bf`oCrR6htGn!S_{Y=V9*kNLz1)icM+Q zKk*+_@{WSq{Xr)S%C7lVmDboZg!kmU$ADu(ImPpJ;_bvCnMOgWN{=29F5QnlXhzeR zM=@>&<>+~OcNO(>nOz5pvJaB=E_A+r~)b`EU=i zpn;t5Iz9I1dNf-_URJMi%;sxYxOzG5*~b?NYR_EHoMkIb{M?UQuZg_`MXlPB8IrcT z{CCRlcsa^$hVr=e^jfTmRBlgA2H@{Mjot=Is{avP6TBXuVo-vl83kUN250bgCgo?& zt@Y??%p%J>Cb?a`JvCVjjc^a$Ni|4LbrW}8WiQxG|3cq;RtJLu@Gjq+Z|Q6B%3em< zh!I%r!pVHe7&dps@*LJWwWnPSO-!2{+^3}-Y#Ln;HV9RO8zn=9PBOnifm+gMuCJe$ z?3H}x9rsJlDyo+Y&CT)kZE=Ocwoje|Ha9;}Tyt^svkL;hv^f2)Xc2r3$@x?u1Ra&pr7o=czDQ5Z8R zeD`SWB06t)@)X)KsrlI{5r|+d5o`P&K{l|)D(4WJ!?+ry3ePg3sAh>D>dUya6c+dHIy-0H~gqYV+^Xh-SvP3-K51s5Iwc*QaOxAG^ZMF-O z*`m*7A4wJ?M<8|g7B0iiSUgyJQu5O&_?2BjKFN3eQRDdh>)5_`=eJ zNDR+SqUlxIhAp0_S6KT0A#}Fe<$e5vxJsxHzw!+e zFPh+M%lj$|STh6+W{J#g7z*Cbt{IC-DI!Hcj`pC61|A|Blgtj@P*qu18y#qi{cg(f zRj`?0wh@_hY6qI9K#}0+nu=rHc`|QCof;cGnr+1cWKUSNJM|D1mJFEkBBq^pwl>+4 z4yL+!+CPO{g}-^)pL1P{9(9^q9sBi|EA8^KnxWOJfU_b>W7BqRQ#oUJ4%&6s z(e^=5isWMsX>C6`8sJW*@Q|?pPfhAWNaVFdSZtfYQH!C0go5xtQJfOgm$nfG>8=vv*bRKEQX3t ziQ@YwEszwqhmRh*tK_Y`y_~7R)(dKPc50mop|m6Wd~eA91-YMA*-IQ8h=@A*xY17< zZl-4uOTu{84CMV-uN}IPAt+eX2q(T@@piMN3}vWriq=yIiD@_o+y+}|U@I!dGrMp1 zPg_fJYQ*5?H>^67HB5MC#!JoqJ(_pB=f*e)Eng2^GynM6fW%A*bAWYLHXMYs$R;YB zwA@e4nr_G;)}%3Ot+`W!tsU)%Pj81^I+9$ag6~^q3naEZGm6?z;|t$i{M7GSYT0|K z8Gk(=l*vYG6T!fG@kl2uy8`i99BTs3{?F#`HBqY7(p=W_Dl#xGyPj$r$PA8YmptvK z-5X%?bC|t-^C=VG-*B0KZ`8=U&+MUe-E-#<-z{iSfS_JJkz@vzXQnyCjh$v`9xi}} zU^g%=zT{;;Eo&Z%c&FQ-7R!2<{y%xTn`zmPLz;7xY^-DVJy*CPG`^jNvg5}nyZ07^ zWp~;{K*9R)Z-JTb&6jfflPT>Oee>9FHJ@?8rfJHx%;YIP8*K|$c_FEn&$x7Vv7e;{ zX*McA=R>nn1;$_pipL4L*jU{BAM%0LMsc$#f9ZdU5SV(soSRUWEqmZkN`A?$FKX(@I|^`E!dGkW>s*Sw|Aw_p_8c*|KTx{)gH z!n?EN)xM@>ReB9!QB-&)@azrjlg{mY(asPMotfTyMg<)@jpQ<{wcudFio(JAen@K3 z#)YN(2+*0$UKU7+C0EFZ{jf8iTh?pqmg>?N>RardaKV$}~G>WY7Q#v z>e@Wq;2M^Bqdl+3mmRy40~@N0XnL2glp-;vV=J(4I=oO2)>MI1bkT!wbjn5R^ z_K&e%o6oqRM=1h18+0iftxTX5DvBf9=UA@ ztNB|TPSZ1+1N%HF$9ZB{%emB!L+x+ekAac3Q|R;pPO#RIZUwqhS};+AGq(j^L1P}0 zj83oMHc^M{kIOasKNg?OvD4xuyAK+}lw*HUx7`yX@j^47brK}}zC5Tp@ulD%b~3em z0?vXsisoYbcR*C82Oe+Nu$_j&p&N%p?!gET$uCsi0IOuPB*tG&VY+& ztjK`~lGpvOqRpeuH||YEUGJbd-P_$H*Gt*(BMjN$^ib+SKl*EVfotMe7yOt_C}#W) zRKK%D=7=mYt|fNy%?a3(=XFe&!*L4YZowpeL!6opf5RYh+QliwtfwNtK^~hA5I<=? zf0h2B0R02COEDqGzjuF|k z>e?Zt9!oe{*|8+<&UySf{=%|2sw~skn5=~f&iG+0`Xj^xv=QEb_TgKfatL_y;uCk> zxb^hULkdgle7r(;v89w|Ta{;LqOwTb1&)HVO9LL|RIw1T=chlSZIiUaqJVH;l9Plo ze#o7)FT2L>j^-}LLct61+o|ZU{;j_H%o$`B9jR8|4KxDzJ^+Ysz+gX*rv0rp}uC zp=awSuJ0Ax;RO2y0}V-S%oq45Qr!cmJ_s+Z$1_WNyF!v)xHq)TI*mJ#iwIN+DwX#~ z9S52=f5A_;+iU$mm5>&``O!;l+l3Bzq##00jo)z;iDwr!Hv16PZv5dj16*C4Z28|h zgk6`$j!E_hi@ACKAJ6ao(Z9wjHCxXk;wCQT#{_k{t0?13z`^?| z+v?fjS#Bg^-C4^_Z~Dz7*|BOz#IzTlnqjhm6mTh}8Gqk={!2U2<%BU*TIsyr*Tqyk zjLBQm!v$GZ!Z!u`sMg^9fn~P))8`HkAqZp0ScynV?IMO91YY2*LO?RVbzk66tA(lD zcBFou;=0CpNvG8*FEc{ zwan$&-tpjjCTS}KT!ZfC;-JnKU1j`~JL%R8#+{1KM!R{0VU7fNw@k8(yRd&M37Zj- zMqL>3ik`_n{r7^YSL;fp9cec4NyipGrw?JgD#S3!wNWf+7BwW2`t!B#;d1~ZQ_IvDs1;n8G1ME<=Fi49tRY$;-4 zS{Qsttd98CH#B5&eZ_{v$COV3mpZqsuk(xl+St}iF>ae;fGn0Idglhdxy2_?i;l?f zL{j%}$}oyRW!7t0GDZS1p?UtdPulMvT9hwg&2T1=Gmk9J#PJ0^vR(7>%p)V7C_jD`l|$PWOU4n7lJDQtO;$R= zerUXL{izGerti>60qeNkVOnA-Al&eIX|fud|GE8`a?--4XsW+8ay5OA#X7XZvH-6A zm`dQ|!=MV8dqtmr_?qFW4>AYg1I9UQVeitkjkt2!**Np97|Q2sqGnD7k(iT|M5o*k zr+*5ZAECKsydFP4+%ESYgEGI+uYKTGXmG8&zsPLBccv!A!5%rw#5RI}fnfNj>rTG9 zqN#cw#zjp$N>)2!VZKIdobu|MV-iOpjHY`%z%ls?O8EGAyRN*beNV^BqrQBi)}ohV$)e0S97*w|nxmqV5CSn3T0 z|7etBI*~ZRrTeTtKGLTbxC;K`Ww~B|W+A|kU{(hQgVG_ZhDyZgWfc1_LMmO2gJ3&U zN85|G5MKi(LXC|#%wDE>dNs=|R8LGySr+kqmMui{n#7RknE%xp4+_C}hzL{Fq4Yqy zS;s=TSuNmmDgse>{v#}vtR{LstBu}w73)R@zxqK`=RK!y(fzOiTIKRTL8lV#x;%OH z-_7qG!xlo1V>dt`ziAV`=YN-%9cpt7KWoN95f2M>X}Uc9l&q7z(TxKbz2Qi9OC^-i|q1e<1#`bT6C=Yaa8RIh^gh&aB^R%w|tv!n{z zkJj?vrIz(Ux;?AEvpNbCm>?A@6FG~1Zx{I`-#X5@D&oTJBPVJJ%(p>`_S;ea)d#&M z1z~2?z!-2ewAo15>pF-CX=>1VH}Q{o9TpNe??OM!TZ~@-bqA94xHc_u^2$qk0raQF zZOk|tnA1F+8kF7E6kqUt2WE2SS^v@U2vB{Ev)`uVc)ebiH2CLwYnDBX#PxMb8`p9p z$U2YTew(|(kW^ji3^ycur=hfd8b5RPGJEPa)yS}52N}0nR#1TN_ z6`M8V7BbJoG=5^`FMi$$Nup{uk&g1`z3kIT?Qs-`U7BoRd~>CLt}@6hck8kLu9zj< z&PL0P-?F~aPF{0hizkHGuDQM;QO{heDjaCV8?Yt-0IBYoqAOfe_bFr% zA{yXqx9Bk4!eKYvoNTrQwloR6!RU{*r?U=k9u(Yg6PhE6cF6ID-djw>t0@gd%yH`! zq;|b=U!Dz3%zhT;yrJ&Yc4cVKc3Ytw z-jUjQ2aII6v9XphF+AjtV8;lf0 zYxgti{ahdBVNsvc{=`i*6*(JN`6>i69{8@!V*1<)r5BcX0A%vKHLSCIBh*O_wONOxZ3IgegGa zfSvB+4i|ToEuDFodo|C}jpd^-cJ}dpj6RZhvka4^n^dDRE90|A{)Dgd8xIxYTiGrm zdk$p!4UK*loRg>1$GtxKbp5^>K*vtJh$Z-eb6zR>s7;5-v#0ZdF`TRL>7L0plXkq4`b^#20%NeLquK z-O=sTIZ3{awAY`k+!=Gu0}n$cn_!8;QVb!G+KN9`l~@NV1$8}hLvnp`-P)tCtzWVy zL^1{|bIyQn5PgtOyI-i_t>JSIuR87Jos|=d#|H>>uIYuZ(aSs_E2OKFc5?>HZ-Z~S z%j?Lo(bhXqxI1G3vrB*JVQw}a*_CeM1yRijRayIi-p-ypRvAYWD6lB$&ocnBdaf2P zrRFVt8Wd$g5_wkr_+ZE&!wgF4hN6r&!_3uhGjOP!Wk7rGZ94eUQu6M;y^ME>pSK`* zXQvAvAEBVUP*gn#*p3w1bUM6hfn>+AgCAd`ZTRw={6gO9Zc#8e5t2Qb>x70t@c@tVr*%g?9RBfK$W%!CKg z!^6@F^lBB3T|t$PE58MN%N3$dT;kEW9>w*mBO8m;k8>SKi2vHQo(W$qsR}kEF0p7@ z8arFyL`lia`;z)J6MF4-2JcMWo_-V9h`~Trs4Z6|&aptL5f96;-HgHWP?bpyp@q!> z4nC#xU!NJLGw(ci7gt#pj7NNu8H}D#fA3w=Sjp$SQ~li*G^$h)d(+xb$S$?;<$d7p*5ktjuIM zuiX;(wr%fho;hw+(4lR9qf0=KmQZP2OCcSsIU*p0A3)|`6@(-#!Px=F>*V>B%Xf*o z888UR+H7U3`9&1t8A6#r{e~vcTPb@g;V8tE(7=mknZ~jwQ5#LxF z|5WprT&2*LQIb!_iq>3X_befm4} z0!RS@J|udiWm|Q>jSsT)h5Ux_$uoiKA$)_xxPeu))5a!6Y;5D7O7(x?G@^RXrF_K1 z{UGMv7aJ3}gUA8G{2R~F&RWgr{swqRb4ELX^1YH#>mp91_Cu&jH`wg8l zOKF~7K>{SsH%x(_y3M{9MZv(CHSWWHGvA~HLhwIee09d!KrvIFZ;-UA`Ba<4Qj7G9 zQv9^60Pc84Don2EM}Y~wYU~#19XHKhM;KnqK0MNZI{K9IQHc}(zoZ#RI*C>N>iFi^Z?g|B(T%XH600J9 zfW#_=9p#0OpTw%sJEgHH+Axl8T+^kzK!0Zsh^)ZxhOFPEe(%x%A<7Gn?sytKBP)Ls zgqd2TB^jGhZ7X$M#wx;hw%V?^Y1*Q=X})>3@?Oh|YgIjiv3YjARb5+nQRZx_X?9(U zaYA%hhB(iz7;WC77;UzB7TBD5Xa1_M{;W>sifWn-aj9y=tW4%o9+r`vZl1+@wPhx{>~UsIl)o{qs)0ElcT)5m}wJ zO00S>O0D&No8@wjZe)FTO6Gfwn!9)UuEAUx?~X-m1qjzmtSY__7ssY3`;f@W;$2JY zeYjKa-r;?xtiF_XKO=7&DdlAk0h@ff4BG-`eO?t{o^g;*Q%PQlQ?EunUB_$ff?8W5 zW*#k**Jocy3w)6LLiDidt;Vfzm{{?W`K4g)BO@pUsXc&=5*uB6h=!HdlB4lTV?!zp z&;bPJxj^4bL2I}<3e#wQE9}>fr6YPNWX-vU-tydwW;;#f?P@VC!n1x)=VBY%DW%x4 z4=Y}Ne=a>l%Pdo>dq`b)Pd2o`q7EV*wz=`8Utj|vh+DQAXa6;bv zipwQ|GJ-@4Wq&etZxi^JC-kbk1bgl&>WM1~Kstvsxtv)1reXe;utK9!Ah*qbO@5;` zUeQ5+xGKT5Bh90iPo7)BRCTquz=gho1=oP7y_lH5d97*;Bq*?aF?vjEFk`UUheRtE)n z%6wg0)7xdDO1v<4qphj+UjcA*F?!9F-jXUuv$UztSGBdVHfB!ev#BM-&v!c+(e}p% zRH^&Z7d%-$8ZHQ`))%6^z06o(T-wy@@PFBO&$~~0>g51gY)A)lop-i9Yz{i)Y;=Lm zlErIIV`%X|3bsw*~qE4R8%nQ4=|E*%6(v)zETws|*jivd%&N6Q;0tOP7@gM@6h zY_w@)aY=wkdKhz!YII4^19uq1ORTZt2@0wfs35gNEaF z750dQGr=lo)hLI4KL*Sj+`z3NSHAP7E#ss8V!GlQRPgb9p z<_zCHQ=n)z%VW_Jak`OF*S4BBo>nqp3Gu@u1~e$Gw_KKQV(2I3KO^I1VG*NE=ET;uLQbOX-IBXPfY`*fv= zsxI5_VEJ(=%8~IJA*h<%Buqz$cjZA7c)7c}2{)q)-YXXH0g0N08l#_g`S@bql;v_Z z=@5wIYU$$-@k{dG#dY2&p$K+XPT}M0Of)rq)an41;>$Nqy~_XMv)6dV=4nV$Cui-9 zZ)VilSmQYV<`+f+xCOV?_!@@GTt!v_94%hP5@eh7G_)X`C02niPctp+&9xG=EzFAD zc!`MJc(?iwY)8{G1IWz>{CRU}XuzjMCVAuHwh3j9n>|qf{*&OYJ49?_;1=QwuqVL?3D{ zijSUyu#a8!-TurjJ7sBYZUsxMHD{>!`Z!zH1*hEnK3v(DvYm`2TUz<3{C}qLiH2d) zMj9e|i+4vH?4tkdgW6F~rYuZDYD4o`yzp%Lp+B-AXUfWj(NYm^T=T_)@@!v3&fVy) zKCx?>U>WOvg$r|1jsm2nb;!zPBSjW%hUfB=;%KJ%35qa@#dw)cvEEhxFs+W`Pbbs- zP1`S9Z|~P^#FWM@NBMWBo7 zHcA#f7ZGXNct(OU$d3wM!T`aBlf99ngoOfa)3WHXIuizf4O3`WlIB3q{pZRXEX;=PJYr+^mEk%g1B$R#^lQ8))EUl4>;@1{67&7=*Bb7&ZB8`fdlDP)22PA+>7!rRw74N)!vfjYuQZuOW*XP$m2@%ZDWa(_9h zV__P3=_RP7d=yaRxUD;9!mkDT?v)ltO!tpcL2T8jD1nKuJzE~Qj-QvzL=0FcWq<5x zvslW;dcsn+4&v+mqGFw}Ou=0m(n+J^zK@Pmd#NEVnHqaACou9|x7iL%9BZ|;T;INT z?42?MRCl8iJHHw!6exu|uO9^?y?cE3XP;9kJ`Ln>*jeu^*vjVUYx(q34mgCslTuM= zFQY~_HPLYVUR9>Ommxxe=r%3VX>O@_;QjOZ`^iC1nR7BsY@X$%z0p%zf=Zefbe5n} z7%j`dDYosZ9LUYWcK*sD6)pd@{$ro#{aFIAPeqVUb+J<;s}#u1F0u-d`dN;;8OCSo z3w8VBgcT(f;{?W@&E@+Wwod>E>p5q^Q6`v>KwU@vUv~XCM?EC{)mmd_j!)q?<_Mb* z(7w-uBta$lzRFde+m3!s3q39*xEYixH=vlN9+hQ3r2N|{_xVcBQ8`M`bj|?}_!PC0 z5ybtSU6p)fn)^qB-`;o2lIbD>mu?Gv!T&xFOS3&3Ry_E8YM+O1AXuaRd2|7%Clqu` zkdC=2i_$J|OhxR&8tok`l3I=6(3nj*$&c}G@ITs_<<-M3Sc*KWY}dlIHr-HmhnSC0Mm+C{YVM&AZ&fH=AZ_T{4}FFG+DBht7M`O7H)w{EfAn^cKNzE z@~6hcK=Or+Xm-87yV_6hVkpd(c&x8a)EHr!{9CPH%hLGAx3=P!v4fkhypVTT42wrH z$ zt#P+Na1X)V-7UDgI|O&9g9UeYcXtUc!QBbYkGne@_P!72o`<$Es`{a;N3CzHnzd#a zO|Ze+TZ7uCykMrfZnAeU%x@+*j9VC&6gOP#gFsv>U&h0+GD0LN5z>k#ro*G=7f6WF zQzElLQrIa{MX8cikK?oOT!J!|;#ch5Lg0F8Tux>@jN!*EjnvIl^i)I)^+dR=!p|3lq+dx>tCsM~e-`PXo*bQCHz{RE2-q2KA0{B^p z5%W;UGF(F!bl>0uF6ak7IMPK_2H!;_FEu&S7B-n`ua*q_R^HsAY7V>)`PEy9MT@T6)T9N>ZMJ#np-;1IIY`vP{n8jz6c_`fBpocIp;> zb_$3T!{(I$yzhLew-Sw|~{Neq$>s2C3q>?%1w@r#CT{c!Z44)Ifp2O&;{s+`@$ zfim?oK_$OFjl2+eMj~U785Ba{hh=WnxQnN!#H4g1@uyKZdUEVGXJ@~Bv|RmzL3pb=x7f7OuKo01O=V+hsoa=69FN+Q50Y*Dy;uCM01L3chLj*tNZh0T@#51EBF z~TofD2oIo#I<9-3l=uMVeTfbH(!s3q%R9iuNM<3NmheHdW+_SysR85~=F(?{4f zmcA1(31c3GfHe6Ql5E!^mfYnD`1uz$Tw`Q{M73u2YnKztIM(2hPK!M<4Fhp zKDygO6ymD)GoaTs>&g>|dO#eOnJivJd4gv)dfpfA^bG#1J;_R9$m+1FNc%51KCapa zDmw`(JZ4K)6BUz^MsCuCLmm>(GnF{dY2aD0uN@V+#VE?a zvfMGY7_r&jhHnFwrSZOaHQ>QMzM(hSg`-uUohC+#VO#!lt`G-E`uV0YO?b;yy>c!H z+}6Kjr~kT}T#mn@I7zV^3?m@ABtqw9ILdl4JUwWfV^(@QO-c>5!1Vj=dBW~5@M~|% z;Gy%$0&cEw>7#BOr@&n|goBGRMOa6T&okrq&{|L`Xf6FV^2H>ehK8~?W+|ETBNI{Z zPan%y9Mlbuk1-`+ig@pec_bL-0dtvqgIp8y;#76_T_m*E)kT{yCocVzHH(h|r=K5T zw}AiIU#^s;F^4{N>bv#ub?W$sa&UO(R%5=RThr6xg5xmC6wnRom97wJxu9G;2q zCu_@=e6U|B1FN^V$K^tkPIhVexv>^oCy5xs<{PrIQwjk+S?2pLWthwO1WU=GA*|tn<2;B_u9gElyZt@kO@`l zYhSNg?s+ZZ4he1(q}EA7xff9~PCL4vS>eZq^gdz;V*r1;Dqd5V`unySNJtxGgKpPO z4GPN9YX2B)?dAGCg&j~waC=Thsd(_LDo6*RrRWQJlU8WZVsHLx@-$sfAG|1HgP*6c z-vfMzj}&LP_X?m)MfBHWW-|s&(yCo`U3Qe-j!PCd)RlIQrSDt)WSqx6{fndKUv`h{ z@M4^G^yct3#hDm&pZhTXhLq!tW4|su6Lc3>PO`x$lvL_|Mw+T%0JyNTy$8)}*%=lD zpd{26L~tE2FnHbRsNi<)ny2S+uQf5ep#it?c(C^@d`o7v8?wmJe_t5Ri+a6sNa>%- z*RpW3vt-9UqfoxRi#*?X$fVbjve!*|X?K9W+T^jPqCGJjW5ENS>@(ffq{2^+#o+67 zj$c(`J6PO#ey-!bI)VsUEL>yGg)eGu1>KVok82zZ1@lvab9QV%qTK?Ww z`wn2A={=R(%S9IDg%?3hi34@2O~Os|rX7R`mF@2hDrtQdE&q?j1A zWSXo%xgl{1i8LfG@KX44vP-=>L`Ks`IbrJ5cbo6Scl#W6H7iF!T;#5rywS!-GfS=e zW&dj~TU`~=7b3#SJlgs0hJ3RA`~b2(xef)){Zf`;Y{qq$>pm}K35k>SioK$Y{F)GP za@xR-0%_6Pl}0V;?#mx-DvE{g&O|0RP`(s2e52HK%9}hA0A_CFy}$p)&}F8zYPV9- zw^PaZ3F2T`l># z;`3dl(O*4Glz$n}@y6PYit$-Rt#@c=rM`UG#v#D1`ZPcxbC%V$`9%}mq;a>Rvg#>o z#AsU7uepcy1vt{gD~zduGyAjw#6-h8D){Kwj_O!Sz(it`@h$MZU1ixwy>L)#Ejus| zw@YMM`!%uk9ZbP%2LG!mcK) zLnfLrY7!P1TvKDc>&fWasYIh3tm9YVq^%SGt7Z4HS3uCiAo5P9z(>b8t1c%=7~lO@oUHQc`b}*sNWHi%G2yQF=bj7l15!5jUpvRS*+Jrn{DlYhO{OGfU>JsWy)9*`4_GqFkKp3 zFI$ZcrHo^+<3k?$oU-(}6 zI;mYmKUk*=v;J8S$iRyhiE}vmLduOxC@RL@c7d@2!?tDAxJ1 z{c1(qFMeF?u?S&1_%0yg@{+Ka~v(^~0ng(48mRWXSZpz<0%N=P70b?o>iit8s0{RH2O?az#{ zimxd&_mCp_o9QkXI+$5lk1Nl(7K_=U{RW=tY;5`={>2*`2e3oMDuT%A-?|UldT6?Q ziMskluiP>;R>yJnr52K;sJos2?dJlK9zJ|6?wd;5J=G|p^-Ol?<)K5?y%=^I)0t8b z^Bt~D%r9F+*#qqQGbvQZ?WQ4x3jW8mB-*F@E^PIVBAKh-)e4#lztQD2ZhjL_}e zVEjFRjVW^qzHBG3xKp4r-iyPU-K^y+ld!zUqB6}b_VI7;=+3*&QxYH&j*A|-`pWWa z&*1I#=AS6FKkerCNYxA65zMebI$z>SVw4Y_=K(8$LdpV{Mvo;GA;PPjshs*^R!up0GzA28 z{3YUowG_{)iab$*D0+HWIbH5j$hUP-R0@;PlS#1FGa890OZna9zInOjPJX}wO%1ET zcAk3P)DogbNp%c*JYbG|H{yC?^14>)(k<)fD;&4?drv2~THy>*b4P9KyeFZi!khlo zXq9zp7I`R2@_6&)wxfQ6>icr zoRre31WBhx{IlyGF=}sxjOU)A>+$Ck${aKC8^5yWb;R`#cCK#J#mk|`GRSqsWPyH# z-|0DAMlYfDoMrE^gxI@@DTg6T32}yn_fEH4F)6Fpd0vFeVOsFaqbUN)kUmU0VX)9` zfMs-GU_*OH-qSbi6TG3^LJOzhZdiN1oAB$c7>j^=@)wkE8^l{F5BFCs$I6hj-~ch* z)N0bfUyA%$f?UDh3#$74f{gFzhB6LMh3TUyrDG}=TRo{6qJ#Yb!bmAo3pB*JY8xSQ zerGsZTzZ%Yq6LzsK>u4V5vSWFq8TJMD77!|`rdJ$ zdsg+`&$C9i>N?;h?vYRzNAPNeBzWBT-&o@&d1JSccRHTJVXJH+SL3L62oDZ}0%@7Y z{Cwvh^`~jYcfaDv*C6pDSim_hB0q=-(RC+ElxL%?a0!;WscdS=@YSh}kI6vKAWz+w zRQqlwVt94Pt3*8U_n%fqm0)bF`1o=f6nAoIMFG5Tm41kgw=%Z;M-k497F~>6;>bo; ze6FK=7ae5vO=B{{#A=Dk%aqiNHK=!kP`vvQaBjCP=%1-*OG@<4H`<4b_psB42(i3t zhmsH2|8;-o_;i1#H5jYW-~j`BE(Zf+{&at5ScPF}nGA*0;=zZ6`U(aH1_vhe*~};w zyxj*L49xxWp!;n03j{-t1nv$WdQThy2N$Z)m%Sp-0<}n}qxzSkNaz_7BRDuT&ulA!bqw^pCRQ#XyxpSg0B~iV+pdb{*IO?4oX}Jg} zk)lyz`cdK^?4_ZoO>9NOSqo@_utJmW3L~eXvxGh)bQ&ca4(15Vw z*}_PcQ^|%Mk&9Q&5}ZfNS?BN9aT^_kEbm+JvEv4`$;4OG50F%7N6jR>-8?7dYhUDn zBg6`e?p}eZ!&nWqx`T@HV8h0#f~Jfm_MMrt^aCgSS0$x+QNuzK9kek!DGgLOz)JPfvX{w$KEhtTHg8FLtX5*v26v zn{~vEanR~KET8qE7hO&8;OpUwM#Jl;l!>?>0f4Js?4a(}Nl%S-s!Cnb2(Up0Hk@NJ-5M+^eSkv0WYtCsz0EXVGR&|Z@@Jbjin*bTxU zrpQ(yUPN}}oudBl-z)3YL86luHzrRwoC)@O-Gw2y@$6C5lqZ?o-$hL^R>l#f>VwyM zA*Ft=Gu`(|g~R?f9l^n+#4wF_(;g^QXZMYsk?*I##Enl2k!X&>W7L#T+8y~^cb))f z`tD|7q9VPmtlED%GV0N^SoRVNzoWOKfX)YOgiq&hiOv>G#uI7;s9XNSNv>X)dm z$dGX3{Jn?jMaj#rEd&c?%A@sh>t^$TW!5i9Kh($LofLbKzsuSj-f3w%0vi!qJ1orv6nLJIY-~CxCJvt=$GCXGjk?D$!5TIVS+tF#)xGa1W+(*If+WqA3kC7f{hR0XA{k|JYX~yNQ zHNNs8$b#!ZU6}z=tRV8u92nrCK9+o2Vk#aj8L&|7BwX=76>G2Pw=+eZ)k~QP04;riN3)tRen6NVK12T05GCPJ;H?=iod zSk>y^j?FB?l2n zK04pa-NoMebgq&^-SF7|7|y!{&!EV;OM?mzZW2XTRjSg;fuNeX;km|t^Iz5KLv6|< zUw`o-8@!*O=hu=N-`Wz{|BLqMa|^_j_f!jT-!ArT6u;fm;F9wb%l6NfPdIod7QNj0 zAc10x%ZU>|JR-lghWq;sYWFMDZX?`8J_g>ZK=y<=C52YObQ}?3hIEu1^EE=^(BC0S z<$`hgA{@`84nWpVQXf1!kJ+-9(KGAstl}usHSD$bHJ&HoBaE$FiRNxd<^hBvfe8qL zTV^uuriarC=^1kqUSh*ddisMGM1L)L&2g#F=;{*QCYbw5WEhZ=_oqAFeI#eZyQh14 zQuZfJLRLDC#fI^cB@Ju#hv$f->%SM0&O^Hmo+*?s#Bx`-ap<0KKT;Nx;c3=0yX_ zGeLKm74XGX5W`mhqb#BVUEmH^0BkHs=W$h!uE5~I@|DTX78u#Vbs)&ck4jLCp=V{~ zm4q<@d)Hxx53AKuz<(|B^*cIeqqd#!MtBFZC+{^1C~LTC_)i=)h>9g@oP?4e+q(M$ z*NC;t0Ijp6wtrnE7rstv;E=|6o-PT;Onmk$;Ha%sRD;(}BfrG!&HPv!`*lJ!qS^c~ z(v5eH`ltz^pwn1@ylZ<`weqie9D;){>MC9;X0xrRQ>4fpTDpen*rH3Cj$Nr?hS5)F z?E){b3VI!wkhN9z>YR4v8l4E&W+hf5raP}3`y+?V*`-T*!gC#-`4*Q@`y;r`S@2Dk zPsyKI^|lVhT8nI{eHz*(%a<-;-xSsnV?W+37KJ#XapbyxlHTj$q2D?748>Z%I!<{9 zaX(Zd+N1d(IydR;>s>nk0$CBadQIz&@-lE;SVe}~Up@~(u)mQ{G}@FwaMHA38Dmv~ ze1+~|E4Jk|*dMch{*%RB^>z#NE>?G~20|G!KOIxq_0jBL_0$#`4dcan_#l5N89kP7 zb*ayn*H22;O#;Fn>wc?xV%O4-$IcGBZ-7-&jtJl3o)ior>eb!ZGWJ7$*9$s%upxqqAqm6tZtxeYup zr^njC8uusskO^{sjS6NY8FA*@H05>1EL3%5VuSM2KK)U z$NLFq>R*|sI6uLR1?Ka_@JVMqQBaIX;4JVH|E05lPddYoh9Usc?f*+>7dAN`f2&P+ zfz02vw$GHvQQVtP_UWH=7CNgI6%<7CeRg7FeYF8(_t5x9(s*7`V=Gn_Qgwt)B&k$d z;A>d`2fdtSd@*xT-uG$rpxD?|R3Dm4dY=>6|Ho!6D-(Cs%J-nRiJS-XjSf#<-jxyM zoi@fz3;+XLPft0j<7W&=Rt7(7P6nEl!08u_~2p|w?YJRp8zVuIfbgTXPuf*_f{D<{KgxDkbA)$SnFDqv`J^!K|h z7_;Y(Mr#hu1197FtBhVzlWL#Dmzw^@>vZTjhmOo5$S!{&WymT2izLr6I`grc8#}Sg zV^UU;Q)=E7J3acR& zx|{IS74w+Mbt}Qa#4!D7^5cp(p3jYrIRIr>@qir!b*XumuB9rALLd*sFu zyxS>VdF+^bTgxaj<8L#6SxNuTwfI@g(F24fXG*O?Qo7f~x zdm|OzB2hmov+=MiCmtMTXbzW|h+1T-;-WHIGTg%+_5pxZrr_HsgzGf)ZE)1M!tgr5 zPtzPAZ(g`z|A1QV72#OK2W=FzPVN0$IVs(UJ{5BN_9u3ux&^ik;pnXRCDxtvC9dMX z=!E8k>_qQG=)~`Y(+1uK{e<=jPyTD??jh&Surqy`+qO?{ysxZb%eFNhzv#dGhkNwi zxV`|R_MJ-x{pTzGiV{cAd(V(6bHu6PdB4U2|4T;rrqjfCpbj4$C>_X34gH#~J(R0q zgFhlq2Y?LwTKiq^e|zo7O{x^giZLBN=>7M_zVpwaTOr^Zz}W%&d^R^F7x9+l7cc$J zk_WAWgFjRkSBz92OpErS*@urnhQsyRkuDgf*xM|=ZG z_oJuhV{_t?wtQ_aqO|Mjw=O#3^uOV;VS_^rH>Y=W?s@xjj2xP{&)~_wKPnjY>fM`U zfa`K%pt~C%m%pa*;zqlm74Q#&)Q$6#DOs-(KOu_o+fZD>uq2H=F%z(t>^^3G4fYW# z+3b;X2@}*Lb){83N5`wxU<1NEn?~jo?^5VGcrl8;PaI7y-U{KVmrb^6DLP;uq$n?9 zcKR9~9sWo1a^M*bwegwGPVc_0nmL%5z1pd-23_~xN%{ibj7C-84G5R%4C->8(4p_> zubO^4q`XIP2Uu|@ln;Qr=7{GuVjuf*@ew0^gi_Whlqb?i%Ov!jbbd%S#+F+T zsiJs6{ho_H& z>cWXqYuvshW1n<3u#R*R-zuj?PidfzBoYqbq}T6~WINbvcPQElDecrxckjIc8`Kc= zILU2G1axCB%A!MwnU|uWrD676$J`RXRch)}KhkLqzx+Bx#p;jOV0kLDJFx*j_P+n+ znXK=W^B>&WFk}=!(}&d~pQtyA59;^%#I3v+X~VAUIhpca$-3tIHs@RnmkxVgO`xv0 zU{=9fe;3(bSFLD03d%uZWHzF_Ns~~bC3aNUTi$i!%~vGD7<28M=srH`_Pn;>d{oK) zL7+bk=O)Xc{~Hu7RawKPUDUEWY`4I|znT|!i6j%9DGxaUjg~8+VEAp=iw(eCF+9B> zJmK*zl0tQ;&Zai2nf3d0WGqOnh zd_|1^Q~SNSe-=zCucy8?A->04<&bFw2|E7BPGz(fNsfA~n62NAx={~nHd#)GL+^g= zCHpqJkdi!mwfIl^q1MHQ^TpF-+d;PXWE(CUz{Qprv`Sfgj((@49j+;gRug;O{pg4+ z96w--kakMhtsGYY5}VkZmocj+es341A(N*y9f--bo+~~nq{+wJ;OKWpY+Up8iD(q& z@G8YG^_j*By5MU3xXqxpf~?bEX0-k|b+RH`s#kPX#Z*(P5nZxxr#0DsL8P;N>lC>#F3CIYbO#*CtgGx6@1ffMr%IN z7LI}<7nwexf&$xkh$uxgC02`BcvhPQ==}GO#D3Nzyca`mi+z)>j_4JR!H0|l7lX@@d>^W@1A5rG!38a-ZWX5~_#?LP7zOveE6}j@qrA@x2xNP4l zDD&h7DjzWCVK%&E6f2}fSP%|6dnNPCbK|3e9!Hy?e3!z#qz8<3l7=|&ewgm!Mqa`z zd!`m%R1{4us-}CEZF79tNoR+81F{1GE4H@&HZT({qwd{CTtf${Dc$*k!TBe(?DvG@ z_8_Zb5ZAUE8Z#3+tfRoxmWGuIkbLX4JX$*D8fS^*hJBzaS)s5%_&t(&3wk zB)Vw&^O7S1)<~t;d?q{NM^Cm&PYhQp#&LLYz?p_2bFI?XP%1%PwL!FNB#HSSHfU;L zM=H{G7tAmimu4cnOmGp-(W-twX6+Sk)0!}g>Fw9PWji)>xg!^WUN&@59}u~FXVo9) z*=qmVksg|ya1mEPd0&Mn7XV>(Glh&vVNl>xb!H^Lm5DHMIoetblv4x^Hk=)uvjYgwxn_Qhr&F%^|@pC zEFfrMR9QS$Eu>^i%f`s(ytr25`_tQ!Bgm7Bm{|LDZ})P(-4Y76?*i#D+1}+{P1}gm zQiAn)+2v;J&EIgOExtJ#P{fC_9>i;MGZs(H&&BArp-l$-^a>~p@SWGLEE2B#&aNJh zWhxOq+uIVc06i;5c$gQqAX?J(NJlNMQi3g_5@NoEf)`*j-<4*4VvdG&5vC+?R(9askw~W==aNSO`o1*)JDIZ(D)KI+jHT+bR6?+3wIaNVI z7CSGlmzC_5{s-YpOMT9_SG3zlmDX{iZaxl{(B=-E9nc^2YH-ta_u=MKT8>uMc_P(z zoM|CLf6MO%I>^}WqbhoV>CK`xJt$!j4nhRV{9fJKYy7zD%21%|LHoJW8mmuDk)BeD zW)4;!*UAi)0|A)>!4&H5Qg6%-eVKn*G1h2$yx2;);qQ#%HoE0K8?%eZOC9aLrymkh6MC=7T2a`$a`)(g`b6akYon>N~ z_S%Fyrz(Ud)kGXFvEAMr2RnRK9dtYXt&7tt5XJ$pWFSPb^zsZ0iP4}VMHTmVsg{BY zH&=DX?#k6KVbBjNC7DI;tQ@Q2Ne1x`hgzI0-ppjfe}zh7tV9w+;Fw1lkR{p2-}cHs zFGPpWeH;PtHo177@i??n_2r0VigemCp(E^2Vo|rugp^}=*>rJSl%x2C*S7Hj8{#?Z z>W=RbA&leKStkq<6NJGX1x}I;LbQ|vUF<=vUi89?=(i(;nV!@np+?}rBC@B~3g0VX zd@sG86V4E~zf(HNU0AoyWn4$JkcHpMW`D6jIKAN*Taw%^w8|9tnx;NuDCtEII-ILAz)aS2u{HWsvK zvA{A#0*jfrG{su3Z@;NB6!RS0EH$8J&LR0Tn`+>`8;^+b#Jh_t#Klt0)TAFh$hOS{ z3{S?*dvf`57}~HN6mKrN6xw_G6?C~Cb_2ljANvBoi-Ze-jkjQ|H|M3aYTpXG1i$Vl zUf!-d<%;(s`4K^bJ4XDw{F9vb-S;{Cy9L3vm-fr7s^M!1-CtJ>vZl zQc|#KviVSt(}UQ{!mZ&wSoB|a^Fxd6Gpz!C4Y#jh!8`fP`>-U4!dD7{Voa&r6yT;C z-8c7FhafjCot%-i`HY+nD=Mhnmy^=Z$hY-u>opY035l&NQI_k75>^+5m0l;&w*TP2KnkkUnR%IBfYn zI$E_i^0rFywp{(8;FN>64bs=6a(_vd&jvA~%srgz*MeY4ErU%8FlF9<0mD%QbJCCL zgl-lwdG<>}F@rO61=H1}JTS;aE;|>^xCH#>^eaO1)jHxxc3KK(XF5w5RcF&NrVhBz zZt?Xz1-=$BvPzW1XaCH!DO0%U5_K1MiGoTdj`BcGbJg$Z3#i-YcL<02B|__$L3SP@ zoSr2<%UjI}l=gT;Oi|~}0IKGT*YxNXCsO_+6Zip@=&9rj0oKB($QOj@7*v>UPlF3a z)aHwg_pu?_&6>8CvfC3;;#`tn0v;xgWh}{XEJdRag`P(-wa$dzb^e_-1KOBH(i$#vFBDGk-vp!v1+W#;2_DaWr+`y+GlemvsAch%PSwr%yrKw#;OIQz_-xc%7Y!Jzsl z(bF?Z(fd8X>wBIACjO5aUFrl=KNe9XXCfnaK8UEc@t zR)3x6UdOBho36XJpY&(`@Qgtwf83}lsN}sDzUk-i5e70ii$Ds#;JVuT2P`_AXlxw6 zKkYs&Dhvr8Z9JUC#KR8-pTB5(ov-C}Prqeo6wPBBBpd_8z;k#7=S20KdkJcXx5hO# zrJtYNex0NNZ?ti(z|UB~2lQQa#7T47UvD)W%R#W=uNv(wvQtCN#(hhbui!uC<#|DZ z_LVo)(_+;7b1R9jx1NF*KZLFM5SY!sqwNq=8`LNhRp!S$9?o&nLj`X=iy|aMWS$fZ zN8&ODxS0cSe@GRr8kijREhE-`cVG_UX26wwMF;!xHh^Q%>3XEd_H{TYprCT8=Udjd zq?&|VR?=se+S&1dZ+s%k?t7i4A4VXgov;~~#h81k^ft*Jvxzmi01Ee{Ts3s`st)r6 zFSe!NSEO+{l?;UD3xtgzt{?5=e=AE`d8pg3Q)^Cum1TuQwc9p0%98LhrTyPg(M2LH zrlMD1Dw}+C$^vxxAC$7){0vOpxv4+P$uu<8*P-OP?Y-{7Az!oVYjD9y|yc(y%3Z|dSBu~0XxP6j(E*lBH zq(1l!2z+(4D<#!`1iNDRe%T_7Kmz!zr%-WyBT^j4K!s@gVMKNs zYkk{y5rWCGas|A_-!ffw?Jyasd=JC5)T@C5Fow1nJI2m&yX4Y8tH|&4v=L5054@6EaC94OKO$p|)gq$m^75<68aa@@Hu&D**es z%XRY4@z&k&&D@L%;h$V)9rwCdlwW2Z8tyzwjVw&emau_NKZ z*c2}BcU?37@4)f5q5ew6$xHapdW&!E0OCo??!I@OT|~;Ix%-HnQOZuai;y~PNla`K~{F?aa8j9$3G&h=wGW_3!d?jJbUg}o|%1|v^7cUt;J*{3pJ`eSu9awWca^>z2Vs;D>*fQb## zQHc#dq6EK%b8UH8#ImEUDKE~7cu@GtQye|BW%{b) z{Zf83web}YXy`xe{M!(hQ{XbA9@NgZ`|?1=s7o!bIIlI}MwfmG&$92T3K&nAauw;e z-HV$KD|kq+U_CJ8$2-EPjxuj{3_FPksE$V3>YA#zt^Me6^WcvdS0&LxSFC25*|~5( z8@%_nI#>HbAG7ZarV~2?|6JI2F0QXVd;yi|=0Gi*l5&z%Pj~!EARji%SDz2;&(PIp zhbxaOe}#aGsHw5Vp3_ij2fUb5R|OGMW1sbrsAR6Wg(fIx&H74pm(V@RL^zYA%p!7= zD0Yi*f~~M#sAxv#p!xoQ4dx_1BpFhrOr;o?i9K=SXc{#MkucI98Jx})6C7OAVdKH< z`0!zhq~K}F%!CT=1)e>L4YEcI89GLP_zXm?~B0@63zicDlAclAZc zIk^b_=>ALdHd^TX%W-?e;(-LyAM5{g%7(*(^w%+P&=7|+^{->bjOMgp)cZZ?cbjc>t^()=-WWd6oCYS?EDCfW|za8F8xkBi_q?@CvkIs{Bid!PVY;>CXu@=^m?a> zz>?xXr?=M{k;zLzJ5VUNANsp;lKVx>cx@p&`q3mg(!IsEVtuvjN~dJbO~rovz^S+s zOK)*^R_sfb;JNIJ9FxKt&hM-3UlJuKZBeaLMDFIk)&A5quHR=ZSj2vDVAP5a1vDSB zWiQS1?uC&TWZ#n(Z|qa|FuLjlzAWc?ER%G0^@$7nZl>*KKUzFUJck%SV-PD_> zZS0A#x58j{rcs?d<=li%A=u`KG!6=f_6X(!{jZ`O^f@_PSM7F>X6GyJTX-$j&!Q*6DzNS8@a}X7O_D4j)DbI7%ovuMX^lfY z8nK#|Ff$Pb@&OE@B^Pc&vR6Wp$Jj2RY~~HVnI5`G=7-WN-LuXFeRun>E|45s$S<~# zGtBPfo|#N3@{q3#!qp<$q)&$H3x8;ieRYTJez{Tb!`v%bqDHQpbaJ^06?A=%{E?&S zE^rYM5g$>bRKyT%Y}M`g@cyr!eH29g# zG+x$aTQ4B66Wuo29Dk$NXU)PydYBRXfD>P{4t@{{&2&<~cM3gO#NCqu-AVqo8eM;~ z9W^2Axt8Qp!+8d)$B0y5w|Ia+@fOE&ue{7?I>g+qhFx9Q@@*}}bV|T- zK6x&SWZkLK)<-DHrjCF?^T8oEfYBhm$;Esu`wYd?H9rITgX<*tk-*Y~XlXoisft=l zp%BpMNM;hSbp6Jkv;v!o9gjRIuyt^5u)&Y#E}OjM+hxCU4}M6CQG2}alk{*DWKfZI z--7y`v0fu(91BJ^#SSs}!0G_!ke~o;zp1@&S^2~@IDzO) zcD@Sw>0j2|d0V#AiBhtg=bNG-xZg1ToiKp3FUcL`X87%pBl<2Sf_rq1p=M%2zkLGQ zWD@F9L6m`gZwAE@BDuP)E3E#hvgi5E0@m##ZEP5XgWJ9MrSr#m{|wxD4tURAq^JNg zPi-M~CS;y(;2S?D>h&&@x%$?)BJ7TQ9v`8J%PtoQ5BLd;HxHKvDQfkPZl8l8ur0tz z{?}T<`Td#zwY7zFt$>mOZ)KZ!N=sY)$#uy>$>=~KmMhvyh6HT;=-$+ZR?WZst9BmB z(fzU%j`JzEn%qnbhw@&c>$^b~>ma99Do~Nh=|-8Vw@y4xZm9iAy0H9jr=~K51JZ7D zs?e}1gMdl8+C?`vLi6}+4||*is#-waR_Sq_7t_?3mmc)s%vB?SL+NGyOo6oGr&3dm zR)D?0=4cbRf4I4xcMh3pQc4pkJ;>okEZeW3s&LM}yp_fwUohG@WVp<23O&k}PbhQ& zDT)=?%Vr9tU19|F7Ub>>v5?+SN@AOH4(^5OWzT%u?=xrakt1eytas?U)C$1E6e*>x zhK(*qSP@}6#_e&;qW`Tf?UlkG| zx0kBEWIpoWm8&;Vo0$&7jMwPx8S)by}SUN1b<3>^q zdkX=gR|nqJUe1!WGe|sCYf)gs!=7!+P2#Q2UtX4*s}6I&pG216>nl9y63>fip8B>c zYIn0A`FK0=7jb}J%(lhvE8C-FX1bUera&Fah|3EJ)NUD0ct4^&QKpTw7(`(edQacw zkQS`N0t;=+F8$lBoG2Jkh$;iY_L^U=|I$iaa9WGD1qkU?QiYcOcRyL4EPT^rMv%qlPAUK1G6=u%d|ZSl-1gDS2K>{&e};VK z#uEvs<8{xhI9IC0@FYKvjP9)2cz!#HB(BmnyZdW84$seUEHD23g-1PKxYAMeE5{aP z!wJOjBO>{jE-4l`}_7 zTKL&G=#){H*xJrdeWT0hR$$m@;jA-k3Y1(@YZ1eD$c^|mOFMuOn)ldCsb*!(N7W53i zjZm9f#8H}}_w@Uew+mwI5+jShqCuKK+(HPj@C6%xaZ%4zz!}TP*wm2&SbqLpM zuRJroW{>T1R{R5KUNkyf#9i%^2f5NY4~S)9=5%H9_|`m!e+iW{t5-fi3g^=wOkK(| zKQvrG-#0e=5a=MbA%7q*9gAL^8Q73HfW^!**!2)JXQo-#{(8LeQn4FF*jW^O%u2zhs~lO{oBv$TGu3PDBF1F3f!$J-E7bejJW_(xOdHe z8I^*Ul9^D^*=P`|O*GJD{EFgFfz67f;WVmw@2(<=%He3!Sfsg_V8h> zh4DgTLSx7(l<$uP2>#g(OpIQZ0Rkd_P-fh`g3b$GDCiRDjPlMCO~-@uLJ+3Rm?2+R zM}Q5#lebgO^?OR-ZkR9{+Z!&xv(O@dBYG+l&38B1pGBiAIh@w#H%IE(KC0I^>OB)c ziTjgs^e?KvGu-MgB%-`H?ZctNWeEOIJy**`xJHSx`bF4}iX)%0@395NUU3GLWuNyw zq&ymODKzYFX*Hx?!@HtoeaN05l2NX0RkB;){I;RlIjF{1`!_;{USJ>9hmFJ?CB zA4?u9GB2;x5}3r`)2_7d#oD8q*!|6fanEqi3V_l}fKd@Pl*pk`3Y@(X_(ijb zNb_R~mDwHD*NDW|D-0s6FIIcTr#8mZcoQ2OIlBGk1(PihCyHb19M??0^_F#4Y9Tdb!QLh(*%?wsrrda?o5z*DDwgcszR}XOp7Q6bf11zQdT%jT-c% zA=xw1IKKHF0a^iLR;431+Tf>UF2#gHYo{D5fcwu+Ur&teb{WF9C$tnEmk%y-*8FZX z))qy?&bp+J)i6o@uRIfD6zz%eZ!j6hq$FjxqRh(qM>Yd_ENivMZSGkgf78!Ff6#Hu z{~rK@KzzSU7tw1ZeGYE4%Q2?B(MSxC#MnT;kr;$4$pCEt8VPM2S`V~7XeMZvz;%B` zH9gSugq=R5_QbfZaqU!i#uh|R82d-8-sScDlfO0J4tLeZS1L{!%5c>hUrg5cQW1ON z!5;IA2IiFs=BX=oqD<6S1GLNMjYut=E)VJ*BH&rV{E4 z?39&%ha!6W2^GIFp3aG7JF(2TN8?bKG_ z&wl&B+B^Le!TjQC1-L0+s#m#uNyx|v$uAA&rwz>a4lwtBWhbh1;Xgpqw=I9bW<~Jl zjhCV|rqCMq!y5NWagE}A6xO>>vUtC;-kR8!ITlKWhiqx55-qXq@`UN+?V}?QPs~rh zsvz&J)?lAw$gdg9j~keK?99E_>_m+&zz_AGzr@4e=}hrSE2&mUG`_i#mVo!>K8^pL#HBhUt=^`@X10rUXT`m}={X=;{bkUi~G4d|PE_l3Dr-+vfD-|bYT5Se;K zImATd?@lsr9@&W|UF6r%UzbyeE6YPbE7vRBikRvSLbt+axRq)?S>b=$E?J9xP~lpJ zR09cg$D#zj|BaqOvga!1k!j_Q-7jYINOYxCucaW95Et|%()=39JU+#|?Amtn&yM4A z`YIKU1KZ&kcA$OTV;F<1jx-X?)5jDfqbekPQ2`>RM9&^&-k#ZZ_KRl>;=+A&Qfsrk zsvn(H-pp6ob*Ku22S$I1K9U?Hm}jq>pa>#T(5{E}G_^@D=D|3|Hf%Zf@mFQ6Pz6`jSdrqoOomxg*+kf?#|80L@-nyQ-_ry;0=z8aZ zf&LJ@W5?ckjIG+s6bL27@ec61$_jm#%r#dZBSrn_NNp`WMOw3V6T7P7N1VU4U{LGmkdKQ@ zbzUk`qy$dvv?MhmNxbdFcXS0x=E?VhXpP>{D%*tkItPE2%pOEwS`GtA7X-feCa)u5 zwvSJYf4aXLABA@DBTW}SopkMkMmIh)bf@^=!z#S{RdSa~(7i7JyH#oJd0n%|6+}03 z^}Wua_c*idTGqM8XuqdJ^>RX9`*rjw24+Sw*#)d1U&?wCyZmF|pzB>F9rT;^#KYx2~N;&vAB%W!W>V>hb2-(<~cj zJWlJJ)d6}J4_>1Vjhn4x>2GCF+9xR3VUi^O<{STl%k7bw9$fHP}+YFXdg|NW+ z+^Z?qhBFnN*$S+da?#D8BQ+J-jJbrhfZ(VGyg`|tO-5(d60y9H-V7WK_-e-jg_(bR zDtd-L&3o#Z=tgzH%kqhWAf)`^Y^va^C2j;c|BN%`Z=iV^aTp(ug|eA>p@Dhcpfgnv zVE(WW;2SxZ&zXvOW@1y}nY16x%kn8#@b*MB;SK9N|2&6)*^?LTEkV7wU;k zJYOU-7q6Z62Hn|6i|rz|sVd*J3+#VM#DZHX7s9p7>)Ng(llJ@S3BPYkZ6o-_5n2`b zsbZv-o)^>@%cHbi>Tv9sAp#5x_b^VR8#XE z*4PzV&j8+w#Ox}_)-&F&+a`a<@XW>RgZYGn%e~2U_Fq#b84cxA+uE8F*FG9?#G_%b zVGf;_$M8OkxK;B+@EH~IBHP@X34dfW0cQ@#7UI#3twhY(77Hkz;su1wU5HJ2^66q2 z_PK!Ub-)>|AG=6zG$;Vh^@QMV#A87RU?`*5&CD-$Esg=-RtC;(z+Zn(xu!eCGMq0V zux|$ZCakCUuEorHx*!yj(T;Yt@Vnu!B#KQ}qy+cb8orx5#IUZM?%kmFiT<6?w7)fW z@m-(2v4QSi)tMM_pjhf;S9%KcckwJwK#X*sX|UA+qy z`JLSbcr9T(+;hUV=YIraTZj8XK>1v!^-B~s*5k45&ecRU1#5q^vvVT6*4g(>UKjI% z&S$BV50v-LCT9luEj|?#fWDsQrJUO@@Nj0J`~%k@T-3LjF1V+}GbYn8*}J~ZLn+& zm5=j{S*RE1P=9|0m611~a?(>`p?(aZ{!$Lg&e=IMR6w<-uOXJ9&@ZF^{v7(9mg-fO zUD!H?ie9Kwy|_~KO8xgn}%TOLnNnjfY^lX$DB??v+1{xkS{!Hu}c*WmYH{BQ>3*Wv!pLhiH*xuG-T z52Cz$jh&l42>ug|%&{#`UG@(!y9cziNE!020dT{&rLf@=BEwv?pp4QlZ zT()0|uQZ-YnFQ-o)yh%e1gI`tmBi0)Fl&9F^DM@|Vo}9*>C6ztW zw+4R+n{R8fWxYK(&cySl0f(ChTPqtSuNUrU&mXVW-eu7guO#Pf%6lD6`&tmS0o_BvNPoGzCSHZ0V`2YThzu5_5i48md3s4+O0|XQR000O8IZH-Z2tRf&*9rgt?j!&J zCIA4Ju*d`_f5lf_Y}?iqCS}>C9XWAQQ|()7*0 zjSwVBTp6RNyZ^M12Ta7skEaGH>cf9q2PxvuV-)chU_Jfx*9R@cG>lHbJp+{Q{AOm* zO0B;6JV+&gmKvi@XWo3CK-WKhTEcIdpl4|3G#DGFhv=ax3)SFQC}bC1X5v^EDqK&- z4Dhs(e}lu;*Vxxx$KLwgk1mfR2J^ADJ3)K#N@9O-7>9h#y|4WBB7YH77n zFACVFk4W<;By($!`Ma@GTUY25Z3@x`4BcoVm4!G&n>7nzL{#MoG0}|R8nG(yNE^XC zpr&Yp3hO`<)@rg)l`9zBHPU>YWF8JPw}<;_-DQ}+-q(UT)`BTl^BRyJj50Syzd(>z zfA_aQQW#`AzH4L51Jf6X@4fLBzEO-%zs$D}Fh4)AZG=3{1py{P=%}C_mruy4M5R!w z55gc<5ar4k{E=Z7(}$lzJ1J2?Ij(mEa(|>b)zbQ_al-&^+9^k8p|yBz5sm|KxHLlW>pe`&RlUM(g{6)`Cm6LO`jiTY1y=06kLj{0qq zz6y2zFvgoT8i^5-m>3y05~EP84RDXZO~O41_W;~OaGT&h0EL`VYcSn>)5qv(Z6Tjj zITlLw57*XCDqIsm#dG8ExYfO~o_*_2XpNa0hg(&AUrH!fL^)9r3o`cnjRErqe+K5E zg}L+Oc8qn6#4EHfNSkmR?8b2vheIe16N>MrE$ZBs&+P?VYo6+AzCk6lrTvUmyh{;~ z;mqe>YB@SoD2W+S@$tIB{A~ksdy4t=$aai$_3D2eWZz6|H z#Ebvk59fLA_v7#!We>q~->r#3f9mw=jU!lLWc+v!#~U0Ag)}xWbyC|Mf9JbTt=%04 z$M1c$<+v$ZsFsCnK}t1_>URz1Ul^G8t;{=L*^a5M?n6^^Q`6K~<>5OxC*B*QOy3xJ z+enU^KK}5fL6S1P96d2aQp8nQ{9gid|AXi-X(3*L;WfCC{FNWRPmxyBf9HwM_K}qF zWqyPrK7lm3lKgBRQh8(YTeKQ2U2oIiSg3}1F z)z`LTt6R7xKUyGg10m!Sv;_!94VpfRpiOApJVlQZ!6`J&091VoaP-T;x1XR6HrVY) zua4O~@^o~~QKR9Qn(7+We_M;AN72;GM?Pt*ib7GhpE77mNrlviIAOL;PEFq2i%xR~ zJHK7*)^@GK+KsMgcRHC}YAklY8Q7zfcK6S@y*g0#pa`3PW-;3s%KTUJ1Y%o;iYP_O zmVb?1wuy2|*no_cs(HC=d)E4*O@&~4Y1(R2=&M*r!0gL5IguCOf1g~HB#=mp0tBU< zrl`kz7Kk?Za!nRef(O^`uclru==(nZgSQ?{+G z7MOMvwq~8Q>A|$KbeP~X;N*NKq9$1b2syPiZEcxs7Nky-Z7iKhb^nUVgw)mWsg6K^ zNMqNFIQk19Q7EN^f0B@bQ92=&g{|(;lp53rU`wDgGN&F3U+=h}qT0{2%HCPSy>0G_ zxqk88rO-AGfL>NL?43`&`A4N*_rs(UYj3$7i9nt7?qFR|PN7bVE&2``(;i5j zCiUE%u72HYY8d~gIb7^Z0%~G#GD;#}NrrU z+~S`_??txB&n(vP7%nV@`ELAPL2o}A9|xUi%(6?R#SF^|^+1u&hb6(|%JI$(2OnM7 z^ydnhXgy%(f9E3gm{VHwOZKwg9cb{=iRi)_7t2b?y8oo#Q+dXpU&!*&OX4|kv6_l* zl!I19RU8F-b8hU^O8A*H+?&=Jletl)#hf9FH%oL8!Hb*wKES&moExdX0r zqz${`+gw>};sQKeEU?KtkzXrfSL|J6l3q`h^LjS57$Gk9P)_0Va-@>O^K*e>-03OziZQ}}t{XmI8T%7+w)AkZvuKV3`#KkZd0)_19zTFNME5{=m7(J=V1+|1SV zg&NAAYCP&tsDi%=IE#d+h`(t55@#!6Ze+`E2c`@HDuR*rV`+CID3F~(O`hNLjF@@GsuojQV)f~uHQ_6aEs|6a{+sM)WdngC^CC=%p3y+8y><>E^O|2*8 zwVwIbl!2NRkJh#wLzHijr)iBIrIs$OAZ#!WOUZm>4astOPdVv~xH|F_#U>h%z_)cy ze{$90v4A}h4HXgIl<#b>oJDp;4&{cEOM`4Z<&|=Y803c>-rS>Hfm#s)tP8LYrFCBH zu^uP}b744}JRs|;_Qw{t_sf@NO@5sHpLf+0(NwWFt~P$J{B6|v9`z{R^&IOFuLA6s zO)i>UM{C*VjOr@4hv!t0bNAm{yNM}we*wiaROg}|s6~FXzJPI~7?%TCw3m?$&!~`{<3wjV&Mky7x4aR|vDLHCGqhvmq@)}w^3Hjzp`Vv0x3_GWRlSy8>u@4tHj_X-lEUQl{Co#m~>p&el+i=0{DMe_{mp zYs!UsJl5BYCws9W&w4O_O*h}Ko4XJ_$W+=(vv)$t;m z#niakZ#FIr4fg_0sS5M$y7}|E`AOaUAbN1#$R^Z*D(nFiWA>!ZpWyjt+WdJz=Z^=4 z&fB*Z0<_%m+1XRryc>7Mo9cMke}k!!Uv(SQxGAwn4FR)1s(R!|;#7C<1p|6or2nZO^^)Q~D!^D7e%p5H>c9MPgFx3U zSQlM1L0_VS7icf-phxJDX&0q%xTtT)JWj%Ee=-W!7qS+(d&%KZ_cz(+!rmYKh57Rl=6!4Tf~J7o z^vo(62Dpx^r0fNY{1+IV^jW>4PsUDZK)*~WZ$=GO+&2M!Gqg&}pK z`NadwA3X5ufCfk1Gm{#cag4?oaQ7#eS0+9)o+6!Jr74Uj&_em8S`f>y^&5x7fAF$X zgIr*T2N7}>eRc+AlR^vaO(Rs;vv$O!PIrx|k2-J`4>4k4e)6Rc zo#$=jsEzpQ|9%dtot?jOf53g5oq+q9zndJUu5P~g8+gIA<9rX`3dKdC6&0PjM>~PP z`t6zBcSb3Kd6Ch8L-o*Za+R7;R*IOPSe!3gnE#n!?tkexqD)g{_L;+1S)4Cfm=CZHS)Uye;|7nl=$og*{{kaZfn};M-7l4k3E~>7QXj=fc$PigG`m%4K001 zxL@}(ulbH6$rSe^^rK4Y@WuKW7^}A%+@@6Gj>Bt%FLRsCN}<7Z9j-3#xJGrI(M=@K z*@}w&(YJ@j$)Sgs{|;$q>w{9|k61Tr?N$*g2+5sqkYrRGNUpno&8V|>DCrKZ zhrA}E8iYF�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

E;t<% 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�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Ξ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%0DJuGAE~iGye>v`9U7mftgr>oW8I9z64zapJ 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

_zBbb+r zb2D3k?OM~RNoa15&U5~s9-Utx){CIKxFaZea{-AT^0)+vDJJKTd|JAG)$lu3!KsJjHQQ)_mJ7F2C(!C`~-!d5hv z1FSlQF8i)?1%%^67U%K8>hVdOZZ1%#w9fjbEFNp*$GuPIHGE&a#?qF; z`AGrW0?4h2Qcu)AVe7d_WRsJ*B_lmL&%0JwCSO?h8g|os$J0qImnJ+u$Hhzz)Phqq zyv zDq+<#E7!f{`7MFTDj3P=`Mc9hQ(A&ly-1?bJdBO}ty4|mC@NdIjKv2i@%Q+HR$o7b zuc&{w%{(14JQ~Sw?po|X&mB6fl-GzImsnljkDpK+PQhEQmEc&8{x5%m4wy z^ZYE@gE-Y<^y)C%{K` z7J**S1c!Xu;DJaV#I7;)Ayk-tEmb^6+^cpI3J+_nk%j9^z20|q!5q2A7%|gTjov=| zY7ImJhimyQubnjM+xmC>--b#Q4CE=J2-gBM;%(%3GsMR-51&<@I>WI3)B>2J%gEy$ z5j)eGkDU5{M#{(Xc^?zPU#8yjmNkD9d6Qjo1?d!BiX-Ie*$DJmu~1e_hu;o%IyQhP zv{0LK+!f3rc_Q?CmVoR-Uo~E&W6JO=jUwu;4puW|H5K=KX&kZ)Vj7QBKBr;N^KQgIz0t1!J`g!7aT{ z9Xm!QaA>Ye6Udm;sJG^NRNSy@cfWLddfgY8Sr>TxV=|n~0d{>Zu#OR=c|&@IB)zs) zAvENYPJ=D?8x442#m)YG%C-5RS)^iVEVC*#jAUHSm$l*J*CI@zz3LSNLkwH7h-f!2280)XzKR?MilN zYWL=K=tQ_VL9|4)!A@j)Z3c$)AF+I&d|*dA#;7|e6%p85ThoisDVdW`P2maM_zJUX#>V=LErb{hweX&10Zh0y4}eMg5aS)eP6-cNZafSz|(a{pm76@ja>avBkj) zl_Te;sr>=$7kJ}(eq!RunV`XDrVrRLiowy3+k-`=Q3RUcORZ{~L?$pa!*xXY!nz=Z_I9w#rUWM?J z3YOB^a;8ew-&4l>!~lY5i*~BqiqhPuie`)mXI`-x(_-aH!jL<(fXI&PKz%oMBpG&F zcU~96GhF56{CujXsXipQ+I1R@gaK3G5IRQuj--U#3hM>cT3H?h%+CN`9i%@zRs~jF z85&UVtzKV4z*h@h1VTv`q|Q#6+*%vLx_d(;A8%E;>?RPm98H(YSxuY|Tu2mtjbC

-M-w2sf6h@>t(9%XSyZJ5V{ax;aGU9VrYT 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%0ABd~zS-(CwGa4FKMl41v7> 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 z ze_$6)6mAMx(Hw=Fp>>9C#^QuA+#xQ&Li@}EG$xzqPPf2;qABbme>Fg(CwblE?G`BX z5aI|?bYT)F(h01f-gnztprJE5HerqEsp>_mH^B^|LAV}M4K@H0pGiJz>)=zG>y z6k-^!FueE%4+_7mY1kQIO`~yRdxCviaiD)3e%W6Y7OOD08+J{G`*m|z08jfpuCDv+#+u-$IHk9}CmEjM-3AB?ST)S^7xZ?AZt^S#lpHE{ zlW?QQ7Q$=_hevoVxE~%j^At1}XuQfi9jNx36u6pi z=4|h>&r!w6mu_l=D+@VbQ#TlM7O3HNED+G#=ypJuO(71FO&2U(sha5z?NdzTV%`oH9ghPGV)06hFh*7h zSXhA>KXwz`$z&A%NzlV#3@=PDiXVjK6k<#k#(0$ByLES@-~d!QMM7fVKk< znkbn95k=WyqToTuPXQU$JRHd+x!lh|(Ddw;74!O))j2jC=pKom3m%tYl#pQR=3U%gZLi4eym<;6|9R&^o+=wSmx8{sC&axJv@0$Mdl6RkiP36eWQy(3i*B=4qO^^SLPQr?iOANiN7hqcf>UH(6Ga=-7BfCs%J@xSNfFz%BE z-b#tkW=Q*O%xmSQG#r?4oNd8h;l{3&TM2SZb@s48SdZiO~6cs)N|dOp+(x0I?Q8Hj4U1Z zJn(4@o{s?@>9hVOck=Kghgh7om`?(U%?Lw&R8fou^xHFkb^M{`PZ|JDIKZsSSTH) ziyl3(dkB+uO$L5{J=?l)Ifl~jLFE_xVSyVa z`E%UYeI~>07L6anjWA)MblB5_*}9aZAWxTrJRMucpYR>?^yJIzv%n)RY%~7K-LVzD zROn<9e3`*6!_YhuQ!FHa)pSaEq;@CdHcpV+UT zo^zCO0A3!>Zey#G@XH;OO_QKsMlE)b0GKE`P_gB?0YnsCp2PI%RWw4Lg{li6>V^^; z$8Di8)BsX7b`1Sq#>N3EjBtz%qQwwo_`^ciFikXK>>yh60)?2N4`?d1cm!$iBTQHT zhx4wklFHfhP^CB`&s?-*HFAJ~srdi0Xu0umGTgsiw7|+4OsW@vI&Of?V&>j*UxhZ&@Ezazd4Thz|& zpog0)W@{=iy$BKn{!BOz=^GoVUs_I0qiVKf59YD#OdP4UWoX`5P&noJJsgC)lgM%O@kRV zzZjS?j{2u>l3|j~zj6&0b@7r(P=ncN__0@)5GIprd;H}}cpnXtA>psst>B^Rc;JxZ z9%uXUSI6M(IV=(-eJeQg{v7O9@H&VtDp4XV=(!T%Fa>bfGhqgJT-n3R(9ZAcbJ3+Q zeJl9MrFc*)2`^0=rwP-YaQ8{Qof$N?_RY{nfkq%hD@SAB+Iji7IYKY=xjNgUwt;V$ zGq$@3*4xjQH(=E>ukvBK^ty+2@F49BUi7cpIq2~1CO_3d2?VA6ku&(Q(%|}-m8U=q z+W>Con3WEs&4Cs+4nQ4N9ZVVmiFCxoziQ_gU`Q@9Kp}?l&i~_f4jMPM9XsEUj$0Ny z7l-HjtDX+FC!1|C8TkKrTTZkk9yAHV{g>NvsFo<)kefiq2K@fE93RyA1RF3mE!sp! z{9kU%*?Sp<7<0@4qw5s*mM`ppc3*;7Tnbp?eR z(lmTR0Ru5Yo<%^yh|vcCU?(!Z*>uEe44;Nc{y|Q}zMb8WheC`wM_?Hy@lJ}H1L^_; Rz-8!<5HyXxaRdJ6{{wgdI&=U4 diff --git a/activitysim/examples/prototype_mtc_extended/test/test_mtc_extended.py b/activitysim/examples/prototype_mtc_extended/test/test_mtc_extended.py index b3ec258ba..f78b7f8b9 100644 --- a/activitysim/examples/prototype_mtc_extended/test/test_mtc_extended.py +++ b/activitysim/examples/prototype_mtc_extended/test/test_mtc_extended.py @@ -219,7 +219,6 @@ def test_prototype_mtc_extended_mp_shadow_pricing(): ] -@test.run_if_exists("prototype_mtc_extended_reference_pipeline.zip") def test_prototype_mtc_extended_progressive(): import activitysim.abm # register components @@ -251,20 +250,13 @@ def test_prototype_mtc_extended_progressive(): assert state.settings.chunk_size == 0 assert state.settings.sharrow == False - for step_name in EXPECTED_MODELS: - state.run.by_name(step_name) - try: - state.checkpoint.check_against( - Path(__file__).parent.joinpath( - "prototype_mtc_extended_reference_pipeline.zip" - ), - checkpoint_name=step_name, - ) - except Exception: - print(f"> prototype_mtc_extended {step_name}: ERROR") - raise - else: - print(f"> prototype_mtc_extended {step_name}: ok") + ref_target = Path(__file__).parent.joinpath( + "prototype_mtc_extended_reference_pipeline.zip" + ) + + test.progressive_checkpoint_test( + state, ref_target, EXPECTED_MODELS, name="prototype_mtc_extended" + ) @pytest.mark.parametrize( @@ -307,20 +299,12 @@ def test_prototype_mtc_extended_with_chunking(chunksize): assert state.settings.sharrow == False assert state.settings.chunk_size == chunksize - for step_name in EXPECTED_MODELS: - state.run.by_name(step_name) - try: - state.checkpoint.check_against( - Path(__file__).parent.joinpath( - "prototype_mtc_extended_reference_pipeline.zip" - ), - checkpoint_name=step_name, - ) - except Exception: - print(f"> prototype_mtc_extended {step_name}: ERROR") - raise - else: - print(f"> prototype_mtc_extended {step_name}: ok") + test.progressive_checkpoint_test( + state, + Path(__file__).parent.joinpath("prototype_mtc_extended_reference_pipeline.zip"), + EXPECTED_MODELS, + name="prototype_mtc_extended_with_chunking", + ) if __name__ == "__main__": From 688539e624afd0f57080f1cfd0a524313197b19a Mon Sep 17 00:00:00 2001 From: Bo Wen <56280490+bwentl@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:45:07 -0800 Subject: [PATCH 46/61] format with black --- activitysim/abm/models/joint_tour_participation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/activitysim/abm/models/joint_tour_participation.py b/activitysim/abm/models/joint_tour_participation.py index 2c5e5fb7b..73825d162 100644 --- a/activitysim/abm/models/joint_tour_participation.py +++ b/activitysim/abm/models/joint_tour_participation.py @@ -432,7 +432,8 @@ def joint_tour_participation( # its value depends on whether the candidate's 'participant_id' is in the joint_tour_participant index survey_participants_df = estimator.get_survey_table("joint_tour_participants") participate = pd.Series( - choices.index.isin(survey_participants_df.participant_id), index=choices.index + choices.index.isin(survey_participants_df.participant_id), + index=choices.index, ) # but estimation software wants to know the choices value (alternative index) From b41800480ece6cb08f20b6497275d2f66004ee58 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Wed, 7 Feb 2024 11:40:37 -0600 Subject: [PATCH 47/61] warnings on tot_tours --- .../models/non_mandatory_tour_frequency.py | 22 ++++++++++++++----- activitysim/abm/models/util/canonical_ids.py | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/activitysim/abm/models/non_mandatory_tour_frequency.py b/activitysim/abm/models/non_mandatory_tour_frequency.py index 54392445c..96986948f 100644 --- a/activitysim/abm/models/non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/non_mandatory_tour_frequency.py @@ -3,18 +3,13 @@ from __future__ import annotations import logging +import warnings from pathlib import Path from typing import Any import numpy as np import pandas as pd -from activitysim.abm.models.util import annotate -from activitysim.abm.models.util.overlap import person_max_window -from activitysim.abm.models.util.school_escort_tours_trips import ( - recompute_tour_count_statistics, -) -from activitysim.abm.models.util.tour_frequency import process_non_mandatory_tours from activitysim.core import ( config, estimation, @@ -203,6 +198,21 @@ def non_mandatory_tour_frequency( alternatives = simulate.read_model_alts( state, "non_mandatory_tour_frequency_alternatives.csv", set_index=None ) + if "tot_tours" not in alternatives.columns: + # add a column for total tours + alternatives["tot_tours"] = alternatives.sum(axis=1) + warnings.warn( + "The 'tot_tours' column may not be automatically added in the future.", + FutureWarning, + ) + else: + # tot_tours already exists, check if it is consistent with legacy behavior + if not (alternatives["tot_tours"] == alternatives.sum(axis=1)).all(): + warnings.warn( + "The 'tot_tours' column in non_mandatory_tour_frequency_alternatives.csv " + "does not match the sum of the other columns.", + RuntimeWarning, + ) # filter based on results of CDAP choosers = persons_merged diff --git a/activitysim/abm/models/util/canonical_ids.py b/activitysim/abm/models/util/canonical_ids.py index 0ca1a1d3b..782828ca6 100644 --- a/activitysim/abm/models/util/canonical_ids.py +++ b/activitysim/abm/models/util/canonical_ids.py @@ -182,7 +182,7 @@ def determine_flavors_from_alts_file( flavors = { c: int(alts[c].max() + max_extension) for c in alts.columns - if all(alts[c].astype(str).str.isnumeric()) + if all(alts[c].astype(str).str.isnumeric()) and (c != "tot_tours") } valid_flavors = all( [(isinstance(flavor, str) & (num >= 0)) for flavor, num in flavors.items()] From 3d4dc354869b36b691fac633c230863bf4ec617e Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Wed, 7 Feb 2024 11:47:41 -0600 Subject: [PATCH 48/61] add back dropped imports --- activitysim/abm/models/non_mandatory_tour_frequency.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/activitysim/abm/models/non_mandatory_tour_frequency.py b/activitysim/abm/models/non_mandatory_tour_frequency.py index 96986948f..53b1bbaed 100644 --- a/activitysim/abm/models/non_mandatory_tour_frequency.py +++ b/activitysim/abm/models/non_mandatory_tour_frequency.py @@ -10,6 +10,12 @@ import numpy as np import pandas as pd +from activitysim.abm.models.util import annotate +from activitysim.abm.models.util.overlap import person_max_window +from activitysim.abm.models.util.school_escort_tours_trips import ( + recompute_tour_count_statistics, +) +from activitysim.abm.models.util.tour_frequency import process_non_mandatory_tours from activitysim.core import ( config, estimation, From ef0f0a5afe15aa725f2a781ec602b058a1f154c0 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Thu, 8 Feb 2024 08:59:15 -0600 Subject: [PATCH 49/61] update envs for Pydantic 2 --- conda-environments/activitysim-dev-base.yml | 4 ++-- conda-environments/activitysim-dev.yml | 4 ++-- conda-environments/docbuild.yml | 4 ++-- conda-environments/github-actions-tests.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/conda-environments/activitysim-dev-base.yml b/conda-environments/activitysim-dev-base.yml index 7a94ae4e1..ec1f2e0f2 100644 --- a/conda-environments/activitysim-dev-base.yml +++ b/conda-environments/activitysim-dev-base.yml @@ -49,7 +49,7 @@ dependencies: - psutil = 5.9.* - pyarrow = 11.* - pycodestyle -- pydantic = 1.10.* +- pydantic = 2.6.* - pydata-sphinx-theme - pyinstrument = 4.4 - pypyr = 5.8.* @@ -75,4 +75,4 @@ dependencies: - zstandard - pip: - - autodoc_pydantic >=1.9,<2.0 + - autodoc_pydantic diff --git a/conda-environments/activitysim-dev.yml b/conda-environments/activitysim-dev.yml index dd1437581..3e5711a29 100644 --- a/conda-environments/activitysim-dev.yml +++ b/conda-environments/activitysim-dev.yml @@ -44,7 +44,7 @@ dependencies: - psutil = 5.9.* - pyarrow = 11.* - pycodestyle -- pydantic = 1.10.* +- pydantic = 2.6.* - pydata-sphinx-theme - pyinstrument = 4.4 - pypyr = 5.8.* @@ -71,5 +71,5 @@ dependencies: - zstandard - pip: - - autodoc_pydantic >=1.9,<2.0 + - autodoc_pydantic - -e .. diff --git a/conda-environments/docbuild.yml b/conda-environments/docbuild.yml index 2e289fa9f..c738ab3a1 100644 --- a/conda-environments/docbuild.yml +++ b/conda-environments/docbuild.yml @@ -36,7 +36,7 @@ dependencies: - platformdirs - psutil >= 4.1 - pyarrow >= 2.0 -- pydantic = 1.10.* +- pydantic = 2.6.* - pypyr >= 5.3 - pytables >=3.7 - pytest @@ -56,5 +56,5 @@ dependencies: - zarr - pip: - - autodoc_pydantic >=1.9,<2.0 + - autodoc_pydantic - -e .. diff --git a/conda-environments/github-actions-tests.yml b/conda-environments/github-actions-tests.yml index 3636f4bc0..5edb8fef7 100644 --- a/conda-environments/github-actions-tests.yml +++ b/conda-environments/github-actions-tests.yml @@ -22,7 +22,7 @@ dependencies: - platformdirs = 3.2.* - psutil = 5.9.* - pyarrow = 11.* -- pydantic = 1.10.* +- pydantic = 2.6.* - pypyr = 5.8.* - pytables >= 3.7 - pytest = 7.2.* From 2a12e89df7b5f01be8b64110df0640d49d9d4091 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Thu, 8 Feb 2024 10:11:37 -0600 Subject: [PATCH 50/61] need nbmake --- conda-environments/activitysim-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/conda-environments/activitysim-dev.yml b/conda-environments/activitysim-dev.yml index 3e5711a29..f805b6e36 100644 --- a/conda-environments/activitysim-dev.yml +++ b/conda-environments/activitysim-dev.yml @@ -31,6 +31,7 @@ dependencies: - myst-parser # allows markdown in sphinx - nbconvert - nbformat +- nbmake - numba = 0.56.* - numexpr - numpy = 1.23.* From 2938fec9611f59c22c62d644e29d5deed7e257c7 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Thu, 8 Feb 2024 10:23:50 -0600 Subject: [PATCH 51/61] model_validate not parse_obj --- activitysim/abm/models/util/logsums.py | 4 ++-- activitysim/abm/tables/shadow_pricing.py | 2 +- .../test/test_misc/test_load_cached_accessibility.py | 2 +- activitysim/core/configuration/base.py | 2 +- activitysim/core/configuration/filesystem.py | 4 ++-- activitysim/core/logit.py | 2 +- activitysim/core/simulate.py | 2 +- activitysim/core/test/test_input.py | 12 ++++++------ activitysim/core/util.py | 2 +- activitysim/core/workflow/state.py | 4 ++-- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/activitysim/abm/models/util/logsums.py b/activitysim/abm/models/util/logsums.py index b92045fa8..328957965 100644 --- a/activitysim/abm/models/util/logsums.py +++ b/activitysim/abm/models/util/logsums.py @@ -84,9 +84,9 @@ def compute_location_choice_logsums( computed logsums with same index as choosers """ if isinstance(model_settings, dict): - model_settings = TourLocationComponentSettings.parse_obj(model_settings) + model_settings = TourLocationComponentSettings.model_validate(model_settings) if isinstance(logsum_settings, dict): - logsum_settings = TourModeComponentSettings.parse_obj(logsum_settings) + logsum_settings = TourModeComponentSettings.model_validate(logsum_settings) trace_label = tracing.extend_trace_label(trace_label, "compute_logsums") logger.debug(f"Running compute_logsums with {choosers.shape[0]:d} choosers") diff --git a/activitysim/abm/tables/shadow_pricing.py b/activitysim/abm/tables/shadow_pricing.py index 6b06a9d58..1b28883df 100644 --- a/activitysim/abm/tables/shadow_pricing.py +++ b/activitysim/abm/tables/shadow_pricing.py @@ -1233,7 +1233,7 @@ def load_shadow_price_calculator( spc : ShadowPriceCalculator """ if not isinstance(model_settings, TourLocationComponentSettings): - model_settings = TourLocationComponentSettings.parse_obj(model_settings) + model_settings = TourLocationComponentSettings.model_validate(model_settings) num_processes = state.get_injectable("num_processes", 1) diff --git a/activitysim/abm/test/test_misc/test_load_cached_accessibility.py b/activitysim/abm/test/test_misc/test_load_cached_accessibility.py index b19d13646..60288d67c 100644 --- a/activitysim/abm/test/test_misc/test_load_cached_accessibility.py +++ b/activitysim/abm/test/test_misc/test_load_cached_accessibility.py @@ -58,7 +58,7 @@ def test_load_cached_accessibility(): settings = state.settings input_table_list = settings.input_table_list input_table_list.append( - configuration.InputTable.parse_obj( + configuration.InputTable.model_validate( { "tablename": "accessibility", "filename": "cached_accessibility.csv", diff --git a/activitysim/core/configuration/base.py b/activitysim/core/configuration/base.py index 9a3f7b7cd..754865dc1 100644 --- a/activitysim/core/configuration/base.py +++ b/activitysim/core/configuration/base.py @@ -118,7 +118,7 @@ class PreprocessorSettings(PydanticBase): The preprocessor will emit rows to a temporary table that match the rows in this table from the pipeline.""" - TABLES: list[str] | None + TABLES: list[str] | None = None """Names of the additional tables to be merged for the preprocessor. Data from these tables will be merged into the primary table, according diff --git a/activitysim/core/configuration/filesystem.py b/activitysim/core/configuration/filesystem.py index 0f398c8fa..ce50becd4 100644 --- a/activitysim/core/configuration/filesystem.py +++ b/activitysim/core/configuration/filesystem.py @@ -639,7 +639,7 @@ def read_settings_file( include_stack: bool = False, configs_dir_list: tuple[Path] | None = None, validator_class: type[PydanticBase] | None = None, - ) -> dict | PydanticBase: + ) -> PydanticBase | dict: """ Load settings from one or more yaml files. @@ -817,7 +817,7 @@ def backfill_settings(settings, backfill): settings.pop("include_settings", None) if validator_class is not None: - settings = validator_class.parse_obj(settings) + settings = validator_class.model_validate(settings) if include_stack: # if we were called recursively, return an updated list of source_file_paths diff --git a/activitysim/core/logit.py b/activitysim/core/logit.py index 053c46e4a..9d282ddda 100644 --- a/activitysim/core/logit.py +++ b/activitysim/core/logit.py @@ -574,7 +574,7 @@ def each_nest(nest_spec: dict | LogitNestSpec, type=None, post_order=False): raise RuntimeError("Unknown nest type '%s' in call to each_nest" % type) if isinstance(nest_spec, dict): - nest_spec = LogitNestSpec.parse_obj(nest_spec) + nest_spec = LogitNestSpec.model_validate(nest_spec) for _node, nest in _each_nest(nest_spec, parent_nest=Nest(), post_order=post_order): if type is None or (type == nest.type): diff --git a/activitysim/core/simulate.py b/activitysim/core/simulate.py index aff2c53e3..133a8b1dc 100644 --- a/activitysim/core/simulate.py +++ b/activitysim/core/simulate.py @@ -467,7 +467,7 @@ def replace_coefficients(nest: LogitNestSpec): coefficients = coefficients["value"].to_dict() if not isinstance(nest_spec, LogitNestSpec): - nest_spec = LogitNestSpec.parse_obj(nest_spec) + nest_spec = LogitNestSpec.model_validate(nest_spec) replace_coefficients(nest_spec) diff --git a/activitysim/core/test/test_input.py b/activitysim/core/test/test_input.py index d0cfc24e2..bedf100d7 100644 --- a/activitysim/core/test/test_input.py +++ b/activitysim/core/test/test_input.py @@ -69,7 +69,7 @@ def test_csv_reader(seed_households, state): """ settings = yaml.load(settings_yaml, Loader=yaml.SafeLoader) - settings = configuration.Settings.parse_obj(settings) + settings = configuration.Settings.model_validate(settings) state.settings = settings hh_file = state.filesystem.get_data_dir()[0].joinpath("households.csv") @@ -94,7 +94,7 @@ def test_hdf_reader1(seed_households, state): """ settings = yaml.load(settings_yaml, Loader=yaml.SafeLoader) - settings = configuration.Settings.parse_obj(settings) + settings = configuration.Settings.model_validate(settings) state.settings = settings hh_file = state.filesystem.get_data_dir()[0].joinpath("households.h5") @@ -120,7 +120,7 @@ def test_hdf_reader2(seed_households, state): """ settings = yaml.load(settings_yaml, Loader=yaml.SafeLoader) - settings = configuration.Settings.parse_obj(settings) + settings = configuration.Settings.model_validate(settings) state.settings = settings hh_file = state.filesystem.get_data_dir()[0].joinpath("households.h5") @@ -145,7 +145,7 @@ def test_hdf_reader3(seed_households, state): """ settings = yaml.load(settings_yaml, Loader=yaml.SafeLoader) - settings = configuration.Settings.parse_obj(settings) + settings = configuration.Settings.model_validate(settings) state.settings = settings hh_file = state.filesystem.get_data_dir()[0].joinpath("input_data.h5") @@ -169,7 +169,7 @@ def test_missing_filename(seed_households, state): """ settings = yaml.load(settings_yaml, Loader=yaml.SafeLoader) - settings = configuration.Settings.parse_obj(settings) + settings = configuration.Settings.model_validate(settings) state.settings = settings with pytest.raises(AssertionError) as excinfo: @@ -191,7 +191,7 @@ def test_create_input_store(seed_households, state): """ settings = yaml.load(settings_yaml, Loader=yaml.SafeLoader) - settings = configuration.Settings.parse_obj(settings) + settings = configuration.Settings.model_validate(settings) state.settings = settings hh_file = state.filesystem.get_data_dir()[0].joinpath("households.csv") diff --git a/activitysim/core/util.py b/activitysim/core/util.py index ce2439a9b..8a0f29b11 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -443,7 +443,7 @@ def suffix_tables_in_settings( model_settings = recursive_replace(model_settings, k, suffix + k) if model_settings_type is not None: - model_settings = model_settings_type.parse_obj(model_settings) + model_settings = model_settings_type.model_validate(model_settings) return model_settings diff --git a/activitysim/core/workflow/state.py b/activitysim/core/workflow/state.py index 77c07180f..5689e2e6f 100644 --- a/activitysim/core/workflow/state.py +++ b/activitysim/core/workflow/state.py @@ -437,7 +437,7 @@ def initialize_filesystem( if cache_dir is not None: fs["cache_dir"] = cache_dir try: - self.filesystem: FileSystem = FileSystem.parse_obj(fs) + self.filesystem: FileSystem = FileSystem.model_validate(fs) except Exception as err: print(err) raise @@ -485,7 +485,7 @@ def load_settings(self) -> State: logger.warning(f"settings file changes cache_dir to {cache_dir}") self.filesystem.cache_dir = cache_dir settings_class = self.__class__.settings.member_type - self.settings: Settings = settings_class.parse_obj(raw_settings) + self.settings: Settings = settings_class.model_validate(raw_settings) extra_settings = set(self.settings.__dict__) - set(settings_class.__fields__) From 613126e6ffa0903af59e4efb3817af5b30ae5f85 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Thu, 8 Feb 2024 10:28:10 -0600 Subject: [PATCH 52/61] update test to use pydantic 2 --- .github/workflows/core_tests.yml | 12 ++++++------ setup.cfg | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/core_tests.yml b/.github/workflows/core_tests.yml index 61c55299c..2f43642f1 100644 --- a/.github/workflows/core_tests.yml +++ b/.github/workflows/core_tests.yml @@ -49,7 +49,7 @@ jobs: mamba env update -n asim-test -f conda-environments/github-actions-tests.yml mamba install --yes \ "psutil=5.9.5" \ - "pydantic=1.10.13" \ + "pydantic=2.6.1" \ "pypyr=5.8.0" \ "pytables=3.6.1" \ "pytest-cov" \ @@ -149,7 +149,7 @@ jobs: mamba env update -n asim-test -f conda-environments/github-actions-tests.yml mamba install --yes \ "psutil=5.9.5" \ - "pydantic=1.10.13" \ + "pydantic=2.6.1" \ "pypyr=5.8.0" \ "pytables=3.6.1" \ "pytest-cov" \ @@ -247,7 +247,7 @@ jobs: mamba env update -n asim-test -f conda-environments/github-actions-tests.yml mamba install --yes \ "psutil=5.9.5" \ - "pydantic=1.10.13" \ + "pydantic=2.6.1" \ "pypyr=5.8.0" \ "pytables=3.6.1" \ "pytest-cov" \ @@ -344,7 +344,7 @@ jobs: mamba env update -n asim-test -f conda-environments/github-actions-tests.yml mamba install --yes \ "psutil=5.9.5" \ - "pydantic=1.10.13" \ + "pydantic=2.6.1" \ "pypyr=5.8.0" \ "pytables=3.6.1" \ "pytest-cov" \ @@ -411,7 +411,7 @@ jobs: mamba env update -n asim-test -f conda-environments/github-actions-tests.yml mamba install --yes \ "psutil=5.9.5" \ - "pydantic=1.10.13" \ + "pydantic=2.6.1" \ "pypyr=5.8.0" \ "pytables=3.6.1" \ "pytest-cov" \ @@ -477,7 +477,7 @@ jobs: mamba env update -n asim-test -f conda-environments/github-actions-tests.yml mamba install --yes \ "psutil=5.9.5" \ - "pydantic=1.10.13" \ + "pydantic=2.6.1" \ "pypyr=5.8.0" \ "pytables=3.6.1" \ "pytest-cov" \ diff --git a/setup.cfg b/setup.cfg index a33f1b3d8..6051b75af 100644 --- a/setup.cfg +++ b/setup.cfg @@ -33,6 +33,7 @@ install_requires = platformdirs psutil >= 4.1 pyarrow >= 2.0 + pydantic >= 2.6 pypyr >= 5.3 pyyaml >= 5.1 requests >= 2.7 From 2a72c2fa48bbb08603ad81416d28a4141e41accf Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Thu, 8 Feb 2024 14:40:22 -0600 Subject: [PATCH 53/61] remove outdated commented code --- activitysim/core/mp_tasks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/activitysim/core/mp_tasks.py b/activitysim/core/mp_tasks.py index 7d1ffc30e..db92be1da 100644 --- a/activitysim/core/mp_tasks.py +++ b/activitysim/core/mp_tasks.py @@ -887,7 +887,6 @@ def setup_injectables_and_logging(injectables, locutor: bool = True) -> workflow state = workflow.State() state = state.initialize_filesystem(**injectables) state.settings = injectables.get("settings", Settings()) - # state.settings = Settings.parse_obj(injectables.get("settings_package", {})) # register abm steps and other abm-specific injectables # by default, assume we are running activitysim.abm From 0d69abbd0a9496a8306c6fa703c44386639947f8 Mon Sep 17 00:00:00 2001 From: Nick Fournier Date: Wed, 26 Apr 2023 14:43:41 -0700 Subject: [PATCH 54/61] added stricter joining of annotated fields --- activitysim/core/util.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 8a0f29b11..4148d220e 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -373,8 +373,22 @@ def assign_in_place(df, df2): df[new_columns] = df2[new_columns] -def df_from_dict(values, index=None): +def reindex_if_series(values, index): + if index is not None: + return values + + if isinstance(values, pd.Series): + assert len(set(values.index).intersection(index)) == len(index) + + if all(values.index != index): + return values.reindex(index=index) + +def df_from_dict(values, index=None): + + # If value object is a series and has out of order index, reindex it + values = {k: reindex_if_series(v, index) for k, v in values.items()} + df = pd.DataFrame.from_dict(values) if index is not None: df.index = index From 6b3a90c4e6e89ea2cd44a5c074b9b32692d5c6a7 Mon Sep 17 00:00:00 2001 From: Nick Fournier Date: Wed, 26 Apr 2023 15:17:00 -0700 Subject: [PATCH 55/61] lint blacked --- activitysim/core/util.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 4148d220e..b7d611ec2 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -26,7 +26,6 @@ def si_units(x, kind="B", digits=3, shift=1000): - # nano micro milli kilo mega giga tera peta exa zeta yotta tiers = ["n", "ยต", "m", "", "K", "M", "G", "T", "P", "E", "Z", "Y"] @@ -342,7 +341,6 @@ def assign_in_place(df, df2): # this is a hack fix for a bug in pandas.update # github.com/pydata/pandas/issues/4094 for c, old_dtype in zip(common_columns, old_dtypes): - # if both df and df2 column were same type, but result is not if (old_dtype == df2[c].dtype) and (df[c].dtype != old_dtype): try: @@ -376,19 +374,18 @@ def assign_in_place(df, df2): def reindex_if_series(values, index): if index is not None: return values - + if isinstance(values, pd.Series): assert len(set(values.index).intersection(index)) == len(index) - + if all(values.index != index): - return values.reindex(index=index) + return values.reindex(index=index) def df_from_dict(values, index=None): - # If value object is a series and has out of order index, reindex it - values = {k: reindex_if_series(v, index) for k, v in values.items()} - + values = {k: reindex_if_series(v, index) for k, v in values.items()} + df = pd.DataFrame.from_dict(values) if index is not None: df.index = index From a3f60a4531be7f47bbbe469a5cd2666f978006ad Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 8 Feb 2024 11:33:51 -0800 Subject: [PATCH 56/61] added unit test for df_from_dict indexing --- activitysim/core/test/test_util.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/activitysim/core/test/test_util.py b/activitysim/core/test/test_util.py index ae9b4fa83..415ec1f9e 100644 --- a/activitysim/core/test/test_util.py +++ b/activitysim/core/test/test_util.py @@ -7,7 +7,7 @@ import pandas.testing as pdt import pytest -from ..util import other_than, quick_loc_df, quick_loc_series, reindex +from ..util import other_than, quick_loc_df, quick_loc_series, reindex, df_from_dict @pytest.fixture(scope="module") @@ -62,3 +62,30 @@ def test_quick_loc_series(): assert list(quick_loc_series(loc_list, series)) == attrib_list assert list(quick_loc_series(loc_list, series)) == list(series.loc[loc_list]) + + +def test_df_from_dict(): + + index = [1, 2, 3, 4, 5] + df = pd.DataFrame({"attrib": [1, 2, 2, 3, 1]}, index=index) + + # scramble index order for one expression and not the other + sorted = df.eval("attrib.sort_values()") + not_sorted = df.eval("attrib * 1") + + # check above expressions + pdt.assert_series_equal( + sorted, pd.Series([1, 1, 2, 2, 3], index=[1, 5, 2, 3, 4]), check_names=False + ) + pdt.assert_series_equal(not_sorted, df.attrib, check_names=False) + + # create a new dataframe from the above expressions + values = {"sorted": sorted, "not_sorted": not_sorted} + new_df = df_from_dict(values, index) + + # index should become unscrambed and back to the same order as before + expected_df = pd.DataFrame( + {"sorted": [1, 2, 2, 3, 1], "not_sorted": [1, 2, 2, 3, 1]}, index=index + ) + + pdt.assert_frame_equal(new_df, expected_df) From 5f182421924042e9f66c05efc03253329b49f2de Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 2 Feb 2024 14:19:00 -0800 Subject: [PATCH 57/61] remove filtered alts from alts_long as well --- activitysim/abm/models/vehicle_type_choice.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/activitysim/abm/models/vehicle_type_choice.py b/activitysim/abm/models/vehicle_type_choice.py index a2ea7b0bd..2c017b888 100644 --- a/activitysim/abm/models/vehicle_type_choice.py +++ b/activitysim/abm/models/vehicle_type_choice.py @@ -245,6 +245,13 @@ def construct_model_alternatives( else: # eliminate alternatives if no vehicle type data alts_wide = alts_wide[alts_wide._merge != "left_only"] + # need to also remove any alts from alts_long + alts_long.set_index(["body_type", "fuel_type", "age"], inplace=True) + alts_long = alts_long[ + alts_long.index.isin( + alts_wide.set_index(["body_type", "fuel_type", "age"]).index + ) + ].reset_index() alts_wide.drop(columns="_merge", inplace=True) # converting age to integer to allow interactions in utilities From cbc3dc810703fc75b2ed4395f9054e37fd11a413 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 2 Feb 2024 17:17:00 -0800 Subject: [PATCH 58/61] logging and correct order for vehicle type name --- activitysim/abm/models/vehicle_type_choice.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/activitysim/abm/models/vehicle_type_choice.py b/activitysim/abm/models/vehicle_type_choice.py index 2c017b888..a93399205 100644 --- a/activitysim/abm/models/vehicle_type_choice.py +++ b/activitysim/abm/models/vehicle_type_choice.py @@ -244,12 +244,16 @@ def construct_model_alternatives( ), f"missing vehicle data for alternatives:\n {missing_alts}" else: # eliminate alternatives if no vehicle type data + num_alts_before_filer = len(alts_wide) alts_wide = alts_wide[alts_wide._merge != "left_only"] + logger.warning( + f"Removed {num_alts_before_filer - len(alts_wide)} alternatives not included in input vehicle type data." + ) # need to also remove any alts from alts_long - alts_long.set_index(["body_type", "fuel_type", "age"], inplace=True) + alts_long.set_index(["body_type", "age", "fuel_type"], inplace=True) alts_long = alts_long[ alts_long.index.isin( - alts_wide.set_index(["body_type", "fuel_type", "age"]).index + alts_wide.set_index(["body_type", "age", "fuel_type"]).index ) ].reset_index() alts_wide.drop(columns="_merge", inplace=True) From 70c73667aee4b90366fabb53fd4a2042759aa89b Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 5 Feb 2024 17:18:49 -0800 Subject: [PATCH 59/61] correct veh type alts indexing --- activitysim/abm/models/vehicle_type_choice.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/activitysim/abm/models/vehicle_type_choice.py b/activitysim/abm/models/vehicle_type_choice.py index a93399205..071061cb8 100644 --- a/activitysim/abm/models/vehicle_type_choice.py +++ b/activitysim/abm/models/vehicle_type_choice.py @@ -256,6 +256,7 @@ def construct_model_alternatives( alts_wide.set_index(["body_type", "age", "fuel_type"]).index ) ].reset_index() + alts_long.index = alts_wide.index alts_wide.drop(columns="_merge", inplace=True) # converting age to integer to allow interactions in utilities @@ -466,11 +467,11 @@ def iterate_vehicle_type_choice( alts = ( alts_long[alts_long.columns] .apply(lambda row: "_".join(row.values.astype(str)), axis=1) - .values + .to_dict() ) else: - alts = model_spec.columns - choices["vehicle_type"] = choices["vehicle_type"].map(dict(enumerate(alts))) + alts = enumerate(dict(model_spec.columns)) + choices["vehicle_type"] = choices["vehicle_type"].map(alts) # STEP II: append probabilistic vehicle type attributes if probs_spec_file is not None: From ede2a526f20cd58686955dd3ae777a0f2534937e Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 7 Feb 2024 21:31:15 -0800 Subject: [PATCH 60/61] veh type alts CI test --- .../util/test/test_vehicle_type_alts.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 activitysim/abm/models/util/test/test_vehicle_type_alts.py diff --git a/activitysim/abm/models/util/test/test_vehicle_type_alts.py b/activitysim/abm/models/util/test/test_vehicle_type_alts.py new file mode 100644 index 000000000..960645c07 --- /dev/null +++ b/activitysim/abm/models/util/test/test_vehicle_type_alts.py @@ -0,0 +1,57 @@ +# ActivitySim +# See full license in LICENSE.txt. + +import pandas as pd +import pandas.testing as pdt + +from activitysim.abm.models.vehicle_type_choice import ( + get_combinatorial_vehicle_alternatives, + construct_model_alternatives, + VehicleTypeChoiceSettings +) +from activitysim.core import workflow + + +def test_vehicle_type_alts(): + state = workflow.State.make_default(__file__) + + alts_cats_dict = { + "body_type": ["Car", "SUV"], + "fuel_type": ["Gas", "BEV"], + "age": [1, 2, 3], + } + + alts_wide, alts_long = get_combinatorial_vehicle_alternatives(alts_cats_dict) + + # alts are initially constructed combinatorially + assert len(alts_long) == 12, "alts_long should have 12 rows" + assert len(alts_wide) == 12, "alts_wide should have 12 rows" + + model_settings = VehicleTypeChoiceSettings.model_construct() + model_settings.combinatorial_alts = alts_cats_dict + model_settings.PROBS_SPEC = None + model_settings.WRITE_OUT_ALTS_FILE = False + + # constructing veh type data with missing alts + vehicle_type_data = pd.DataFrame( + data={ + "body_type": ["Car", "Car", "Car", "SUV", "SUV"], + "fuel_type": ["Gas", "Gas", "BEV", "Gas", "BEV"], + "age": ['1', '2', '3', '1', '2'], + "dummy_data": [1, 2, 3, 4, 5], + }, + index=[0, 1, 2, 3, 4], + ) + + alts_wide, alts_long = construct_model_alternatives( + state, model_settings, alts_cats_dict, vehicle_type_data + ) + + # should only have alts left that are in the file + assert len(alts_long) == 5, "alts_long should have 5 rows" + + # indexes need to be the same to choices match alts + pdt.assert_index_equal(alts_long.index, alts_wide.index) + + # columns need to be in correct order for downstream configs + pdt.assert_index_equal(alts_long.columns, pd.Index(["body_type", "age", "fuel_type"])) From 3521c8d18f88e3c763b87f00b1810e4c9961e568 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 7 Feb 2024 21:33:51 -0800 Subject: [PATCH 61/61] blacken --- .../abm/models/util/test/test_vehicle_type_alts.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/activitysim/abm/models/util/test/test_vehicle_type_alts.py b/activitysim/abm/models/util/test/test_vehicle_type_alts.py index 960645c07..d9cf1c176 100644 --- a/activitysim/abm/models/util/test/test_vehicle_type_alts.py +++ b/activitysim/abm/models/util/test/test_vehicle_type_alts.py @@ -7,7 +7,7 @@ from activitysim.abm.models.vehicle_type_choice import ( get_combinatorial_vehicle_alternatives, construct_model_alternatives, - VehicleTypeChoiceSettings + VehicleTypeChoiceSettings, ) from activitysim.core import workflow @@ -37,7 +37,7 @@ def test_vehicle_type_alts(): data={ "body_type": ["Car", "Car", "Car", "SUV", "SUV"], "fuel_type": ["Gas", "Gas", "BEV", "Gas", "BEV"], - "age": ['1', '2', '3', '1', '2'], + "age": ["1", "2", "3", "1", "2"], "dummy_data": [1, 2, 3, 4, 5], }, index=[0, 1, 2, 3, 4], @@ -54,4 +54,6 @@ def test_vehicle_type_alts(): pdt.assert_index_equal(alts_long.index, alts_wide.index) # columns need to be in correct order for downstream configs - pdt.assert_index_equal(alts_long.columns, pd.Index(["body_type", "age", "fuel_type"])) + pdt.assert_index_equal( + alts_long.columns, pd.Index(["body_type", "age", "fuel_type"]) + )