From 62e89d1a13787fed03ae3cd24bc8e29160f050fe Mon Sep 17 00:00:00 2001 From: sunj2 Date: Fri, 5 Jan 2024 11:45:01 -0800 Subject: [PATCH] Updates for SANDAG ABM3 Integration scripts and setting updates to SANDAG ABM3 Integration --- src/asim-cvm/configs/cvm_accessibility.csv | 6 +- src/asim-cvm/configs/cvm_accessibility.yaml | 2 +- .../configs/destination_choice_size_terms.csv | 78 +- src/asim-cvm/configs/route_start_times.csv | 198 +- src/asim-cvm/configs/settings.yaml | 4 +- src/asim-cvm/configs/write_trip_matrices.yaml | 30 +- ...p_matrices_annotate_trips_preprocessor.csv | 40 +- src/asim-cvm/scripts/convert_tripTables.py | 14 +- src/asim-cvm/scripts/set_zoneMapping.py | 12 +- .../emme/toolbox/import/import_auto_demand.py | 536 +++-- src/main/emme/toolbox/master_run.py | 638 +++-- src/main/python/run_htm.py | 538 +++++ src/main/resources/cvm.bat | 10 +- src/main/resources/htm.bat | 69 + src/main/resources/sandag_abm.properties | 2139 ++++++++--------- 15 files changed, 2603 insertions(+), 1711 deletions(-) create mode 100644 src/main/python/run_htm.py create mode 100644 src/main/resources/htm.bat diff --git a/src/asim-cvm/configs/cvm_accessibility.csv b/src/asim-cvm/configs/cvm_accessibility.csv index 2a2b9a3f4..c353aa0f4 100644 --- a/src/asim-cvm/configs/cvm_accessibility.csv +++ b/src/asim-cvm/configs/cvm_accessibility.csv @@ -1,11 +1,11 @@ Description,Target,Expression -##### CARS use SOV_TR_M_TIME ###### +##### CARS use SOV_TR_M_TIME ######,, peak round trip distance,_trkTime,"skim_od[('SOV_TR_M_TIME', 'AM')] * automobile_am_weight + skim_od[('SOV_TR_M_TIME', 'MD')] * automobile_md_weight + skim_od[('SOV_TR_M_TIME', 'PM')] * automobile_pm_weight" decay function,_decay, exp(_trkTime * dispersion_parameter_automobile) trk to home food delivery attraction,trkHomeFood,df.num_hh_food_delivery * _decay trk to home package delivery attraction,trkHomePackage,df.num_hh_package_delivery * _decay trk to home service attraction,trkHomeService,df.num_hh_service * _decay trk to establishment attraction,trkEstablishment,df.establishment_attraction * _decay -trk to retail,trkRetail,df.emp_retail * _decay +trk to retail,trkRetail,df.emp_ret * _decay trk to total,trkTotal,df.emp_total * _decay -##### +#####,, diff --git a/src/asim-cvm/configs/cvm_accessibility.yaml b/src/asim-cvm/configs/cvm_accessibility.yaml index b918c19a3..29b04bcea 100644 --- a/src/asim-cvm/configs/cvm_accessibility.yaml +++ b/src/asim-cvm/configs/cvm_accessibility.yaml @@ -2,7 +2,7 @@ SPEC: cvm_accessibility.csv # columns from land_use table to add to df -land_use_columns: ['emp_retail', 'emp_total', 'num_hh_food_delivery', 'num_hh_package_delivery', 'num_hh_service', 'establishment_attraction'] +land_use_columns: ['emp_ret', 'emp_total', 'num_hh_food_delivery', 'num_hh_package_delivery', 'num_hh_service', 'establishment_attraction'] CONSTANTS: dispersion_parameter_automobile: -0.05 diff --git a/src/asim-cvm/configs/destination_choice_size_terms.csv b/src/asim-cvm/configs/destination_choice_size_terms.csv index 0574cf50c..dd0eff270 100644 --- a/src/asim-cvm/configs/destination_choice_size_terms.csv +++ b/src/asim-cvm/configs/destination_choice_size_terms.csv @@ -1,39 +1,39 @@ -model_selector,segment,hh,pop,emp_retail,emp_personal_svcs_office,emp_prof_bus_svcs,emp_prof_bus_svcs_bldg_maint,emp_pvt_ed_k12,emp_pvt_ed_post_k12_oth,emp_health,emp_amusement,emp_hotel,emp_restaurant_bar,emp_personal_svcs_retail,emp_religious,emp_fed_non_mil,emp_fed_mil,emp_state_local_gov_blue,emp_state_local_gov_white,emp_state_local_gov_ent,emp_public_ed,emp_ag,emp_mfg_prod,emp_total,enrollgradekto8,enrollgrade9to12,adultschenrl,othercollegeenroll,collegeenroll,parkactive,beachactive,external_work,external_nonwork -workplace,work_low,0,0,0.129,0.193,0,0,0,0,0.383,0,0,0.12,0,0,0,0,0,0,0,0,0.01,0.164,0,0,0,0,0,0,0,0,0,0 -workplace,work_med,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0.21,0,0,0,0,0,0,0,0,0,0 -workplace,work_high,0,0,0.11,0.207,0,0,0,0,0.284,0,0,0.154,0,0,0,0,0,0,0,0,0.006,0.239,0,0,0,0,0,0,0,0,0,0 -workplace,work_veryhigh,0,0,0.093,0.27,0,0,0,0,0.241,0,0,0.146,0,0,0,0,0,0,0,0,0.004,0.246,0,0,0,0,0,0,0,0,0,0 -school,preschool,0,0.1888,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 -school,gradeschool,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 -school,highschool,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 -school,university,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0304,0.859,1,0,0,0,0 -non_mandatory,escort,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 -non_mandatory,shopping,0,0,0.75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -non_mandatory,othmaint,0,0,0.75,0,0.8451,0,0,0,0,0,0,0,2.45592,0,0.72003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -non_mandatory,eatout,0.5512,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -non_mandatory,social,0.3006,0,0,0,0,0,0,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -non_mandatory,othdiscr,0.04333,0,0.04679,0,0.00893,0,0,0,0,0.20337,0.03453,0.15911,0.03726,1,0.00893,0,0.00893,0.00893,0,0,0,0,0,0.03167,0.05136,0,0,0.02258,3.71685,6,0,0 -atwork,atwork,0,0,0.154,0,0.029,0,0,0,0,0,0,0.367,0.054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -trip,work,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 -trip,escort,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 -trip,shopping,0.000001,0,0.75,0,0,0,0,0,0,0,0,0.214689,0,0,0,0,0,0,0,0,0,0,0.0001,0,0,0,0,0,0,0,0,0 -trip,eatout,0.010162,1,0.137829,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -trip,othmaint,0.000001,1,0.75,0,0.05,0,0,0,1.464014,0,0,0,1.725851,0,1.985712,0,0,0,0,0,0,0,0.0001,0,0,0,0,0,0,0,0,0 -trip,social,0.495249,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -trip,othdiscr,0.027342,0,0.038843,0,0,0,0,0,0,0.473744,0.092343,0.122872,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.71685,6,0.05,0 -trip,univ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 -# not needed as school is not chosen as an intermediate trip destination,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -#trip,gradeschool,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -#trip,highschool,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -external_work,external_work,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 -external_nonwork,external_nonwork,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -external_non_mandatory,escort,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -external_non_mandatory,shopping,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -external_non_mandatory,othmaint,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -external_non_mandatory,eatout,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -external_non_mandatory,social,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -external_non_mandatory,othdiscr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -commerce,warehouse,0,0,0.129,0.193,0,0,0,0,0.383,0,0,0.12,0,0,0,0,0,0,0,0,0.01,0.164,0,0,0,0,0,0,0,0,0,0 -commerce,intermodal,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0.21,0,0,0,0,0,0,0,0,0,0 -commerce,residential,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0.21,0,0,0,0,0,0,0,0,0,0 -commerce,commercial,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0.21,0,0,0,0,0,0,0,0,0,0 +model_selector,segment,hh,pop,emp_gov,emp_mil,emp_ag_min,emp_bus_svcs,emp_fin_res_mgm,emp_educ,emp_hlth,emp_ret,emp_trn_wrh,emp_con,emp_utl,emp_mnf,emp_whl,emp_ent,emp_accm,emp_food,emp_oth,emp_non_ws_wfh,emp_non_ws_oth,emp_total,enrollgradekto8,enrollgrade9to12,adultschenrl,othercollegeenroll,collegeenroll,parkactive,beachactive,external_work,external_nonwork +workplace,work_low,0,0,0.129,0.193,0,0,0,0,0.383,0,0,0.12,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0 +workplace,work_med,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0,0,0,0,0,0,0,0,0,0 +workplace,work_high,0,0,0.11,0.207,0,0,0,0,0.284,0,0,0.154,0,0,0,0,0,0,0,0,0.006,0,0,0,0,0,0,0,0,0,0 +workplace,work_veryhigh,0,0,0.093,0.27,0,0,0,0,0.241,0,0,0.146,0,0,0,0,0,0,0,0,0.004,0,0,0,0,0,0,0,0,0,0 +school,preschool,0,0.1888,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 +school,gradeschool,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 +school,highschool,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 +school,university,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0304,0.859,1,0,0,0,0 +non_mandatory,escort,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +non_mandatory,shopping,0,0,0.75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +non_mandatory,othmaint,0,0,0.75,0,0.8451,0,0,0,0,0,0,0,2.45592,0,0.72003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +non_mandatory,eatout,0.5512,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +non_mandatory,social,0.3006,0,0,0,0,0,0,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +non_mandatory,othdiscr,0.04333,0,0.04679,0,0.00893,0,0,0,0,0.20337,0.03453,0.15911,0.03726,1,0.00893,0,0.00893,0.00893,0,0,0,0,0.03167,0.05136,0,0,0.02258,3.71685,6,0,0 +atwork,atwork,0,0,0.154,0,0.029,0,0,0,0,0,0,0.367,0.054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +trip,work,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +trip,escort,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +trip,shopping,0.000001,0,0.75,0,0,0,0,0,0,0,0,0.214689,0,0,0,0,0,0,0,0,0,0.0001,0,0,0,0,0,0,0,0,0 +trip,eatout,0.010162,1,0.137829,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +trip,othmaint,0.000001,1,0.75,0,0.05,0,0,0,1.464014,0,0,0,1.725851,0,1.985712,0,0,0,0,0,0,0.0001,0,0,0,0,0,0,0,0,0 +trip,social,0.495249,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +trip,othdiscr,0.027342,0,0.038843,0,0,0,0,0,0,0.473744,0.092343,0.122872,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3.71685,6,0.05,0 +trip,univ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 +# not needed as school is not chosen as an intermediate trip destination,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +#trip,gradeschool,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +#trip,highschool,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +external_work,external_work,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +external_nonwork,external_nonwork,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +external_non_mandatory,escort,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +external_non_mandatory,shopping,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +external_non_mandatory,othmaint,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +external_non_mandatory,eatout,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +external_non_mandatory,social,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +external_non_mandatory,othdiscr,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +commerce,warehouse,0,0,0.129,0.193,0,0,0,0,0.383,0,0,0.12,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0 +commerce,intermodal,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0,0,0,0,0,0,0,0,0,0 +commerce,residential,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0,0,0,0,0,0,0,0,0,0 +commerce,commercial,0,0,0.12,0.197,0,0,0,0,0.325,0,0,0.139,0,0,0,0,0,0,0,0,0.008,0,0,0,0,0,0,0,0,0,0 diff --git a/src/asim-cvm/configs/route_start_times.csv b/src/asim-cvm/configs/route_start_times.csv index 6220c29bd..e657b808e 100644 --- a/src/asim-cvm/configs/route_start_times.csv +++ b/src/asim-cvm/configs/route_start_times.csv @@ -1,101 +1,101 @@ ,,,Time Periods,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, route_purpose,vehicle_type,business_type,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 -goods,LCV,AGM,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -goods,MUT,AGM,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -goods,SUT,AGM,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -service,LCV,AGM,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -service,MUT,AGM,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -service,SUT,AGM,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -maintenance,LCV,AGM,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,AGM,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,AGM,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,IUT,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -goods,MUT,IUT,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -goods,SUT,IUT,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -service,LCV,IUT,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -service,MUT,IUT,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -service,SUT,IUT,0.000103,0.000384,0.000672,0.000681,0.001138,0.004511,0.016761,0.042656,0.071097,0.086840,0.095514,0.105697,0.101572,0.078597,0.065522,0.070442,0.071175,0.053735,0.028570,0.017805,0.024598,0.027948,0.017398,0.006323,0.002483,0.002095,0.001785,0.001349,0.001229,0.000896,0.000348,0.000061,0.000004,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000011 -maintenance,LCV,IUT,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,IUT,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,IUT,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,CON,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -goods,MUT,CON,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -goods,SUT,CON,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -service,LCV,CON,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -service,MUT,CON,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -service,SUT,CON,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -maintenance,LCV,CON,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,CON,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,CON,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,EPO,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -goods,MUT,EPO,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -goods,SUT,EPO,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -service,LCV,EPO,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -service,MUT,EPO,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -service,SUT,EPO,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -maintenance,LCV,EPO,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,EPO,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,EPO,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,IFR,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -goods,MUT,IFR,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -goods,SUT,IFR,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -service,LCV,IFR,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -service,MUT,IFR,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -service,SUT,IFR,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -maintenance,LCV,IFR,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,IFR,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,IFR,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,LAF,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -goods,MUT,LAF,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -goods,SUT,LAF,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -service,LCV,LAF,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -service,MUT,LAF,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -service,SUT,LAF,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -maintenance,LCV,LAF,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,LAF,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,LAF,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,MHS,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -goods,MUT,MHS,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -goods,SUT,MHS,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -service,LCV,MHS,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -service,MUT,MHS,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -service,SUT,MHS,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -maintenance,LCV,MHS,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,MHS,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,MHS,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,RET,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -goods,MUT,RET,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -goods,SUT,RET,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -service,LCV,RET,0.001027,0.001974,0.003849,0.006959,0.011859,0.018241,0.027156,0.044330,0.072062,0.099846,0.112917,0.106996,0.091431,0.077820,0.065109,0.049336,0.034081,0.022312,0.016446,0.015582,0.016215,0.016724,0.015395,0.011889,0.008563,0.006699,0.006118,0.005835,0.005155,0.004281,0.003589,0.003152,0.002495,0.001587,0.001260,0.001466,0.001540,0.001402,0.001033,0.000487,0.000230,0.000464,0.000825,0.000907,0.000916,0.000909,0.000774,0.000756 -service,MUT,RET,0.005643,0.006543,0.009221,0.013879,0.024174,0.041331,0.064123,0.088894,0.115529,0.138979,0.137534,0.106882,0.064538,0.027899,0.010146,0.007048,0.007367,0.008257,0.010526,0.013641,0.018929,0.022489,0.016464,0.006233,0.001076,0.000070,0.000001,0.000000,0.000000,0.000000,0.000023,0.000357,0.002043,0.005164,0.006196,0.003575,0.000953,0.000105,0.000003,0.000000,0.000000,0.000000,0.000000,0.000023,0.000357,0.002044,0.005187,0.006554 -service,SUT,RET,0.010341,0.012999,0.015821,0.016047,0.014969,0.021292,0.042956,0.074313,0.097409,0.103504,0.093084,0.070253,0.053824,0.056156,0.063300,0.057292,0.041333,0.026820,0.016035,0.009850,0.008552,0.010068,0.009661,0.005456,0.002779,0.003805,0.004771,0.004128,0.004325,0.005057,0.003770,0.001439,0.000249,0.000016,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000146,0.001324,0.004966,0.008617,0.007341,0.003979,0.004364,0.007582 -maintenance,LCV,RET,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,RET,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,RET,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,MFG,0.004887,0.007632,0.009750,0.010204,0.010447,0.014484,0.029295,0.054069,0.076404,0.088014,0.087390,0.077074,0.064762,0.052193,0.043091,0.041045,0.038819,0.036466,0.036746,0.033145,0.027569,0.026708,0.026925,0.022599,0.015492,0.009570,0.005798,0.003896,0.003829,0.004784,0.005406,0.004682,0.003308,0.002445,0.002033,0.001373,0.000732,0.000941,0.001491,0.001320,0.000987,0.001347,0.001520,0.000904,0.000546,0.001374,0.002839,0.003666 -goods,MUT,MFG,0.051166,0.059538,0.055204,0.062060,0.093179,0.111071,0.093686,0.066415,0.045311,0.034169,0.029028,0.025491,0.031781,0.044493,0.043169,0.027553,0.015374,0.010124,0.007196,0.004556,0.002452,0.001605,0.001073,0.000460,0.000510,0.001648,0.002853,0.002445,0.001349,0.001203,0.001258,0.000719,0.000192,0.000021,0.000001,0.000000,0.000000,0.000000,0.000005,0.000094,0.000608,0.001856,0.003174,0.004051,0.005162,0.007903,0.016177,0.032613 -goods,SUT,MFG,0.007165,0.014223,0.014901,0.009068,0.007490,0.019956,0.045016,0.066272,0.074165,0.078714,0.081630,0.076156,0.068383,0.064161,0.056742,0.046121,0.037331,0.028330,0.024066,0.026152,0.026680,0.024213,0.019981,0.012322,0.006043,0.008019,0.014328,0.015712,0.012242,0.007915,0.003577,0.000868,0.000091,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000188,0.001771 -service,LCV,MFG,0.004887,0.007632,0.009750,0.010204,0.010447,0.014484,0.029295,0.054069,0.076404,0.088014,0.087390,0.077074,0.064762,0.052193,0.043091,0.041045,0.038819,0.036466,0.036746,0.033145,0.027569,0.026708,0.026925,0.022599,0.015492,0.009570,0.005798,0.003896,0.003829,0.004784,0.005406,0.004682,0.003308,0.002445,0.002033,0.001373,0.000732,0.000941,0.001491,0.001320,0.000987,0.001347,0.001520,0.000904,0.000546,0.001374,0.002839,0.003666 -service,MUT,MFG,0.051166,0.059538,0.055204,0.062060,0.093179,0.111071,0.093686,0.066415,0.045311,0.034169,0.029028,0.025491,0.031781,0.044493,0.043169,0.027553,0.015374,0.010124,0.007196,0.004556,0.002452,0.001605,0.001073,0.000460,0.000510,0.001648,0.002853,0.002445,0.001349,0.001203,0.001258,0.000719,0.000192,0.000021,0.000001,0.000000,0.000000,0.000000,0.000005,0.000094,0.000608,0.001856,0.003174,0.004051,0.005162,0.007903,0.016177,0.032613 -service,SUT,MFG,0.007165,0.014223,0.014901,0.009068,0.007490,0.019956,0.045016,0.066272,0.074165,0.078714,0.081630,0.076156,0.068383,0.064161,0.056742,0.046121,0.037331,0.028330,0.024066,0.026152,0.026680,0.024213,0.019981,0.012322,0.006043,0.008019,0.014328,0.015712,0.012242,0.007915,0.003577,0.000868,0.000091,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000188,0.001771 -maintenance,LCV,MFG,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,MFG,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,MFG,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,TRN,0.004887,0.007632,0.009750,0.010204,0.010447,0.014484,0.029295,0.054069,0.076404,0.088014,0.087390,0.077074,0.064762,0.052193,0.043091,0.041045,0.038819,0.036466,0.036746,0.033145,0.027569,0.026708,0.026925,0.022599,0.015492,0.009570,0.005798,0.003896,0.003829,0.004784,0.005406,0.004682,0.003308,0.002445,0.002033,0.001373,0.000732,0.000941,0.001491,0.001320,0.000987,0.001347,0.001520,0.000904,0.000546,0.001374,0.002839,0.003666 -goods,MUT,TRN,0.051166,0.059538,0.055204,0.062060,0.093179,0.111071,0.093686,0.066415,0.045311,0.034169,0.029028,0.025491,0.031781,0.044493,0.043169,0.027553,0.015374,0.010124,0.007196,0.004556,0.002452,0.001605,0.001073,0.000460,0.000510,0.001648,0.002853,0.002445,0.001349,0.001203,0.001258,0.000719,0.000192,0.000021,0.000001,0.000000,0.000000,0.000000,0.000005,0.000094,0.000608,0.001856,0.003174,0.004051,0.005162,0.007903,0.016177,0.032613 -goods,SUT,TRN,0.007165,0.014223,0.014901,0.009068,0.007490,0.019956,0.045016,0.066272,0.074165,0.078714,0.081630,0.076156,0.068383,0.064161,0.056742,0.046121,0.037331,0.028330,0.024066,0.026152,0.026680,0.024213,0.019981,0.012322,0.006043,0.008019,0.014328,0.015712,0.012242,0.007915,0.003577,0.000868,0.000091,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000188,0.001771 -service,LCV,TRN,0.004887,0.007632,0.009750,0.010204,0.010447,0.014484,0.029295,0.054069,0.076404,0.088014,0.087390,0.077074,0.064762,0.052193,0.043091,0.041045,0.038819,0.036466,0.036746,0.033145,0.027569,0.026708,0.026925,0.022599,0.015492,0.009570,0.005798,0.003896,0.003829,0.004784,0.005406,0.004682,0.003308,0.002445,0.002033,0.001373,0.000732,0.000941,0.001491,0.001320,0.000987,0.001347,0.001520,0.000904,0.000546,0.001374,0.002839,0.003666 -service,MUT,TRN,0.051166,0.059538,0.055204,0.062060,0.093179,0.111071,0.093686,0.066415,0.045311,0.034169,0.029028,0.025491,0.031781,0.044493,0.043169,0.027553,0.015374,0.010124,0.007196,0.004556,0.002452,0.001605,0.001073,0.000460,0.000510,0.001648,0.002853,0.002445,0.001349,0.001203,0.001258,0.000719,0.000192,0.000021,0.000001,0.000000,0.000000,0.000000,0.000005,0.000094,0.000608,0.001856,0.003174,0.004051,0.005162,0.007903,0.016177,0.032613 -service,SUT,TRN,0.007165,0.014223,0.014901,0.009068,0.007490,0.019956,0.045016,0.066272,0.074165,0.078714,0.081630,0.076156,0.068383,0.064161,0.056742,0.046121,0.037331,0.028330,0.024066,0.026152,0.026680,0.024213,0.019981,0.012322,0.006043,0.008019,0.014328,0.015712,0.012242,0.007915,0.003577,0.000868,0.000091,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000188,0.001771 -maintenance,LCV,TRN,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,TRN,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,TRN,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -goods,LCV,WHL,0.004887,0.007632,0.009750,0.010204,0.010447,0.014484,0.029295,0.054069,0.076404,0.088014,0.087390,0.077074,0.064762,0.052193,0.043091,0.041045,0.038819,0.036466,0.036746,0.033145,0.027569,0.026708,0.026925,0.022599,0.015492,0.009570,0.005798,0.003896,0.003829,0.004784,0.005406,0.004682,0.003308,0.002445,0.002033,0.001373,0.000732,0.000941,0.001491,0.001320,0.000987,0.001347,0.001520,0.000904,0.000546,0.001374,0.002839,0.003666 -goods,MUT,WHL,0.051166,0.059538,0.055204,0.062060,0.093179,0.111071,0.093686,0.066415,0.045311,0.034169,0.029028,0.025491,0.031781,0.044493,0.043169,0.027553,0.015374,0.010124,0.007196,0.004556,0.002452,0.001605,0.001073,0.000460,0.000510,0.001648,0.002853,0.002445,0.001349,0.001203,0.001258,0.000719,0.000192,0.000021,0.000001,0.000000,0.000000,0.000000,0.000005,0.000094,0.000608,0.001856,0.003174,0.004051,0.005162,0.007903,0.016177,0.032613 -goods,SUT,WHL,0.007165,0.014223,0.014901,0.009068,0.007490,0.019956,0.045016,0.066272,0.074165,0.078714,0.081630,0.076156,0.068383,0.064161,0.056742,0.046121,0.037331,0.028330,0.024066,0.026152,0.026680,0.024213,0.019981,0.012322,0.006043,0.008019,0.014328,0.015712,0.012242,0.007915,0.003577,0.000868,0.000091,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000188,0.001771 -service,LCV,WHL,0.004887,0.007632,0.009750,0.010204,0.010447,0.014484,0.029295,0.054069,0.076404,0.088014,0.087390,0.077074,0.064762,0.052193,0.043091,0.041045,0.038819,0.036466,0.036746,0.033145,0.027569,0.026708,0.026925,0.022599,0.015492,0.009570,0.005798,0.003896,0.003829,0.004784,0.005406,0.004682,0.003308,0.002445,0.002033,0.001373,0.000732,0.000941,0.001491,0.001320,0.000987,0.001347,0.001520,0.000904,0.000546,0.001374,0.002839,0.003666 -service,MUT,WHL,0.051166,0.059538,0.055204,0.062060,0.093179,0.111071,0.093686,0.066415,0.045311,0.034169,0.029028,0.025491,0.031781,0.044493,0.043169,0.027553,0.015374,0.010124,0.007196,0.004556,0.002452,0.001605,0.001073,0.000460,0.000510,0.001648,0.002853,0.002445,0.001349,0.001203,0.001258,0.000719,0.000192,0.000021,0.000001,0.000000,0.000000,0.000000,0.000005,0.000094,0.000608,0.001856,0.003174,0.004051,0.005162,0.007903,0.016177,0.032613 -service,SUT,WHL,0.007165,0.014223,0.014901,0.009068,0.007490,0.019956,0.045016,0.066272,0.074165,0.078714,0.081630,0.076156,0.068383,0.064161,0.056742,0.046121,0.037331,0.028330,0.024066,0.026152,0.026680,0.024213,0.019981,0.012322,0.006043,0.008019,0.014328,0.015712,0.012242,0.007915,0.003577,0.000868,0.000091,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000005,0.000188,0.001771 -maintenance,LCV,WHL,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,MUT,WHL,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 -maintenance,SUT,WHL,0.000001,0.000000,0.000020,0.000245,0.001407,0.005001,0.012960,0.024611,0.035783,0.047419,0.059385,0.063913,0.067935,0.084735,0.099504,0.091978,0.068231,0.046019,0.033114,0.028635,0.033053,0.039041,0.032666,0.017352,0.008382,0.009439,0.012779,0.012393,0.010357,0.008771,0.006804,0.005588,0.006795,0.007851,0.005794,0.002819,0.001317,0.000600,0.000280,0.000502,0.000848,0.000791,0.000793,0.001352,0.001567,0.000903,0.000241,0.000027 +goods,LCV,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,AGM,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,IUT,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,CON,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,EPO,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,IFR,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,LAF,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,MHS,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,RET,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,MFG,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,TRN,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,LCV,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,MUT,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +goods,SUT,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,LCV,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,MUT,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +service,SUT,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,LCV,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,MUT,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +maintenance,SUT,WHL,0,0,0,0,0,0,0.25,0.25,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/src/asim-cvm/configs/settings.yaml b/src/asim-cvm/configs/settings.yaml index 6204d7cfb..7bb4db107 100644 --- a/src/asim-cvm/configs/settings.yaml +++ b/src/asim-cvm/configs/settings.yaml @@ -1,7 +1,8 @@ households_sample_size: 0 -establishments_sample_size: 50 +establishments_sample_size: 0 trace_establishment_id: trace_hh_id: 479044 +#resume_after: inherit_settings: True chunk_size: 0 @@ -35,6 +36,7 @@ input_table_list: index_col: zone_id rename_columns: MAZ: zone_id + #emp_retail: emp_ret drop_columns: - i1 - i2 diff --git a/src/asim-cvm/configs/write_trip_matrices.yaml b/src/asim-cvm/configs/write_trip_matrices.yaml index e1b249de7..86651a01d 100644 --- a/src/asim-cvm/configs/write_trip_matrices.yaml +++ b/src/asim-cvm/configs/write_trip_matrices.yaml @@ -14,7 +14,7 @@ EST_EXPANSION_WEIGHT_COL: sample_rate # added when establishments rPMd in SAVE_TRIPS_TABLE: False MATRICES: - - file_name: trips_ea.omx + - file_name: CVMtrips_ea.omx tables: - name: CAR_EA data_field: CAR_EA @@ -22,9 +22,9 @@ MATRICES: data_field: LIGHT_TRUCK_EA - name: MEDIUM_TRUCK_EA data_field: MEDIUM_TRUCK_EA - - name: HEAVY_TRUCK_EA - data_field: HEAVY_TRUCK_EA - - file_name: trips_am.omx + #- name: HEAVY_TRUCK_EA + # data_field: HEAVY_TRUCK_EA + - file_name: CVMtrips_am.omx tables: - name: CAR_AM data_field: CAR_AM @@ -32,9 +32,9 @@ MATRICES: data_field: LIGHT_TRUCK_AM - name: MEDIUM_TRUCK_AM data_field: MEDIUM_TRUCK_AM - - name: HEAVY_TRUCK_AM - data_field: HEAVY_TRUCK_AM - - file_name: trips_md.omx + #- name: HEAVY_TRUCK_AM + # data_field: HEAVY_TRUCK_AM + - file_name: CVMtrips_md.omx tables: - name: CAR_MD data_field: CAR_MD @@ -42,9 +42,9 @@ MATRICES: data_field: LIGHT_TRUCK_MD - name: MEDIUM_TRUCK_MD data_field: MEDIUM_TRUCK_MD - - name: HEAVY_TRUCK_MD - data_field: HEAVY_TRUCK_MD - - file_name: trips_pm.omx + #- name: HEAVY_TRUCK_MD + # data_field: HEAVY_TRUCK_MD + - file_name: CVMtrips_pm.omx tables: - name: CAR_PM data_field: CAR_PM @@ -52,9 +52,9 @@ MATRICES: data_field: LIGHT_TRUCK_PM - name: MEDIUM_TRUCK_PM data_field: MEDIUM_TRUCK_PM - - name: HEAVY_TRUCK_PM - data_field: HEAVY_TRUCK_PM - - file_name: trips_ev.omx + #- name: HEAVY_TRUCK_PM + # data_field: HEAVY_TRUCK_PM + - file_name: CVMtrips_ev.omx tables: - name: CAR_EV data_field: CAR_EV @@ -62,8 +62,8 @@ MATRICES: data_field: LIGHT_TRUCK_EV - name: MEDIUM_TRUCK_EV data_field: MEDIUM_TRUCK_EV - - name: HEAVY_TRUCK_EV - data_field: HEAVY_TRUCK_EV + #- name: HEAVY_TRUCK_EV + # data_field: HEAVY_TRUCK_EV CONSTANTS: time_periods: diff --git a/src/asim-cvm/configs/write_trip_matrices_annotate_trips_preprocessor.csv b/src/asim-cvm/configs/write_trip_matrices_annotate_trips_preprocessor.csv index b9392b11d..a77b10b9f 100644 --- a/src/asim-cvm/configs/write_trip_matrices_annotate_trips_preprocessor.csv +++ b/src/asim-cvm/configs/write_trip_matrices_annotate_trips_preprocessor.csv @@ -8,27 +8,27 @@ Description,Target,Expression ,is_pm,"cv_trips.trip_start_time.between(time_periods['PM']['first_hour'], time_periods['PM']['last_hour'])" ,is_ev,(cv_trips.trip_start_time >= time_periods['EV']['first_hour']) | (cv_trips.trip_start_time <= time_periods['EV']['last_hour']) # ea trips,, -,CAR_EA,((vehicle_type == 'car') & is_ea) -,LIGHT_TRUCK_EA,((vehicle_type == 'light_truck') & is_ea) -,MEDIUM_TRUCK_EA,((vehicle_type == 'med_truck') & is_ea) -,HEAVY_TRUCK_EA,((vehicle_type == 'heavy_truck') & is_ea) +,CAR_EA,((vehicle_type == 'LCV') & is_ea) +,LIGHT_TRUCK_EA,((vehicle_type == 'SUT') & is_ea) +,MEDIUM_TRUCK_EA,((vehicle_type == 'MUT') & is_ea) +#,HEAVY_TRUCK_EA,((vehicle_type == 'heavy_truck') & is_ea) # am trips,, -,CAR_AM,((vehicle_type == 'car') & is_am) -,LIGHT_TRUCK_AM,((vehicle_type == 'light_truck') & is_am) -,MEDIUM_TRUCK_AM,((vehicle_type == 'med_truck') & is_am) -,HEAVY_TRUCK_AM,((vehicle_type == 'heavy_truck') & is_am) +,CAR_AM,((vehicle_type == 'LCV') & is_am) +,LIGHT_TRUCK_AM,((vehicle_type == 'SUT') & is_am) +,MEDIUM_TRUCK_AM,((vehicle_type == 'MUT') & is_am) +#,HEAVY_TRUCK_AM,((vehicle_type == 'heavy_truck') & is_am) # md trips,, -,CAR_MD,((vehicle_type == 'car') & is_md) -,LIGHT_TRUCK_MD,((vehicle_type == 'light_truck') & is_md) -,MEDIUM_TRUCK_MD,((vehicle_type == 'med_truck') & is_md) -,HEAVY_TRUCK_MD,((vehicle_type == 'heavy_truck') & is_md) +,CAR_MD,((vehicle_type == 'LCV') & is_md) +,LIGHT_TRUCK_MD,((vehicle_type == 'SUT') & is_md) +,MEDIUM_TRUCK_MD,((vehicle_type == 'MUT') & is_md) +#,HEAVY_TRUCK_MD,((vehicle_type == 'heavy_truck') & is_md) # pm trips,, -,CAR_PM,((vehicle_type == 'car') & is_pm) -,LIGHT_TRUCK_PM,((vehicle_type == 'light_truck') & is_pm) -,MEDIUM_TRUCK_PM,((vehicle_type == 'med_truck') & is_pm) -,HEAVY_TRUCK_PM,((vehicle_type == 'heavy_truck') & is_pm) +,CAR_PM,((vehicle_type == 'LCV') & is_pm) +,LIGHT_TRUCK_PM,((vehicle_type == 'SUT') & is_pm) +,MEDIUM_TRUCK_PM,((vehicle_type == 'MUT') & is_pm) +#,HEAVY_TRUCK_PM,((vehicle_type == 'heavy_truck') & is_pm) # ev trips,, -,CAR_EV,((vehicle_type == 'car') & is_ev) -,LIGHT_TRUCK_EV,((vehicle_type == 'light_truck') & is_ev) -,MEDIUM_TRUCK_EV,((vehicle_type == 'med_truck') & is_ev) -,HEAVY_TRUCK_EV,((vehicle_type == 'heavy_truck') & is_ev) \ No newline at end of file +,CAR_EV,((vehicle_type == 'LCV') & is_ev) +,LIGHT_TRUCK_EV,((vehicle_type == 'SUT') & is_ev) +,MEDIUM_TRUCK_EV,((vehicle_type == 'MUT') & is_ev) +#,HEAVY_TRUCK_EV,((vehicle_type == 'heavy_truck') & is_ev) diff --git a/src/asim-cvm/scripts/convert_tripTables.py b/src/asim-cvm/scripts/convert_tripTables.py index 7f90d70b4..1ae4ee693 100644 --- a/src/asim-cvm/scripts/convert_tripTables.py +++ b/src/asim-cvm/scripts/convert_tripTables.py @@ -10,14 +10,14 @@ for period in ['EA', 'AM', 'MD', 'PM', 'EV']: - print("Working on auto %s_%s_%s" %(mode, period, vot)) + print("Working on auto %s_%s" %(model_name, period)) #rename the file # os.rename(output_dir + "/%s_%s_%s.omx" % (mode, period, vot), output_dir + "/%s_%s_%s_.omx" % (mode, period, vot)) - trips = omx.open_file(output_dir + "/" + model_name + "/trips_%s.omx" % (period), 'r') - new_trips = omx.open_file(output_dir + "/assignment/%s_%s_%s.omx" % (mode, period, vot), 'w') + trip = omx.open_file(output_dir + "/" + model_name + "//%strips_%s.omx" % (model_name, period), 'r') + new_trips = omx.open_file(output_dir + "/assignment/%strips_%s.omx" % (model_name, period), 'w') - for table in skim.list_matrices(): - new_skim.create_matrix(name = table, obj=np.array(skim[table]), shape = skim[table].shape, atom=tables.Atom.from_dtype(np.dtype('float64'))) + for table in trip.list_matrices(): + new_trips.create_matrix(name = table, obj=np.array(trip[table]), shape = trip[table].shape, atom=tables.Atom.from_dtype(np.dtype('float64'))) - skim.close() - new_skim.close() \ No newline at end of file + trip.close() + new_trips.close() \ No newline at end of file diff --git a/src/asim-cvm/scripts/set_zoneMapping.py b/src/asim-cvm/scripts/set_zoneMapping.py index 6aff18e9a..4e298ca12 100644 --- a/src/asim-cvm/scripts/set_zoneMapping.py +++ b/src/asim-cvm/scripts/set_zoneMapping.py @@ -10,16 +10,18 @@ print("Working on setting zone mapping for cv trips_%s.omx" %(period)) # check if the old file exists, if so, delete it - if os.path.exists(output_dir + "/%s/trips_%s_.omx" % (model_name, period)): - os.remove(output_dir + "/%s/trips_%s_.omx" % (model_name, period)) + #if os.path.exists(output_dir + "/%s/%strips_%s_.omx" % (model_name, model_name, period)): + #os.remove(output_dir + "/%s/%strips_%s_.omx" % (model_name, model_name, period)) # rename the file - os.rename(output_dir + "/%s/trips_%s.omx" % (model_name, period), output_dir + "/%s/trips_%s_.omx" % (model_name, period)) - trip_table_old = omx.open_file(output_dir + "/%s/trips_%s_.omx" % (model_name, period), 'r') - trip_table = omx.open_file(output_dir + "/%s/trips_%s.omx" % (model_name, period), 'w') + os.rename(output_dir + "/%s/%strips_%s.omx" % (model_name, model_name, period), output_dir + "/%s/%strips_%s_.omx" % (model_name, model_name, period)) + trip_table_old = omx.open_file(output_dir + "/%s/%strips_%s_.omx" % (model_name, model_name, period), 'r') + trip_table = omx.open_file(output_dir + "/%s/%strips_%s.omx" % (model_name, model_name, period), 'w') for core in trip_table_old.list_matrices(): + print("core is " + core) mapping_name = trip_table_old.list_mappings()[0] + print("mapping_name is " + mapping_name) zone_mapping = trip_table_old.mapping(mapping_name) zones = list(zone_mapping.keys()) zones_sorted = sorted(zones) diff --git a/src/main/emme/toolbox/import/import_auto_demand.py b/src/main/emme/toolbox/import/import_auto_demand.py index 375a27c2e..040e05828 100644 --- a/src/main/emme/toolbox/import/import_auto_demand.py +++ b/src/main/emme/toolbox/import/import_auto_demand.py @@ -69,6 +69,7 @@ import os import numpy from contextlib import contextmanager as _context +import inro.emme.matrix as _matrix _join = os.path.join @@ -173,8 +174,8 @@ def __call__(self, output_dir, external_zones, num_processors, scenario): self.external_zones = external_zones self.num_processors = num_processors self.import_traffic_trips(props) - self.import_commercial_vehicle_demand(props) - #self.convert_light_trucks_to_pce() + #self.import_commercial_vehicle_demand(props) + # self.convert_light_trucks_to_pce() self.add_aggregate_demand() @_context @@ -194,10 +195,13 @@ def set_data(self, name, value): value = value + self._matrix_cache[name] self._matrix_cache[name] = value - @_m.logbook_trace("Import CT-RAMP traffic trips from OMX") + @_m.logbook_trace("Import ActivitySim traffic trips from OMX") def import_traffic_trips(self, props): - title = "Import CT-RAMP traffic trips from OMX report" + title = "Import ActivitySim traffic trips from OMX report" report = _m.PageBuilder(title) + + emmebank = self.scenario.emmebank + emme_zones = self.scenario.zone_numbers taxi_da_share = props["Taxi.da.share"] taxi_s2_share = props["Taxi.s2.share"] @@ -213,7 +217,7 @@ def import_traffic_trips(self, props): tnc_shared_pce = props["TNC.shared.passengersPerVehicle"] av_share = props["Mobility.AV.Share"] - periods = ["_EA", "_AM", "_MD", "_PM", "_EV"] + periods = ["_EA", "_AM", "_MD", "_PM", "_EV"] vot_bins = ["_low", "_med", "_high"] mode_shares = [ ("mf%s_SOV_TR_H", { @@ -226,246 +230,322 @@ def import_traffic_trips(self, props): "TAXI": taxi_s3_share / taxi_pce }), ] + + cvm_vot_low_share = props["cvm.vot.share.low"] + cvm_vot_med_share = props["cvm.vot.share.medium"] + cvm_vot_high_share = props["cvm.vot.share.high"] + cvm_vot_shares = [cvm_vot_low_share, cvm_vot_med_share, cvm_vot_high_share] + + + truck_pce_light = 1.3 + truck_pce_medium = 1.5 + truck_pce_heavy = 2.5 with self.setup() as omx_manager: - # SOV transponder "TRPDR" = "TR" and non-transponder "NOTRPDR" = "NT" + # SOV transponder "TRPDR" = "TR" and non-transponder "NOTRPDR" = "NT" for period in periods: - for vot in vot_bins: - # SOV non-transponder demand - matrix_name = "mf%s_SOV_NT_%s" % (period[1:], vot[1].upper()) - logbook_label = "Import auto from OMX SOVNOTRPDR to matrix %s" % (matrix_name) - resident_demand = omx_manager.lookup(("auto", period, vot), "SOVNOTRPDR%s" % period) - visitor_demand = omx_manager.lookup(("autoVisitor", period, vot), "SOV%s" % period) - cross_border_demand = omx_manager.lookup(("autoCrossBorder", period, vot), "SOV%s" % period) - # NOTE: No non-transponder airport or internal-external demand - total_ct_ramp_trips = ( - resident_demand + visitor_demand + cross_border_demand) - dem_utils.demand_report([ - ("resident", resident_demand), - ("cross_border", cross_border_demand), - ("visitor", visitor_demand), - ("total", total_ct_ramp_trips) - ], - logbook_label, self.scenario, report) - self.set_data(matrix_name, total_ct_ramp_trips) - - # SOV transponder demand - matrix_name = "mf%s_SOV_TR_%s" % (period[1:], vot[1].upper()) - logbook_label = "Import auto from OMX SOVTRPDR to matrix %s" % (matrix_name) - resident_demand = omx_manager.lookup(("auto", period, vot), "SOVTRPDR%s" % period) - # NOTE: No transponder visitor or cross-border demand - airport_demand = omx_manager.lookup(("autoAirport", ".SAN" + period, vot), "SOV%s" % period) - if omx_manager.file_exists(("autoAirport", ".CBX" + period, vot)): - airport_demand += omx_manager.lookup(("autoAirport", ".CBX" + period, vot), "SOV%s" % period) - internal_external_demand = omx_manager.lookup(("autoInternalExternal", period, vot), "SOV%s" % period) - - total_ct_ramp_trips = ( - resident_demand + airport_demand + internal_external_demand) - dem_utils.demand_report([ - ("resident", resident_demand), - ("airport", airport_demand), - ("internal_external", internal_external_demand), - ("total", total_ct_ramp_trips) - ], - logbook_label, self.scenario, report) - self.set_data(matrix_name, total_ct_ramp_trips) - - # HOV2 and HOV3 demand - matrix_name_map = [ - ("mf%s_HOV2_%s", "SR2%s"), - ("mf%s_HOV3_%s", "SR3%s") - ] - for matrix_name_tmplt, omx_name in matrix_name_map: - matrix_name = matrix_name_tmplt % (period[1:], vot[1].upper()) - logbook_label = "Import auto from OMX %s to matrix %s" % (omx_name[:3], matrix_name) - resident_demand = ( - omx_manager.lookup(("auto", period, vot), omx_name % ("TRPDR" + period)) - + omx_manager.lookup(("auto", period, vot), omx_name % ("NOTRPDR" + period))) - visitor_demand = omx_manager.lookup(("autoVisitor", period, vot), omx_name % period) - cross_border_demand = omx_manager.lookup(("autoCrossBorder", period, vot), omx_name % period) - airport_demand = omx_manager.lookup(("autoAirport", ".SAN" + period, vot), omx_name % period) - if omx_manager.file_exists(("autoAirport", ".CBX" + period, vot)): - airport_demand += omx_manager.lookup(("autoAirport", ".CBX" + period, vot), omx_name % period) - internal_external_demand = omx_manager.lookup(("autoInternalExternal", period, vot), omx_name % period) + with _m.logbook_trace("Import ActivitySim traffic trips from OMX for %s" % period): + for vot, cvm_vot_share in zip(vot_bins, cvm_vot_shares): + # SOV non-transponder demand + matrix_name = "mf%s_SOV_NT_%s" % (period[1:], vot[1].upper()) + logbook_label = "Import auto from OMX SOVNOTRPDR to matrix %s" % (matrix_name) + resident_demand = omx_manager.lookup(("auto", period, vot), "SOVNOTRPDR%s" % period) + visitor_demand = omx_manager.lookup(("autoVisitor", period, vot), "SOV%s" % period) + cross_border_demand = omx_manager.lookup(("autoCrossBorder", period, vot), "SOV%s" % period) + # NOTE: No non-transponder airport or internal-external demand + total_asim_trips = ( + resident_demand + cross_border_demand+ visitor_demand) - total_ct_ramp_trips = ( - resident_demand + visitor_demand + cross_border_demand + airport_demand + internal_external_demand) dem_utils.demand_report([ ("resident", resident_demand), ("cross_border", cross_border_demand), ("visitor", visitor_demand), + ("total", total_asim_trips) + ], + logbook_label, self.scenario, report) + self.set_data(matrix_name, total_asim_trips) + + # SOV transponder demand + matrix_name = "mf%s_SOV_TR_%s" % (period[1:], vot[1].upper()) + logbook_label = "Import auto from OMX SOVTRPDR to matrix %s" % (matrix_name) + resident_demand = omx_manager.lookup(("auto", period, vot), "SOVTRPDR%s" % period) + # NOTE: No transponder visitor or cross-border demand + airport_demand = omx_manager.lookup(("autoAirport", ".SAN" + period, vot), "SOV%s" % period) + if omx_manager.file_exists(("autoAirport", ".CBX" + period, vot)): + airport_demand += omx_manager.lookup(("autoAirport", ".CBX" + period, vot), "SOV%s" % period) + cvm_demand = (omx_manager.lookup(("cvm", period, ""), "CAR%s" % period) * cvm_vot_share) + + total_asim_trips = (resident_demand + airport_demand + cvm_demand) + + dem_utils.demand_report([ + ("resident", resident_demand), ("airport", airport_demand), - ("internal_external", internal_external_demand), - ("total", total_ct_ramp_trips) - ], + ("cvm", cvm_demand), + ("total", total_asim_trips) + ], logbook_label, self.scenario, report) - self.set_data(matrix_name, total_ct_ramp_trips) - - # add TNC and TAXI demand to vot="high" - for matrix_name_tmplt, share in mode_shares: - matrix_name = matrix_name_tmplt % period[1:] - logbook_label = "Import othr from TAXI, empty AV, and TNC to matrix %s" % (matrix_name) - resident_taxi_demand = ( - omx_manager.lookup(("othr", period, ""), "TAXI" + period) * share["TAXI"]) - visitor_taxi_demand = ( - omx_manager.lookup(("othrVisitor", period, ""), "TAXI" + period) * share["TAXI"]) - cross_border_taxi_demand = ( - omx_manager.lookup(("othrCrossBorder", period, ""), "TAXI" + period) * share["TAXI"]) - # airport SAN - airport_taxi_demand = ( - omx_manager.lookup(("othrAirport", ".SAN", period), "TAXI" + period) * share["TAXI"]) - # airport CBX (optional) - if omx_manager.file_exists(("othrAirport", ".CBX", period)): - airport_taxi_demand += ( - omx_manager.lookup(("othrAirport",".CBX", period), "TAXI" + period) * share["TAXI"]) - internal_external_taxi_demand = ( - omx_manager.lookup(("othrInternalExternal", period, ""), "TAXI" + period) * share["TAXI"]) - - #AV routing models and TNC fleet model demand - empty_av_demand = omx_manager.lookup(("EmptyAV","",""), "EmptyAV%s" % period) - tnc_demand_0 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_0" % period) - tnc_demand_1 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_1" % period) - tnc_demand_2 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_2" % period) - tnc_demand_3 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_3" % period) + self.set_data(matrix_name, total_asim_trips) + + # HOV2 and HOV3 demand + matrix_name_map = [ + ("mf%s_HOV2_%s", "SR2%s"), + ("mf%s_HOV3_%s", "SR3%s") + ] + for matrix_name_tmplt, omx_name in matrix_name_map: + matrix_name = matrix_name_tmplt % (period[1:], vot[1].upper()) + logbook_label = "Import auto from OMX %s to matrix %s" % (omx_name[:3], matrix_name) + resident_demand = ( + omx_manager.lookup(("auto", period, vot), omx_name % ("TRPDR" + period)) + + omx_manager.lookup(("auto", period, vot), omx_name % ("NOTRPDR" + period))) + visitor_demand = omx_manager.lookup(("autoVisitor", period, vot), omx_name % period) + cross_border_demand = omx_manager.lookup(("autoCrossBorder", period, vot), omx_name % period) + airport_demand = omx_manager.lookup(("autoAirport", ".SAN" + period, vot), omx_name % period) + if omx_manager.file_exists(("autoAirport", ".CBX" + period, vot)): + airport_demand += omx_manager.lookup(("autoAirport", ".CBX" + period, vot), omx_name % period) + # internal_external_demand = omx_manager.lookup(("autoInternalExternal", period, vot), omx_name % period) + + total_asim_trips = ( + resident_demand + cross_border_demand + visitor_demand + airport_demand) + + # Check the OMX zones are the same Emme database, assume all files have the same zones + # matrix = emmebank.matrix(matrix_name) + # if omx_zones != emme_zones: + # matrix_data = _matrix.MatrixData(type='f', indices=[omx_zones, omx_zones]) + # matrix_data.from_numpy(total_asim_trips) + # expanded_matrix_data = matrix_data.expand([emme_zones, emme_zones]) + # matrix.set_data(expanded_matrix_data, self.scenario) + # else: + # matrix.set_numpy_data(total_asim_trips, self.scenario) + + dem_utils.demand_report([ + ("resident", resident_demand), + ("cross_border", cross_border_demand), + ("visitor", visitor_demand), + ("airport", airport_demand), + # ("internal_external", internal_external_demand), + ("total", total_asim_trips) + ], + logbook_label, self.scenario, report) + self.set_data(matrix_name, total_asim_trips) + + # light-heavy truck + matrix_name = "mf%s_TRK_L" % (period[1:]) + logbook_label = "Import light-heavy truck pce from OMX to matrix %s" % (matrix_name) + cvm_demand = (omx_manager.lookup(("cvm", period, ""), "LIGHT_TRUCK%s" % period) * truck_pce_light) + htm_ei_demand = (omx_manager.lookup(("htm", period, ""), "Lightei%s" % period) * truck_pce_light) + htm_ie_demand = (omx_manager.lookup(("htm", period, ""), "Lightie%s" % period) * truck_pce_light) - #AVs: no driver. No AVs: driver - #AVs: 0 and 1 passenger would be SOV. there will be empty vehicles as well. No AVs: 0 passanger would be SOV - #AVs: 2 passenger would be HOV2. No AVs: 1 passenger would be HOV2 - #AVs: 3 passenger would be HOV3. No AVs: 2 and 3 passengers would be HOV3 - if (av_share>0): - if (matrix_name_tmplt[5:-2] == "SOV_TR"): - av_demand = empty_av_demand + tnc_demand_0 + tnc_demand_1 - elif (matrix_name_tmplt[5:-2] == "HOV2"): - av_demand = tnc_demand_2 - else: - av_demand = tnc_demand_3 - else: - if (matrix_name_tmplt[5:-2] == "SOV_TR"): - av_demand = tnc_demand_0 - elif (matrix_name_tmplt[5:-2] == "HOV2"): - av_demand = tnc_demand_1 - else: - av_demand = tnc_demand_2 + tnc_demand_3 + total_asim_trips = (cvm_demand + htm_ei_demand + htm_ie_demand) - total_ct_ramp_trips = ( - resident_taxi_demand + visitor_taxi_demand + cross_border_taxi_demand - + airport_taxi_demand + internal_external_taxi_demand + av_demand) dem_utils.demand_report([ - ("resident_taxi", resident_taxi_demand), - ("visitor_taxi", visitor_taxi_demand), - ("cross_border_taxi", cross_border_taxi_demand), - ("airport_taxi", airport_taxi_demand), - ("internal_external_taxi", internal_external_taxi_demand), - ("av_fleet", av_demand), - ("total", total_ct_ramp_trips) - ], + ("cvm", cvm_demand), + ("htm_ei", htm_ei_demand), + ("htm_ie", htm_ie_demand), + ("total", total_asim_trips) + ], + logbook_label, self.scenario, report) + self.set_data(matrix_name, total_asim_trips) + + # medium-heavy truck + matrix_name = "mf%s_TRK_M" % (period[1:]) + logbook_label = "Import medium-heavy truck pce from OMX to matrix %s" % (matrix_name) + cvm_demand = (omx_manager.lookup(("cvm", period, ""), "MEDIUM_TRUCK%s" % period) * truck_pce_medium) + htm_ei_demand = (omx_manager.lookup(("htm", period, ""), "Mediumei%s" % period) * truck_pce_medium) + htm_ie_demand = (omx_manager.lookup(("htm", period, ""), "Mediumie%s" % period) * truck_pce_medium) + + total_asim_trips = (cvm_demand + htm_ei_demand + htm_ie_demand) + + dem_utils.demand_report([ + ("cvm", cvm_demand), + ("htm_ei", htm_ei_demand), + ("htm_ie", htm_ie_demand), + ("total", total_asim_trips) + ], + logbook_label, self.scenario, report) + self.set_data(matrix_name, total_asim_trips) + + # heavy-heavy truck + matrix_name = "mf%s_TRK_H" % (period[1:]) + logbook_label = "Import heavy-heavy truck pce from OMX to matrix %s" % (matrix_name) + htm_ei_demand = (omx_manager.lookup(("htm", period, ""), "Heavyei%s" % period) * truck_pce_heavy) + htm_ie_demand = (omx_manager.lookup(("htm", period, ""), "Heavyie%s" % period) * truck_pce_heavy) + + total_asim_trips = (htm_ei_demand + htm_ie_demand) + + dem_utils.demand_report([ + ("htm_ei", htm_ei_demand), + ("htm_ie", htm_ie_demand), + ("total", total_asim_trips) + ], logbook_label, self.scenario, report) - self.set_data(matrix_name, total_ct_ramp_trips) + self.set_data(matrix_name, total_asim_trips) + + # #add TNC and TAXI demand to vot="high" + # for matrix_name_tmplt, share in mode_shares: + # matrix_name = matrix_name_tmplt % period[1:] + # logbook_label = "Import othr from TAXI, empty AV, and TNC to matrix %s" % (matrix_name) + # resident_taxi_demand = ( + # omx_manager.lookup(("othr", period, ""), "TAXI" + period) * share["TAXI"]) + # visitor_taxi_demand = ( + # omx_manager.lookup(("othrVisitor", period, ""), "TAXI" + period) * share["TAXI"]) + # cross_border_taxi_demand = ( + # omx_manager.lookup(("othrCrossBorder", period, ""), "TAXI" + period) * share["TAXI"]) + # # airport SAN + # airport_taxi_demand = ( + # omx_manager.lookup(("othrAirport", ".SAN", period), "TAXI" + period) * share["TAXI"]) + # # airport CBX (optional) + # if omx_manager.file_exists(("othrAirport", ".CBX", period)): + # airport_taxi_demand += ( + # omx_manager.lookup(("othrAirport",".CBX", period), "TAXI" + period) * share["TAXI"]) + # internal_external_taxi_demand = ( + # omx_manager.lookup(("othrInternalExternal", period, ""), "TAXI" + period) * share["TAXI"]) + + # # Commenting out for now: AV routing models and TNC fleet model demand + # empty_av_demand = omx_manager.lookup(("EmptyAV","",""), "EmptyAV%s" % period) + # tnc_demand_0 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_0" % period) + # tnc_demand_1 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_1" % period) + # tnc_demand_2 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_2" % period) + # tnc_demand_3 = omx_manager.lookup(("TNCVehicle","",period), "TNC%s_3" % period) + + # #AVs: no driver. No AVs: driver + # #AVs: 0 and 1 passenger would be SOV. there will be empty vehicles as well. No AVs: 0 passanger would be SOV + # #AVs: 2 passenger would be HOV2. No AVs: 1 passenger would be HOV2 + # #AVs: 3 passenger would be HOV3. No AVs: 2 and 3 passengers would be HOV3 + # if (av_share>0): + # if (matrix_name_tmplt[5:-2] == "SOV_TR"): + # av_demand = empty_av_demand + tnc_demand_0 + tnc_demand_1 + # elif (matrix_name_tmplt[5:-2] == "HOV2"): + # av_demand = tnc_demand_2 + # else: + # av_demand = tnc_demand_3 + # else: + # if (matrix_name_tmplt[5:-2] == "SOV_TR"): + # av_demand = tnc_demand_0 + # elif (matrix_name_tmplt[5:-2] == "HOV2"): + # av_demand = tnc_demand_1 + # else: + # av_demand = tnc_demand_2 + tnc_demand_3 + + # total_asim_trips = ( + # resident_taxi_demand + visitor_taxi_demand + cross_border_taxi_demand + # + airport_taxi_demand + internal_external_taxi_demand) #+ av_demand + # dem_utils.demand_report([ + # ("resident_taxi", resident_taxi_demand), + # ("visitor_taxi", visitor_taxi_demand), + # ("cross_border_taxi", cross_border_taxi_demand), + # ("airport_taxi", airport_taxi_demand), + # ("internal_external_taxi", internal_external_taxi_demand), + # # ("av_fleet", av_demand), + # ("total", total_asim_trips) + # ], + # logbook_label, self.scenario, report) + # self.set_data(matrix_name, total_asim_trips) + _m.logbook_write(title, report.render()) - @_m.logbook_trace('Import commercial vehicle demand') - def import_commercial_vehicle_demand(self, props): - scale_factor = props["cvm.scale_factor"] - scale_light = props["cvm.scale_light"] - scale_medium = props["cvm.scale_medium"] - scale_heavy = props["cvm.scale_heavy"] - share_light = props["cvm.share.light"] - share_medium = props["cvm.share.medium"] - share_heavy = props["cvm.share.heavy"] - - scenario = self.scenario - emmebank = scenario.emmebank + # @_m.logbook_trace('Import commercial vehicle demand') + # def import_commercial_vehicle_demand(self, props): + # scale_factor = props["cvm.scale_factor"] + # scale_light = props["cvm.scale_light"] + # scale_medium = props["cvm.scale_medium"] + # scale_heavy = props["cvm.scale_heavy"] + # share_light = props["cvm.share.light"] + # share_medium = props["cvm.share.medium"] + # share_heavy = props["cvm.share.heavy"] + + # scenario = self.scenario + # emmebank = scenario.emmebank - mapping = {} - periods = ["EA", "AM", "MD", "PM", "EV"] - # The SOV demand is modified in-place, which was imported - # prior from the CT-RAMP demand - # The truck demand in vehicles is copied from separate matrices - for index, period in enumerate(periods): - mapping["CVM_%s:LNT" % period] = { - "orig": "%s_SOV_TR_H" % period, - "dest": "%s_SOV_TR_H" % period, - "pce": 1.0, - "scale": scale_light[index], - "share": share_light, - "period": period - } - mapping["CVM_%s:INT" % period] = { - "orig": "%s_TRK_L_VEH" % period, - "dest": "%s_TRK_L" % period, - "pce": 1.3, - "scale": scale_medium[index], - "share": share_medium, - "period": period - } - mapping["CVM_%s:MNT" % period] = { - "orig": "%s_TRK_M_VEH" % period, - "dest": "%s_TRK_M" % period, - "pce": 1.5, - "scale": scale_medium[index], - "share": share_medium, - "period": period - } - mapping["CVM_%s:HNT" % period] = { - "orig": "%s_TRK_H_VEH" % period, - "dest": "%s_TRK_H" % period, - "pce": 2.5, - "scale": scale_heavy[index], - "share": share_heavy, - "period": period - } - with _m.logbook_trace('Load starting SOV and truck matrices'): - for key, value in mapping.iteritems(): - value["array"] = emmebank.matrix(value["orig"]).get_numpy_data(scenario) + # mapping = {} + # periods = ["EA", "AM", "MD", "PM", "EV"] + # # The SOV demand is modified in-place, which was imported + # # prior from the CT-RAMP demand + # # The truck demand in vehicles is copied from separate matrices + # for index, period in enumerate(periods): + # mapping["CVM_%s:LNT" % period] = { + # "orig": "%s_SOV_TR_H" % period, + # "dest": "%s_SOV_TR_H" % period, + # "pce": 1.0, + # "scale": scale_light[index], + # "share": share_light, + # "period": period + # } + # mapping["CVM_%s:INT" % period] = { + # "orig": "%s_TRK_L_VEH" % period, + # "dest": "%s_TRK_L" % period, + # "pce": 1.3, + # "scale": scale_medium[index], + # "share": share_medium, + # "period": period + # } + # mapping["CVM_%s:MNT" % period] = { + # "orig": "%s_TRK_M_VEH" % period, + # "dest": "%s_TRK_M" % period, + # "pce": 1.5, + # "scale": scale_medium[index], + # "share": share_medium, + # "period": period + # } + # mapping["CVM_%s:HNT" % period] = { + # "orig": "%s_TRK_H_VEH" % period, + # "dest": "%s_TRK_H" % period, + # "pce": 2.5, + # "scale": scale_heavy[index], + # "share": share_heavy, + # "period": period + # } + # with _m.logbook_trace('Load starting SOV and truck matrices'): + # for key, value in mapping.iteritems(): + # value["array"] = emmebank.matrix(value["orig"]).get_numpy_data(scenario) - with _m.logbook_trace('Processing CVM from TripMatrices.csv'): - path = os.path.join(self.output_dir, "TripMatrices.csv") - table = _pandas.read_csv(path) - for key, value in mapping.iteritems(): - cvm_array = table[key].values.reshape((4996, 4996)) # reshape method deprecated since v 0.19.0, yma, 2/12/2019 - #factor in cvm demand by the scale factor used in trip generation - cvm_array = cvm_array/scale_factor - #scale trips to take care of underestimation - cvm_array = cvm_array * value["scale"] + # with _m.logbook_trace('Processing CVM from TripMatrices.csv'): + # path = os.path.join(self.output_dir, "TripMatrices.csv") + # table = _pandas.read_csv(path) + # for key, value in mapping.iteritems(): + # cvm_array = table[key].values.reshape((4947, 4947)) # reshape method deprecated since v 0.19.0, yma, 2/12/2019 + # #factor in cvm demand by the scale factor used in trip generation + # cvm_array = cvm_array/scale_factor + # #scale trips to take care of underestimation + # cvm_array = cvm_array * value["scale"] - #add remaining share to the correspnding truck matrix - value["array"] = value["array"] + (cvm_array * (1-value["share"])) + # #add remaining share to the correspnding truck matrix + # value["array"] = value["array"] + (cvm_array * (1-value["share"])) - #add cvm truck vehicles to light-heavy trucks - for key, value in mapping.iteritems(): - period = value["period"] - cvm_vehs = ['L','M','H'] - if key == "CVM_%s:INT" % period: - for veh in cvm_vehs: - key_new = "CVM_%s:%sNT" % (period, veh) - value_new = mapping[key_new] - if value_new["share"] != 0.0: - cvm_array = table[key_new].values.reshape((4996, 4996)) - cvm_array = cvm_array/scale_factor - cvm_array = cvm_array * value_new["scale"] - value["array"] = value["array"] + (cvm_array * value_new["share"]) - matrix_unique = {} - with _m.logbook_trace('Save SOV matrix and convert CV and truck vehicle demand to PCEs for assignment'): - for key, value in mapping.iteritems(): - matrix = emmebank.matrix(value["dest"]) - array = value["array"] * value["pce"] - if (matrix in matrix_unique.keys()): - array = array + emmebank.matrix(value["dest"]).get_numpy_data(scenario) - matrix.set_numpy_data(array, scenario) - matrix_unique[matrix] = 1 - - @_m.logbook_trace('Convert light truck vehicle demand to PCEs for assignment') - def convert_light_trucks_to_pce(self): - matrix_calc = dem_utils.MatrixCalculator(self.scenario, self.num_processors) - # Calculate PCEs for trucks - periods = ["EA", "AM", "MD", "PM", "EV"] - mat_trucks = ['TRK_L'] - pce_values = [1.3] - for period in periods: - with matrix_calc.trace_run("Period %s" % period): - for name, pce in zip(mat_trucks, pce_values): - demand_name = 'mf%s_%s' % (period, name) - matrix_calc.add(demand_name, '(%s_VEH * %s).max.0' % (demand_name, pce)) + # #add cvm truck vehicles to light-heavy trucks + # for key, value in mapping.iteritems(): + # period = value["period"] + # cvm_vehs = ['L','M','H'] + # if key == "CVM_%s:INT" % period: + # for veh in cvm_vehs: + # key_new = "CVM_%s:%sNT" % (period, veh) + # value_new = mapping[key_new] + # if value_new["share"] != 0.0: + # cvm_array = table[key_new].values.reshape((4947, 4947)) + # cvm_array = cvm_array/scale_factor + # cvm_array = cvm_array * value_new["scale"] + # value["array"] = value["array"] + (cvm_array * value_new["share"]) + # matrix_unique = {} + # with _m.logbook_trace('Save SOV matrix and convert CV and truck vehicle demand to PCEs for assignment'): + # for key, value in mapping.iteritems(): + # matrix = emmebank.matrix(value["dest"]) + # array = value["array"] * value["pce"] + # if (matrix in matrix_unique.keys()): + # array = array + emmebank.matrix(value["dest"]).get_numpy_data(scenario) + # matrix.set_numpy_data(array, scenario) + # matrix_unique[matrix] = 1 + + # @_m.logbook_trace('Convert light truck vehicle demand to PCEs for assignment') + # def convert_light_trucks_to_pce(self): + # matrix_calc = dem_utils.MatrixCalculator(self.scenario, self.num_processors) + # # Calculate PCEs for trucks + # periods = ["EA", "AM", "MD", "PM", "EV"] + # mat_trucks = ['TRK_L'] + # pce_values = [1.3] + # for period in periods: + # with matrix_calc.trace_run("Period %s" % period): + # for name, pce in zip(mat_trucks, pce_values): + # demand_name = 'mf%s_%s' % (period, name) + # matrix_calc.add(demand_name, '(%s_VEH * %s).max.0' % (demand_name, pce)) @_m.logbook_trace('Add aggregate demand') def add_aggregate_demand(self): @@ -489,9 +569,9 @@ def add_aggregate_demand(self): assign_mode = modes_assign[mode] params = {'p': period, 'm': mode, 'v': vot, 'am': assign_mode} matrix_calc.add("mf%s_%s_%s" % (period, assign_mode, vot), - "mf%(p)s_%(am)s_%(v)s " - "+ (1.0/3.0)*mf%(p)s_%(m)s_EIWORK " - "+ (1.0/3.0)*mf%(p)s_%(m)s_EINONWORK" % params) + "mf%(p)s_%(am)s_%(v)s " + "+ (1.0/3.0)*mf%(p)s_%(m)s_EIWORK " + "+ (1.0/3.0)*mf%(p)s_%(m)s_EINONWORK" % params) # External - external faster with single-processor as number of O-D pairs is so small (12 X 12) # External-external trips do not have transpnder diff --git a/src/main/emme/toolbox/master_run.py b/src/main/emme/toolbox/master_run.py index 6a91f16e0..0cf451a87 100644 --- a/src/main/emme/toolbox/master_run.py +++ b/src/main/emme/toolbox/master_run.py @@ -61,6 +61,7 @@ import inro.modeller as _m import inro.emme.database.emmebank as _eb +import inro.emme.desktop.app as _app import traceback as _traceback import glob as _glob @@ -75,6 +76,8 @@ import socket as _socket import sys import os +import uuid +import yaml import pandas as pd import numpy as np @@ -82,6 +85,9 @@ import datetime import pyodbc import win32com.client as win32 +import shutil + +import multiprocessing _join = os.path.join _dir = os.path.dirname @@ -122,6 +128,7 @@ def __init__(self): "num_processors", "select_link" ] self._log_level = "ENABLED" + self.LOCAL_ROOT = "C:\\abm_runs" def page(self): self.load_properties() @@ -247,26 +254,25 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, create_transit_connector = modeller.tool("sandag.assignment.create_transit_connector") transit_assign = modeller.tool("sandag.assignment.transit_assignment") run_truck = modeller.tool("sandag.model.truck.run_truck_model") - external_internal = modeller.tool("sandag.model.external_internal") - external_external = modeller.tool("sandag.model.external_external") import_auto_demand = modeller.tool("sandag.import.import_auto_demand") import_transit_demand = modeller.tool("sandag.import.import_transit_demand") - export_transit_skims = modeller.tool("sandag.export.export_transit_skims") + # export_transit_skims = modeller.tool("sandag.export.export_transit_skims") export_for_transponder = modeller.tool("sandag.export.export_for_transponder") export_network_data = modeller.tool("sandag.export.export_data_loader_network") export_matrix_data = modeller.tool("sandag.export.export_data_loader_matrices") - export_tap_adjacent_lines = modeller.tool("sandag.export.export_tap_adjacent_lines") export_for_commercial_vehicle = modeller.tool("sandag.export.export_for_commercial_vehicle") validation = modeller.tool("sandag.validation.validation") file_manager = modeller.tool("sandag.utilities.file_manager") utils = modeller.module('sandag.utilities.demand') load_properties = modeller.tool('sandag.utilities.properties') + run_summary = modeller.tool("sandag.utilities.run_summary") self.username = username self.password = password props = load_properties(_join(main_directory, "conf", "sandag_abm.properties")) props.set_year_specific_properties(_join(main_directory, "input", "parametersByYears.csv")) + props.set_year_specific_properties(_join(main_directory, "input", "filesByYears.csv")) props.save() # Log current state of props file for debugging of UI / file sync issues attributes = dict((name, props["RunModel." + name]) for name in self._run_model_names) @@ -280,17 +286,19 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, raise Exception(error_text % name) scenarioYear = str(props["scenarioYear"]) + # geographyID = str(props["geographyID"]) startFromIteration = props["RunModel.startFromIteration"] - precision = props["RunModel.MatrixPrecision"] + # precision = props["RunModel.MatrixPrecision"] minSpaceOnC = props["RunModel.minSpaceOnC"] sample_rate = props["sample_rates"] end_iteration = len(sample_rate) - scale_factor = props["cvm.scale_factor"] - visualizer_reference_path = props["visualizer.reference.path"] - visualizer_output_file = props["visualizer.output"] - visualizer_reference_label = props["visualizer.reference.label"] - visualizer_build_label = props["visualizer.build.label"] + #scale_factor = props["cvm.scale_factor"] + # visualizer_reference_path = props["visualizer.reference.path"] + # visualizer_output_file = props["visualizer.output"] + # visualizer_reference_label = props["visualizer.reference.label"] + # visualizer_build_label = props["visualizer.build.label"] mgraInputFile = props["mgra.socec.file"] + fafInputFile = props["faf.file"] period_ids = list(enumerate(periods, start=int(scenario_id) + 1)) @@ -307,36 +315,52 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, skipBikeLogsums = props["RunModel.skipBikeLogsums"] skipBuildNetwork = props["RunModel.skipBuildNetwork"] skipHighwayAssignment = props["RunModel.skipHighwayAssignment"] - skipTransitConnector = props["RunModel.skipTransitConnector"] skipTransitSkimming = props["RunModel.skipTransitSkimming"] + skipTransitConnector = props["RunModel.skipTransitConnector"] skipTransponderExport = props["RunModel.skipTransponderExport"] - skipCoreABM = props["RunModel.skipCoreABM"] - skipOtherSimulateModel = props["RunModel.skipOtherSimulateModel"] - skipMAASModel = props["RunModel.skipMAASModel"] + skipABMPreprocessing = props["RunModel.skipABMPreprocessing"] + skipABMResident = props["RunModel.skipABMResident"] + skipABMAirport = props["RunModel.skipABMAirport"] + skipABMXborderWait = props["RunModel.skipABMXborderWait"] + skipABMXborder = props["RunModel.skipABMXborder"] + skipABMVisitor = props["RunModel.skipABMVisitor"] skipCTM = props["RunModel.skipCTM"] skipEI = props["RunModel.skipEI"] - skipExternal = props["RunModel.skipExternalExternal"] + skipExternal = props["RunModel.skipExternal"] skipTruck = props["RunModel.skipTruck"] + external_internal = modeller.tool("sandag.model.external_internal") + external_external = modeller.tool("sandag.model.external_external") skipTripTableCreation = props["RunModel.skipTripTableCreation"] skipFinalHighwayAssignment = props["RunModel.skipFinalHighwayAssignment"] + skipFinalHighwayAssignmentStochastic = props["RunModel.skipFinalHighwayAssignmentStochastic"] + if skipFinalHighwayAssignmentStochastic == True: + makeFinalHighwayAssignmentStochastic = False + else: + makeFinalHighwayAssignmentStochastic = True skipFinalTransitAssignment = props["RunModel.skipFinalTransitAssignment"] skipVisualizer = props["RunModel.skipVisualizer"] skipDataExport = props["RunModel.skipDataExport"] + skipDatalake = props["RunModel.skipDatalake"] skipDataLoadRequest = props["RunModel.skipDataLoadRequest"] skipDeleteIntermediateFiles = props["RunModel.skipDeleteIntermediateFiles"] - skipTransitShed = props["RunModel.skipTransitShed"] - transitShedThreshold = props["transitShed.threshold"] - transitShedTOD = props["transitShed.TOD"] + # skipTransitShed = props["RunModel.skipTransitShed"] + # transitShedThreshold = props["transitShed.threshold"] + # transitShedTOD = props["transitShed.TOD"] + + #check if visualizer.reference.path is valid in filesbyyears.csv + # if not os.path.exists(visualizer_reference_path): + # raise Exception("Visualizer reference %s does not exist. Check filesbyyears.csv." %(visualizer_reference_path)) if useLocalDrive: + folder_name = os.path.basename(main_directory) + if not os.path.exists(_join(self.LOCAL_ROOT, username, folder_name, "report")): # check free space only if it is a new run + self.check_free_space(minSpaceOnC) + # if initialization copy ALL files from remote + # else check file meta data and copy those that have changed initialize = (skipInitialization == False and startFromIteration == 1) local_directory = file_manager( "DOWNLOAD", main_directory, username, scenario_id, initialize=initialize) self._path = local_directory - if not os.path.exists(_join(self._path, "output")): # check free space only if it is a new run - self.check_free_space(minSpaceOnC) - # if initialization copy ALL files from remote - # else check file meta data and copy those that have changed else: self._path = main_directory @@ -352,41 +376,116 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, external_zones = "1-12" travel_modes = ["auto", "tran", "nmot", "othr"] - core_abm_files = ["Trips*.omx", "InternalExternalTrips*.omx"] + core_abm_files = ["Trips*.omx"] core_abm_files = [mode + name for name in core_abm_files for mode in travel_modes] smm_abm_files = ["AirportTrips*.omx", "CrossBorderTrips*.omx", "VisitorTrips*.omx"] smm_abm_files = [mode + name for name in smm_abm_files for mode in travel_modes] + smm_csv_files = ["airport_out.CBX.csv", "airport_out.SAN.csv", "crossBorderTours.csv", "crossBorderTrips.csv", "visitorTours.csv", "visitorTrips.csv"] + smm_abm_files.extend(smm_csv_files) maas_abm_files = ["EmptyAVTrips.omx", "TNCVehicleTrips*.omx"] relative_gap = props["convergence"] - max_assign_iterations = 1000 + max_assign_iterations = 100 mgra_lu_input_file = props["mgra.socec.file"] + #change emme databank dimensions based on number of select links - SANDAG ABM2+ Enhancements (06-28-2021) + num_select_links = 0 + if select_link: + num_select_links = len(_json.loads(select_link)) + change_dimensions = modeller.tool("inro.emme.data.database.change_database_dimensions") + dims = main_emmebank.dimensions + num_nodes = dims["regular_nodes"] + dims['centroids'] + num_links = dims["links"] + num_turn_entries = dims["turn_entries"] + num_transit_lines = dims['transit_lines'] + num_transit_segments = dims['transit_segments'] + num_traffic_classes = 15 + + additional_node_extra_attributes = 4 + additional_link_extra_attributes = 26 + additional_line_extra_attributes = 4 + additional_segment_extra_attributes = 12 + + extra_attribute_values = 18000000 + extra_attribute_values += (num_nodes + 1) * additional_node_extra_attributes + extra_attribute_values += (num_links + 1) * additional_link_extra_attributes + extra_attribute_values += (num_transit_lines + 1)* additional_line_extra_attributes + extra_attribute_values += (num_transit_segments + 1) * additional_segment_extra_attributes + + if num_select_links > 3: + extra_attribute_values += (num_select_links - 3) * ((num_links + 1) * (num_traffic_classes + 1) + (num_turn_entries + 1) * (num_traffic_classes)) + + if extra_attribute_values > dims["extra_attribute_values"] or dims["full_matrices"] < 9999: + dims["extra_attribute_values"] = extra_attribute_values + dims["full_matrices"] = 9999 + #add logging for when this setp is run, add before and after attribute value + #change_dimensions(emmebank_dimensions=dims, emmebank=main_emmebank, keep_backup=False) + #replaced the above line with the below lines - suggested by Antoine, Bentley (2022-06-02) + if main_emmebank.scenario(1) is None: + main_emmebank.create_scenario(1) + change_dimensions(dims, main_emmebank, False) + # with open(_join(self._path, "logFiles", "select_link_log.txt"),"a+") as f: + # f.write("Num Select links {}\nExtra Attribute Value {}".format(num_select_links,extra_attribute_values)) + # f.close() + + for period in periods: + if os.path.exists(_join(self._path, "emme_project", "Database_transit_" + period, "emmebank")): + with _eb.Emmebank(_join(self._path, "emme_project", "Database_transit_" + period, "emmebank")) as transit_db: + transit_db_dims = transit_db.dimensions + num_nodes = transit_db_dims["regular_nodes"] + transit_db_dims['centroids'] + num_links = transit_db_dims["links"] + num_turn_entries = transit_db_dims["turn_entries"] + num_transit_lines = transit_db_dims['transit_lines'] + num_transit_segments = transit_db_dims['transit_segments'] + num_traffic_classes = 15 + + extra_attribute_values = 18000000 + extra_attribute_values += (num_nodes + 1) * additional_node_extra_attributes + extra_attribute_values += (num_links + 1) * additional_link_extra_attributes + extra_attribute_values += (num_transit_lines + 1)* additional_line_extra_attributes + extra_attribute_values += (num_transit_segments + 1) * additional_segment_extra_attributes + + if num_select_links > 3: + extra_attribute_values += 18000000 + (num_select_links - 3) * ((num_links + 1) * (num_traffic_classes + 1) + (num_turn_entries + 1) * (num_traffic_classes)) + + if extra_attribute_values > transit_db_dims["extra_attribute_values"] or transit_db_dims["full_matrices"] < 9999: + transit_db_dims["extra_attribute_values"] = extra_attribute_values + transit_db_dims["full_matrices"] = 9999 + #change_dimensions(emmebank_dimensions=transit_db_dims, emmebank=transit_db, keep_backup=False) + #replaced the above line with the below lines - suggested by Antoine, Bentley (2022-06-02) + if transit_db.scenario(1) is None: + transit_db.create_scenario(1) + change_dimensions(transit_db_dims, transit_db, False) + with _m.logbook_trace("Setup and initialization"): self.set_global_logbook_level(props) # Swap Server Configurations - self.run_proc("serverswap.bat", [drive, path_no_drive, path_forward_slash], "Run ServerSwap") - self.check_for_fatal(_join(self._path, "logFiles", "serverswap.log"), - "ServerSwap failed! Open logFiles/serverswap.log for details.") - self.run_proc("checkAtTransitNetworkConsistency.cmd", [drive, path_forward_slash], - "Checking if AT and Transit Networks are consistent") - self.check_for_fatal(_join(self._path, "logFiles", "AtTransitCheck_event.log"), - "AT and Transit network consistency checking failed! Open AtTransitCheck_event.log for details.") + # self.run_proc("serverswap.bat", [drive, path_no_drive, path_forward_slash], "Run ServerSwap") + # self.check_for_fatal(_join(self._path, "logFiles", "serverswap.log"), + # "ServerSwap failed! Open logFiles/serverswap.log for details.") + # self.run_proc("checkAtTransitNetworkConsistency.cmd", [drive, path_forward_slash], + # "Checking if AT and Transit Networks are consistent") + # self.check_for_fatal(_join(self._path, "logFiles", "AtTransitCheck_event.log"), + # "AT and Transit network consistency checking failed! Open AtTransitCheck_event.log for details.") + + #get number of households to pass on sample size to activitysim + householdFile = pd.read_csv(_join(self._path, "input", "synthetic_households_" + scenarioYear + "_base.csv")) + hh_resident_size = len(householdFile) + del(householdFile) if startFromIteration == 1: # only run the setup / init steps if starting from iteration 1 if not skipWalkLogsums: self.run_proc("runSandagWalkLogsums.cmd", [drive, path_forward_slash], - "Walk - create AT logsums and impedances") + "Walk - create AT logsums and impedances", capture_output=True) if not skipCopyWalkImpedance: - self.copy_files(["walkMgraEquivMinutes.csv", "walkMgraTapEquivMinutes.csv"], + self.copy_files(["walkMgraEquivMinutes.csv", "microMgraEquivMinutes.csv"], input_dir, output_dir) if not skip4Ds: - run4Ds(path=self._path, int_radius=0.65, ref_path=visualizer_reference_path) + run4Ds(path=self._path, int_radius=0.65, ref_path='visualizer_reference_path') - - mgraFile = 'mgra13_based_input' + str(scenarioYear) + '.csv' + mgraFile = 'mgra15_based_input_' + str(scenarioYear) + '_base.csv' # Should be read in from properties? -JJF self.complete_work(scenarioYear, input_dir, output_dir, mgraFile, "walkMgraEquivMinutes.csv") if not skipBuildNetwork: @@ -410,7 +509,6 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, if not skipInputChecker: input_checker(path=self._path) - export_tap_adjacent_lines(_join(output_dir, "tapLines.csv"), base_scenario) # parse vehicle availablility file by time-of-day availability_file = "vehicle_class_availability.csv" availabilities = self.parse_availability_file(_join(input_dir, availability_file), periods) @@ -446,15 +544,21 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, traffic_components.append("traffic_demand") init_matrices(traffic_components, periods, base_scenario, deleteAllMatrices) - transit_scenario = init_transit_db(base_scenario, add_database=not useLocalDrive) - transit_emmebank = transit_scenario.emmebank - transit_components = ["transit_skims"] - if not skipCopyWarmupTripTables: - transit_components.append("transit_demand") - init_matrices(transit_components, periods, transit_scenario, deleteAllMatrices) + transit_scenario_dict = {} + transit_emmebank_dict = {} + for period in periods: + transit_scenario_dict[period] = init_transit_db(base_scenario, period, add_database=not useLocalDrive) + transit_emmebank_dict[period] = transit_scenario_dict[period].emmebank + transit_components = ["transit_skims"] + if not skipCopyWarmupTripTables: + transit_components.append("transit_demand") + init_matrices(transit_components, [period], transit_scenario_dict[period], deleteAllMatrices) else: - transit_emmebank = _eb.Emmebank(_join(self._path, "emme_project", "Database_transit", "emmebank")) - transit_scenario = transit_emmebank.scenario(base_scenario.number) + transit_scenario_dict = {} + transit_emmebank_dict = {} + for period in periods: + transit_emmebank_dict[period] = _eb.Emmebank(_join(self._path, "emme_project", "Database_transit_" + period, "emmebank")) + transit_scenario_dict[period] = transit_emmebank_dict[period].scenario(base_scenario.number) if not skipCopyWarmupTripTables: # import seed auto demand and seed truck demand @@ -462,30 +566,31 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, omx_file = _join(input_dir, "trip_%s.omx" % period) import_demand(omx_file, "AUTO", period, base_scenario) import_demand(omx_file, "TRUCK", period, base_scenario) - + if not skipBikeLogsums: self.run_proc("runSandagBikeLogsums.cmd", [drive, path_forward_slash], "Bike - create AT logsums and impedances") if not skipCopyBikeLogsum: self.copy_files(["bikeMgraLogsum.csv", "bikeTazLogsum.csv"], input_dir, output_dir) - + else: base_scenario = main_emmebank.scenario(scenario_id) - transit_emmebank = _eb.Emmebank(_join(self._path, "emme_project", "Database_transit", "emmebank")) - transit_scenario = transit_emmebank.scenario(base_scenario.number) + transit_scenario_dict = {} + transit_emmebank_dict = {} + for period in periods: + transit_emmebank_dict[period] = _eb.Emmebank(_join(self._path, "emme_project", "Database_transit_" + period, "emmebank")) + transit_scenario_dict[period] = transit_emmebank_dict[period].scenario(base_scenario.number) # Check that setup files were generated - self.run_proc("CheckOutput.bat", [drive + path_no_drive, 'Setup'], "Check for outputs") + # self.run_proc("CheckOutput.bat", [drive + path_no_drive, 'Setup'], "Check for outputs") # Note: iteration indexes from 0, msa_iteration indexes from 1 for iteration in range(startFromIteration - 1, end_iteration): msa_iteration = iteration + 1 with _m.logbook_trace("Iteration %s" % msa_iteration): - if not skipCoreABM[iteration] or not skipOtherSimulateModel[iteration] or not skipMAASModel[iteration]: - self.run_proc("runMtxMgr.cmd", [drive, drive + path_no_drive], "Start matrix manager") - self.run_proc("runDriver.cmd", [drive, drive + path_no_drive], "Start JPPF Driver") - self.run_proc("StartHHAndNodes.cmd", [drive, path_no_drive], - "Start HH Manager, JPPF Driver, and nodes") + #create a folder to store skims + if not os.path.exists(_join(output_dir, "skims")): + os.mkdir(_join(output_dir, "skims")) if not skipHighwayAssignment[iteration]: # run traffic assignment @@ -494,60 +599,97 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, self.run_traffic_assignments( base_scenario, period_ids, msa_iteration, relative_gap, max_assign_iterations, num_processors) - self.run_proc("CreateD2TAccessFile.bat", [drive, path_forward_slash], - "Create drive to transit access file", capture_output=True) if not skipTransitSkimming[iteration]: # run transit assignment # export transit skims with _m.logbook_trace("Transit assignments and skims"): + for number, period in period_ids: src_period_scenario = main_emmebank.scenario(number) transit_assign_scen = build_transit_scen( - period=period, base_scenario=src_period_scenario, - transit_emmebank=transit_emmebank, - scenario_id=src_period_scenario.id, - scenario_title="%s %s transit assign" % (base_scenario.title, period), - data_table_name=scenarioYear, overwrite=True) - - if iteration==0: - create_transit_connector(transit_assign_scen) - - transit_assign(period, transit_assign_scen, data_table_name=scenarioYear, - skims_only=True, num_processors=num_processors) - - omx_file = _join(output_dir, "transit_skims.omx") - export_transit_skims(omx_file, periods, transit_scenario) + period=period, base_scenario=src_period_scenario, + transit_emmebank=transit_emmebank_dict[period], + scenario_id=src_period_scenario.id, + scenario_title="%s %s transit assign" % (base_scenario.title, period), + data_table_name=scenarioYear, overwrite=True) + + if (not skipTransitConnector) and (msa_iteration == 1): + if not os.path.exists(_join(input_dir, "transit_connectors")): + os.mkdir(_join(input_dir, "transit_connectors")) + # #in case of new network, create transit connectors from scratch, and export them to the input folder for future runs/iterations + # create_transit_connector(period, transit_assign_scen, create_connector_flag=True) + # else: + # #this would import connectors from the input/transit_connectors folder, and not create them from scratch + # create_transit_connector(period, transit_assign_scen, create_connector_flag=False) + + # Run transit assignment in separate process + # Running in same process slows OMX skim export for unknown reason + # transit_emmebank need to be closed and re-opened to be accessed by separate process + transit_emmebank_dict = self.run_transit_assignments(transit_emmebank_dict, scenarioYear, output_dir, ((not skipTransitConnector) and (msa_iteration == 1)), main_directory) + for period in periods: + transit_scenario_dict[period] = transit_emmebank_dict[period].scenario(base_scenario.number) + # _m.Modeller().desktop.refresh_data() + + # #output transit skims by period + # for number, period in period_ids: + # transit_scenario = transit_emmebank.scenario(number) + # omx_file = _join(output_dir, "skims", "transit_skims_" + period + ".omx") + # export_transit_skims(omx_file, [period], transit_scenario, big_to_zero=False) if not skipTransponderExport[iteration]: am_scenario = main_emmebank.scenario(base_scenario.number + 2) export_for_transponder(output_dir, num_processors, am_scenario) - # For each step move trip matrices so run will stop if ctramp model - # doesn't produced csv/omx files for assignment - # also needed as CT-RAMP does not overwrite existing files - if not skipCoreABM[iteration]: - self.remove_prev_iter_files(core_abm_files, output_dir, iteration) + if msa_iteration==1: + self.run_proc("runSandag_ScenManagement.cmd", + [main_directory, str(props["scenarioYear"])], + "Running Scenario Management", capture_output=True) + + if not skipABMPreprocessing[iteration]: self.run_proc( - "runSandagAbm_SDRM.cmd", - [drive, drive + path_forward_slash, sample_rate[iteration], msa_iteration], - "Java-Run CT-RAMP", capture_output=True) - if not skipOtherSimulateModel[iteration]: - self.remove_prev_iter_files(smm_abm_files, output_dir, iteration) + "runSandagAbm_Preprocessing.cmd", + [drive, drive + path_forward_slash, msa_iteration, scenarioYear], + "Creating all the required files to run the ActivitySim models", capture_output=True) + if not skipABMResident[iteration]: self.run_proc( - "runSandagAbm_SMM.cmd", - [drive, drive + path_forward_slash, sample_rate[iteration], msa_iteration], - "Java-Run airport model, visitor model, cross-border model", capture_output=True) - - if not skipMAASModel[iteration]: - self.remove_prev_iter_files(maas_abm_files, output_dir, iteration) + "runSandagAbm_ActivitySimResident.cmd", + [drive, drive + path_forward_slash, int(sample_rate[iteration] * hh_resident_size), msa_iteration], + "Running ActivitySim resident model", capture_output=True) + if not skipABMAirport[iteration]: + hh_airport_size = {} + for airport in ["san", "cbx"]: + householdFile = pd.read_csv(_join(self._path, "input", "households_airport.{}.csv".format(airport))) + hh_airport_size[airport] = len(householdFile) + del(householdFile) self.run_proc( - "runSandagAbm_MAAS.cmd", - [drive, drive + path_forward_slash, sample_rate[iteration], msa_iteration], - "Java-Run AV allocation model and TNC routing model", capture_output=True) + "runSandagAbm_ActivitySimAirport.cmd", + [drive, drive + path_forward_slash, int(sample_rate[iteration] * hh_airport_size["san"]), int(sample_rate[iteration] * hh_airport_size["cbx"])], + "Running ActivitySim airport models", capture_output=True) + if (not skipABMXborderWait) and (iteration == 0): + self.run_proc( + "runSandagAbm_ActivitySimXborderWaitModel.cmd", + [drive, drive + path_forward_slash], + "Running ActivitySim wait time models", capture_output=True) + if not skipABMXborder[iteration]: + householdFile = pd.read_csv(_join(self._path, "input", "households_xborder.csv")) + hh_xborder_size = len(householdFile) + del(householdFile) + self.run_proc( + "runSandagAbm_ActivitySimXborder.cmd", + [drive, drive + path_forward_slash, int(sample_rate[iteration] * hh_xborder_size)], + "Running ActivitySim crossborder model", capture_output=True) + if not skipABMVisitor[iteration]: + householdFile = pd.read_csv(_join(self._path, "input", "households_visitor.csv")) + hh_visitor_size = len(householdFile) + del(householdFile) + self.run_proc( + "runSandagAbm_ActivitySimVisitor.cmd", + [drive, drive + path_forward_slash, int(sample_rate[iteration] * hh_visitor_size)], + "Running ActivitySim visitor model", capture_output=True) if not skipCTM[iteration]: - export_for_commercial_vehicle(output_dir, base_scenario) + #export_for_commercial_vehicle(output_dir + '/skims', base_scenario) self.run_proc( "cvm.bat", [drive, path_no_drive], @@ -556,7 +698,10 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, external_zones = "1-12" if not skipTruck[iteration]: # run truck model (generate truck trips) - run_truck(True, input_dir, input_truck_dir, num_processors, base_scenario) + self.run_proc( + "htm.bat", + [drive, path_no_drive, fafInputFile, mgraInputFile, "traffic_skims_PM"], + "Heavy truck model", capture_output=True) # run EI model "US to SD External Trip Model" if not skipEI[iteration]: external_internal(input_dir, base_scenario) @@ -564,11 +709,11 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, if not skipExternal[iteration]: external_external(input_dir, external_zones, base_scenario) + # import demand from all sub-market models from CT-RAMP and # add CV trips to auto demand - # add EE and EI trips to auto demand if not skipTripTableCreation[iteration]: - import_auto_demand(output_dir, external_zones, num_processors, base_scenario) + import_auto_demand(output_dir + '/assignment', external_zones, num_processors, base_scenario) if not skipFinalHighwayAssignment: with _m.logbook_trace("Final traffic assignments"): @@ -576,70 +721,93 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, final_iteration = 4 self.run_traffic_assignments( base_scenario, period_ids, final_iteration, relative_gap, max_assign_iterations, - num_processors, select_link) + num_processors, select_link, makeFinalHighwayAssignmentStochastic, input_dir) + self.run_proc( + "runSandagAbm_Preprocessing.cmd", + [drive, drive + path_forward_slash, final_iteration, scenarioYear], + "Adding DIST skim", capture_output=True) if not skipFinalTransitAssignment: - import_transit_demand(output_dir, transit_scenario) + import_transit_demand(output_dir + '/assignment', transit_scenario_dict) with _m.logbook_trace("Final transit assignments"): # Final iteration includes the transit skims per ABM-1072 for number, period in period_ids: src_period_scenario = main_emmebank.scenario(number) transit_assign_scen = build_transit_scen( period=period, base_scenario=src_period_scenario, - transit_emmebank=transit_emmebank, scenario_id=src_period_scenario.id, - scenario_title="%s - %s transit assign" % (base_scenario.title, period), + transit_emmebank=transit_emmebank_dict[period], + scenario_id=src_period_scenario.id, + scenario_title="%s %s transit assign" % (base_scenario.title, period), data_table_name=scenarioYear, overwrite=True) - transit_assign(period, transit_assign_scen, data_table_name=scenarioYear, - num_processors=num_processors) - omx_file = _join(output_dir, "transit_skims.omx") - export_transit_skims(omx_file, periods, transit_scenario, big_to_zero=True) - if not skipTransitShed: - # write walk and drive transit sheds - self.run_proc("runtransitreporter.cmd", [drive, path_forward_slash, transitShedThreshold, transitShedTOD], - "Create walk and drive transit sheds", - capture_output=True) + #this would import connectors from the input/transit_connectors folder, and not create them from scratch + # create_transit_connector(period, transit_assign_scen, create_connector_flag=False) + + # Run transit assignment in separate process + # Running in same process slows OMX skim export for unknown reason + # transit_emmebank need to be closed and re-opened to be accessed by separate process + transit_emmebank_dict = self.run_transit_assignments(transit_emmebank_dict, scenarioYear, output_dir, False, main_directory) + for period in periods: + transit_scenario_dict[period] = transit_emmebank_dict[period].scenario(base_scenario.number) + # _m.Modeller().desktop.refresh_data() + + # #output transit skims by period + # for number, period in period_ids: + # transit_scenario = transit_emmebank.scenario(number) + # omx_file = _join(output_dir, "skims", "transit_skims_" + period + ".omx") + # export_transit_skims(omx_file, [period], transit_scenario, big_to_zero=False) + + # if not skipTransitShed: + # # write walk and drive transit sheds + # self.run_proc("runtransitreporter.cmd", [drive, path_forward_slash, transitShedThreshold, transitShedTOD], + # "Create walk and drive transit sheds", + # capture_output=True) if not skipVisualizer: self.run_proc("RunViz.bat", - [drive, path_no_drive, visualizer_reference_path, visualizer_output_file, "NO", visualizer_reference_label, visualizer_build_label, mgraInputFile], + [drive, drive + path_forward_slash], "HTML Visualizer", capture_output=True) if not skipDataExport: + # export network and matrix results from Emme directly to T if using local drive output_directory = _join(self._path, "output") - export_network_data(self._path, scenario_id, main_emmebank, transit_emmebank, num_processors) - export_matrix_data(output_directory, base_scenario, transit_scenario) + export_network_data(self._path, scenario_id, main_emmebank, transit_emmebank_dict, num_processors) + export_matrix_data(output_directory, base_scenario) # export core ABM data # Note: uses relative project structure, so cannot redirect to T drive - self.run_proc("DataExporter.bat", [drive, path_no_drive], "Export core ABM data",capture_output=True) - #Validation for 2016 scenario + # self.run_proc("DataExporter.bat", [drive, path_no_drive], "Export core ABM data",capture_output=True) + # aggregate_models = {} + # for agg_model in ['eetrip', 'eitrip', 'trucktrip']:#TODO ['commercialVehicleTrips','internalExternalTrips']: + # aggregate_models[agg_model] = str(os.path.join(self._path,'report',agg_model+'.csv')) + # gen_utils.DataLakeExporter(ScenarioPath=self._path).write_to_datalake(aggregate_models) + self.run_proc( + "export_hwy_shape.cmd", + [drive, drive + path_forward_slash], + "Exporting highway shapefile", capture_output=True) + + if not skipDatalake: + self.write_metadata(main_directory, scenario_title, select_link, username, scenarioYear, sample_rate) + self.run_proc( + "write_to_datalake.cmd", + [drive, drive + path_forward_slash], + "Writing model output to datalake", capture_output=True) + + #Validation for 2022 scenario if scenarioYear == "2016": - validation(self._path, main_emmebank, base_scenario) - ### CL: Below step is temporarily used to update validation output files. When Gregor complete Upload procedure, below step should be removed. 05/31/20 - self.run_proc("ExcelUpdate.bat", # forced to update excel links - [drive, path_no_drive, scenarioYear, 0], - "Excel Update", - capture_output=True) - - - - # UPLOAD DATA AND SWITCH PATHS - if useLocalDrive: - file_manager("UPLOAD", main_directory, username, scenario_id, - delete_local_files=not skipDeleteIntermediateFiles) - self._path = main_directory - drive, path_no_drive = os.path.splitdrive(self._path) - init_transit_db.add_database( - _eb.Emmebank(_join(main_directory, "emme_project", "Database_transit", "emmebank"))) + validation(self._path, main_emmebank, base_scenario) # to create source_EMME.xlsx - if not skipDataLoadRequest: - start_db_time = datetime.datetime.now() # record the time to search for request id in the load request table, YMA, 1/23/2019 - # start_db_time = start_db_time + datetime.timedelta(minutes=0) + # #Create Worksheet for ABM Validation using PowerBI Visualization #JY: can be uncommented if deciding to incorporate PowerBI vis in ABM workflow + # self.run_proc("VisPowerBI.bat", # forced to update excel links + # [drive, path_no_drive, scenarioYear, 0], + # "VisPowerBI", + # capture_output=True) - self.run_proc("DataLoadRequest.bat", - [drive + path_no_drive, end_iteration, scenarioYear, sample_rate[end_iteration - 1]], - "Data load request") + ### CL: Below step is temporarily used to update validation output files. When Gregor complete Upload procedure, below step should be removed. 05/31/20 + # self.run_proc("ExcelUpdate.bat", # forced to update excel links + # [drive, path_no_drive, scenarioYear, 0], + # "ExcelUpdate", + # capture_output=True) ### ES: Commented out until this segment is updated to reference new database. 9/10/20 ### # add segments below for auto-reporting, YMA, 1/23/2019 @@ -676,6 +844,31 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, # "Excel Update", # capture_output=True) + # # terminate all java processes + # _subprocess.call("taskkill /F /IM java.exe") + + # # close all DOS windows + # _subprocess.call("taskkill /F /IM cmd.exe") + + # UPLOAD DATA AND SWITCH PATHS + if useLocalDrive: + file_manager("UPLOAD", main_directory, username, scenario_id, + delete_local_files=not skipDeleteIntermediateFiles) + self._path = main_directory + drive, path_no_drive = os.path.splitdrive(self._path) + # self._path = main_directory + # drive, path_no_drive = os.path.splitdrive(self._path) + for period in periods: + init_transit_db.add_database( + _eb.Emmebank(_join(main_directory, "emme_project", "Database_transit_" + period, "emmebank"))) + + if not skipDataLoadRequest: + start_db_time = datetime.datetime.now() # record the time to search for request id in the load request table, YMA, 1/23/2019 + # start_db_time = start_db_time + datetime.timedelta(minutes=0) + # self.run_proc("DataLoadRequest.bat", + # [drive + path_no_drive, end_iteration, scenarioYear, sample_rate[end_iteration - 1], geographyID], + # "Data load request") + # delete trip table files in iteration sub folder if model finishes without errors if not useLocalDrive and not skipDeleteIntermediateFiles: for msa_iteration in range(startFromIteration, end_iteration + 1): @@ -683,11 +876,8 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, ["auto*Trips*.omx", "tran*Trips*.omx", "nmot*.omx", "othr*.omx", "trip*.omx"], _join(output_dir, "iter%s" % (msa_iteration))) - # terminate all java processes - _subprocess.call("taskkill /F /IM java.exe") - - # close all DOS windows - _subprocess.call("taskkill /F /IM cmd.exe") + # record run time + run_summary(path=self._path) def set_global_logbook_level(self, props): self._log_level = props.get("RunModel.LogbookLevel", "ENABLED") @@ -706,8 +896,83 @@ def set_global_logbook_level(self, props): except KeyError: raise Exception("properties.RunModel.LogLevel: value must be one of %s" % ",".join(log_states.keys())) + def run_transit_assignments(self, transit_emmebank_dict, scenarioYear, output_dir, create_connector_flag, main_directory_original): + + scenario_id = 100 + periods = ["EA", "AM", "MD", "PM", "EV"] + period_ids = list(enumerate(periods, start=int(scenario_id) + 1)) + + transit_processors = (multiprocessing.cpu_count() - 1) // 5 + + transit_emmebank_path_dict = {} + + processes = [] + + with _m.logbook_trace("Running all period transit assignmens"): + for number, period in period_ids: + + transit_emmebank_path_dict[period] = transit_emmebank_dict[period].path + emme_project_dir = _dir(_dir(transit_emmebank_path_dict[period])) + main_directory = _dir(emme_project_dir) + + if os.path.exists(_join(emme_project_dir, "transit_assign_dummy_project_" + period)): + shutil.rmtree(_join(emme_project_dir, "transit_assign_dummy_project_" + period)) + project_path = _app.create_project(emme_project_dir, "transit_assign_dummy_project_" + period) + dummy_desktop = _app.start_dedicated(visible=False, user_initials="SD", project=project_path) + dummy_desktop.add_modeller_toolbox(_join(main_directory_original, "emme_project", "Scripts", "sandag_toolbox.mtbx")) + data_explorer = dummy_desktop.data_explorer() + db = data_explorer.add_database(transit_emmebank_dict[period].path) + db.open() + + project_table_db = _m.Modeller().desktop.project.data_tables() + data = project_table_db.table("%s_transit_passes" % scenarioYear).get_data() + dummy_project_table_db = dummy_desktop.project.data_tables() + dummy_project_table_db.create_table("%s_transit_passes" % scenarioYear, data, overwrite=True) + + dummy_desktop.project.save() + dummy_desktop.close() + transit_emmebank_dict[period].dispose() + + _time.sleep(2) + + script = _join(main_directory, "python", "emme", "run_transit_assignment.py") + args = [sys.executable, script, "--root_dir", '"%s"' % main_directory, "--project_path", '"%s"' % project_path, + "--period", '"%s"' % period, "--number", '"%s"' % number, "--proc", '"%s"' % transit_processors, + "--output_dir", '"%s"' % output_dir] + if create_connector_flag: + args.append("--create_connector_flag") + p = _subprocess.Popen(args, shell=True) + processes.append({ + "p": p, + "period": period + }) + _time.sleep(2) + + # NOTE: could remove project when done + #shutil.rmtree(project_dir) + # NOTE: need to pass back re-opened objects + + for p in processes: + report = _m.PageBuilder(title="Command report") + out, err = p["p"].communicate() + self.add_html(report, 'Output:

%s
' % out) + if err: + self.add_html(report, 'Error message(s):

%s
' % err) + _m.logbook_write("Transit assignment process record for period " + p["period"], report.render()) + if p["p"].returncode != 0: + raise + + + new_transit_emmebank_dict = {} + for number, period in period_ids: + new_transit_emmebank_dict[period] = _eb.Emmebank(transit_emmebank_path_dict[period]) + _m.Modeller().desktop.refresh_data() + + return new_transit_emmebank_dict + def run_traffic_assignments(self, base_scenario, period_ids, msa_iteration, relative_gap, - max_assign_iterations, num_processors, select_link=None): + max_assign_iterations, num_processors, select_link=None, + makeFinalHighwayAssignmentStochastic=False, input_dir=None): modeller = _m.Modeller() traffic_assign = modeller.tool("sandag.assignment.traffic_assignment") export_traffic_skims = modeller.tool("sandag.export.export_traffic_skims") @@ -728,7 +993,7 @@ def run_traffic_assignments(self, base_scenario, period_ids, msa_iteration, rela "conf\\server-config.csv ServerName column") server_config = {"SNODE": "yes"} distributed = server_config["SNODE"] == "no" - if distributed: + if distributed and not makeFinalHighwayAssignmentStochastic: scen_map = dict((p, main_emmebank.scenario(n)) for n, p in period_ids) input_args = { "msa_iteration": msa_iteration, @@ -758,8 +1023,8 @@ def run_traffic_assignments(self, base_scenario, period_ids, msa_iteration, rela local_scenario = scen_map[period] traffic_assign(period, msa_iteration, relative_gap, max_assign_iterations, num_processors, local_scenario, select_link) - omx_file = _join(output_dir, "traffic_skims_%s.omx" % period) - if msa_iteration < 4: + omx_file = _join(output_dir, "skims", "traffic_skims_%s.omx" % period) + if msa_iteration <= 4: export_traffic_skims(period, omx_file, base_scenario) scenarios = { database_path1: [scen_map[p] for p in periods_node1], @@ -779,9 +1044,9 @@ def run_traffic_assignments(self, base_scenario, period_ids, msa_iteration, rela for number, period in period_ids: period_scenario = main_emmebank.scenario(number) traffic_assign(period, msa_iteration, relative_gap, max_assign_iterations, - num_processors, period_scenario, select_link) - omx_file = _join(output_dir, "traffic_skims_%s.omx" % period) - if msa_iteration < 4: + num_processors, period_scenario, select_link, stochastic=makeFinalHighwayAssignmentStochastic, input_directory=input_dir) + omx_file = _join(output_dir, "skims", "traffic_skims_%s.omx" % period) + if msa_iteration <= 4: export_traffic_skims(period, omx_file, base_scenario) def run_proc(self, name, arguments, log_message, capture_output=False): @@ -793,15 +1058,15 @@ def run_proc(self, name, arguments, log_message, capture_output=False): with _m.logbook_trace(log_message, attributes=attrs): if capture_output and self._log_level != "NO_EXTERNAL_REPORTS": report = _m.PageBuilder(title="Process run %s" % name) - report.add_html('Command:

%s

' % command) + self.add_html(report, 'Command:

%s

' % command) # temporary file to capture output error messages generated by Java err_file_ref, err_file_path = _tempfile.mkstemp(suffix='.log') err_file = os.fdopen(err_file_ref, "w") try: output = _subprocess.check_output(command, stderr=err_file, cwd=self._path, shell=True) - report.add_html('Output:

%s
' % output) + self.add_html(report, 'Output:

%s
' % output) except _subprocess.CalledProcessError as error: - report.add_html('Output:

%s
' % error.output) + self.add_html(report, 'Output:

%s
' % error.output) raise finally: err_file.close() @@ -809,7 +1074,7 @@ def run_proc(self, name, arguments, log_message, capture_output=False): error_msg = f.read() os.remove(err_file_path) if error_msg: - report.add_html('Error message(s):

%s
' % error_msg) + self.add_html(report, 'Error message(s):

%s
' % error_msg) try: # No raise on writing report error # due to observed issue with runs generating reports which cause @@ -1169,6 +1434,77 @@ def sql_check_load_request(self, year, path, user, ldtime): # YMA, 1/24/2019 else: return "The data load request was not successfully made, please double check the [data_load].[load_request] table to confirm." + def get_scenario_id(self, scenario_guid, scenario_name): + path = _join(self._path, "bin", "GetScenarioId.bat") + err_file_ref, err_file_path = _tempfile.mkstemp(suffix='.log') + err_file = os.fdopen(err_file_ref, "w") + try: + output = _subprocess.check_output(" ".join([path, '"' + scenario_guid + '"', '"' + scenario_name + '"']), stderr=err_file, cwd=self._path, shell=True) + scenario_id = int(output.splitlines()[4]) + _m.logbook_write("Got new scenario_id: %s" % (scenario_id)) + err_file.close() + return True, scenario_id + except Exception as e: + report = _m.PageBuilder(title="Error getting new scenario_id") + self.add_html(report, 'Error:

%s
' % e) + err_file.close() + with open(err_file_path, 'r') as f: + error_msg = f.read() + os.remove(err_file_path) + if error_msg: + self.add_html(report, 'Error message(s):

%s
' % error_msg) + try: + # No raise on writing report error + # due to observed issue with runs generating reports which cause + # errors when logged + _m.logbook_write("Error getting new scenario_id", report.render()) + except Exception as error: + print(_time.strftime("%Y-%M-%d %H:%m:%S")) + print("Error writing scenario_id report to logbook") + print(error) + print(_traceback.format_exc(error)) + if self._log_level == "DISABLE_ON_ERROR": + _m.logbook_level(_m.LogbookLevel.NONE) + return False, -1 + + def write_metadata(self, main_directory, scenario_title, select_link, username, scenarioYear, sample_rate): + '''Write YAML file containing scenario guid and other scenario info to output folder for writing to datalake''' + datalake_metadata_dict = { + "main_directory" : main_directory.encode('utf-8') + ,"scenario_guid" : uuid.uuid4().hex + ,'scenario_guid_created_at' : datetime.datetime.now() + ,"scenario_title" : scenario_title.encode('utf-8') + ,"scenario_year": scenarioYear + ,"select_link" : select_link.encode('utf-8') + ,"username" : username.encode('utf-8') + ,"properties_path" : self.properties_path + ,"sample_rate" : ",".join(map(str, sample_rate)) + } + _m.logbook_write("Created new scenario_guid: %s" % (datalake_metadata_dict['scenario_guid'])) + got_id, scenario_id = self.get_scenario_id(datalake_metadata_dict['scenario_guid'], scenario_title) + if got_id: + datalake_metadata_dict['scenario_id'] = scenario_id + datalake_metadata_path = os.path.join(self._path,'output','datalake_metadata.yaml') + with open(datalake_metadata_path, 'w') as file: + yaml.safe_dump(datalake_metadata_dict, file, default_flow_style=False) + + + # def update_metadata_iteration(self, main_directory, msa_iteration): + # """update iteration value in metadata YAML""" + # datalake_metadata_path = os.path.join(main_directory,'output','datalake_metadata.yaml') + # with open(datalake_metadata_path, 'r') as file: + # datalake_metadata_dict = yaml.safe_load(file) + # datalake_metadata_dict['current_iteration'] = msa_iteration + # with open(datalake_metadata_path, 'w') as file: + # yaml.dump(datalake_metadata_dict, file, default_flow_style=False) + # _m.logbook_write("Updated Iteration in datalake_metadata.yaml file") + + def add_html(self, report, html): + try: + report.add_html(html) + except Exception: + fix_html = html.replace(r'\U', r'/U').replace(r'\u', r'/u') + report.add_html(fix_html) ''' def send_notification(self,str_message,user): # YMA, 1/24/2019, not working on server diff --git a/src/main/python/run_htm.py b/src/main/python/run_htm.py new file mode 100644 index 000000000..257fbf8ca --- /dev/null +++ b/src/main/python/run_htm.py @@ -0,0 +1,538 @@ +# -*- coding: utf-8 -*- +""" +Heavy Truck Model +FAF Annual Tonnage to Truck Number by TAZ Disaggregation + +Author: Maddie Hasani, Fehr & Peers
+Reviewer: Fatemeh Ranaiefar, Fehr & Peers
+Last update: 12/19/2023 +""" + +## REQUIRED LIBRARIES +import pandas as pd +import numpy as np +import openmatrix as omx +from scipy import io +pd.set_option('display.max_columns', None) # Display all columns +import sys +import shutil + +#=================================================================================================================== +#=================================================================================================================== + + +## Functions +def load_and_preprocess_data(path, model_dir, output_dir, faf_file_name, mgra_file_name, skim_file_name): + + """ + Parameters: + - Path: a full path to the input file. For example: 'C:\GitLab\HVM scripts\input_file.xlsx' + + input_file: + - HTM input excel file + + Returns: + - df_dict (dict): A dictionary containing DataFrames for each sheet in the input Excel file. + - traffic_skims (DataFrame): Processed DataFrame containing traffic skims. + + Description: + This function loads and preprocesses input files and returns DataFrames and processed traffic skims. + + """ + + # Initialize a dictionary to hold DataFrames + df_dict = {} + + # 1. Load in input files + input_path = path + inputs_sandag_HTM = pd.ExcelFile(input_path) + sheet_names = [sheet_name for sheet_name in inputs_sandag_HTM.sheet_names if sheet_name.lower() not in ['userguide', 'reference']] + + # 1.1 Load all sheets into separate DataFrames with lowercase names + for sheet_name in sheet_names: + df_name = sheet_name.lower() # Convert sheet name to lowercase + df_dict[df_name] = inputs_sandag_HTM.parse(sheet_name) # Save DataFrame to the dictionary + + # 2. Load in FAF data + faf = df_dict['faf'] # Use the dictionary to get the DataFrame + faf_name = faf_file_name + faf_path = model_dir + "\input\htm" + full_faf_path = f"{faf_path}\\{faf_name}" + df = pd.read_csv(full_faf_path) + + # 3. Load in MGRA data + mgra_loc = df_dict['mgra'] # Use the dictionary to get the DataFrame + mgra_name = mgra_file_name + #mgra_path = mgra_loc.loc[0, 'Path'] + full_mgra_path = f"{model_dir}\\{mgra_file_name}" + mgra = pd.read_csv(full_mgra_path) + + # 4. Load in Skim file + skim = df_dict['skim'] # Use the dictionary to get the DataFrame + skim_name = skim_file_name + skim_path = output_dir + full_skim_path = f"{output_dir}\\skims\\{skim_name}.omx" + + traffic_skims_PM = [] + with omx.open_file(full_skim_path) as omx_file: + # for name in ["PM_TRK_H_DIST"]: + for name in ["TRK_H_DIST__PM"]: + matrix = omx_file[name] + df_skim = pd.DataFrame(matrix[:]) + stacked_df = df_skim.stack().reset_index() # Reset the index to make it separate columns + stacked_df.columns = ["origin", "destination", name] # Rename the columns + traffic_skims_PM.append(stacked_df) + traffic_skims = pd.concat(traffic_skims_PM, axis=1) + + # 5. Filter out OD pairs where at least one end is a gateway + traffic_skims = traffic_skims.loc[(traffic_skims['origin'] >= 13) & (traffic_skims['destination'] >= 13)] + + return df, mgra, traffic_skims, df_dict + + +#=================================================================================================================== +#=================================================================================================================== + +def clean_faf(df, faz_gateway, faz_county, sd_flows, othermode_truck, commodity_group): + """ + Process a DataFrame containing transportation data. + + Parameters: + - df (DataFrame): The input DataFrame containing transportation data. + - faz_gateway (DataFrame): DataFrame containing FAZ and Gateways/Airports/Ports TAZ. + - faz_county (DataFrame): DataFrame containing FAZ and County information. + - sd_flows (DataFrame): DataFrame containing Origin and Destination pair that will generate truck trips to/from SANDAG or Pass through SANDAG region. + - othermode_truck (DataFrame): DataFrame with mode information and percentages. + - commodity_group (DataFrame): DataFrame mapping commodities to CG values. + + Returns: + - processed_df (DataFrame): Processed DataFrame with updated columns. + + Description: + This function takes FAF data and performs the following steps: + 1. Determine what are the OD pairs that may pass through SANDAG region or start/end in SANDAG + 2. Includes only specified modes and calculates tonnage. + 3. Deletes unnecessary columns. + 4. Assigns SANDAG commodity groups based on SCTG commodity group. + 5. Aggregates tonnage data by OD FAZ and Commodity Group. + 6. Adds columns identifying if OD pairs have at least one end within Orange County or Mexico. + The processed DataFrame is returned. + """ + sd_flows = df_dict[sd_flows] + faz_gateway = df_dict[faz_gateway] + faz_county = df_dict[faz_county] + othermode_truck = df_dict[othermode_truck] + commodity_group = df_dict[commodity_group] + + + # 1. Determine what are the OD pairs that may pass through SANDAG region or start/end in SANDAG + # Mapping columns 'dms_orig' and 'dms_dest' based on the lookup table to determine the area code (check out the reference tab in the input spreadsheet for more info) + df = df.merge(faz_gateway[['FAZ', 'AreaCode']], how='left', left_on='dms_orig', right_on='FAZ').drop('FAZ', axis=1).rename(columns={'AreaCode': 'code_orig'}) + df = df.merge(faz_gateway[['FAZ', 'AreaCode']], how='left', left_on='dms_dest', right_on='FAZ').drop('FAZ', axis=1).rename(columns={'AreaCode': 'code_dest'}) + # if FAZ is within SANDAG, the areacode should be 8 + faz_sandag = faz_county[faz_county["County"] == "San Diego"]["FAZ"] + df.loc[df['dms_orig'].isin(faz_sandag), 'code_orig'] = 8 + df.loc[df['dms_dest'].isin(faz_sandag), 'code_dest'] = 8 + # merge the distribution of truck trips between each OD pair + df = df.merge(sd_flows[['OriginCode', 'DestinationCode', 'Dist']], how='left', left_on=['code_orig', 'code_dest'], right_on=['OriginCode', 'DestinationCode']).drop(['OriginCode', 'DestinationCode'], axis=1) + # calculate how much of each OD pairs will travel through SANDAG - multiply by the ton + df['distons_2025'] = df['distons_2025'] * df['Dist'] + # remove all OD pairs that do not have any tons traveled through or within SANDAG + df = df[df['distons_2025'] > 0] + df.drop(['Dist'], axis=1, inplace=True) + + # 2. Include some modes + mode_to_include = othermode_truck.set_index('Mode_Num')['Percentage'].to_dict() + df = df[df['Mode'].isin(mode_to_include.keys())] + df['truck_perc'] = df['Mode'].map(mode_to_include) + df['ton'] = df['distons_2025'] * df['truck_perc'] + df.drop(['truck_perc', 'distons_2025'], axis=1, inplace=True) + + # 3. Delete unnecessary columns + delete_col = ['Direction', 'Trade', 'disvalue_2017', 'distons_2017', 'disvalue_2025', 'distons_2030', 'disvalue_2030', 'distons_2035', + 'disvalue_2035', 'distons_2040', 'disvalue_2040', 'distons_2045', 'disvalue_2045', 'distons_2050', 'disvalue_2050'] + df.drop(delete_col, axis=1, inplace=True) + + # 4. Assign SANDAG commodity groups based on SCTG commodity group + commodity_to_cg = commodity_group.set_index('SCTG')['CG'].to_dict() + df['CG'] = df['Commodity'].map(commodity_to_cg) + df.drop('Commodity', axis=1, inplace=True) + + # 5. Aggregate the Tonnage Data by Origin/Destination and Commodity Group + df['fr_orig'] = df['fr_orig'].fillna(0) + df['fr_dest'] = df['fr_dest'].fillna(0) + df = df.groupby(['dms_orig', 'dms_dest', 'fr_orig', 'fr_dest', 'code_orig', 'code_dest', 'CG'], as_index=False).agg({'ton': 'sum'}) + + # 6. Create a new column that identifies if at least one end of the OD is within Orange County and mexico + df['one_end_orange'] = ((df['code_orig'] == 6) | (df['code_dest'] == 6)).astype(int) + df['one_end_mx'] = ((df['fr_orig'].isin([802])) | (df['fr_dest'].isin([802]))).astype(int) + + return df + +#=================================================================================================================== +#=================================================================================================================== + +def prepare_taz_data(mgra, faz_county, emp_converter, taz_faz): + """ + Prepare TAZ data by calculating NAICS employee category percentages within each TAZ. + + Parameters: + - mgra (DataFrame): DataFrame containing MGRA data. + - faz_county (DataFrame): DataFrame containing FAZ and County information. + - emp_converter (DataFrame): DataFrame mapping SANDAG emp category to NAICS emp category. + - taz_faz (DataFrame): DataFrame mapping TAZ values to FAZ values. + + Returns: + - taz_long (DataFrame): Processed DataFrame with calculated employee category percentages. + + Description: + This function calculates the percentage of each employee category (from the NAICS Dataset) + within each TAZ. It performs the following steps: + 1. Calculate the number of SADNAG employees by TAZ. + 2. Add FAZ to the emp by TAZ table + 3. Reformat the TAZ table to long format using emp_ and pop columns. + 4. Reformat the emp_converter table to long format using FAZ columns + 5. Convert SANDAG emp category to NAICS emp category. + 6. Calculate the number of NAICS employees by TAZ. + 7. Aggregate total number of each NAICS employee category by TAZ. + 6. Create a mapping of TAZ values to FAZ values. + 8. Calculate how many percentage of each emp category is within a TAZ + The processed DataFrame is returned. + """ + + emp_converter = df_dict[emp_converter] + taz_faz = df_dict[taz_faz] + faz_county = df_dict[faz_county] + + # 1. Calculate the number of employee by TAZ + cols_to_sum = ['pop'] + [col for col in mgra.columns if col.startswith('emp_')] + taz = mgra.groupby(['taz'], as_index=False)[cols_to_sum].sum() + + # 2. Add FAZ to the emp by TAZ table + taz_to_faz = taz_faz.set_index('TAZ')['FAZ'].to_dict() + # Use the map function to directly assign TAZ values + taz['FAZ'] = taz['taz'].map(taz_to_faz) + + # 3. Reformat the taz table to long format using emp_ columns and pop + taz_long = taz.melt(id_vars=['taz', 'FAZ'], value_vars=cols_to_sum, value_name='sandag_emp_num', var_name='sandag_emp') + + # 4. Reformat the emp_converter table to long format using FAZ columns + faz_sandag = faz_county[faz_county["County"] == "San Diego"]["FAZ"] + emp_converter_long = emp_converter.melt(id_vars=['NAICS_Emp', 'SANDAG_Emp'], value_vars=faz_sandag, value_name='Emp_PCT', var_name='FAZ') + + # 5. Convert SANDAG emp category to NAICS emp category + taz_long = emp_converter_long.merge(taz_long, how='inner', right_on=['sandag_emp', 'FAZ'], left_on=['SANDAG_Emp', 'FAZ']).drop(['sandag_emp'], axis=1) + + # 6. Calculate the number of NAICS employees by TAZ. + taz_long['naics_emp_num'] = taz_long['sandag_emp_num'] * taz_long['Emp_PCT'] + + # 7. Aggregate NAICS employee number by TAZ + taz_long = taz_long.groupby(['taz', 'FAZ', 'NAICS_Emp'], as_index=False).agg({'naics_emp_num': 'sum'}) + + # 8. Calculate how many percentage of each emp category is within a TAZ + taz_long['emp_naics_perc'] = taz_long['naics_emp_num'] / taz_long.groupby(['NAICS_Emp', 'FAZ'])['naics_emp_num'].transform('sum') + taz_long = taz_long.loc[taz_long['naics_emp_num'] > 0] + + return taz_long + +#=================================================================================================================== +#=================================================================================================================== + +def faf_disaggregate_to_taz(df, faz_gateway, cg_emp_a, cg_emp_p, faz_county, taz, annual_factor): + """ + Parameters: + - df (DataFrame): faf data with aggregated commodity + - faz_gateway (DataFrame): DataFrame mapping FAZ to SADNAG gateways. + - faz_county (DataFrame): DataFrame containing FAZ and County information. + + Returns: + - processed_df (DataFrame): Processed DataFrame with daily tonnage by TAZ origin and destination. + + Description: + This function performs the following steps: + 1. Determine NAICS emp category for production and attraction in FAF. + 2. Bring TAZ numbers and the percentage of each emp category within each TAZ to relatively distribute tonnage to TAZ. + 3. For FAZ outside the SANDAG region, assume that the distribution of tonnage is 1 for both attraction/production. + 4. Calculate annual tonnage for each OD pair. + 5. Reformat the faz_gateway table to long format using emp_ columns and pop. + 6. Assign Gateway TAZ and percentage to the DataFrame. + 7. Calculate final tonnage where one end of trip is outside the SANDAG region (taz_a or taz_p is null) and assign corresponding gateways as taz_a or taz_p. + 8. Group by TAZ attraction and production and sum up the annual tonnage. + 9. Convert annual to daily tonnage . the annual to daily factor is basically the number of working days within a year. + + The processed DataFrame is returned. + """ + faz_gateway = df_dict[faz_gateway] + cg_emp_a = df_dict[cg_emp_a] + cg_emp_p = df_dict[cg_emp_p] + faz_county = df_dict[faz_county] + annual_factor = df_dict[annual_factor] + + + # 1. Determine NAICS emp category for production and attraction in FAF + cg_to_emp_a = cg_emp_a.set_index('CG')['Emp_a'].to_dict() + cg_to_emp_p = cg_emp_p.set_index('CG')['Emp_p'].to_dict() + + # Use the map function to directly assign Emp_a and Emp_p values + df['Emp_a'] = df['CG'].map(cg_to_emp_a) + df['Emp_p'] = df['CG'].map(cg_to_emp_p) + + # 2. Bring TAZ numbers and the percentage of each emp category within each TAZ to relatively distribute tonnage to TAZ. + df = df.merge(taz[['taz', 'FAZ', 'NAICS_Emp', 'emp_naics_perc']], how='left', left_on=['Emp_p', 'dms_orig'], right_on=['NAICS_Emp', 'FAZ']).drop(['FAZ', 'NAICS_Emp', 'Emp_p'], axis=1) + df.rename(columns={'taz': 'taz_p', 'emp_naics_perc': 'emp_naics_perc_p'}, inplace=True) + + df = df.merge(taz[['taz', 'FAZ', 'NAICS_Emp', 'emp_naics_perc']], how='left', left_on=['Emp_a', 'dms_dest'], right_on=['NAICS_Emp', 'FAZ']).drop(['FAZ', 'NAICS_Emp', 'Emp_a'], axis=1) + df.rename(columns={'taz': 'taz_a', 'emp_naics_perc': 'emp_naics_perc_a'}, inplace=True) + + # 3. For FAZ outside the SANDAG region, assume that the distribution percentage is 1 for both attraction/production + # create a list of FAZ in San Diego + faz_sandag = faz_county[faz_county["County"] == "San Diego"]["FAZ"] + df.loc[(~df['dms_orig'].isin(faz_sandag)) & (df['emp_naics_perc_p'].isnull()), 'emp_naics_perc_p'] = 1 + df.loc[(~df['dms_dest'].isin(faz_sandag)) & (df['emp_naics_perc_a'].isnull()), 'emp_naics_perc_a'] = 1 + + # 4. Calculate annual tonnage for each OD pair + df['dist_perc'] = df['emp_naics_perc_a'] * df['emp_naics_perc_p'] + df['ton_annual'] = df['ton'] * df['dist_perc'] * 1000 # FAF data is in thousand tons + df.drop(['ton', 'emp_naics_perc_p', 'emp_naics_perc_a', 'dist_perc'], axis=1, inplace=True) + + # 5. Reformat the faz_gateway table to long format using emp_ columns and pop + gateway_airport_port = faz_gateway.columns[4:] + faz_gateway_long = faz_gateway.melt(id_vars=['FAZ'], value_vars=gateway_airport_port, value_name='faz_gtw_perc', var_name='gateways').dropna(subset=['faz_gtw_perc']) + + # 6. Assign Gateway TAZ and percentage to the DataFrame + df = df.merge(faz_gateway_long, how='left', left_on='dms_orig', right_on='FAZ').drop('FAZ', axis=1) + df.rename(columns={'gateways': 'gateways_p', 'faz_gtw_perc': 'faz_gtw_perc_p'}, inplace=True) + + df = df.merge(faz_gateway_long, how='left', left_on='dms_dest', right_on='FAZ').drop('FAZ', axis=1) + df.rename(columns={'gateways': 'gateways_a', 'faz_gtw_perc': 'faz_gtw_perc_a'}, inplace=True) + + # 7. Calculate final tonnage + # For the end that is within SANDAG region, gateway distributions should be ignored + df.loc[(df['dms_orig'].isin(faz_sandag)) & (df['faz_gtw_perc_p'].isnull()), 'faz_gtw_perc_p'] = 1 + df.loc[(df['dms_dest'].isin(faz_sandag)) & (df['faz_gtw_perc_a'].isnull()), 'faz_gtw_perc_a'] = 1 + + df['faz_gtw_perc'] = df['faz_gtw_perc_p'] * df['faz_gtw_perc_a'] + df['ton_tot'] = df['ton_annual'] * df['faz_gtw_perc'] + + # df.loc[df['taz_a'].isnull(), 'ton_tot'] = df.loc[df['taz_a'].isnull(), 'ton_annual'] * df.loc[df['taz_a'].isnull(), 'faz_gtw_perc_a'] + df.loc[df['taz_a'].isnull(), 'taz_a'] = df.loc[df['taz_a'].isnull(), 'gateways_a'] + + # df.loc[df['taz_p'].isnull(), 'ton_tot'] = df.loc[df['taz_p'].isnull(), 'ton_annual'] * df.loc[df['taz_p'].isnull(), 'faz_gtw_perc_p'] + df.loc[df['taz_p'].isnull(), 'taz_p'] = df.loc[df['taz_p'].isnull(), 'gateways_p'] + + # 8. Group by TAZ attraction and production and sum up the annual tonnage + # Note that there is a column that shows if at least one end of the trip is within Orange County. This column will be used in future steps to determine the OD distance. + processed_df = df.groupby(['taz_a', 'taz_p', 'CG', 'one_end_orange', 'one_end_mx'], as_index=False).agg({'ton_tot': 'sum'}) + + # 9. Convert annual to daily tonnage . the annual to daily factor is basically the number of working days within a year. + annual_to_daily_factor = annual_factor['Factor'].values + processed_df['ton_daily'] = processed_df['ton_tot'] / annual_to_daily_factor + + # Drop unnecessary columns + processed_df.drop(['ton_tot'], axis=1, inplace=True) + + return processed_df + + +#=================================================================================================================== +#=================================================================================================================== + +def daily_ton_to_truck_by_type_and_tod(df, traffic_skims, truck_dist, payload, time_of_day): + """ + Convert daily tonnage to number of trucks by type and time of day. + + Parameters: + - df (DataFrame): DataFrame containing the daily tonnage by TAZ. + - traffic_skims (DataFrame): DataFrame containing OD pair distance data. + - truck_dist (DataFrame): DataFrame containing truck type distribution data. + - payload (DataFrame): DataFrame containing payload data for truck types. + - time_of_day (DataFrame): DataFrame containing time of day factors. + + Returns: + - final_df (DataFrame): Processed DataFrame with number of trucks by type and time of day (TOD). + + Description: + This function performs the following steps: + 1. Identify distance between two OD pairs within San Diego using skim. + 2. Categorize the distance into different categories. + 1. less than 50 miles; + 2. 51 to 100 miles ; + 3. One end in OC ; + 4. 201 miles or more; or one end outside of SANDAG and Orange county regions. + 3. Distribute daily tonnage between truck types based on OD distance. + 4. Convert tonnage by truck type to the number of trucks using truck type and commodity. + 5. Distribute the number of trucks by time of day. + The final processed DataFrame is returned. + """ + truck_dist = df_dict[truck_dist] + payload = df_dict[payload] + time_of_day = df_dict[time_of_day] + + # 1. Identify distance between two OD pairs within San Diego using skim + df = df.merge(traffic_skims, how='left', left_on=['taz_a', 'taz_p'], right_on=['destination', 'origin']).drop(['origin', 'destination'], axis=1) + + # 2. Categorize the distance + def categorize_dist(value): + if value <= 50: + return 1 + elif value <= 100: + return 2 + elif value <= 150: + return 3 + elif value > 200: + return 4 + else: + return 0 + + df['dist_cat'] = np.where(df['one_end_orange'] == 1, 3, 0) + df['dist_cat'] = np.where(df['one_end_mx'] == 1, 5, 0) + # df['dist_cat'] = np.where(df['dist_cat'] == 0, df['PM_TRK_H_DIST'].apply(categorize_dist), df['dist_cat']) + df['dist_cat'] = np.where(df['dist_cat'] == 0, df['TRK_H_DIST__PM'].apply(categorize_dist), df['dist_cat']) + df['dist_cat'] = np.where(df['dist_cat'] == 0, 4, df['dist_cat']) + # df.drop(['one_end_orange', 'PM_TRK_H_DIST'], axis=1, inplace=True) + df.drop(['one_end_orange', 'TRK_H_DIST__PM'], axis=1, inplace=True) + + # 3. Distribute daily tonnage between truck types based on OD distance + df = df.merge(truck_dist[['Dist_GP', 'Truck_Type', 'Dist']], how='left', left_on='dist_cat', right_on='Dist_GP').drop(['Dist_GP'], axis=1) + df['ton_daily_bytruck'] = df['ton_daily'] * df['Dist'] + df.drop(['ton_daily', 'dist_cat', 'Dist'], axis=1, inplace=True) + df = df.groupby(['taz_a', 'taz_p', 'CG', 'Truck_Type'], as_index=False)['ton_daily_bytruck'].sum() + + # 4. Convert tonnage by truck type to the number of trucks using truck type and commodity + max_tonnage_dict = payload.set_index(['CG', 'Truck_Type'])['Pounds'].to_dict() + df['Tonnage'] = df.apply(lambda row: max_tonnage_dict.get((row['CG'], row['Truck_Type']), 0), axis=1) + df = df.loc[df['Tonnage'] > 0] + df['tot_truck'] = (df['ton_daily_bytruck'] / df['Tonnage']) * 2000 + df.drop(['ton_daily_bytruck', 'Tonnage'], axis=1, inplace=True) + + # 5. Distribute the number of trucks by time of day + peak_periods = ['AM', 'MD', 'PM', 'EA', 'EV'] + for period in peak_periods: + factor_column = time_of_day.loc[time_of_day['Peak_Period'] == period, 'Factor'].values + df[f'{period.lower()}_truck'] = df['tot_truck'] * factor_column + + final_df = df + + return final_df + +#=================================================================================================================== +#=================================================================================================================== +#=================================================================================================================== + +## Main Script + +arguments = sys.argv + +model_dir = arguments[1] +output_dir = arguments[2] +#assignment_dir = arguments[3] +faf_file_name = arguments[3] +mgra_file_name = arguments[4] +skim_file_name = arguments[5] + +# Step 1: Load and preprocess data +#df, mgra, traffic_skims, df_dict = load_and_preprocess_data("inputs_sandag_HTM.xlsx") +df, mgra, traffic_skims, df_dict = load_and_preprocess_data(model_dir + "\input\htm\inputs_sandag_HTM.xlsx", model_dir, output_dir, faf_file_name, mgra_file_name, skim_file_name) + +# Step 2: Prepare TAZ data +taz = prepare_taz_data(mgra, 'faz_county', 'emp_converter', 'taz_faz') + + +# Process df in chunks +# chunk_size = 100000 +chunk_size = 400000 +num_chunks = len(df) // chunk_size + 1 +final_results = [] +final_ton = [] + +for chunk_num in range(num_chunks): + start_idx = chunk_num * chunk_size + end_idx = (chunk_num + 1) * chunk_size + df_chunk = df[start_idx:end_idx] + + # Step 3: Clean FAF data + df_chunk = clean_faf(df_chunk, 'faz_gateway', 'faz_county', 'sd_flows', 'othermode_truck', 'commodity_group') + + # Step 4: FAF disaggregation to TAZ + df_chunk = faf_disaggregate_to_taz(df_chunk, 'faz_gateway', 'cg_emp_a', 'cg_emp_p', 'faz_county', taz, 'annual_factor') + + # Step 5: Daily tonnage to truck types and time of day + final_chunk = daily_ton_to_truck_by_type_and_tod(df_chunk, traffic_skims, 'truck_dist', 'payload', 'time_of_day') + + # Append the results of the chunk to the final_results list + final_results.append(final_chunk) + final_ton.append(df_chunk) + + # Print progress + progress = (chunk_num + 1) / num_chunks * 100 + print(f"Processing chunk {chunk_num + 1}/{num_chunks} - {progress:.2f}% done") + + +# Combine the results of all chunks +final_truck = pd.concat(final_results, ignore_index=True) +final_ton = pd.concat(final_ton, ignore_index=True) + +#=================================================================================================================== + +# combine medium1 and 2 truck type to a medium type +htm = final_truck +htm.loc[htm['Truck_Type'] == "Medium1", 'Truck_Type'] = 'Medium' +htm.loc[htm['Truck_Type'] == "Medium2", 'Truck_Type'] = 'Medium' + +htm = htm.groupby(['Truck_Type', 'taz_a', 'taz_p'], as_index=False)[['tot_truck', 'am_truck','md_truck', 'pm_truck', 'ea_truck', 'ev_truck']].sum() + +#=================================================================================================================== +# Identify the trip types: ei,ie (drop ii since it is not an HTM trip) +external = [1,2,3,4,5,6,7,8,9,10,11,12, 1154, 1294, 1338, 1457,1476,1485,1520, 2086,2193,2372,2384,2497,3693,4184] +htm['ei'] = 0 +htm['ie'] = 0 +htm.loc[(~htm.taz_a.isin(external)) & (htm.taz_p.isin(external)), 'ei'] = 1 +htm.loc[(htm.taz_a.isin(external)) & (~htm.taz_p.isin(external)), 'ie'] = 1 +# Define truck types and columns to process +truck_types = htm['Truck_Type'].unique() +columns_to_process = ['am_truck', 'md_truck', 'pm_truck', 'ea_truck', 'ev_truck'] +conditions = ['ei', 'ie'] + +# Create empty matrices +matrix_size = 4947 #ABM3 zone system +#matrix_size = 4996 +empty_matrix = np.zeros((matrix_size, matrix_size)) + +for column in columns_to_process: + matrices = {} + for condition in conditions: + condition_matrices = {} + for i, truck_type in enumerate(truck_types): + filtered_data = htm[(htm[condition] == 1) & (htm['Truck_Type'] == truck_type)] + filtered_data_group = filtered_data.groupby(['Truck_Type', 'taz_a', 'taz_p'], as_index=False)[[column]].sum() + + # Create a matrix filled with zeros + matrix = pd.pivot_table(filtered_data_group, values=column, index='taz_a', columns='taz_p').fillna(0) + + # Reindex to ensure the matrix is of size 4996x4996 + matrix = matrix.reindex(range(1, matrix_size + 1), fill_value=0).fillna(0) + matrix = matrix.reindex(columns=range(1, matrix_size + 1), fill_value=0).fillna(0) + + # Convert the matrix to a NumPy array + condition_matrices[f"{truck_type}_{condition}"] = matrix.values + + matrices[f"{column}_{condition}_matrices"] = condition_matrices + + # Create OMX file for each column + htm_period = column.split("_")[0].upper() + file_name = f"\htmtrips_{htm_period}.omx" + matrix_file = output_dir + "\htm" + file_name + + # Create an OMX file and write matrices + #with omx.open_file(file_name, 'w') as f: + with omx.open_file(matrix_file, 'w') as f: + for matrix_name, matrix_data in matrices.items(): + for sub_matrix_name, sub_matrix_data in matrix_data.items(): + #clean_matrix_name = matrix_name.replace('_', '') # Remove underscores + matrix_tod = matrix_name.split("_")[0].upper() + clean_sub_matrix_name = sub_matrix_name.replace('_', '') # Remove underscores + #f[f"{clean_matrix_name}_{clean_sub_matrix_name}"] = sub_matrix_data + f[f"{clean_sub_matrix_name}_{matrix_tod}"] = sub_matrix_data + #copy_dst = assignment_dir + "\\" + file_name + #shutil.copyfile(matrix_file, copy_dst) + print(f"Matrices for '{column}' saved as '{file_name}'") \ No newline at end of file diff --git a/src/main/resources/cvm.bat b/src/main/resources/cvm.bat index f3c11c789..a4f8efaf5 100644 --- a/src/main/resources/cvm.bat +++ b/src/main/resources/cvm.bat @@ -53,7 +53,7 @@ IF %ERRORLEVEL% NEQ 0 (GOTO :ERROR) else (GOTO :SUCCESS) :SUCCESS ECHO CVM complete! ECHO %DATE% %TIME% - + CD /d %PROJECT_DRIVE%%PROJECT_DIRECTORY% :::::::::::::::::::::: @@ -61,9 +61,9 @@ IF %ERRORLEVEL% NEQ 0 (GOTO :ERROR) else (GOTO :SUCCESS) :: sort TAZ zone index in omx %PYTHON3% src/asim-cvm/scripts/set_zoneMapping.py cvm output - :: append cvm omx to assignment omx - :: TODO Jielin to update the script to append omx - :: %PYTHON2% src/asim-cvm/scripts/convert_tripTables.py cvm output + + :: convert trip tables into Python2 + %PYTHON2% src/asim-cvm/scripts/convert_tripTables.py cvm output :: finish and exit batch file EXIT /B 0 @@ -72,4 +72,4 @@ IF %ERRORLEVEL% NEQ 0 (GOTO :ERROR) else (GOTO :SUCCESS) CD /d %PROJECT_DRIVE%%PROJECT_DIRECTORY% ECHO ERROR: CVM failed! ECHO %DATE% %TIME% - PAUSE \ No newline at end of file + EXIT /B \ No newline at end of file diff --git a/src/main/resources/htm.bat b/src/main/resources/htm.bat new file mode 100644 index 000000000..23c349e29 --- /dev/null +++ b/src/main/resources/htm.bat @@ -0,0 +1,69 @@ +ECHO ON +set PROJECT_DRIVE=%1 +set PROJECT_DIRECTORY=%2 +set faf_file_name=%3 +set mgra_file_name=%4 +set skim_file_name=%5 + +SET ANACONDA3_DIR=C:\Anaconda3 +SET ANACONDA2_DIR=C:\Anaconda2 + +:: setup paths to Python application, Conda script, etc. +SET CONDA3_ACT=%ANACONDA3_DIR%\Scripts\activate.bat +SET CONDA2_ACT=%ANACONDA2_DIR%\Scripts\activate.bat + +SET CONDA3_DEA=%ANACONDA3_DIR%\Scripts\deactivate.bat +SET CONDA2_DEA=%ANACONDA2_DIR%\Scripts\deactivate.bat + +SET CONDA3=%ANACONDA3_DIR%\Scripts\conda.exe +SET CONDA2=%ANACONDA2_DIR%\Scripts\conda.exe + +SET PYTHON3=%ANACONDA3_DIR%\envs\asim_sandag_cvm\python.exe +:: FIX PATH AND ENV HERE LATER +SET PYTHON2=%ANACONDA2_DIR%\python.exe + +ECHO Activate ActivitySim for CVM... +CD /d %ANACONDA3_DIR%\Scripts +CALL %CONDA3_ACT% asim_sandag_cvm + +:: FIX PATH AND ENV HERE LATER +SET PYTHON2=%ANACONDA2_DIR%\python.exe + +set MKL_NUM_THREADS=1 +set MKL=1 + +CD /d %PROJECT_DRIVE%%PROJECT_DIRECTORY% + +:: Create directory to store HTM outputs +CD Output +ECHO Create directory to store HTM outputs... +IF exist HTM ( echo HTM folder exists ) ELSE ( MD HTM && echo HTM folder created) +::MD HTM +CD .. + +SET MODEL_DIR=%PROJECT_DRIVE%%PROJECT_DIRECTORY% +SET OUTPUT_DIR=%PROJECT_DRIVE%%PROJECT_DIRECTORY%\output + +:: run run_htm.py +ECHO Run HTM... +CD /d %PROJECT_DRIVE%%PROJECT_DIRECTORY%\python\ +%PYTHON3% run_htm.py %MODEL_DIR% %OUTPUT_DIR% %faf_file_name% %mgra_file_name% %skim_file_name% 2>>%PROJECT_DRIVE%%PROJECT_DIRECTORY%\logFiles\event-htm.txt +IF %ERRORLEVEL% NEQ 0 (GOTO :ERROR) else (GOTO :SUCCESS) + +:SUCCESS + ECHO HTM complete! + ECHO %DATE% %TIME% + + CD /d %PROJECT_DRIVE%%PROJECT_DIRECTORY% + + :: convert trip tables into Python2 + %PYTHON2% src/asim-cvm/scripts/convert_tripTables.py htm output + + :: finish and exit batch file + EXIT /B 0 + +:ERROR + CD /d %PROJECT_DRIVE%%PROJECT_DIRECTORY% + ECHO ERROR: HTM failed! + ECHO %DATE% %TIME% + EXIT /B \ No newline at end of file diff --git a/src/main/resources/sandag_abm.properties b/src/main/resources/sandag_abm.properties index 673d65463..41dd7db30 100644 --- a/src/main/resources/sandag_abm.properties +++ b/src/main/resources/sandag_abm.properties @@ -1,272 +1,283 @@ -#SANDAG ABM Properties -#Software Version -version=${version} -############################################################################################################################################################################# +##SANDAG ABM Properties +##Software Version +#version = version_14_3_0 +## geography ID +#geographyID = 1 +############################################################################################################################################################################## +## +## CLUSTER PROPERTIES: MODIFY WHEN CHANGING CLUSTER CONFIGURATION OR MOVING TO NEW CLUSTER. +## +############################################################################################################################################################################## +RunModel.MatrixServerAddress = localhost +RunModel.MatrixServerPort = 1191 +RunModel.HouseholdServerAddress = localhost +RunModel.HouseholdServerPort = 1129 # -# CLUSTER PROPERTIES: MODIFY WHEN CHANGING CLUSTER CONFIGURATION OR MOVING TO NEW CLUSTER. +############################################################################################################################################################################## +## +## RUN PROPERTIES: MODEL COMPONENT SWITCHES +## +############################################################################################################################################################################## +##set sample rates +sample_rates = 0.25,0.5,1.0 # -############################################################################################################################################################################# -RunModel.MatrixServerAddress=${matrix.server.host} -RunModel.MatrixServerPort=${matrix.server.port} -RunModel.HouseholdServerAddress=${household.server.host} -RunModel.HouseholdServerPort=${household.server.port} - -############################################################################################################################################################################# -# -# RUN PROPERTIES: MODEL COMPONENT SWITCHES -# -############################################################################################################################################################################# -#set sample rates -sample_rates=1.0,1.0,1.0 - -#highway assignment convergence criteria -convergence=0.0005 - -#set warm up inputs -RunModel.useLocalDrive = true +##highway assignment convergence criteria +convergence = 0.0005 +RunModel.useLocalDrive = false RunModel.skipInitialization = false RunModel.deleteAllMatrices = true -RunModel.skip4Ds = false -RunModel.skipInputChecker = false +RunModel.skip4Ds = true +RunModel.skipInputChecker = true RunModel.skipCopyWarmupTripTables = false RunModel.skipCopyBikeLogsum = false +RunModel.skipShadowPricing = false RunModel.skipBikeLogsums = true -#always create walk logsum (walk to TAP file); modification from GUI disallowed RunModel.skipCopyWalkImpedance = true RunModel.skipWalkLogsums = false - -#build networks -RunModel.skipBuildNetwork = false - -# start looping -# set startFromIteration to 4 if only want -# to run final hwy and transit steps +RunModel.skipBuildNetwork = true RunModel.startFromIteration = 1 RunModel.skipHighwayAssignment = false,false,false RunModel.skipTransitSkimming = false,false,false -RunModel.skipCoreABM = false,false,false -RunModel.skipOtherSimulateModel = false,false,false -RunModel.skipMAASModel = false,false,false -RunModel.skipSpecialEventModel = true,true,true +RunMode.skipTransitConnector = true +RunModel.skipTransponderExport = false,false,false +RunModel.skipABMPreprocessing = false,false,false +RunModel.skipABMResident = false,false,false +RunModel.skipABMAirport = false,false,false +RunModel.skipABMVisitor = false,false,false +RunModel.skipABMXborderWait = false +RunModel.skipABMXborder = false,false,false RunModel.skipCTM = false,false,false RunModel.skipEI = false,false,false +RunModel.skipExternalExternal = true,true,true RunModel.skipTruck = false,false,false RunModel.skipTripTableCreation = false,false,false -# end looping - RunModel.skipFinalHighwayAssignment = false +RunModel.skipFinalHighwayAssignmentStochastic = true RunModel.skipFinalTransitAssignment = false -RunModel.collapseOnOffByRoute=false +RunModel.collapseOnOffByRoute = false RunModel.skipLUZSkimCreation = true RunModel.skipVisualizer = true RunModel.skipDataExport = false -RunModel.skipDataLoadRequest = false -RunModel.skipDeleteIntermediateFiles = false +RunModel.skipDataLoadRequest = true +RunModel.skipDeleteIntermediateFiles = true RunModel.MatrixPrecision = 0.0005 # minimual space (MB) on C drive -RunModel.minSpaceOnC =200 - -############################################################################################################################################################################# +RunModel.minSpaceOnC = 400 + +TNC.totalThreads = 10 + +############################################################################################################################################################################## +## +## LOGGING PROPERTIES: USE FOR TRACING HOUSEHOLDS OR AGENTS THROUGH SIMULATION. +## +## Note that the way that logging works right now, the trace zones also have to be valid transit stops or the code will crash. Check the skims to make sure they exist. +## Turn off trace debugging in routine model runs to speed things up (comment out Debug.Trace.HouseholdIdList) +## +############################################################################################################################################################################## +## Resident models +#Trace = false +##Trace.otaz = 1638 +##Trace.dtaz = 2447 +#Trace.otaz = +#Trace.dtaz = +#Seek = false +#Process.Debug.HHs.Only = false +Debug.Trace.HouseholdIdList = # -# LOGGING PROPERTIES: USE FOR TRACING HOUSEHOLDS OR AGENTS THROUGH SIMULATION. +## Internal-External models +#internalExternal.seek = false +#internalExternal.trace = 50 # -# Note that the way that logging works right now, the trace zones also have to be valid transit stops or the code will crash. Check the skims to make sure they exist. -# Turn off trace debugging in routine model runs to speed things up (comment out Debug.Trace.HouseholdIdList) +## Cross-Border models +#crossBorder.seek = false +## trace by tourId +#crossBorder.trace = 12 # -############################################################################################################################################################################# -# Resident models -Trace = false -#Trace.otaz = 1638 -#Trace.dtaz = 2447 -Trace.otaz = -Trace.dtaz = -Seek = false -Process.Debug.HHs.Only = false -Debug.Trace.HouseholdIdList= - -# Internal-External models -internalExternal.seek = false -internalExternal.trace = 50 - -# Cross-Border models -crossBorder.seek = false -# trace by tourId -crossBorder.trace = 12 - -# Visitor models -visitor.seek = false -#trace by tourId +## Visitor models +#visitor.seek = false +##trace by tourId +##visitor.trace = 742 #visitor.trace = 742 -visitor.trace = 742 - -# Special event models -specialEvent.seek = false -specialEvent.trace = 5855 - -# Trace TransCAD trip table creation by TAZ (to/from); only applies to SD resident model -tripTable.trace=4384 - -RunModel.LogResults = true - -############################################################################################################################################################################# -# PATH PROPERTIES: MODIFY AS NEEDED WHEN COPY RELEASE TO A LOCAL RUN FOLDER -############################################################################################################################################################################# +# +## Special event models +#specialEvent.seek = false +#specialEvent.trace = 5855 +# +## Trace TransCAD trip table creation by TAZ (to/from); only applies to SD resident model +#tripTable.trace = 4384 +# +#RunModel.LogResults = true +# +############################################################################################################################################################################## +## PATH PROPERTIES: MODIFY AS NEEDED WHEN COPY RELEASE TO A LOCAL RUN FOLDER +############################################################################################################################################################################## Project.Directory = %project.folder%/ generic.path = %project.folder%/input/ scenario.path = %project.folder%/ -skims.path = %project.folder%/output/ +skims.path = %project.folder%/output/skims/ uec.path = %project.folder%/uec/ report.path = %project.folder%/report/ - -# Visitor model is run using Java 7 Fork\Join Framework. Parallelism controls number of simultaneous threads. Can increase if more processors. -# 5 threads provided optimum runtimes on a 6 core, 24 thread machine with 128GB of RAM. -visitor.run.concurrent = true -visitor.concurrent.parallelism = 5 - -############################################################################################################################################################################# # -# SCENARIO PROPERTIES: MODIFY WHEN RUNNING NEW SCENARIO, IF NECESSARY +## Visitor model is run using Java 7 Fork\Join Framework. Parallelism controls number of simultaneous threads. Can increase if more processors. +## 5 threads provided optimum runtimes on a 6 core, 24 thread machine with 128GB of RAM. +#visitor.run.concurrent = true +#visitor.concurrent.parallelism = 5 # -############################################################################################################################################################################# -# MGRA data file: this token is referred to in many UECs -mgra.socec.file = input/mgra13_based_input${year}.csv - -# scenario year -scenarioYear=${year} - -# Auto operating costs: these tokens are referred to in many UECs -aoc.fuel =${aoc.fuel} -aoc.maintenance =${aoc.maintenance} - -# Cross border model is run using Java 7 Fork\Join Framework. Parallelism controls number of simultaneous threads. Can increase if more processors. -crossBorder.run.concurrent = true -crossBorder.concurrent.parallelism = 8 - -# Cross border model settings: Number of tours, share of tours that are SENTRI. -crossBorder.tours =${crossBorder.tours} -crossBorder.sentriShare = ${crossBorder.sentriShare} - -# Visitor model settings: occupancy rates for hotels, households and share of each that are business visitors -visitor.hotel.occupancyRate = 0.7 -visitor.household.occupancyRate = 0.018 -visitor.hotel.businessPercent = 0.3 -visitor.household.businessPercent = 0.04 - -# Airport model settings: enplanements, connecting passengers, average party size, MGRA that the airport is in -airport.SAN.enplanements =${airport.SAN.enplanements} -airport.SAN.connecting =${airport.SAN.connecting} -airport.SAN.annualizationFactor = 365 -airport.SAN.averageSize = 1.7 -airport.SAN.airportMgra =${airport.SAN.airportMgra} - -airport.CBX.enplanements =${airport.CBX.enplanements} -airport.CBX.connecting =${airport.CBX.connecting} -airport.CBX.annualizationFactor = 365 -airport.CBX.averageSize = 2.2 -airport.CBX.airportMgra =${airport.CBX.airportMgra} - -# Truck model settings: -truck.FFyear =${year} - -############################################################################################ -# EMERGING MOBILITY SECTION: MODIFY WHEN CHANGE AV, TNC, and MICROMOBILITY ASSUMPTIONS -#------------------------------------------------------------------------------------------- -# AV Mobility Scenario Parameters -#------------------------------------------------------------------------------------------- -# AV.Share: the share of vehicles assumed to be AVs in the vehicle fleet; Auto ownership ASCs will be calibrated for different levels of AV penetration -# AV.ProbabilityBoost: the increased probability (multiplicative) for using AVs for tours, based on autos to drivers. The highest this should go is 1.2 -# AV.IVTFactor: the auto in-vehicle time factor to apply to AVs -# AV.ParkingCostFactor: The auto parking cost factor to apply to AVs, assuming some AVs are sent to remote locations or home -# AV.CostPerMileFactor: The auto cost per mile factor to apply to AVs, assuming AVs are more efficient in terms of fuel consumption than human-driven vehicles -# AV.TerminalTimeFactor: The factor to apply to terminal time for AVs, assuming AVs offer curbside passenger pickup/dropoff -# TNC.shared.IVTFactor: The factor to apply to in-vehicle time for shared TNC mode, reflecting out-direction travel for pickup/dropoff of other passengers - -Mobility.AV.Share = ${Mobility.AV.Share} -Mobility.AV.ProbabilityBoost.AutosLTDrivers = 1.2 -Mobility.AV.ProbabilityBoost.AutosGEDrivers = 1.1 -Mobility.AV.IVTFactor = 0.75 -Mobility.AV.ParkingCostFactor = 0.5 -Mobility.AV.CostPerMileFactor = 0.7 -Mobility.AV.TerminalTimeFactor = 0.65 -Mobility.AV.MinimumAgeDriveAlone = 13 -Mobility.TNC.shared.IVTFactor = 1.25 -crossBorder.avShare = 0.0 - -#------------------------------------------------------------------------------------------- -# Taxi and TNC cost and wait time parameters -#------------------------------------------------------------------------------------------- -# 3 modes: taxi, TNC - single, and TNC - shared -# baseFare: Initial fare -# costPerMile: The cost per mile -# costPerMinute: The cost per minute -# costMinimum: The minimum cost (for TNC modes only) -# -# Wait times are drawn from a distribution by area type (emp+hh)/sq. miles -# The mean and standard deviation is given for each area type range -# The ranges are configurable, set by WaitTimeDistribution.EndPopEmpPerSqMi - -taxi.baseFare = 2.20 -taxi.costPerMile = 2.30 -taxi.costPerMinute = 0.10 - -TNC.single.baseFare = 2.20 -TNC.single.costPerMile = 1.33 -TNC.single.costPerMinute = 0.24 -TNC.single.costMinimum = 7.20 - -# use lower costs - these are synthesized, need real prices -TNC.shared.baseFare = 2.20 -TNC.shared.costPerMile = 0.44 -TNC.shared.costPerMinute = 0.08 -TNC.shared.costMinimum = 3.00 - -#Note: the following comma-separated value properties cannot have spaces between them, or else the RuntimeConfiguration.py code won't work -TNC.single.waitTime.mean = 10.3,8.5,8.4,6.3,4.7 -TNC.single.waitTime.sd = 4.1,4.1,4.1,4.1,4.1 - -TNC.shared.waitTime.mean = 15.0,15.0,11.0,8.0,7.0 -TNC.shared.waitTime.sd = 4.1,4.1,4.1,4.1,4.1 - -Taxi.waitTime.mean = 26.5,17.3,13.3,9.5,5.5 -Taxi.waitTime.sd = 6.4,6.4,6.4,6.4,6.4 - -WaitTimeDistribution.EndPopEmpPerSqMi = 500,2000,5000,15000,9999999999 - -#------------------------------------------------------------------------------------------- -# Taxi and TNC vehcicle trip conversion factors -#------------------------------------------------------------------------------------------- -# The following properties are used to split out the taxi, TNC-single, and TNC-shared trips into vehicle trips to be added to the rest of the vehicle trips by occupancy prior to assignment. +############################################################################################################################################################################## +## +## SCENARIO PROPERTIES: MODIFY WHEN RUNNING NEW SCENARIO, IF NECESSARY +## +############################################################################################################################################################################## +## MGRA data file: this token is referred to in many UECs in additon to submodels like truck +mgra.socec.file = input/mgra15_based_input2022.csv +mgra.socec.base.file = input/mgra15_based_input_2022_base.csv +## scenario year +scenarioYear = 2022 +# +## Auto operating costs: these tokens are referred to in many UECs +aoc.fuel = 11.4 +aoc.maintenance = 6.9 +# +## Cross border model is run using Java 7 Fork\Join Framework. Parallelism controls number of simultaneous threads. Can increase if more processors. +#crossBorder.run.concurrent = true +#crossBorder.concurrent.parallelism = 8 +# +## Cross border model settings: Number of tours, share of tours that are SENTRI. +#crossBorder.tours = 120700 +#crossBorder.sentriShare = 0.44 +# +## Visitor model settings: occupancy rates for hotels, households and share of each that are business visitors +#visitor.hotel.occupancyRate = 0.7 +#visitor.household.occupancyRate = 0.018 +#visitor.hotel.businessPercent = 0.3 +#visitor.household.businessPercent = 0.04 +# +## Airport model settings: enplanements, connecting passengers, average party size, MGRA that the airport is in +#airport.SAN.enplanements = 13727381 +#airport.SAN.connecting = 808619 +#airport.SAN.annualizationFactor = 365 +#airport.SAN.averageSize = 1.7 +#airport.SAN.airportMgra = 11249 +# +#airport.CBX.enplanements = 984428 +#airport.CBX.connecting = 0 +#airport.CBX.annualizationFactor = 365 +#airport.CBX.averageSize = 2.2 +#airport.CBX.airportMgra = 9350 +# +# Truck model settings: +truck.DFyear = 2016,2019,2020,2022,2023,2025,2026,2029,2030,2032,2035,2040,2050 +truck.luOverRide = "False" +truck.FFyear = 2022 +faf.file = FAF5_BaseandFutureYears_Oct27_2023.csv +# +## Destination zones for the transponder accessibility calculator +transponder.destinations = 4027,2563,2258 +#traffic.sla_limit = 3 +# +## Number of zones where 4996 is the default, but may be changed by Land Use Converter Tool zone split +#zones.count = 4947 +# +############################################################################################# +## EMERGING MOBILITY SECTION: MODIFY WHEN CHANGE AV, TNC, and MICROMOBILITY ASSUMPTIONS +##------------------------------------------------------------------------------------------- +## AV Mobility Scenario Parameters +##------------------------------------------------------------------------------------------- +## AV.Share: the share of vehicles assumed to be AVs in the vehicle fleet; Auto ownership ASCs will be calibrated for different levels of AV penetration +## AV.ProbabilityBoost: the increased probability (multiplicative) for using AVs for tours, based on autos to drivers. The highest this should go is 1.2 +## AV.IVTFactor: the auto in-vehicle time factor to apply to AVs +## AV.ParkingCostFactor: The auto parking cost factor to apply to AVs, assuming some AVs are sent to remote locations or home +## AV.CostPerMileFactor: The auto cost per mile factor to apply to AVs, assuming AVs are more efficient in terms of fuel consumption than human-driven vehicles +## AV.TerminalTimeFactor: The factor to apply to terminal time for AVs, assuming AVs offer curbside passenger pickup/dropoff +## TNC.shared.IVTFactor: The factor to apply to in-vehicle time for shared TNC mode, reflecting out-direction travel for pickup/dropoff of other passengers +# +#Mobility.AV.Share = 0 +#Mobility.AV.ProbabilityBoost.AutosLTDrivers = 1.2 +#Mobility.AV.ProbabilityBoost.AutosGEDrivers = 1.1 +#Mobility.AV.IVTFactor = 0.75 +#Mobility.AV.ParkingCostFactor = 0.5 +Mobility.AV.CostPerMileFactor = 0.7 +#Mobility.AV.TerminalTimeFactor = 0.65 +#Mobility.AV.MinimumAgeDriveAlone = 13 +#Mobility.TNC.shared.IVTFactor = 1.25 +#crossBorder.avShare = 0.0 +# +##------------------------------------------------------------------------------------------- +## Taxi and TNC cost and wait time parameters +##------------------------------------------------------------------------------------------- +## 3 modes: taxi, TNC - single, and TNC - shared +## baseFare: Initial fare +## costPerMile: The cost per mile +## costPerMinute: The cost per minute +## costMinimum: The minimum cost (for TNC modes only) +## +## Wait times are drawn from a distribution by area type (emp+hh)/sq. miles +## The mean and standard deviation is given for each area type range +## The ranges are configurable, set by WaitTimeDistribution.EndPopEmpPerSqMi +# +#taxi.baseFare = 1.78 +#taxi.costPerMile = 1.87 +#taxi.costPerMinute = 0.08 +# +#TNC.single.baseFare = 1.78 +#TNC.single.costPerMile = 1.08 +#TNC.single.costPerMinute = 0.19 +#TNC.single.costMinimum = 5.84 +# +## use lower costs - these are synthesized, need real prices +#TNC.shared.baseFare = 1.78 +#TNC.shared.costPerMile = 0.36 +#TNC.shared.costPerMinute = 0.06 +#TNC.shared.costMinimum = 2.43 +# +##Note: the following comma-separated value properties cannot have spaces between them, or else the RuntimeConfiguration.py code won't work +#TNC.single.waitTime.mean = 10.3,8.5,8.4,6.3,4.7 +#TNC.single.waitTime.sd = 4.1,4.1,4.1,4.1,4.1 +# +#TNC.shared.waitTime.mean = 15.0,15.0,11.0,8.0,7.0 +#TNC.shared.waitTime.sd = 4.1,4.1,4.1,4.1,4.1 +# +#Taxi.waitTime.mean = 26.5,17.3,13.3,9.5,5.5 +#Taxi.waitTime.sd = 6.4,6.4,6.4,6.4,6.4 +# +#WaitTimeDistribution.EndPopEmpPerSqMi = 500,2000,5000,15000,9999999999 +# +##------------------------------------------------------------------------------------------- +## Taxi and TNC vehcicle trip conversion factors +##------------------------------------------------------------------------------------------- +## The following properties are used to split out the taxi, TNC-single, and TNC-shared trips into vehicle trips to be added to the rest of the vehicle trips by occupancy prior to assignment. +# Taxi.da.share = 0.0 Taxi.s2.share = 0.9 Taxi.s3.share = 0.1 Taxi.passengersPerVehicle = 1.1 - +# TNC.single.da.share = 0.0 TNC.single.s2.share = 0.8 TNC.single.s3.share = 0.2 TNC.single.passengersPerVehicle = 1.2 - +# TNC.shared.da.share = 0.0 TNC.shared.s2.share = 0.3 TNC.shared.s3.share = 0.7 TNC.shared.passengersPerVehicle = 2.0 - -#------------------------------------------------------------------------------------------- -# Maas Routing Model Properties -#------------------------------------------------------------------------------------------- +# +##------------------------------------------------------------------------------------------- +## Maas Routing Model Properties +##------------------------------------------------------------------------------------------- Maas.RoutingModel.maxDistanceForPickup = 5 Maas.RoutingModel.maxDiversionTimeForPickup = 5 Maas.RoutingModel.minutesPerSimulationPeriod = 5 -Maas.RoutingModel.maxPassengers=6 +Maas.RoutingModel.maxPassengers = 6 Maas.RoutingModel.maxWalkDistance = 0.15 -Maas.RoutingModel.vehicletrip.output.file=output/TNCTrips.csv -Maas.RoutingModel.vehicletrip.output.matrix=output/TNCVehicleTrips +Maas.RoutingModel.vehicletrip.output.file = output/TNCTrips.csv +Maas.RoutingModel.vehicletrip.output.matrix = output/TNCVehicleTrips -Maas.RoutingModel.routeIntrazonal=false +Maas.RoutingModel.routeIntrazonal = false #NULL,DRIVEALONE,SHARED2,SHARED3,WALK,BIKE,WALK_SET,PNR_SET,KNR_SET,TNC_SET,TAXI,TNC_SINGLE,TNC_SHARED,SCHBUS -Maas.RoutingModel.Modes =0,0,0,0,0,0,0,0,0,0,1,1,1,0 -Maas.RoutingModel.SharedEligible=0,0,0,0,0,0,0,0,0,0,0,0,1,0 +Maas.RoutingModel.Modes = 0,0,0,0,0,0,0,0,0,0,1,1,1,0 +Maas.RoutingModel.SharedEligible = 0,0,0,0,0,0,0,0,0,0,0,0,1,0 Maas.RoutingModel.maxDistanceBeforeRefuel = 300 Maas.RoutingModel.timeRequiredForRefuel = 15 @@ -278,464 +289,469 @@ Maas.AVAllocation.data.page = 0 Maas.AVAllocation.vehiclechoice.model.page = 1 Maas.AVAllocation.parkingchoice.model.page = 2 Maas.AVAllocation.triputility.model.page = 3 -Mobility.AV.RemoteParkingCostPerHour= 1.00 - -# END--EMERGING MOBILITY SECTION -############################################################################################ - -############################################################################################################################################################################# -# -# CORE MODEL RUN PROPERTIES: CONTROL STEPS RUN IN CORE MODEL +Mobility.AV.RemoteParkingCostPerHour = 0.81 # -############################################################################################################################################################################# +## END--EMERGING MOBILITY SECTION +############################################################################################# +# Transit PCE VEH Conversion cliu 8/19/20 +##################################################################################### +transit.bus.pceveh = 3.0 +############################################################################################################################################################################## +## +## CORE MODEL RUN PROPERTIES: CONTROL STEPS RUN IN CORE MODEL +## +############################################################################################################################################################################## Model.Random.Seed = 1 - -RunModel.Clear.MatrixMgr.At.Start=false - -# Set to true if read the accessibilities from an input file instead of calculating them prior to running CTRAMP -acc.read.input.file = false - -# Setting shadow price files to null will reset prices to 0. If running new land-use scenario, set files to null and set maximum iterations to 20. -# Then copy shadow price output files to input directory, set maximum iterations to 1 for any subsequent runs with the same land-use file. -UsualWorkLocationChoice.ShadowPrice.Input.File = input/${workShadowPricing.iteration} -UsualSchoolLocationChoice.ShadowPrice.Input.File = input/${schoolShadowPricing.iteration} -uwsl.ShadowPricing.Work.MaximumIterations = 1 -uwsl.ShadowPricing.School.MaximumIterations = 1 -uwsl.ShadowPricing.OutputFile = output/ShadowPricingOutput.csv - -uwsl.run.workLocChoice = true -uwsl.run.schoolLocChoice = true -uwsl.write.results = true - -uwsl.use.new.soa = false -nmdc.use.new.soa = false -slc.use.new.soa = false - -# properties for distributed time coefficient -distributedTimeCoefficients = true - -timeDistribution.mean.work = 1.0 -timeDistribution.standardDeviation.work = 0.7 -timeDistribution.mean.nonWork = 1.0 -timeDistribution.standardDeviation.nonWork = 0.6 - -timeDistribution.randomSeed = 2301832 - -# value of time thresholds for skimming, assignment, mode choice UECs and trip tables ($/hr). -valueOfTime.threshold.low = 8.81 -valueOfTime.threshold.med = 18.00 - - -# save tour mode choice utilities and probabilities (for debugging purpose) -TourModeChoice.Save.UtilsAndProbs = true - -# packet size for distributing households, DO NOT change -distributed.task.packet.size = 200 - -#RunModel.RestartWithHhServer = uwsl -RunModel.RestartWithHhServer = none -#RunModel.RestartWithHhServer = ao -#RunModel.RestartWithHhServer = stf - -# Model Component run flags; Wu's note: not functional yet -RunModel.PreAutoOwnership = true -RunModel.UsualWorkAndSchoolLocationChoice = true -RunModel.AutoOwnership = true -RunModel.TransponderChoice = true -RunModel.FreeParking = true -RunModel.CoordinatedDailyActivityPattern = true -RunModel.IndividualMandatoryTourFrequency = true -RunModel.MandatoryTourModeChoice = true -RunModel.MandatoryTourDepartureTimeAndDuration = true -RunModel.SchoolEscortModel = true -RunModel.JointTourFrequency = true -RunModel.JointTourLocationChoice = true -RunModel.JointTourDepartureTimeAndDuration = true -RunModel.JointTourModeChoice = true -RunModel.IndividualNonMandatoryTourFrequency = true -RunModel.IndividualNonMandatoryTourLocationChoice = true -RunModel.IndividualNonMandatoryTourDepartureTimeAndDuration = true -RunModel.IndividualNonMandatoryTourModeChoice = true -RunModel.AtWorkSubTourFrequency = true -RunModel.AtWorkSubTourLocationChoice = true -RunModel.AtWorkSubTourDepartureTimeAndDuration = true -RunModel.AtWorkSubTourModeChoice = true -RunModel.StopFrequency =true -RunModel.StopLocation = true - -############################################################################################################################################################################# # -# INPUT PROPERTIES +#RunModel.Clear.MatrixMgr.At.Start = false # -############################################################################################################################################################################# -#PopSyn Inputs +## Set to true if read the accessibilities from an input file instead of calculating them prior to running CTRAMP +#acc.read.input.file = false +# +## Setting shadow price files to null will reset prices to 0. If running new land-use scenario, set files to null and set maximum iterations to 20. +## Then copy shadow price output files to input directory, set maximum iterations to 1 for any subsequent runs with the same land-use file. +#UsualWorkLocationChoice.ShadowPrice.Input.File = input/ShadowPricingOutput_work_9.csv +#UsualSchoolLocationChoice.ShadowPrice.Input.File = input/ShadowPricingOutput_school_9.csv +#uwsl.ShadowPricing.Work.MaximumIterations = 1 +#uwsl.ShadowPricing.School.MaximumIterations = 1 +#uwsl.ShadowPricing.OutputFile = output/ShadowPricingOutput.csv +# +#uwsl.run.workLocChoice = true +#uwsl.run.schoolLocChoice = true +#uwsl.write.results = true +# +#uwsl.use.new.soa = false +#nmdc.use.new.soa = false +#slc.use.new.soa = false +# +## properties for distributed time coefficient +#distributedTimeCoefficients = true +# +#timeDistribution.mean.work = 1.0 +#timeDistribution.standardDeviation.work = 0.7 +#timeDistribution.mean.nonWork = 1.0 +#timeDistribution.standardDeviation.nonWork = 0.6 +# +#timeDistribution.randomSeed = 2301832 +# +## value of time thresholds for skimming, assignment, mode choice UECs and trip tables ($/hr). +#valueOfTime.threshold.low = 8.81 +#valueOfTime.threshold.med = 18.0 +# +# +## save tour mode choice utilities and probabilities (for debugging purpose) +#TourModeChoice.Save.UtilsAndProbs = true +# +## packet size for distributing households, DO NOT change +#distributed.task.packet.size = 200 +# +##RunModel.RestartWithHhServer = uwsl +#RunModel.RestartWithHhServer = none +##RunModel.RestartWithHhServer = ao +##RunModel.RestartWithHhServer = stf +# +## Model Component run flags; Wu's note: not functional yet +#RunModel.PreAutoOwnership = true +#RunModel.UsualWorkAndSchoolLocationChoice = true +#RunModel.AutoOwnership = true +#RunModel.TransponderChoice = true +#RunModel.FreeParking = true +#RunModel.CoordinatedDailyActivityPattern = true +#RunModel.IndividualMandatoryTourFrequency = true +#RunModel.MandatoryTourModeChoice = true +#RunModel.MandatoryTourDepartureTimeAndDuration = true +#RunModel.SchoolEscortModel = true +#RunModel.JointTourFrequency = true +#RunModel.JointTourLocationChoice = true +#RunModel.JointTourDepartureTimeAndDuration = true +#RunModel.JointTourModeChoice = true +#RunModel.IndividualNonMandatoryTourFrequency = true +#RunModel.IndividualNonMandatoryTourLocationChoice = true +#RunModel.IndividualNonMandatoryTourDepartureTimeAndDuration = true +#RunModel.IndividualNonMandatoryTourModeChoice = true +#RunModel.AtWorkSubTourFrequency = true +#RunModel.AtWorkSubTourLocationChoice = true +#RunModel.AtWorkSubTourDepartureTimeAndDuration = true +#RunModel.AtWorkSubTourModeChoice = true +#RunModel.StopFrequency = true +#RunModel.StopLocation = true +# +############################################################################################################################################################################## +## +## INPUT PROPERTIES +## +############################################################################################################################################################################## +##PopSyn Inputs PopulationSynthesizer.InputToCTRAMP.HouseholdFile = input/households.csv -PopulationSynthesizer.InputToCTRAMP.PersonFile = input/persons.csv -PopulationSynthesizer.OccupCodes = input/pecas_occ_occsoc_acs.csv +PopulationSynthesizer.InputToCTRAMP.PersonFile = input/persons.csv +PopulationSynthesizer.OccupCodes = input/pecas_occ_occsoc_acs.csv PopulationSynthesizer.IndustryCodes = input/activity_code_indcen_acs.csv +## +## The military industry ranges are used to recode military occupation. This is +## necessary because military workers identify themselves as non-military occupations. +## The models need to be consistent with PECAS, where all military workers are in +## the military occupation category 56. +#PopulationSynthesizer.MilitaryIndustryRange = 9670,9870 # -# The military industry ranges are used to recode military occupation. This is -# necessary because military workers identify themselves as non-military occupations. -# The models need to be consistent with PECAS, where all military workers are in -# the military occupation category 56. -PopulationSynthesizer.MilitaryIndustryRange=9670,9870 - -# auxiliary inputs, these are scenario-specific -taz.driveaccess.taps.file = input/accessam.csv -tap.ptype.file = input/tap.ptype -taz.parkingtype.file = input/zone.park -taz.terminal.time.file = input/zone.term -maz.tap.tapLines = output/tapLines.csv - -############################################################################################################################################################################# +## auxiliary inputs, these are scenario-specific +#taz.driveaccess.taps.file = input/accessam.csv +#tap.ptype.file = input/tap.ptype +#taz.parkingtype.file = input/zone.park +#taz.terminal.time.file = input/zone.term +#maz.tap.tapLines = output/tapLines.csv # -# OUTPUT PROPERTIES +## transit stop attribute file +#transit.stop.file = input/trstop.csv # -############################################################################################################################################################################# -Results.WriteDataToFiles= true -Results.HouseholdDataFile = output/householdData.csv -Results.PersonDataFile = output/personData.csv -Results.IndivTourDataFile = output/indivTourData.csv -Results.JointTourDataFile = output/jointTourData.csv -Results.IndivTripDataFile = output/indivTripData.csv -Results.JointTripDataFile = output/jointTripData.csv -Results.WriteDataToDatabase = false -Results.HouseholdTable = household_data -Results.PersonTable = person_data -Results.IndivTourTable = indiv_tour_data -Results.JointTourTable = joint_tour_data -Results.IndivTripTable = indiv_trip_data -Results.JointTripTable = joint_trip_data -Results.AutoTripMatrix = output/autoTrips -Results.TranTripMatrix = output/tranTrips -Results.NMotTripMatrix = output/nmotTrips -Results.OthrTripMatrix = output/othrTrips -Results.PNRFile = output/PNRByTAP_Vehicles.csv -Results.CBDFile = output/CBDByMGRA_Vehicles.csv +############################################################################################################################################################################## +## +## OUTPUT PROPERTIES +## +############################################################################################################################################################################## +#Results.WriteDataToFiles = true +Results.HouseholdDataFile = output/resident/final_households.csv +Results.PersonDataFile = output/resident/final_persons.csv +#Results.IndivTourDataFile = output/indivTourData.csv +#Results.JointTourDataFile = output/jointTourData.csv +Results.TripDataFile = output/resident/final_trips.csv +#Results.JointTripDataFile = output/jointTripData.csv +#Results.WriteDataToDatabase = false +#Results.HouseholdTable = household_data +#Results.PersonTable = person_data +#Results.IndivTourTable = indiv_tour_data +#Results.JointTourTable = joint_tour_data +#Results.IndivTripTable = indiv_trip_data +#Results.JointTripTable = joint_trip_data +#Results.AutoTripMatrix = output/autoTrips +#Results.TranTripMatrix = output/tranTrips +#Results.NMotTripMatrix = output/nmotTrips +#Results.OthrTripMatrix = output/othrTrips +#Results.PNRFile = output/PNRByTAP_Vehicles.csv +#Results.CBDFile = output/CBDByMGRA_Vehicles.csv Results.MatrixType = OMX -Results.segmentByTransponderOwnership = true - - -Results.AutoOwnership=output/aoResults.csv -read.pre.ao.results=false -read.pre.ao.filename=output/aoResults_pre.csv - -Results.UsualWorkAndSchoolLocationChoice=output/wsLocResults.csv -read.uwsl.results=false -read.uwsl.filename=output/wsLocResults_1.csv - +#Results.segmentByTransponderOwnership = true +# +# +#Results.AutoOwnership = output/aoResults.csv +#read.pre.ao.results = false +#read.pre.ao.filename = output/aoResults_pre.csv +# +#Results.UsualWorkAndSchoolLocationChoice = output/wsLocResults.csv +#read.uwsl.results = false +#read.uwsl.filename = output/wsLocResults_1.csv +# ############################################################################################################################################################################# # # CORE MODEL UECS # ############################################################################################################################################################################# # UECs for calculating accessibilities -acc.uec.file = %project.folder%/uec/Accessibilities.xls -acc.data.page = 0 -acc.sov.offpeak.page = 1 -acc.sov.peak.page = 2 -acc.hov.offpeak.page = 3 -acc.hov.peak.page = 4 -acc.maas.offpeak.page = 5 -acc.maas.peak.page = 6 -acc.nonmotorized.page = 7 -acc.constants.page = 8 -acc.sizeTerm.page = 9 -acc.schoolSizeTerm.page = 10 -acc.workerSizeTerm.page = 11 -acc.dcUtility.uec.file = %project.folder%/uec/Accessibilities_DC.xls -acc.dcUtility.data.page = 0 -acc.dcUtility.page = 1 - -# accessibility file location -acc.output.file = input/accessibilities.csv - -#UECs for calculating destination choice based land use accessibilities -lu.acc.dcUtility.uec.file = %project.folder%/uec/Accessibilities_LU_DC.xls -lu.acc.dcUtility.data.page = 0 -lu.acc.dcUtility.page = 1 -lu.accessibility.alts.file = Acc_LU_alts.csv - -# land use accessibililty file locations -lu.acc.output.file = output/luAccessibilities.csv -lu.acc.mc.logsums.output.file = output/luLogsums.csv - -# set either or both averaging methods to be used to write LU accessibilities files -# also requires command line parameter "-luAcc true" and acc.read.input.file = false -lu.acc.simple.averaging.method = true -lu.acc.logit.averaging.method = true - -accessibility.alts.file = Acc_alts.csv - -#UEC for Mandatory accessibilities -acc.mandatory.uec.file = %project.folder%/uec/MandatoryAccess.xls -acc.mandatory.data.page = 0 -acc.mandatory.auto.page = 1 -acc.mandatory.autoLogsum.page = 2 -acc.mandatory.bestWalkTransit.page = 3 -acc.mandatory.bestDriveTransit.page = 4 -acc.mandatory.transitLogsum.page = 5 - -# UECs for auto ownership model -ao.uec.file = AutoOwnership.xls -ao.data.page = 0 -ao.model.page = 1 - -# UECs for Mandatory tour destination choice model -uwsl.dc.uec.file = ${tourdest.uec.file} -uwsl.dc2.uec.file = TourDestinationChoice2.xls -uwsl.soa.uec.file = DestinationChoiceAlternativeSample.xls -uwsl.soa.alts.file = DestinationChoiceAlternatives.csv -uwsl.work.soa.SampleSize = 30 -uwsl.school.soa.SampleSize = 30 - -# The UEC file for work purposes includes TAZ Size in the expressions -work.soa.uec.file = TourDcSoaDistance.xls -work.soa.uec.data = 0 -work.soa.uec.model = 1 - -# The UEC file for school purposes does not include TAZ Size in the expressions -# so that the utilities can be stored as exponentiated distance utility matrices -# for univ, hs, gs, and ps, and then multiplied by the various school segment -# size terms for each of these 4 groups of school segments. -univ.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls -univ.soa.uec.data = 0 -univ.soa.uec.model = 1 - -hs.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls -hs.soa.uec.data = 0 -hs.soa.uec.model = 2 - -gs.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls -gs.soa.uec.data = 0 -gs.soa.uec.model = 3 - -ps.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls -ps.soa.uec.data = 0 -ps.soa.uec.model = 4 - -#UECs for transponder ownership model -tc.choice.avgtts.file = input/transponderModelAccessibilities.csv -tc.uec.file = TransponderOwnership.xls -tc.data.page = 0 -tc.model.page = 1 -tc.everyone.owns = 0 - - -#UECs for parking provision model -fp.uec.file = ParkingProvision.xls -fp.data.page = 0 -fp.model.page = 1 - -#UEC for telecommute model -te.uec.file = Telecommute.xls -te.data.page = 0 -te.model.page = 1 - - -#UECs for CDAP model -cdap.uec.file = CoordinatedDailyActivityPattern.xls -cdap.data.page = 0 -cdap.one.person.page = 1 -cdap.two.person.page = 2 -cdap.three.person.page = 3 -cdap.all.person.page = 4 -cdap.joint.page = 5 - -#UECs for individual mandatory tour frequency model -imtf.uec.file = MandatoryTourFrequency.xls -imtf.data.page = 0 -imtf.model.page = 1 - -#UECs for Non-Mandatory tour destination sampling -nonSchool.soa.uec.file = TourDcSoaDistance.xls -escort.soa.uec.data = 0 -escort.soa.uec.model = 2 -other.nonman.soa.uec.data = 0 -other.nonman.soa.uec.model = 3 -atwork.soa.uec.data = 0 -atwork.soa.uec.model = 4 - +#acc.uec.file = %project.folder%/uec/Accessibilities.xls +#acc.data.page = 0 +#acc.sov.offpeak.page = 1 +#acc.sov.peak.page = 2 +#acc.hov.offpeak.page = 3 +#acc.hov.peak.page = 4 +#acc.maas.offpeak.page = 5 +#acc.maas.peak.page = 6 +#acc.nonmotorized.page = 7 +#acc.constants.page = 8 +#acc.sizeTerm.page = 9 +#acc.schoolSizeTerm.page = 10 +#acc.workerSizeTerm.page = 11 +#acc.dcUtility.uec.file = %project.folder%/uec/Accessibilities_DC.xls +#acc.dcUtility.data.page = 0 +#acc.dcUtility.page = 1 +# +## accessibility file location +#acc.output.file = input/accessibilities.csv +# +##UECs for calculating destination choice based land use accessibilities +#lu.acc.dcUtility.uec.file = %project.folder%/uec/Accessibilities_LU_DC.xls +#lu.acc.dcUtility.data.page = 0 +#lu.acc.dcUtility.page = 1 +#lu.accessibility.alts.file = Acc_LU_alts.csv +# +## land use accessibililty file locations +#lu.acc.output.file = output/luAccessibilities.csv +#lu.acc.mc.logsums.output.file = output/luLogsums.csv +# +## set either or both averaging methods to be used to write LU accessibilities files +## also requires command line parameter "-luAcc true" and acc.read.input.file = false +#lu.acc.simple.averaging.method = true +#lu.acc.logit.averaging.method = true +# +#accessibility.alts.file = Acc_alts.csv +# +##UEC for Mandatory accessibilities +#acc.mandatory.uec.file = %project.folder%/uec/MandatoryAccess.xls +#acc.mandatory.data.page = 0 +#acc.mandatory.auto.page = 1 +#acc.mandatory.autoLogsum.page = 2 +#acc.mandatory.bestWalkTransit.page = 3 +#acc.mandatory.bestDriveTransit.page = 4 +#acc.mandatory.transitLogsum.page = 5 +# +## UECs for auto ownership model +#ao.uec.file = AutoOwnership.xls +#ao.data.page = 0 +#ao.model.page = 1 +# +## UECs for Mandatory tour destination choice model +#uwsl.dc.uec.file = TourDestinationChoice2020.xls +#uwsl.dc2.uec.file = TourDestinationChoice2.xls +#uwsl.soa.uec.file = DestinationChoiceAlternativeSample.xls +#uwsl.soa.alts.file = DestinationChoiceAlternatives.csv +#uwsl.work.soa.SampleSize = 30 +#uwsl.school.soa.SampleSize = 30 +# +## The UEC file for work purposes includes TAZ Size in the expressions +#work.soa.uec.file = TourDcSoaDistance.xls +#work.soa.uec.data = 0 +#work.soa.uec.model = 1 +# +## The UEC file for school purposes does not include TAZ Size in the expressions +## so that the utilities can be stored as exponentiated distance utility matrices +## for univ, hs, gs, and ps, and then multiplied by the various school segment +## size terms for each of these 4 groups of school segments. +#univ.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls +#univ.soa.uec.data = 0 +#univ.soa.uec.model = 1 +# +#hs.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls +#hs.soa.uec.data = 0 +#hs.soa.uec.model = 2 +# +#gs.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls +#gs.soa.uec.data = 0 +#gs.soa.uec.model = 3 +# +#ps.soa.uec.file = TourDcSoaDistanceNoSchoolSize.xls +#ps.soa.uec.data = 0 +#ps.soa.uec.model = 4 +# +##UECs for transponder ownership model +#tc.choice.avgtts.file = output/transponderModelAccessibilities.csv +#tc.uec.file = TransponderOwnership.xls +#tc.data.page = 0 +#tc.model.page = 1 +#tc.everyone.owns = 0 +# +# +##UECs for parking provision model +#fp.uec.file = ParkingProvision.xls +#fp.data.page = 0 +#fp.model.page = 1 +# +##UEC for telecommute model +#te.uec.file = Telecommute.xls +#te.data.page = 0 +#te.model.page = 1 +# +# +##UECs for CDAP model +#cdap.uec.file = CoordinatedDailyActivityPattern.xls +#cdap.data.page = 0 +#cdap.one.person.page = 1 +#cdap.two.person.page = 2 +#cdap.three.person.page = 3 +#cdap.all.person.page = 4 +#cdap.joint.page = 5 +# +##UECs for individual mandatory tour frequency model +#imtf.uec.file = MandatoryTourFrequency.xls +#imtf.data.page = 0 +#imtf.model.page = 1 +# +##UECs for Non-Mandatory tour destination sampling +#nonSchool.soa.uec.file = TourDcSoaDistance.xls +#escort.soa.uec.data = 0 +#escort.soa.uec.model = 2 +#other.nonman.soa.uec.data = 0 +#other.nonman.soa.uec.model = 3 +#atwork.soa.uec.data = 0 +#atwork.soa.uec.model = 4 +# soa.taz.dist.alts.file = SoaTazDistAlts.csv - -nmdc.dist.alts.file = NonMandatoryTlcAlternatives.csv -nmdc.soa.alts.file = DestinationChoiceAlternatives.csv -nmdc.soa.SampleSize = 30 - -#UECs for Non-Mandatory tour destination choice model -nmdc.uec.file2 = TourDestinationChoice2.xls -nmdc.uec.file = ${tourdest.uec.file} -nmdc.data.page = 0 -nmdc.escort.model.page = 7 -nmdc.shop.model.page = 8 -nmdc.maint.model.page = 9 -nmdc.eat.model.page = 10 -nmdc.visit.model.page = 11 -nmdc.discr.model.page = 12 -nmdc.atwork.model.page = 13 - -# following properties use tod sampling instead of logsums -nmdc.SampleTODPeriod = true -nmdc.SampleTODPeriod.file = input/Non_Mand_Tours_ArrDep_Distbn.csv - -#UECs for Non-Mandatory tour destination sampling -nmdc.soa.uec.file = DestinationChoiceAlternativeSample.xls -nmdc.soa.data.page = 0 -nmdc.soa.escort.model.page = 6 -nmdc.soa.shop.model.page = 7 -nmdc.soa.maint.model.page = 7 -nmdc.soa.eat.model.page = 7 -nmdc.soa.visit.model.page = 7 -nmdc.soa.discr.model.page = 7 -nmdc.soa.atwork.model.page = 8 - -#UECs for School Escorting Model -school.escort.uec.filename = SchoolEscorting.xls -school.escort.alts.file = SchoolEscortingAlts.csv -school.escort.data.sheet = 0 -school.escort.outbound.model.sheet = 1 -school.escort.inbound.conditonal.model.sheet = 2 -school.escort.outbound.conditonal.model.sheet = 3 -school.escort.RNG.offset = 384571483 - -#UECs for tour mode choice model -tourModeChoice.uec.file =TourModeChoice.xls -tourModeChoice.maint.model.page = 4 -tourModeChoice.discr.model.page = 5 -tourModeChoice.atwork.model.page = 6 - -# utility coefficients by tour purpose (work, univ, school, maintenance, discretionary, work-based). These are at tour level. -tour.utility.ivt.coeffs = -0.016,-0.016,-0.01,-0.017,-0.015,-0.032 -tour.utility.income.coeffs = -0.625,-0.262,-0.262,-0.262,-0.262,-0.262 -tour.utility.income.exponents = 0.6,0.5,0.5,0.5,0.5,0.5 - -#UECs for tour TOD choice model -departTime.uec.file = TourDepartureAndDuration.xls -departTime.data.page = 0 -departTime.work.page = 1 -departTime.univ.page = 2 -departTime.school.page = 3 -departTime.escort.page = 4 -departTime.shop.page = 5 -departTime.maint.page = 6 -departTime.eat.page = 7 -departTime.visit.page = 8 -departTime.discr.page = 9 -departTime.atwork.page = 10 -departTime.alts.file = DepartureTimeAndDurationAlternatives.csv - -#UECs for joint tour frequency choice model -jtfcp.uec.file = JointTourFrequency.xls -jtfcp.alternatives.file = JointAlternatives.csv -jtfcp.data.page = 0 -jtfcp.freq.comp.page = 1 -jtfcp.participate.page = 2 - -#UECs for individual non-mandatory tour frequency model -inmtf.uec.file = NonMandatoryIndividualTourFrequency.xls -inmtf.FrequencyExtension.ProbabilityFile = IndividualNonMandatoryTourFrequencyExtensionProbabilities_p1.csv -IndividualNonMandatoryTourFrequency.AlternativesList.InputFile = IndividualNonMandatoryTourFrequencyAlternatives.csv -inmtf.data.page = 0 -inmtf.perstype1.page = 1 -inmtf.perstype2.page = 2 -inmtf.perstype3.page = 3 -inmtf.perstype4.page = 4 -inmtf.perstype5.page = 5 -inmtf.perstype6.page = 6 -inmtf.perstype7.page = 7 -inmtf.perstype8.page = 8 - -#UECs for at work subtour frequency model -awtf.uec.file = AtWorkSubtourFrequency.xls -awtf.data.page = 0 -awtf.model.page = 1 - -#UECs for stop frequency model -stf.uec.file = StopFrequency.xls -stf.purposeLookup.proportions = StopPurposeLookupProportions.csv -stf.data.page = 0 -stf.work.page = 1 -stf.univ.page = 2 -stf.school.page = 3 -stf.escort.page = 4 -stf.shop.page = 5 -stf.maint.page = 6 -stf.eat.page = 7 -stf.visit.page = 8 -stf.discr.page = 9 -stf.subtour.page = 10 - -#UECs for stop location choice model -slc.uec.file = StopLocationChoice.xls -slc.uec.data.page = 0 -slc.mandatory.uec.model.page = 1 -slc.maintenance.uec.model.page = 2 -slc.discretionary.uec.model.page = 3 -slc.alts.file = SlcAlternatives.csv - -slc.soa.uec.file = SlcSoaSize.xls -slc.soa.alts.file = DestinationChoiceAlternatives.csv - -auto.slc.soa.distance.uec.file = SlcSoaDistanceUtility.xls -auto.slc.soa.distance.data.page = 0 -auto.slc.soa.distance.model.page = 1 - -slc.soa.size.uec.file = SlcSoaSize.xls -slc.soa.size.uec.data.page = 0 -slc.soa.size.uec.model.page = 1 - -stop.depart.arrive.proportions = StopDepartArriveProportions.csv - -#UECs for trip mode choice model -tripModeChoice.uec.file =TripModeChoice.xls - -# utility coefficients by tour purpose (work, univ, school, maintenance, discretionary, work-based). These are at trip level. -trip.utility.ivt.coeffs = -0.032,-0.032,-0.02,-0.034,-0.03,-0.064 -trip.utility.income.coeffs = -1.25,-0.524,-0.524,-0.524,-0.524,-0.524 -trip.utility.income.exponents = 0.6,0.5,0.5,0.5,0.5,0.5 - - -#UECs for parking location choice model -plc.uec.file = ParkLocationChoice.xls -plc.uec.data.page = 0 -plc.uec.model.page = 1 - -plc.alts.corresp.file = ParkLocationAlts.csv -plc.alts.file = ParkLocationSampleAlts.csv - -mgra.avg.cost.output.file = output/mgraParkingCost.csv - -mgra.avg.cost.dist.coeff.work = -8.6 -mgra.avg.cost.dist.coeff.other = -4.9 - -park.cost.reimb.mean = -0.05 -park.cost.reimb.std.dev = 0.54 - -#UECs for best transit path finding -utility.bestTransitPath.uec.file =BestTransitPathUtility.xls -utility.bestTransitPath.data.page = 0 -utility.bestTransitPath.tapToTap.page = 1 -utility.bestTransitPath.walkAccess.page = 2 -utility.bestTransitPath.driveAccess.page = 3 -utility.bestTransitPath.walkEgress.page = 4 -utility.bestTransitPath.driveEgress.page = 5 -utility.bestTransitPath.driveAccDisutility.page = 6 -utility.bestTransitPath.driveEgrDisutility.page = 7 -utility.bestTransitPath.skim.sets = 3 -utility.bestTransitPath.alts = 4 -utility.bestTransitPath.maxPathsPerSkimSetForLogsum = 1,1,1 -utility.bestTransitPath.nesting.coeff = 0.24 - -#UECs for auto skimming -skims.auto.uec.file = AutoSkims.xls -skims.auto.data.page = 0 -skims.auto.ea.page = 1 -skims.auto.am.page = 2 -skims.auto.md.page = 3 -skims.auto.pm.page = 4 -skims.auto.ev.page = 5 - -#UECs for TAZ distances +# +#nmdc.dist.alts.file = NonMandatoryTlcAlternatives.csv +#nmdc.soa.alts.file = DestinationChoiceAlternatives.csv +#nmdc.soa.SampleSize = 30 +# +##UECs for Non-Mandatory tour destination choice model +#nmdc.uec.file2 = TourDestinationChoice2.xls +#nmdc.uec.file = TourDestinationChoice2020.xls +#nmdc.data.page = 0 +#nmdc.escort.model.page = 7 +#nmdc.shop.model.page = 8 +#nmdc.maint.model.page = 9 +#nmdc.eat.model.page = 10 +#nmdc.visit.model.page = 11 +#nmdc.discr.model.page = 12 +#nmdc.atwork.model.page = 13 +# +## following properties use tod sampling instead of logsums +#nmdc.SampleTODPeriod = true +#nmdc.SampleTODPeriod.file = input/Non_Mand_Tours_ArrDep_Distbn.csv +# +##UECs for Non-Mandatory tour destination sampling +#nmdc.soa.uec.file = DestinationChoiceAlternativeSample.xls +#nmdc.soa.data.page = 0 +#nmdc.soa.escort.model.page = 6 +#nmdc.soa.shop.model.page = 7 +#nmdc.soa.maint.model.page = 7 +#nmdc.soa.eat.model.page = 7 +#nmdc.soa.visit.model.page = 7 +#nmdc.soa.discr.model.page = 7 +#nmdc.soa.atwork.model.page = 8 +# +##UECs for School Escorting Model +#school.escort.uec.filename = SchoolEscorting.xls +#school.escort.alts.file = SchoolEscortingAlts.csv +#school.escort.data.sheet = 0 +#school.escort.outbound.model.sheet = 1 +#school.escort.inbound.conditonal.model.sheet = 2 +#school.escort.outbound.conditonal.model.sheet = 3 +#school.escort.RNG.offset = 384571483 +# +##UECs for tour mode choice model +#tourModeChoice.uec.file = TourModeChoice.xls +#tourModeChoice.maint.model.page = 4 +#tourModeChoice.discr.model.page = 5 +#tourModeChoice.atwork.model.page = 6 +# +## utility coefficients by tour purpose (work, univ, school, maintenance, discretionary, work-based). These are at tour level. +#tour.utility.ivt.coeffs = -0.016,-0.016,-0.01,-0.017,-0.015,-0.032 +#tour.utility.income.coeffs = -0.625,-0.262,-0.262,-0.262,-0.262,-0.262 +#tour.utility.income.exponents = 0.6,0.5,0.5,0.5,0.5,0.5 +# +##UECs for tour TOD choice model +#departTime.uec.file = TourDepartureAndDuration.xls +#departTime.data.page = 0 +#departTime.work.page = 1 +#departTime.univ.page = 2 +#departTime.school.page = 3 +#departTime.escort.page = 4 +#departTime.shop.page = 5 +#departTime.maint.page = 6 +#departTime.eat.page = 7 +#departTime.visit.page = 8 +#departTime.discr.page = 9 +#departTime.atwork.page = 10 +#departTime.alts.file = DepartureTimeAndDurationAlternatives.csv +# +##UECs for joint tour frequency choice model +#jtfcp.uec.file = JointTourFrequency.xls +#jtfcp.alternatives.file = JointAlternatives.csv +#jtfcp.data.page = 0 +#jtfcp.freq.comp.page = 1 +#jtfcp.participate.page = 2 +# +##UECs for individual non-mandatory tour frequency model +#inmtf.uec.file = NonMandatoryIndividualTourFrequency.xls +#inmtf.FrequencyExtension.ProbabilityFile = IndividualNonMandatoryTourFrequencyExtensionProbabilities_p1.csv +#IndividualNonMandatoryTourFrequency.AlternativesList.InputFile = IndividualNonMandatoryTourFrequencyAlternatives.csv +#inmtf.data.page = 0 +#inmtf.perstype1.page = 1 +#inmtf.perstype2.page = 2 +#inmtf.perstype3.page = 3 +#inmtf.perstype4.page = 4 +#inmtf.perstype5.page = 5 +#inmtf.perstype6.page = 6 +#inmtf.perstype7.page = 7 +#inmtf.perstype8.page = 8 +# +##UECs for at work subtour frequency model +#awtf.uec.file = AtWorkSubtourFrequency.xls +#awtf.data.page = 0 +#awtf.model.page = 1 +# +##UECs for stop frequency model +#stf.uec.file = StopFrequency.xls +#stf.purposeLookup.proportions = StopPurposeLookupProportions.csv +#stf.data.page = 0 +#stf.work.page = 1 +#stf.univ.page = 2 +#stf.school.page = 3 +#stf.escort.page = 4 +#stf.shop.page = 5 +#stf.maint.page = 6 +#stf.eat.page = 7 +#stf.visit.page = 8 +#stf.discr.page = 9 +#stf.subtour.page = 10 +# +##UECs for stop location choice model +#slc.uec.file = StopLocationChoice.xls +#slc.uec.data.page = 0 +#slc.mandatory.uec.model.page = 1 +#slc.maintenance.uec.model.page = 2 +#slc.discretionary.uec.model.page = 3 +#slc.alts.file = SlcAlternatives.csv +# +#slc.soa.uec.file = SlcSoaSize.xls +#slc.soa.alts.file = DestinationChoiceAlternatives.csv +# +#auto.slc.soa.distance.uec.file = SlcSoaDistanceUtility.xls +#auto.slc.soa.distance.data.page = 0 +#auto.slc.soa.distance.model.page = 1 +# +#slc.soa.size.uec.file = SlcSoaSize.xls +#slc.soa.size.uec.data.page = 0 +#slc.soa.size.uec.model.page = 1 +# +#stop.depart.arrive.proportions = StopDepartArriveProportions.csv +# +##UECs for trip mode choice model +#tripModeChoice.uec.file = TripModeChoice.xls +# +## utility coefficients by tour purpose (work, univ, school, maintenance, discretionary, work-based). These are at trip level. +#trip.utility.ivt.coeffs = -0.032,-0.032,-0.02,-0.034,-0.03,-0.064 +#trip.utility.income.coeffs = -1.25,-0.524,-0.524,-0.524,-0.524,-0.524 +#trip.utility.income.exponents = 0.6,0.5,0.5,0.5,0.5,0.5 +# +# +##UECs for parking location choice model +#plc.uec.file = ParkLocationChoice.xls +#plc.uec.data.page = 0 +#plc.uec.model.page = 1 +# +#plc.alts.corresp.file = ParkLocationAlts.csv +#plc.alts.file = ParkLocationSampleAlts.csv +# +#mgra.avg.cost.output.file = output/mgraParkingCost.csv +# +#mgra.avg.cost.dist.coeff.work = -8.6 +#mgra.avg.cost.dist.coeff.other = -4.9 +# +#park.cost.reimb.mean = -0.05 +#park.cost.reimb.std.dev = 0.54 +# +##UECs for best transit path finding +#utility.bestTransitPath.uec.file = BestTransitPathUtility.xls +#utility.bestTransitPath.data.page = 0 +#utility.bestTransitPath.tapToTap.page = 1 +#utility.bestTransitPath.walkAccess.page = 2 +#utility.bestTransitPath.driveAccess.page = 3 +#utility.bestTransitPath.walkEgress.page = 4 +#utility.bestTransitPath.driveEgress.page = 5 +#utility.bestTransitPath.driveAccDisutility.page = 6 +#utility.bestTransitPath.driveEgrDisutility.page = 7 +#utility.bestTransitPath.skim.sets = 3 +#utility.bestTransitPath.alts = 4 +#utility.bestTransitPath.maxPathsPerSkimSetForLogsum = 1,1,1 +#utility.bestTransitPath.nesting.coeff = 0.24 +# +##UECs for auto skimming +#skims.auto.uec.file = AutoSkims.xls +#skims.auto.data.page = 0 +#skims.auto.ea.page = 1 +#skims.auto.am.page = 2 +#skims.auto.md.page = 3 +#skims.auto.pm.page = 4 +#skims.auto.ev.page = 5 +# +##UECs for TAZ distances taz.distance.uec.file = tazDistance.xls taz.distance.data.page = 0 taz.od.distance.ea.page = 1 @@ -743,305 +759,333 @@ taz.od.distance.am.page = 2 taz.od.distance.md.page = 3 taz.od.distance.pm.page = 4 taz.od.distance.ev.page = 5 - -#UECs for TAZ times +# +##UECs for TAZ times taz.od.time.ea.page = 6 taz.od.time.am.page = 7 taz.od.time.md.page = 8 taz.od.time.pm.page = 9 taz.od.time.ev.page = 10 +# +# +##UECs for walk-transit-walk skimming +#skim.walk.transit.walk.uec.file = WalkTransitWalkSkims.xls +#skim.walk.transit.walk.data.page = 0 +#skim.walk.transit.walk.skim.page = 1 +#skim.walk.transit.walk.skims = 13 +# +##UECs for walk-transit-drive skimming +#skim.walk.transit.drive.uec.file = WalkTransitDriveSkims.xls +#skim.walk.transit.drive.data.page = 0 +#skim.walk.transit.drive.skim.page = 1 +#skim.walk.transit.drive.skims = 13 +# +##UECs for drive-transit-walk skimming +#skim.drive.transit.walk.uec.file = DriveTransitWalkSkims.xls +#skim.drive.transit.walk.data.page = 0 +#skim.drive.transit.walk.skim.page = 1 +#skim.drive.transit.walk.skims = 13 +# +# +###################################################################################### +## IE Model Settings (run as part of CT-RAMP) +###################################################################################### +# +#RunModel.InternalExternal = true +# +#ie.uec.file = InternalExternalTripChoice.xls +#ie.data.page = 0 +#ie.model.page = 1 +#ie.logsum.distance.coeff = -0.05 +#external.tazs = 1,2,3,4,5,6,7,8,9,10,11,12 +# +# +#internalExternal.dc.uec.file = InternalExternalDestinationChoice.xls +#internalExternal.dc.uec.data.page = 0 +#internalExternal.dc.uec.model.page = 1 +#internalExternal.dc.uec.alts.file = InternalExternalDestinationChoiceAlternatives.csv +# +#internalExternal.tour.tod.file = input/internalExternal_tourTOD.csv +# +#internalExternal.trip.mc.uec.file = InternalExternalTripModeChoice.xls +#internalExternal.trip.mc.data.page = 0 +#internalExternal.trip.mc.model.page = 1 +# +#internalExternal.trip.output.file = output/internalExternalTrips.csv +# +#internalExternal.results.autoTripMatrix = output/autoInternalExternalTrips +#internalExternal.results.nMotTripMatrix = output/nmotInternalExternalTrips +#internalExternal.results.tranTripMatrix = output/tranInternalExternalTrips +#internalExternal.results.othrTripMatrix = output/othrInternalExternalTrips +# +###################################################################################### +## Cross-Border Model Settings +###################################################################################### +#crossBorder.purpose.nonsentri.file = input/crossBorder_tourPurpose_nonSENTRI.csv +#crossBorder.purpose.sentri.file = input/crossBorder_tourPurpose_SENTRI.csv +# +#crossBorder.tour.tod.file = input/crossBorder_tourEntryAndReturn.csv +# +#crossBorder.dc.soa.uec.file = CrossBorderDestinationChoiceSample.xls +#crossBorder.dc.soa.data.page = 0 +#crossBorder.dc.soa.model.page = 1 +#crossBorder.dc.soa.size.page = 2 +#crossborder.dc.soa.alts.file = CrossBorderDestinationChoiceSoaAlternatives2020.csv +# +#crossBorder.dc.uec.file = CrossBorderDestinationChoice2020.xls +#crossBorder.dc.data.page = 0 +#crossBorder.dc.model.page = 1 +#crossborder.dc.alts.file = CrossBorderDestinationChoiceAlternatives.csv +# +#crossBorder.dc.colonia.file = input/crossBorder_supercolonia.csv +#crossBorder.dc.colonia.distance.parameter = -0.19 +#crossBorder.dc.soa.sampleRate = 30 +# +##crossBorder.tour.mc.uec.file = CrossBorderTourModeChoice.xls +#crossBorder.tour.mc.uec.file = CrossBorderTourModeChoice2020.xls +#crossBorder.tour.mc.data.page = 0 +#crossBorder.tour.mc.mandatory.model.page = 1 +#crossBorder.tour.mc.nonmandatory.model.page = 2 +#crossBorder.poe.waittime.file = input/crossBorder_pointOfEntryWaitTime.csv +# +#crossBorder.trip.mc.uec.file = CrossBorderTripModeChoice.xls +#crossBorder.trip.mc.data.page = 0 +#crossBorder.trip.mc.model.page = 1 +# +#crossBorder.stop.frequency.file = input/crossBorder_stopFrequency.csv +#crossBorder.stop.purpose.file = input/crossBorder_stopPurpose.csv +# +#crossBorder.slc.soa.uec.file = CrossBorderStopLocationChoiceSample.xls +#crossBorder.slc.soa.data.page = 0 +#crossBorder.slc.soa.model.page = 1 +#crossBorder.slc.soa.alts.file = SoaTazDistAlts.csv +# +#crossBorder.slc.uec.file = CrossBorderStopLocationChoice.xls +#crossBorder.slc.data.page = 0 +#crossBorder.slc.model.page = 1 +# +#crossBorder.stop.outbound.duration.file = input/crossBorder_outboundStopDuration.csv +#crossBorder.stop.inbound.duration.file = input/crossBorder_inboundStopDuration.csv +# +#crossBorder.tour.output.file = output/crossBorderTours.csv +crossBorder.trip.output.file = output/crossborder/final_trips.csv +# +#crossBorder.results.autoTripMatrix = output/autoCrossBorderTrips +#crossBorder.results.nMotTripMatrix = output/nmotCrossBorderTrips +#crossBorder.results.tranTripMatrix = output/tranCrossBorderTrips +#crossBorder.results.othrTripMatrix = output/othrCrossBorderTrips +# +###################################################################################### +## Visitor Model Settings +###################################################################################### +#visitor.business.tour.file = input/visitor_businessFrequency.csv +#visitor.personal.tour.file = input/visitor_personalFrequency.csv +# +#visitor.partySize.file = input/visitor_partySize.csv +#visitor.autoAvailable.file = input/visitor_autoAvailable.csv +#visitor.income.file = input/visitor_income.csv +# +#visitor.dc.soa.uec.file = VisitorDestinationChoiceSample.xls +#visitor.dc.soa.data.page = 0 +#visitor.dc.soa.work.page = 1 +#visitor.dc.soa.recreate.page = 2 +#visitor.dc.soa.dining.page = 3 +#visitor.dc.soa.size.page = 4 +#visitor.dc.soa.alts.file = SoaTazDistAlts.csv +# +#visitor.dc.uec.file = VisitorDestinationChoice.xls +#visitor.dc.data.page = 0 +#visitor.dc.work.page = 1 +#visitor.dc.recreate.page = 2 +#visitor.dc.dining.page = 3 +# +#visitor.tour.tod.file = input/visitor_tourTOD.csv +# +#visitor.mc.uec.file = VisitorTourModeChoice.xls +#visitor.mc.data.page = 0 +#visitor.mc.model.page = 1 +# +#visitor.stop.frequency.file = input/visitor_stopFrequency.csv +#visitor.stop.purpose.file = input/visitor_stopPurpose.csv +#visitor.stop.outbound.duration.file = input/visitor_outboundStopDuration.csv +#visitor.stop.inbound.duration.file = input/visitor_inboundStopDuration.csv +# +#visitor.slc.soa.uec.file = VisitorStopLocationChoiceSample.xls +#visitor.slc.soa.data.page = 0 +#visitor.slc.soa.model.page = 1 +# +#visitor.slc.uec.file = VisitorStopLocationChoice.xls +#visitor.slc.data.page = 0 +#visitor.slc.model.page = 1 +# +#visitor.trip.mc.uec.file = VisitorTripModeChoice.xls +#visitor.trip.mc.data.page = 0 +#visitor.trip.mc.model.page = 1 +# +#visitor.micromobility.uec.file = VisitorMicromobilityChoice.xls +#visitor.micromobility.data.page = 0 +#visitor.micromobility.model.page = 1 +# +# +# +# +#visitor.tour.output.file = output/visitorTours.csv +visitor.trip.output.file = output/visitor/final_trips.csv +# +#visitor.results.autoTripMatrix = output/autoVisitorTrips +#visitor.results.nMotTripMatrix = output/nmotVisitorTrips +#visitor.results.tranTripMatrix = output/tranVisitorTrips +#visitor.results.othrTripMatrix = output/othrVisitorTrips +# +# +## These settings are for building an estimation file, not used for main visitor model code +#visitor.uec.file = VisitorSize.xls +#visitor.uec.data.page = 0 +#visitor.uec.sizeTerms.page = 1 +# +###################################################################################### +## SAN Airport Model Settings +###################################################################################### +#airport.SAN.purpose.file = input/airport_purpose.SAN.csv +#airport.SAN.size.file = input/airport_party.SAN.csv +#airport.SAN.duration.file = input/airport_nights.SAN.csv +#airport.SAN.income.file = input/airport_income.SAN.csv +#airport.SAN.departureTime.file = input/airport_departure.SAN.csv +#airport.SAN.arrivalTime.file = input/airport_arrival.SAN.csv +airport.SAN.output.file = output/airport.SAN/final_trips.csv +# +#airport.SAN.dc.uec.file = AirportDestinationChoice.SAN.xls +#airport.SAN.dc.data.page = 0 +#airport.SAN.dc.size.page = 5 +#airport.SAN.dc.segment1.page = 1 +#airport.SAN.dc.segment2.page = 2 +#airport.SAN.dc.segment3.page = 3 +#airport.SAN.dc.segment4.page = 4 +# +#airport.SAN.mc.uec.file = AirportModeChoice.SAN2016.xls +#airport.SAN.mc.data.page = 0 +#airport.SAN.mc.da.page = 1 +#airport.SAN.mc.s2.page = 2 +#airport.SAN.mc.s3.page = 3 +#airport.SAN.mc.transit.page = 4 +#airport.SAN.mc.accessMode.page = 5 +# +#airport.SAN.externalStationFile = uec/InternalExternalDestinationChoiceAlternatives.csv +# +#airport.SAN.results.autoTripMatrix = output/autoAirportTrips.SAN +#airport.SAN.results.nMotTripMatrix = output/nmotAirportTrips.SAN +#airport.SAN.results.tranTripMatrix = output/tranAirportTrips.SAN +#airport.SAN.results.othrTripMatrix = output/othrAirportTrips.SAN +# +###################################################################################### +## CBX Airport Model Settings +###################################################################################### +#airport.CBX.purpose.file = input/airport_purpose.CBX.csv +#airport.CBX.size.file = input/airport_party.CBX.csv +#airport.CBX.duration.file = input/airport_nights.CBX.csv +#airport.CBX.income.file = input/airport_income.CBX.csv +#airport.CBX.departureTime.file = input/airport_departure.CBX.csv +#airport.CBX.arrivalTime.file = input/airport_arrival.CBX.csv +airport.CBX.output.file = output/airport.CBX/final_trips.csv +RunModel.skipTransitConnector = false +RunModel.skipExternal = false,false,false +SavedFrom = Emme Modeller properties writer Process ID 232096 +SavedLast = Jan-04-2024 21:46:23 +active.coef.dwrongwy = 3.25553 +active.coef.dartne2 = 0.99225 +TNC.single.baseFare = 2.2 +TNC.shared.costMinimum = 3 +TNC.shared.costPerMinute = 0.1 +active.micromobility.fixedCost = 1 +active.micromobility.variableCost = 0.2 +airport.CBX.airportMgra = 9350 +TNC.single.costPerMile = 1.33 +active.ebike.ownership = 0.11 +taxi.costPerMinute = 0.1 +airport.SAN.connecting = 808619 +atdm.factor = 1 +active.maxdist.bike.taz = 21.1 +TNC.single.costMinimum = 7.2 +airport.CBX.connecting = 0 +active.coef.distcla0 = 0.81081 +active.coef.distcla3 = 0.81081 +smartSignal.factor.MA = 1 +airport.CBX.enplanements = 984428 +active.maxdist.bike.mgra = 2.11 +TNC.single.costPerMinute = 0.24 +Mobility.AV.Share = 0 +active.bike.minutes.per.mile = 5.6872 +TNC.shared.costPerMile = 0.53 +smartSignal.factor.PA = 1 +airport.SAN.airportMgra = 11249 +active.coef.dbikblvd = 0.32414 +crossBorder.tours = 120700 +tc.everyone.owns = 0 +crossBorder.sentriShare = 0.219 +active.coef.dcyctrac = 0.40068 +TNC.shared.baseFare = 2.2 +airport.SAN.enplanements = 13727381 +taxi.baseFare = 2.2 +active.coef.distcla1 = 0.32886 +active.microtransit.fixedCost = 2.03 +taxi.costPerMile = 2.3 +active.coef.distcla2 = 0.51408 - -#UECs for walk-transit-walk skimming -skim.walk.transit.walk.uec.file = WalkTransitWalkSkims.xls -skim.walk.transit.walk.data.page = 0 -skim.walk.transit.walk.skim.page = 1 -skim.walk.transit.walk.skims = 13 - -#UECs for walk-transit-drive skimming -skim.walk.transit.drive.uec.file = WalkTransitDriveSkims.xls -skim.walk.transit.drive.data.page = 0 -skim.walk.transit.drive.skim.page = 1 -skim.walk.transit.drive.skims = 13 - -#UECs for drive-transit-walk skimming -skim.drive.transit.walk.uec.file = DriveTransitWalkSkims.xls -skim.drive.transit.walk.data.page = 0 -skim.drive.transit.walk.skim.page = 1 -skim.drive.transit.walk.skims = 13 - - -##################################################################################### -# IE Model Settings (run as part of CT-RAMP) -##################################################################################### - -RunModel.InternalExternal = true - -ie.uec.file = InternalExternalTripChoice.xls -ie.data.page = 0 -ie.model.page = 1 -ie.logsum.distance.coeff = -0.05 -external.tazs = 1,2,3,4,5,6,7,8,9,10,11,12 - - -internalExternal.dc.uec.file = InternalExternalDestinationChoice.xls -internalExternal.dc.uec.data.page = 0 -internalExternal.dc.uec.model.page = 1 -internalExternal.dc.uec.alts.file = InternalExternalDestinationChoiceAlternatives.csv - -internalExternal.tour.tod.file = input/internalExternal_tourTOD.csv - -internalExternal.trip.mc.uec.file =InternalExternalTripModeChoice.xls -internalExternal.trip.mc.data.page = 0 -internalExternal.trip.mc.model.page = 1 - -internalExternal.trip.output.file = output/internalExternalTrips.csv - -internalExternal.results.autoTripMatrix = output/autoInternalExternalTrips -internalExternal.results.nMotTripMatrix = output/nmotInternalExternalTrips -internalExternal.results.tranTripMatrix = output/tranInternalExternalTrips -internalExternal.results.othrTripMatrix = output/othrInternalExternalTrips - -##################################################################################### -# Cross-Border Model Settings -##################################################################################### -crossBorder.purpose.nonsentri.file = input/crossBorder_tourPurpose_nonSENTRI.csv -crossBorder.purpose.sentri.file = input/crossBorder_tourPurpose_SENTRI.csv - -crossBorder.tour.tod.file = input/crossBorder_tourEntryAndReturn.csv - -crossBorder.dc.soa.uec.file = CrossBorderDestinationChoiceSample.xls -crossBorder.dc.soa.data.page = 0 -crossBorder.dc.soa.model.page = 1 -crossBorder.dc.soa.size.page = 2 -crossborder.dc.soa.alts.file =${crossborder.dc.soa.alts.file} - -crossBorder.dc.uec.file =${crossBorder.dc.uec.file} -crossBorder.dc.data.page = 0 -crossBorder.dc.model.page = 1 -crossborder.dc.alts.file = CrossBorderDestinationChoiceAlternatives.csv - -crossBorder.dc.colonia.file = input/crossBorder_supercolonia.csv -crossBorder.dc.colonia.distance.parameter = -0.19 -crossBorder.dc.soa.sampleRate = 30 - -#crossBorder.tour.mc.uec.file = CrossBorderTourModeChoice.xls -crossBorder.tour.mc.uec.file =${crossBorder.tour.mc.uec.file} -crossBorder.tour.mc.data.page = 0 -crossBorder.tour.mc.mandatory.model.page = 1 -crossBorder.tour.mc.nonmandatory.model.page = 2 -crossBorder.poe.waittime.file = input/crossBorder_pointOfEntryWaitTime.csv - -crossBorder.trip.mc.uec.file =CrossBorderTripModeChoice.xls -crossBorder.trip.mc.data.page = 0 -crossBorder.trip.mc.model.page = 1 - -crossBorder.stop.frequency.file = input/crossBorder_stopFrequency.csv -crossBorder.stop.purpose.file = input/crossBorder_stopPurpose.csv - -crossBorder.slc.soa.uec.file = CrossBorderStopLocationChoiceSample.xls -crossBorder.slc.soa.data.page = 0 -crossBorder.slc.soa.model.page = 1 -crossBorder.slc.soa.alts.file = SoaTazDistAlts.csv - -crossBorder.slc.uec.file = CrossBorderStopLocationChoice.xls -crossBorder.slc.data.page = 0 -crossBorder.slc.model.page = 1 - -crossBorder.stop.outbound.duration.file = input/crossBorder_outboundStopDuration.csv -crossBorder.stop.inbound.duration.file = input/crossBorder_inboundStopDuration.csv - -crossBorder.tour.output.file = output/crossBorderTours.csv -crossBorder.trip.output.file = output/crossBorderTrips.csv - -crossBorder.results.autoTripMatrix = output/autoCrossBorderTrips -crossBorder.results.nMotTripMatrix = output/nmotCrossBorderTrips -crossBorder.results.tranTripMatrix = output/tranCrossBorderTrips -crossBorder.results.othrTripMatrix = output/othrCrossBorderTrips - -##################################################################################### -# Visitor Model Settings -##################################################################################### -visitor.business.tour.file = input/visitor_businessFrequency.csv -visitor.personal.tour.file = input/visitor_personalFrequency.csv - -visitor.partySize.file = input/visitor_partySize.csv -visitor.autoAvailable.file = input/visitor_autoAvailable.csv -visitor.income.file = input/visitor_income.csv - -visitor.dc.soa.uec.file = VisitorDestinationChoiceSample.xls -visitor.dc.soa.data.page = 0 -visitor.dc.soa.work.page = 1 -visitor.dc.soa.recreate.page = 2 -visitor.dc.soa.dining.page = 3 -visitor.dc.soa.size.page = 4 -visitor.dc.soa.alts.file = SoaTazDistAlts.csv - -visitor.dc.uec.file = VisitorDestinationChoice.xls -visitor.dc.data.page = 0 -visitor.dc.work.page = 1 -visitor.dc.recreate.page = 2 -visitor.dc.dining.page = 3 - -visitor.tour.tod.file = input/visitor_tourTOD.csv - -visitor.mc.uec.file =VisitorTourModeChoice.xls -visitor.mc.data.page = 0 -visitor.mc.model.page = 1 - -visitor.stop.frequency.file = input/visitor_stopFrequency.csv -visitor.stop.purpose.file = input/visitor_stopPurpose.csv -visitor.stop.outbound.duration.file = input/visitor_outboundStopDuration.csv -visitor.stop.inbound.duration.file = input/visitor_inboundStopDuration.csv - -visitor.slc.soa.uec.file = VisitorStopLocationChoiceSample.xls -visitor.slc.soa.data.page = 0 -visitor.slc.soa.model.page = 1 - -visitor.slc.uec.file = VisitorStopLocationChoice.xls -visitor.slc.data.page = 0 -visitor.slc.model.page = 1 - -visitor.trip.mc.uec.file =VisitorTripModeChoice.xls -visitor.trip.mc.data.page = 0 -visitor.trip.mc.model.page = 1 - -visitor.micromobility.uec.file = VisitorMicromobilityChoice.xls -visitor.micromobility.data.page = 0 -visitor.micromobility.model.page = 1 - - - - -visitor.tour.output.file = output/visitorTours.csv -visitor.trip.output.file = output/visitorTrips.csv - -visitor.results.autoTripMatrix = output/autoVisitorTrips -visitor.results.nMotTripMatrix = output/nmotVisitorTrips -visitor.results.tranTripMatrix = output/tranVisitorTrips -visitor.results.othrTripMatrix = output/othrVisitorTrips - - -# These settings are for building an estimation file, not used for main visitor model code -visitor.uec.file = VisitorSize.xls -visitor.uec.data.page = 0 -visitor.uec.sizeTerms.page = 1 - -##################################################################################### -# SAN Airport Model Settings -##################################################################################### -airport.SAN.purpose.file = input/airport_purpose.SAN.csv -airport.SAN.size.file = input/airport_party.SAN.csv -airport.SAN.duration.file = input/airport_nights.SAN.csv -airport.SAN.income.file = input/airport_income.SAN.csv -airport.SAN.departureTime.file = input/airport_departure.SAN.csv -airport.SAN.arrivalTime.file = input/airport_arrival.SAN.csv -airport.SAN.output.file = output/airport_out.SAN.csv - -airport.SAN.dc.uec.file = AirportDestinationChoice.SAN.xls -airport.SAN.dc.data.page = 0 -airport.SAN.dc.size.page = 5 -airport.SAN.dc.segment1.page = 1 -airport.SAN.dc.segment2.page = 2 -airport.SAN.dc.segment3.page = 3 -airport.SAN.dc.segment4.page = 4 - -airport.SAN.mc.uec.file =AirportModeChoice.SAN.xls -airport.SAN.mc.data.page = 0 -airport.SAN.mc.da.page = 1 -airport.SAN.mc.s2.page = 2 -airport.SAN.mc.s3.page = 3 -airport.SAN.mc.transit.page = 4 -airport.SAN.mc.accessMode.page = 5 - -airport.SAN.externalStationFile = uec/InternalExternalDestinationChoiceAlternatives.csv - -airport.SAN.results.autoTripMatrix = output/autoAirportTrips.SAN -airport.SAN.results.nMotTripMatrix = output/nmotAirportTrips.SAN -airport.SAN.results.tranTripMatrix = output/tranAirportTrips.SAN -airport.SAN.results.othrTripMatrix = output/othrAirportTrips.SAN - +# ##################################################################################### -# CBX Airport Model Settings +# Smart Signal Properties wsu 8/22/18 ##################################################################################### -airport.CBX.purpose.file = input/airport_purpose.CBX.csv -airport.CBX.size.file = input/airport_party.CBX.csv -airport.CBX.duration.file = input/airport_nights.CBX.csv -airport.CBX.income.file = input/airport_income.CBX.csv -airport.CBX.departureTime.file = input/airport_departure.CBX.csv -airport.CBX.arrivalTime.file = input/airport_arrival.CBX.csv -airport.CBX.output.file = output/airport_out.CBX.csv +smartSignal.factor.LC = 1 +crossborder.dc.soa.alts.file = CrossBorderDestinationChoiceSoaAlternatives2020.csv +visualizer.reference.path = T:\RTP\2021RP\2021rp_final\abm_runs\2020\input\mgra13_based_input2020.csv +nmdc.uec.file = TourDestinationChoice2020.xls +airport.SAN.mc.uec.file = AirportModeChoice.SAN2016.xls +crossBorder.dc.uec.file = CrossBorderDestinationChoice2020.xls +crossBorder.tour.mc.uec.file = CrossBorderTourModeChoice2020.xls +uwsl.dc.uec.file = TourDestinationChoice2020.xls -airport.CBX.dc.uec.file = AirportDestinationChoice.CBX.xls -airport.CBX.dc.data.page = 0 -airport.CBX.dc.size.page = 5 -airport.CBX.dc.segment1.page = 1 -airport.CBX.dc.segment2.page = 2 -airport.CBX.dc.segment3.page = 3 -airport.CBX.dc.segment4.page = 4 - -airport.CBX.mc.uec.file =AirportModeChoice.CBX.xls -airport.CBX.mc.data.page = 0 -airport.CBX.mc.da.page = 1 -airport.CBX.mc.s2.page = 2 -airport.CBX.mc.s3.page = 3 -airport.CBX.mc.transit.page = 4 -airport.CBX.mc.accessMode.page = 5 +# +active.logsum.matrix.file.bike.taz = bikeTazLogsum.csv +active.logsum.matrix.file.bike.mgra = bikeMgraLogsum.csv +active.logsum.matrix.file.walk.mgra = walkMgraEquivMinutes.csv +active.logsum.matrix.file.walk.mgratap = walkMgraTapEquivMinutes.csv -airport.CBX.externalStationFile = uec/InternalExternalDestinationChoiceAlternatives.csv +active.bike.write.derived.network = true +active.bike.derived.network.edges = derivedBikeEdges.csv +active.bike.derived.network.nodes = derivedBikeNodes.csv +active.bike.derived.network.traversals = derivedBikeTraversals.csv -airport.CBX.results.autoTripMatrix = output/autoAirportTrips.CBX -airport.CBX.results.nMotTripMatrix = output/nmotAirportTrips.CBX -airport.CBX.results.tranTripMatrix = output/tranAirportTrips.CBX -airport.CBX.results.othrTripMatrix = output/othrAirportTrips.CBX +active.assignment.file.bike = bikeAssignmentResults.csv +active.micromobility.file.walk.mgra = microMgraEquivMinutes.csv +active.micromobility.file.walk.mgratap = microMgraTapEquivMinutes.csv -##################################################################################### -# Truck Model Settings -##################################################################################### -truck.DFyear = ${model_years} -truck.luOverRide = "False" +AtTransitConsistency.xThreshold = 1.0 +AtTransitConsistency.yThreshold = 1.0 ##################################################################################### # Commercial Vehicle Model Settings ##################################################################################### #scale factor to use in cvm trip generation. Also, used during demand import to factor-in demand accordingly -cvm.scale_factor = 1 +#cvm.scale_factor = 1 #scale factors by vehicle (light, medium, and heavy) and time of day (ea,am,md,pm,ev) - used to boost cvm demand #light vehicles -cvm.scale_light = 1,1,2.8,1,1 +#cvm.scale_light = 1,2,3.5,2,1 #medium vehicles -cvm.scale_medium = 1,1,1,1,1 +#cvm.scale_medium = 1,1,1,1,1 #heavy vehicles -cvm.scale_heavy = 1,1,1,1,1 -#cvm vehicle shares representing portions of the cvm vehicle trips that go to light-heavy trucks. +#cvm.scale_heavy = 1,1,1,1,1 +#cvm vehicle shares representing portions of the cvm vehicle trips that go to light-heavy trucks. #share value should be between 0 and 1. 0 representing none will go to light-heavy truck and 1 means all will go. -cvm.share.light = 0.04 -cvm.share.medium = 0.64 -cvm.share.heavy = 0 +#cvm.share.light = 0.04 +#cvm.share.medium = 0.64 +#cvm.share.heavy = 0 -################################################################# -# Report Section -################################################################# -Report.exportData=True -Report.iteration=3 -Report.tables = taztotap,indivtrips,jointtrips,airporttripsSAN,airporttripsCBX,cbtrips,visitortours,visitortrips,ietrip,commtrip -#aggregate trips eetrip, eitrip, and trucktrip are exported in Python, always -#Report.writeTransitIVT = True -##################################################################################### -# Trip Table Settings -##################################################################################### -# occupancies needed for trip table creation -occ3plus.purpose.Work = 3.34 -occ3plus.purpose.University = 3.34 -occ3plus.purpose.School = 3.34 -occ3plus.purpose.Escort = 3.34 -occ3plus.purpose.Shop = 3.34 -occ3plus.purpose.Maintenance = 3.34 -occ3plus.purpose.EatingOut = 3.34 -occ3plus.purpose.Visiting = 3.34 -occ3plus.purpose.Discretionary = 3.34 -occ3plus.purpose.WorkBased = 3.34 +#cvm vehicle shares representing portions of the cvm vehicle trips by value of time +cvm.vot.share.low = 0.0 +cvm.vot.share.medium = 0.0 +cvm.vot.share.high = 1.0 +# ################################################################# # Active Transportation Model Settings # updated 4/2/2014 wsu @@ -1053,22 +1097,22 @@ active.node.columns = MGRA,TAZ,XCOORD,YCOORD,TAP,Signal active.edge.file = %project.folder%/input/SANDAG_Bike_NET.dbf active.edge.anode = A active.edge.bnode = B -active.edge.directional = false +active.edge.directional = false active.edge.fieldnames = functionalClass,distance,gain,bikeClass,lanes,cycleTrack,bikeBlvd,roadsegid active.edge.columns.ab = Func_Class,Distance,AB_Gain,ABBikeClas,AB_Lanes,Bike2Sep,Bike3Blvd,ROADSEGID active.edge.columns.ba = Func_Class,Distance,BA_Gain,BABikeClas,BA_Lanes,Bike2Sep,Bike3Blvd,ROADSEGID active.edge.centroid.field = functionalClass active.edge.centroid.value = 10 active.edge.autospermitted.field = functionalClass -active.edge.autospermitted.values = 1, 2, 3, 4, 5, 6, 7 +active.edge.autospermitted.values = 1,2,3,4,5,6,7 # distance bins for control of path sampling active.sample.distance.breaks = 99 # minimum path sizes of alternative lists for each distance bin -active.sample.pathsizes = 2 +active.sample.pathsizes = 2 # minimum count of samples for each distance bin -active.sample.count.min = 10 +active.sample.count.min = 10 # maximum count of samples for each distance bin -active.sample.count.max = 100 +active.sample.count.max = 100 # scale of random cost for each sampling iteration where random cost = cost + scale * unif(0,1) * distance active.sample.random.scale.coef = 0.5 active.sample.random.scale.link = 0.7 @@ -1076,37 +1120,25 @@ active.sample.random.seeded = true active.sample.maxcost = 998 active.maxdist.walk.mgra = 3.0 active.maxdist.walk.tap = 1.0 -active.maxdist.bike.taz = 20.0 -active.maxdist.bike.mgra = 2.0 -active.maxdist.microtransit.mgra = 4.0 -active.maxdist.microtransit.tap = 4.0 +active.maxdist.micromobility.mgra = 3.0 +active.maxdist.micromobility.tap = 1.0 +active.maxdist.microtransit.mgra = 3.0 +active.maxdist.microtransit.tap = 3.0 active.output.bike = %project.folder%/output/ active.output.walk = %project.folder%/output/ -active.coef.distcla0 = 0.858 -active.coef.distcla1 = 0.348 -active.coef.distcla2 = 0.544 -active.coef.distcla3 = 0.858 -active.coef.dartne2 = 1.050 -active.coef.dwrongwy = 3.445 -active.coef.dcyctrac = 0.424 -active.coef.dbikblvd = 0.343 -active.coef.nonscenic = 0.300 -active.coef.gain = 0.015 -active.coef.turn = 0.083 -active.coef.signals = 0.040 -active.coef.unlfrma = 0.360 -active.coef.unlfrmi = 0.150 -active.coef.untoma = 0.480 -active.coef.untomi = 0.100 -active.coef.distance.walk = 20.0 +active.coef.nonscenic = 0.3 +active.coef.gain = 0.015 +active.coef.turn = 0.083 +active.coef.signals = 0.04 +active.coef.unlfrma = 0.36 +active.coef.unlfrmi = 0.15 +active.coef.untoma = 0.48 +active.coef.untomi = 0.1 active.coef.gain.walk = 0.034 active.walk.minutes.per.mile = 20 -active.bike.minutes.per.mile = 6 -active.micromobility.speed = 12 -active.micromobility.variableCost = 0.20 -active.micromobility.fixedCost = 1.00 +active.micromobility.speed = 15 active.micromobility.rentalTime = 1 active.micromobility.constant = 60 active.micromobility.vot = 15 @@ -1115,187 +1147,20 @@ micromobility.uec.file = MicromobilityChoice.xls micromobility.data.page = 0 micromobility.model.page = 1 -active.microtransit.speed = 25 +active.microtransit.speed = 17 active.microtransit.variableCost = 0.0 -active.microtransit.fixedCost = 1.00 -active.microtransit.waitTime = 3.0 +active.microtransit.waitTime = 4.0 active.microtransit.accessTime = 0.0 active.microtransit.constant = 120 active.microtransit.notAvailable = 999 -active.microtransit.tap.file = input/microTransitTaps.csv -active.microtransit.mgra.file = input/microTransitMGRAs.csv - -#active.trace.origins.taz = 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500 -#active.trace.origins.mgra = 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000, 20000 -#active.trace.origins.tap = 1, 3, 5, 7, 8, 9, 15 -#active.trace.exclusive = false -#active.debug.origin = 200003500 -#active.debug.destination = 200003601 - -active.trace.outputassignmentpaths = false - -path.choice.uec.spreadsheet = %project.folder%/uec/BikeTripPathChoice.xls -path.choice.uec.model.sheet = 1 -path.choice.uec.data.sheet = 0 -path.choice.max.path.count = 200 -btpc.alts.file = bike_path_alts.csv -active.logsum.matrix.file.bike.taz = bikeTazLogsum.csv -active.logsum.matrix.file.bike.mgra = bikeMgraLogsum.csv -active.logsum.matrix.file.walk.mgra = walkMgraEquivMinutes.csv -active.logsum.matrix.file.walk.mgratap = walkMgraTapEquivMinutes.csv - -active.bike.write.derived.network = true -active.bike.derived.network.edges = derivedBikeEdges.csv -active.bike.derived.network.nodes = derivedBikeNodes.csv -active.bike.derived.network.traversals = derivedBikeTraversals.csv - -active.assignment.file.bike = bikeAssignmentResults.csv - -AtTransitConsistency.xThreshold=1.0 -AtTransitConsistency.yThreshold=1.0 +active.microtransit.mgra.file = input/mobilityHubMGRAs.csv ##################################################################################### -# SUMMIT Settings -##################################################################################### -summit.output.directory = output/ -# Purposes (which correspond to SUMMIT files) are as follows: -summit.purpose.Work = 1 -summit.purpose.University = 2 -summit.purpose.School = 3 -summit.purpose.Escort = 4 -summit.purpose.Shop = 4 -summit.purpose.Maintenance = 4 -summit.purpose.EatingOut = 5 -summit.purpose.Visiting = 5 -summit.purpose.Discretionary = 5 -summit.purpose.WorkBased = 6 - -summit.filename.1 = Work -summit.filename.2 = University -summit.filename.3 = School -summit.filename.4 = Maintenance -summit.filename.5 = Discretionary -summit.filename.6 = Workbased - -summit.ivt.file.1 = -0.016 -summit.ivt.file.2 = -0.016 -summit.ivt.file.3 = -0.010 -summit.ivt.file.4 = -0.017 -summit.ivt.file.5 = -0.015 -summit.ivt.file.6 = -0.032 - -summit.modes = 26 -# 1=wt,2=dt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 -summit.mode.array = 0,0,0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 - -summit.upperEA = 3 -summit.upperAM = 9 -summit.upperMD = 22 -summit.upperPM = 29 - -################################################################# -# TAPS Creation Settings -# updated 4/28/2015 ymm -################################################################# -taps.formal.premium.maxDist = 10.0 -taps.formal.express.maxDist = 4.0 -taps.formal.local.maxDist = 4.0 -taps.informal.premium.maxDist = 4.0 -taps.informal.express.maxDist = 2.0 -taps.informal.local.maxDist = 2.0 - -taps.premium.modes = 4,5,6,7 -taps.express.modes = 8,9 -taps.local.modes = 10 - -taps.skim = traffic_skims_AM.omx -taps.skim.dist = AM_SOV_NT_M_DIST -taps.skim.time = AM_SOV_NT_M_TIME - -################################################################# -# Military Adjustment Section -# updated 4/26/2016 Wu Sun -################################################################# -RunModel.militaryCtmAdjustment=true - -##################################################################################### -# Special Event Model Settings -# Wu Sun 5/15/2017 -##################################################################################### -specialEvent.event.file = input/specialEvent_eventData.csv - -specialEvent.partySize.file = input/specialEvent_partySize.csv -specialEvent.income.file = input/specialEvent_income.csv - -specialEvent.dc.uec.file = SpecialEventOriginChoice.xls -specialEvent.dc.data.page = 0 -specialEvent.dc.model.page = 1 -specialEvent.dc.size.page = 2 - -specialEvent.saveUtilsAndProbs= false - -specialEvent.trip.mc.uec.file =SpecialEventTripModeChoice.xls -specialEvent.trip.mc.data.page = 0 -specialEvent.trip.mc.model.page = 1 - -specialEvent.tour.output.file = output/specialEventTours.csv -specialEvent.trip.output.file = output/specialEventTrips.csv - -specialEvent.results.autoTripMatrix = output/autoSpecialEventTrips -specialEvent.results.nMotTripMatrix = output/nmotSpecialEventTrips -specialEvent.results.tranTripMatrix = output/tranSpecialEventTrips -specialEvent.results.othrTripMatrix = output/othrSpecialEventTrips - -##################################################################################### -# Transit Shed Properties wsu 8/7/18 -##################################################################################### -RunModel.skipTransitShed= true -#transit access threshold (in minutes, must be integer) -transitShed.threshold=30 -#TOD to use in Transit Shed analysis-EA, AM, MD, PM, and EV -transitShed.TOD=AM -#Transit Shed time components (walk to transit). Options: walkAccTime,walkEgrTime,walkAuxTime,1stWaitTime,xferWaitTime,IVTime -transitShed.walkTransitTimeComponents=walkAccTime,walkEgrTime,walkAuxTime,1stWaitTime,xferWaitTime,IVTime -#Transit Shed time components (drive to transit). Options: driveAccTime,walkEgrTime,walkAuxTime,1stWaitTime,xferWaitTime,IVTime -transitShed.driveTransitTimeComponents=drvAccTime,walkEgrTime,walkAuxTime,1stWaitTime,xferWaitTime,IVTime - -##################################################################################### -# Smart Signal Properties wsu 8/22/18 -##################################################################################### -smartSignal.factor.LC=1.0 -smartSignal.factor.MA=1.0 -smartSignal.factor.PA=1.0 - -##################################################################################### -# ATDM Properties wsu 8/22/18 -##################################################################################### -atdm.factor=1.0 -##################################################################################### -# Local Drive Run Settings wsu 1/19/19 -##################################################################################### -RunModel.FileMask.Download = output,report,sql,logFiles -RunModel.FileMask.Upload = application,bin,input_truck,uec,output\iter*,output\*_1.csv,output\*_2.csv -##################################################################################### -# Visualizer Settings (run once after feedback loops) -##################################################################################### -visualizer.reference.path = ${visualizer.reference.path} -visualizer.output = SANDAG_Dashboard -visualizer.reference.label = REFERENCE -visualizer.build.label = SDABM - ##################################################################################### -# Telework Targets wsu 6/17/20 +# Transit Tier 1 EMME Link Name zou 5/7/20 ##################################################################################### -telework.occasional.2020.1day=-3.426 -telework.occasional.2020.23days=-3.345 -telework.occasional.2020.4days=-4.480 -telework.occasional.2025.1day=-3.305 -telework.occasional.2025.23days=-3.212 -telework.occasional.2025.4days=-4.369 -telework.occasional.2035.1day=-3.083 -telework.occasional.2035.23days=-3.017 -telework.occasional.2035.4days=-4.147 -telework.occasional.2050.1day=-2.899 -telework.occasional.2050.23days=-2.823 -telework.occasional.2050.4days=-3.943 \ No newline at end of file +transit.newMode = TIER 1 RAIL +transit.newMode.route = 581,582,583 +RunModel.skipDatalake = false +crossBorder.readyShare = 0.322