API Documentation 🔧 ¶
Welcome to the TM2PY API reference. This documentation provides comprehensive details about all classes, functions, and configuration options available in the tm2py transportation modeling framework.
Getting Started
New to tm2py? Start with the User Guide and Installation Instructions before diving into the API details.
Output Data Formats
For detailed specifications of model output file formats, field definitions, and data structures, see the CTRAMP Output File Specifications.
🚀 Model Setup & Execution ¶
Core classes for setting up and running transportation models.
Model Setup ¶
The primary interface for configuring and initializing tm2py models.
tm2py.SetupModel
¶
SetupModel(config_file: Path, model_dir: Path)
Main operational interface for setup model process.
Initializes an instance of the SetupModel class.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config_file
|
Path
|
The TOML file with the model setup attributes. |
required |
model_dir
|
Path
|
The directory which to setup for a TM2 model run. |
required |
Source code in tm2py/setup_model/setup.py
71 72 73 74 75 76 77 78 79 80 | |
Functions ¶
run_setup
¶
run_setup()
Does the work of setting up the model.
This step will do the following within the model directory.
- Intialize logging to write to
setup.log - Copy the setup config file to
setupmodel_config.toml - Create the required folder structure
- Copy the input from the locations specified: a. hwy and trn networks b. popsyn and landuse inputs c. nonres inputs d. warmstart demand matrices e. warmstart skims
- Copy the Emme template project and Emme network databases (based on the EMME version in sys.path)
- Download the travel model CTRAMP core code (runtime, uec) from the travel-model-two repository
- Updates the IP address in the CTRAMP runtime properties files
- Creates
RunModel.pyfor running the model
Raises:
| Type | Description |
|---|---|
FileExistsError
|
If the model directory to setup already exists. |
Source code in tm2py/setup_model/setup.py
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 | |
Controller ¶
Central orchestration and workflow management for model execution.
tm2py.controller
¶
RunController - model operation controller.
Main interface to start a TM2PY model run. Provide one or more configuration files in .toml format (by convention a scenario.toml and a model.toml)
Typical usage example: from tm2py.controller import RunController controller = RunController( [“scenario.toml”, “model.toml”]) controller.run()
Or from the command-line:
python <path>/tm2py/tm2py/controller.py –s scenario.toml –m model.toml
Classes ¶
RunController
¶
RunController(config_file: Union[Collection[Union[str, Path]], str, Path] = None, run_dir: Union[Path, str] = None, run_components: Collection[str] = component_cls_map.keys())
Main operational interface for model runs.
Provide one or more config files in TOML (*.toml) format, and a run directory. If the run directory is not provided the root directory of the first config_file is used.
Properties
Internal properties
Constructor for RunController class.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config_file
|
Union[Collection[Union[str, Path]], str, Path]
|
Single or list of config file locations as strings or Path objects. Defaults to None. |
None
|
run_dir
|
Union[Path, str]
|
Model run directory as a Path object or string. If not provided, defaults to the directory of the first config_file. |
None
|
run_components
|
Collection[str]
|
List of component names to run. Defaults to all components. |
keys()
|
Source code in tm2py/controller.py
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | |
time_period_names
property
¶time_period_names: List[str]
Return input time_period name or names and return list of time_period names.
Implemented here for easy access for all components.
Returns: list of uppercased string names of time periods
time_period_durations
property
¶time_period_durations: dict
Return mapping of time periods to durations in hours.
congested_transit_assn_max_iteration
property
¶congested_transit_assn_max_iteration: dict
Return mapping of time periods to max iteration in congested transit assignment.
iter_component
property
¶iter_component: Tuple[int, str]
Tuple of the current iteration and component name.
component
¶component() -> Component
Current component of model.
Source code in tm2py/controller.py
223 224 225 | |
get_abs_path
¶get_abs_path(rel_path: Union[Path, str]) -> Path
Get the absolute path from the root run directory given a relative path.
Source code in tm2py/controller.py
242 243 244 245 246 | |
run
¶run()
Main interface to run model.
Iterates through the self._queued_components and runs them.
Source code in tm2py/controller.py
285 286 287 288 289 290 291 292 293 | |
run_next
¶run_next()
Run next component in the queue.
Source code in tm2py/controller.py
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 | |
Functions ¶
⚙️ Configuration Management ¶
Configuration classes that define model parameters, settings, and behavioral options.
Configuration Pattern
Each component has an associated configuration class that defines its parameters. Configurations are typically loaded from TOML files and validated at runtime.
tm2py.config
¶
Config implementation and schema.
Classes ¶
ConfigItem
¶
Base class to add partial dict-like interface to tm2py model configuration.
Allow use of .items() [“X”] and .get(“X”) .to_dict() from configuration.
Not to be constructed directly. To be used a mixin for dataclasses representing config schema. Do not use “get” “to_dict”, or “items” for key names.
Functions ¶
items
¶items()
The sub-config objects in config.
Source code in tm2py/config.py
31 32 33 | |
get
¶get(key, default=None)
Return the value for key if key is in the dictionary, else default.
Source code in tm2py/config.py
35 36 37 | |
ScenarioConfig
¶
Scenario related parameters.
Properties
WarmStartConfig
¶
Warm start parameters.
Note that the components will be executed in the order listed.
Properties
Functions ¶
check_warmstart_method
¶check_warmstart_method(value, values)
When warmstart, either skim or demand should be true.
Source code in tm2py/config.py
111 112 113 114 115 116 117 118 | |
RunConfig
¶
Model run parameters.
Note that the components will be executed in the order listed.
Properties
Functions ¶
end_iteration_gt_start
¶end_iteration_gt_start(value, values)
Validate end_iteration greater than start_iteration.
Source code in tm2py/config.py
145 146 147 148 149 150 151 152 153 | |
start_component_used
¶start_component_used(value, values)
Validate start_component is listed in *_components.
Source code in tm2py/config.py
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | |
LoggingConfig
¶
Logging parameters. TODO.
Properties
TimePeriodConfig
¶
Time time period entry.
Properties
TimeSplitConfig
¶
Split matrix i and j.
i.e. for time of day splits.
TimeOfDayClassConfig
¶
Configuration for a class of time of day model.
TimeOfDayConfig
¶
Configuration for time of day model.
HouseholdModeAgg
¶
household trip mode aggregation input parameters.
Properties
HouseholdConfig
¶
Household (residents) model parameters.
AirPassengerDemandAggregationConfig
¶
Air passenger demand aggregation input parameters.
Properties
AirPassengerConfig
¶
Air passenger model parameters.
Properties
highway_demand_file: output OMX file input_demand_folder: location to find the input demand csvs input_demand_filename_tmpl: filename template for input demand. Should have {year}, {direction} and {airport} variables and end in ‘.csv’ reference_start_year: base start year for input demand tables used to calculate the linear interpolation, as well as in the file name template {year}{direction}{airport}.csv reference_end_year: end year for input demand tables used to calculate the linear interpolation, as well as in the file name template {year}{direction}{airport}.csv airport_names: list of one or more airport names / codes as used in the input file names demand_aggregation: specification of aggregation of by-access mode demand to highway class demand
Functions ¶
valid_input_demand_filename_tmpl
¶valid_input_demand_filename_tmpl(value)
Validate skim matrix template has correct {}.
Source code in tm2py/config.py
391 392 393 394 395 396 397 398 399 400 401 402 403 404 | |
MatrixFactorConfig
¶
Mapping of zone or list of zones to factor value.
Functions ¶
valid_zone_index
¶valid_zone_index(value)
Validate zone index and turn to list if isn’t one.
Source code in tm2py/config.py
417 418 419 420 421 422 423 424 425 | |
CoefficientConfig
¶
Coefficient and properties to be used in utility or regression.
ChoiceClassConfig
¶
Choice class parameters.
Properties
The end value in the utility equation for class c and property p is:
utility[p].coeff * classes[c].property_factor[p] * sum(skim(classes[c].skim_mode,skim_p) for skim_p in property_to_skim[p])
TollChoiceConfig
¶
Toll choice parameters.
Properties
InternalExternalConfig
¶
Internal <-> External model parameters.
TripGenerationFormulaConfig
¶
TripProductionConfig.
Trip productions or attractions for a zone are the constant plus the sum of the rates * values in land use file for that zone.
TripGenerationClassConfig
¶
Trip Generation parameters.
TripGenerationConfig
¶
Trip Generation parameters.
TripDistributionClassConfig
¶
Trip Distribution parameters.
Properties
TruckClassConfig
¶
Truck class parameters.
ImpedanceConfig
¶
Blended skims used for accessibility/friction calculations.
Properties:I name: name to store it as, referred to in TripDistribution config skim_mode: name of the mode to use for the blended skim time_blend: blend of time periods to use; mapped to the factors (which should sum to 1)
Functions ¶
sums_to_one
¶sums_to_one(value)
Validate highway.maz_to_maz.skim_period refers to a valid period.
Source code in tm2py/config.py
595 596 597 598 599 | |
TripDistributionConfig
¶
Trip Distribution parameters.
TruckConfig
¶
Truck model parameters.
Attributes ¶
highway_demand_file
instance-attribute
¶highway_demand_file: str
@validator(“classes”) def class_consistency(cls, v, values): # TODO Can’t get to work righ tnow _class_names = [c.name for c in v] _gen_classes = [c.name for c in values[“trip_gen”]] _dist_classes = [c.name for c in values[“trip_dist”]] _time_classes = [c.name for c in values[“time_split”]] _toll_classes = [c.name for c in values[“toll_choice”]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
ActiveModeShortestPathSkimConfig
¶
Active mode skim entry.
ActiveModesConfig
¶
Active Mode skim parameters.
HighwayCapClassConfig
¶
Highway link capacity and speed (‘capclass’) index entry.
Properties
ClassDemandConfig
¶
Input source for demand for highway or transit assignment class.
Used to specify where to find related demand file for this highway or transit class.
Properties
HighwayRelativeGapConfig
¶
Highway assignment relative gap parameters.
Properties
HighwayClassConfig
¶
Highway assignment class definition.
Note that excluded_links, skims and toll attribute names include vehicle groups (“{vehicle}”) which reference the list of highway.toll.dst_vehicle_group_names (see HighwayTollsConfig). The default example model config uses: “da”, “sr2”, “sr3”, “vsm”, sml”, “med”, “lrg”
Example single class config
name = “da” description= “drive alone” mode_code= “d” [[highway.classes.demand]] source = “household” name = “SOV_GP_{period}” [[highway.classes.demand]] source = “air_passenger” name = “da” [[highway.classes.demand]] source = “internal_external” name = “da” excluded_links = [“is_toll_da”, “is_sr2”], value_of_time = 18.93, # $ / hr operating_cost_per_mile = 17.23, # cents / mile toll = [“@bridgetoll_da”] skims = [“time”, “dist”, “freeflowtime”, “bridgetoll_da”],
Properties
HighwayTollsConfig
¶
Highway assignment and skim input tolls and related parameters.
Properties
Functions ¶
dst_vehicle_group_names_length
¶dst_vehicle_group_names_length(value, values)
Validate dst_vehicle_group_names has same length as src_vehicle_group_names.
Source code in tm2py/config.py
841 842 843 844 845 846 847 848 849 850 851 | |
DemandCountyGroupConfig
¶
Grouping of counties for assignment and demand files.
Properties
HighwayMazToMazConfig
¶
Highway MAZ to MAZ shortest path assignment and skim parameters.
Properties
Functions ¶
unique_group_numbers
¶unique_group_numbers(value)
Validate list of demand_county_groups has unique .number values.
Source code in tm2py/config.py
918 919 920 921 922 923 | |
HighwayConfig
¶
Highway assignment and skims parameters.
Properties
Functions ¶
valid_skim_template
¶valid_skim_template(value)
Validate skim template has correct {} and extension.
Source code in tm2py/config.py
983 984 985 986 987 988 989 990 991 992 | |
valid_skim_matrix_name_template
¶valid_skim_matrix_name_template(value)
Validate skim matrix template has correct {}.
Source code in tm2py/config.py
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 | |
unique_capclass_numbers
¶unique_capclass_numbers(value)
Validate list of capclass_lookup has unique .capclass values.
Source code in tm2py/config.py
1008 1009 1010 1011 1012 1013 1014 | |
unique_class_names
¶unique_class_names(value)
Validate list of classes has unique .name values.
Source code in tm2py/config.py
1016 1017 1018 1019 1020 1021 1022 | |
validate_class_mode_excluded_links
¶validate_class_mode_excluded_links(value, values)
Validate list of classes has unique .mode_code or .excluded_links match.
Source code in tm2py/config.py
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 | |
validate_class_keyword_lists
¶validate_class_keyword_lists(value, values)
Validate classes .skims, .toll, and .excluded_links values.
Source code in tm2py/config.py
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 | |
TransitModeConfig
¶
Transit mode definition (see also mode in the Emme API).
Functions ¶
in_vehicle_perception_factor_valid
¶in_vehicle_perception_factor_valid(value, values)
Validate in_vehicle_perception_factor exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1116 1117 1118 1119 1120 1121 | |
speed_or_time_factor_valid
¶speed_or_time_factor_valid(value, values)
Validate speed_or_time_factor exists if assign_type is AUX_TRANSIT.
Source code in tm2py/config.py
1123 1124 1125 1126 1127 1128 | |
initial_boarding_penalty_valid
¶initial_boarding_penalty_valid(value, values)
Validate initial_boarding_penalty exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1130 1131 1132 1133 1134 1135 | |
transfer_boarding_penalty_valid
¶transfer_boarding_penalty_valid(value, values)
Validate transfer_boarding_penalty exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1137 1138 1139 1140 1141 1142 | |
headway_fraction_valid
¶headway_fraction_valid(value, values)
Validate headway_fraction exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1144 1145 1146 1147 1148 1149 | |
transfer_wait_perception_factor_valid
¶transfer_wait_perception_factor_valid(value, values)
Validate transfer_wait_perception_factor exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1151 1152 1153 1154 1155 1156 | |
mode_id_valid
classmethod
¶mode_id_valid(value)
Validate mode_id.
Source code in tm2py/config.py
1158 1159 1160 1161 1162 1163 | |
TransitVehicleConfig
¶
Transit vehicle definition (see also transit vehicle in the Emme API).
TransitClassConfig
¶
Transit demand class definition.
ManualJourneyLevelsConfig
¶
Manual Journey Level Specification
TransitJourneyLevelsConfig
¶
Transit manual journey levels structure.
Attributes ¶
use_algorithm
class-attribute
instance-attribute
¶use_algorithm: bool = False
The original translation from Cube to Emme used an algorithm to, as faithfully as possible, reflect transfer fares via journey levels.
The algorithm examines fare costs and proximity of transit services to create a set of journey levels that reflects transfer costs.
While this algorithm works well, the Bay Area’s complex fare system results in numerous journey levels specific to operators with low ridership.
The resulting assignment compute therefore expends a lot of resources on these operators.
Set this parameter to True to use the algorithm. Exactly one of use_algorithm or specify_manually must be True.
specify_manually
class-attribute
instance-attribute
¶specify_manually: bool = False
An alternative to using an algorithm to specify the journey levels is to use specify them manually.
If this option is set to True, the manual parameter can be used to assign fare systems to faresystem groups (or journey levels).
Consider, for example, the following three journey levels: 0 - has yet to board transit; 1 - has boarded SF Muni; 2 - has boarded all other transit systems.
To specify this configuration, a single manual entry identifying the SF Muni fare systems is needed.
The other faresystem group is automatically generated in the code with the rest of the faresystems which are not specified in any of the groups.
See the manual entry for an example.
manual
class-attribute
instance-attribute
¶manual: Optional[Tuple[ManualJourneyLevelsConfig, ...]] = (ManualJourneyLevelsConfig(level_id=1, group_fare_systems=(25,)),)
If ‘specify_manually’ is set to True, there should be at least one faresystem group specified here.
The format includes two entries: level_id, which is the serial number of the group specified,
and group_fare_system, which is a list of all faresystems belonging to that group.
For example, to specify MUNI as one faresystem group, the right configuration would be:
[[transit.journey_levels.manual]]
level_id = 1
group_fare_systems = [25]
If there are multiple groups required to be specified, for example, MUNI in one and Caltrain in the other group,
it can be achieved by adding another entry of manual, like:
[[transit.journey_levels.manual]]
level_id = 1
group_fare_systems = [25][[transit.journey_levels.manual]]
level_id = 2
group_fare_systems = [12,14]
Functions ¶
check_exclusivity
¶check_exclusivity(v, values)
Valdiates that exactly one of specify_manually and use_algorithm is True
Source code in tm2py/config.py
1241 1242 1243 1244 1245 1246 1247 1248 | |
AssignmentStoppingCriteriaConfig
¶
Assignment stop configuration parameters.
CcrWeightsConfig
¶
Weights for CCR Configuration.
CongestedWeightsConfig
¶
Weights for Congested Transit Assignment Configuration.
EawtWeightsConfig
¶
Weights for calculating extra added wait time Configuration.
CongestedTransitMaxIteration
¶
Congested transit assignment time period specific max iteration parameters.
Properties
CongestedTransitStopCriteria
¶
Congested transit assignment stopping criteria parameters.
Properties
CongestedAssnConfig
¶
Congested transit assignment Configuration.
TransitConfig
¶
Transit assignment parameters.
HighwayDistribution
¶
Highway distribution run configuration. Use to enable distributing the assignment (running time periods in parallel).
Properties
NetworkSummaryConfig
¶
Network Summary Configuration.
Properties
PostProcessorConfig
¶
Post Processor Configuration.
EmmeConfig
¶
Emme-specific parameters.
Properties
Configuration
¶
Functions ¶
load_toml
classmethod
¶load_toml(toml_path: Union[List[Union[str, Path]], str, Path]) -> Configuration
Load configuration from .toml files(s).
Normally the config is split into a scenario_config.toml file and a model_config.toml file.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
toml_path
|
Union[List[Union[str, Path]], str, Path]
|
a valid system path string or Path object to a TOML format config file or list of paths of path objects to a set of TOML files. |
required |
Returns:
| Type | Description |
|---|---|
Configuration
|
A Configuration object |
Source code in tm2py/config.py
1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 | |
maz_skim_period_exists
¶maz_skim_period_exists(value, values)
Validate highway.maz_to_maz.skim_period refers to a valid period.
Source code in tm2py/config.py
1539 1540 1541 1542 1543 1544 1545 1546 1547 | |
relative_gap_length
¶relative_gap_length(value, values)
Validate highway.relative_gaps is a list of length greater or equal to global iterations.
Source code in tm2py/config.py
1549 1550 1551 1552 1553 1554 1555 1556 1557 | |
transit_stop_criteria_length
¶transit_stop_criteria_length(value, values)
Validate transit.congested.stop_criteria is a list of length greater or equal to global iterations.
Source code in tm2py/config.py
1559 1560 1561 1562 1563 1564 1565 1566 1567 | |
sample_rate_length
¶sample_rate_length(value, values)
Validate highway.sample_rate_by_iteration is a list of length greater or equal to global iterations.
Source code in tm2py/config.py
1569 1570 1571 1572 1573 1574 1575 1576 | |
Component-specific configurations are documented with their respective components below.
🏗️ Model Components ¶
The core building blocks of the transportation modeling system, organized by functional area.
Base Component Framework ¶
Abstract base classes and shared functionality for all model components.
tm2py.components.component
¶
Root component ABC.
Classes ¶
FileFormatError
¶
FileFormatError(f, *args)
Bases: Exception
Exception raised when a file is not in the expected format.
Exception for invalid file formats.
Source code in tm2py/components/component.py
19 20 21 22 | |
Component
¶
Component(controller: RunController)
Bases: ABC
Template for Component class with several built-in methods.
A component is a piece of the model that can be run independently (of other components) given the required input data and configuration. It communicates information to other components via disk I/O (including the emmebank).
Note: if the component needs data that is not written to disk, it would be considered a subcomponent.
Abstract Methods – Each component class must have the following methods: __init___: constructor, which associates the RunController with the instantiated object run: run the component without any arguments validate_inputs: validate the inputs to the component report_progress: report progress to the user verify: verify the component’s output write_top_sheet: write outputs to topsheet test_component: test the component
Template Class methods - component classes inherit
Template Class Properties - component classes inherit
:: class MyComponent(Component):
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Model component template/abstract base class.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Reference to the run controller object. |
required |
Source code in tm2py/components/component.py
79 80 81 82 83 84 85 86 87 88 | |
time_period_names
property
¶time_period_names: List[str]
Return input time_period name or names and return list of time_period names.
Implemented here for easy access for all components.
Returns: list of uppercased string names of time periods
time_period_durations
property
¶time_period_durations: dict
Return mapping of time periods to durations in hours.
congested_transit_assn_max_iteration
property
¶congested_transit_assn_max_iteration: dict
Return mapping of time periods to max iteration in congested transit assignment.
get_abs_path
¶get_abs_path(path: Union[Path, str]) -> str
Convenince method to get absolute path from run directory.
Source code in tm2py/components/component.py
99 100 101 102 103 104 | |
validate_inputs
abstractmethod
¶validate_inputs()
Validate inputs are correct at model initiation, raise on error.
Source code in tm2py/components/component.py
141 142 143 | |
run
abstractmethod
¶run()
Run model component.
Source code in tm2py/components/component.py
145 146 147 | |
report_progress
¶report_progress()
Write progress to log file.
Source code in tm2py/components/component.py
150 151 | |
verify
¶verify()
Verify component outputs / results.
Source code in tm2py/components/component.py
154 155 | |
write_top_sheet
¶write_top_sheet()
Write key outputs to the model top sheet.
Source code in tm2py/components/component.py
158 159 | |
Subcomponent
¶
Subcomponent(controller: RunController, component: Component)
Bases: Component
Template for sub-component class.
A sub-component is a more loosly defined component that allows for input into the run() method. It is used to break-up larger processes into smaller chunks which can be: (1) re-used across components (i.e toll choice) (2) updated/subbed in to a parent component(s) run method based on the expected API (3) easier to test, understand and debug. (4) more consistent with the algorithms we understand from transportation planning 101
Constructor for model sub-component abstract base class.
Only calls the super class constructor.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Reference to the run controller object. |
required |
component
|
Component
|
Reference to the parent component object. |
required |
Source code in tm2py/components/component.py
173 174 175 176 177 178 179 180 181 182 183 | |
run
abstractmethod
¶run(*args, **kwargs)
Run sub-component, allowing for multiple inputs.
Allowing for inputs to the run() method is what differentiates a sub-component from a component.
Source code in tm2py/components/component.py
185 186 187 188 189 190 191 | |
🚗 Demand Modeling Components ¶
Components responsible for generating travel demand from various sources.
Demand Preparation ¶
Foundational demand processing and preparation utilities.
tm2py.components.demand.prepare_demand
¶
Demand loading from OMX to Emme database.
Classes ¶
EmmeDemand
¶
EmmeDemand(controller: RunController)
Abstract base class to import and average demand.
Constructor for PrepareDemand class.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Run controller for the current run. |
required |
Source code in tm2py/components/demand/prepare_demand.py
30 31 32 33 34 35 36 37 38 39 | |
PrepareHighwayDemand
¶
PrepareHighwayDemand(controller: RunController)
Bases: EmmeDemand
Import and average highway demand.
Demand is imported from OMX files based on reference file paths and OMX matrix names in highway assignment config (highway.classes). The demand is average using MSA with the current demand matrices (in the Emmebank) if the controller.iteration > 1.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
parent RunController object |
required |
Constructor for PrepareHighwayDemand.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Reference to run controller object. |
required |
Source code in tm2py/components/demand/prepare_demand.py
149 150 151 152 153 154 155 156 157 158 | |
run
¶run()
Open combined demand OMX files from demand models and prepare for assignment.
Source code in tm2py/components/demand/prepare_demand.py
172 173 174 175 176 177 178 | |
prepare_household_demand
¶prepare_household_demand()
Prepares highway and transit household demand matrices from trip lists produced by CT-RAMP.
Source code in tm2py/components/demand/prepare_demand.py
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 | |
PrepareTransitDemand
¶
PrepareTransitDemand(controller: 'RunController')
Bases: EmmeDemand
Import transit demand.
Demand is imported from OMX files based on reference file paths and OMX matrix names in transit assignment config (transit.classes). The demand is average using MSA with the current demand matrices (in the Emmebank) if transit.apply_msa_demand is true if the controller.iteration > 1.
Constructor for PrepareTransitDemand.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
'RunController'
|
RunController object. |
required |
Source code in tm2py/components/demand/prepare_demand.py
606 607 608 609 610 611 612 613 614 615 | |
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/prepare_demand.py
617 618 | |
run
¶run()
Open combined demand OMX files from demand models and prepare for assignment.
Source code in tm2py/components/demand/prepare_demand.py
628 629 630 631 632 633 634 635 636 637 638 639 | |
Functions ¶
avg_matrix_msa
¶
avg_matrix_msa(prev_avg_matrix: NumpyArray, this_iter_matrix: NumpyArray, msa_iteration: int) -> NumpyArray
Average matrices based on Method of Successive Averages (MSA).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
prev_avg_matrix
|
NumpyArray
|
Previously averaged matrix |
required |
this_iter_matrix
|
NumpyArray
|
Matrix for this iteration |
required |
msa_iteration
|
int
|
MSA iteration |
required |
Returns:
| Name | Type | Description |
|---|---|---|
NumpyArray |
NumpyArray
|
MSA Averaged matrix for this iteration. |
Source code in tm2py/components/demand/prepare_demand.py
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | |
Household Travel Demand ¶
Personal travel demand generated by household members, including work, school, and discretionary trips.
Key Features
- Activity-based modeling approach
- Tour and trip generation
- Mode choice modeling
- Time-of-day distribution
tm2py.components.demand.household
¶
Placeholder docstring for CT-RAMP related components for household residents’ model.
Classes ¶
HouseholdModel
¶
HouseholdModel(controller: RunController)
Bases: Component
Run household resident model.
Source code in tm2py/components/component.py
79 80 81 82 83 84 85 86 87 88 | |
validate_inputs
¶validate_inputs()
Validates inputs for component.
Source code in tm2py/components/demand/household.py
16 17 18 | |
run
¶run()
Run the the household resident travel demand model.
Steps
- Starts household manager.
- Starts matrix manager.
- Starts resident travel model (CTRAMP).
- Cleans up CTRAMP java.
Source code in tm2py/components/demand/household.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
Functions ¶
Configuration:
tm2py.config.HouseholdConfig
¶
Household (residents) model parameters.
Air Passenger Demand ¶
Airport access and egress travel demand modeling.
tm2py.components.demand.air_passenger
¶
Module containing the AirPassenger class which builds the airport trip matrices.
Classes ¶
AirPassenger
¶
AirPassenger(controller: RunController)
Bases: Component
Builds the airport trip matrices.
input: nonres/{year}_{tofrom}{airport}.csv output: five time-of-day-specific OMX files with matrices DA, SR2, SR3
Notes: These are independent of level-of-service.
Note that the reference names, years, file paths and other key details are controlled via the config, air_passenger section. See the AirPassengerConfig doc for details on specifying these inputs.
The following details are based on the default config values.
Creates air passenger vehicle trip tables for the Bay Area’s three major airports, namely SFO, OAK, and SJC. Geoff Gosling, a consultant, created vehicle trip tables segmented by time of day, travel mode, and access/egress direction (i.e. to the airport or from the airport) for years 2007 and 2035. The tables are based on a 2006 Air Passenger survey, which was conducted at SFO and OAK (but not SJC).
The travel modes are as follows
(a) escort (drive alone, shared ride 2, and shared ride 3+) (b) park (da, sr2, & sr3+) © rental car (da, sr2, & sr3+) (d) taxi ((da, sr2, & sr3+) (e) limo (da, sr2, & sr3+) (f) shared ride van (all assumed to be sr3); (g) hotel shuttle (all assumed to be sr3); and, (h) charter bus (all assumed to be sr3).
The shared ride van, hotel shuttle, and charter bus modes are assumed to have no deadhead travel. The return escort trip is included, as are the deadhead limo and taxi trips.
The scripts reads in csv files adapted from Mr. Gosling’s Excel files, and creates a highway-assignment ready OMX matrix file for each time-of-day interval.
Assumes that no air passengers use HOT lanes (probably not exactly true in certain future year scenarios, but the assumption is made here as a simplification). Simple linear interpolations are used to estimate vehicle demand in years other than 2007 and 2035, including 2015, 2020, 2025, 2030, and 2040.
Transit travel to the airports is not included in these vehicle trip tables.
Input
Year-, access/egress-, and airport-specific database file with 90 columns of data for each TAZ. There are 18 columns for each time-of-day interval as follows: (1) Escort, drive alone (2) Escort, shared ride 2 (3) Escort, shared ride 3+ (4) Park, drive alone (5) Park, shared ride 2 (6) Park, shared ride 3+ (7) Rental car, drive alone (8) Rental car, shared ride 2 (9) Rental car, shared ride 3+ (10) Taxi, drive alone (11) Taxi, shared ride 2 (12) Taxi, shared ride 3+ (13) Limo, drive alone (14) Limo, shared ride 2 (15) Limo, shared ride 3+ (16) Shared ride van, shared ride 3+ (17) Hotel shuttle, shared ride 3+ (18) Charter bus, shared ride 3+
Five time-of-day-specific tables, each containing origin/destination vehicle matrices for the following modes: (1) drive alone (DA) (2) shared ride 2 (SR2) (3) shared ride 3+ (SR3)
Internal properties
_start_year _end_year _mode_groups: _out_names:
Build the airport trip matrices.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
parent Controller object |
required |
Source code in tm2py/components/demand/air_passenger.py
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | |
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/air_passenger.py
154 155 156 157 | |
run
¶run()
Run the Air Passenger Demand model to generate the demand matrices.
Steps
- Load the demand data from the CSV files.
- Aggregate the demand data into the assignable classes.
- Create the demand matrices be interpolating the demand data.
- Write the demand matrices to OMX files.
Source code in tm2py/components/demand/air_passenger.py
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | |
Functions ¶
Configuration:
tm2py.config.AirPassengerDemandAggregationConfig
¶
Air passenger demand aggregation input parameters.
Properties
Commercial Vehicle Demand ¶
Freight and commercial vehicle trip generation and distribution.
Commercial Vehicle Types
- Light commercial vehicles
- Medium trucks
- Heavy trucks
- Delivery vehicles
tm2py.components.demand.commercial
¶
Commercial vehicle / truck model module.
Classes ¶
CommercialVehicleModel
¶
CommercialVehicleModel(controller: RunController)
Bases: Component
Commercial Vehicle demand model.
Generates truck demand matrices from
- land use
- highway network impedances
- parameters
Segmented into four truck types
(1) very small trucks (two-axle, four-tire), (2) small trucks (two-axle, six-tire), (3) medium trucks (three-axle), (4) large or combination (four or more axle) trucks.
(1) MAZ csv data file with the employment and household counts.
(2) Skims (3) K-Factors (4)
Notes: (1) Based on the BAYCAST truck model, no significant updates. (2) Combined Chuck’s calibration adjustments into the NAICS-based model coefficients.
Constructor for the CommercialVehicleTripGeneration component.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Run controller for model run. |
required |
Source code in tm2py/components/demand/commercial.py
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | |
emmebank
property
¶emmebank
Reference to highway assignment Emmebank.
TODO This should really be in the controller? Or part of network.skims?
emme_scenario
property
¶emme_scenario
Return emme scenario from emmebank.
Use first valid scenario for reference Zone IDs.
TODO This should really be in the controller? Or part of network.skims?
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/commercial.py
120 121 | |
run
¶run()
Run commercial vehicle model.
Source code in tm2py/components/demand/commercial.py
124 125 126 127 128 129 130 131 132 133 134 135 136 137 | |
CommercialVehicleTripGeneration
¶
CommercialVehicleTripGeneration(controller: RunController, component: Component)
Bases: Subcomponent
Commercial vehicle (truck) Trip Generation for 4 sizes of truck.
The four truck types are
(1) very small trucks (two-axle, four-tire), (2) small trucks (two-axle, six-tire), (3) medium trucks (three-axle), (4) large or combination (four or more axle) trucks.
Trip generation ¶
Use linear regression models to generate trip ends, balancing attractions to productions. Based on BAYCAST truck model.
The truck trip generation models for small trucks (two-axle, six tire), medium trucks (three-axle), and large or combination (four or more axle) trucks are taken directly from the study: “I-880 Intermodal Corridor Study: Truck Travel in the San Francisco Bay Area”, prepared by Barton Aschman in December 1992. The coefficients are on page 223 of this report.
The very small truck generation model is based on the Phoenix four-tire truck model documented in the TMIP Quick Response Freight Manual.
Note that certain production models previously used SIC-based employment categories. To both maintain consistency with the BAYCAST truck model and update the model to use NAICS-based employment categories, new regression models were estimated relating the NAICS-based employment data with the SIC-based-predicted trips. The goal here is not to create a new truck model, but to mimic the old model with the available data. Please see the excel spreadsheet TruckModel.xlsx for details. The NAICS-based model results replicate the SIC-based model results quite well.
Constructor for the CommercialVehicleTripGeneration component.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Run controller for model run. |
required |
component
|
Component
|
Parent component of sub-component |
required |
Source code in tm2py/components/demand/commercial.py
222 223 224 225 226 227 228 229 230 | |
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/commercial.py
232 233 234 235 | |
run
¶run()
Run commercial vehicle trip distribution.
Source code in tm2py/components/demand/commercial.py
237 238 239 240 241 242 243 244 | |
CommercialVehicleTripDistribution
¶
CommercialVehicleTripDistribution(controller: RunController, component: Component)
Bases: Subcomponent
Commercial vehicle (truck) Trip Distribution for 4 sizes of truck.
The four truck types are
(1) very small trucks (two-axle, four-tire), (2) small trucks (two-axle, six-tire), (3) medium trucks (three-axle), (4) large or combination (four or more axle) trucks.
(1) Trips by 4 truck sizes
(2) highway skims for truck, time, distance, bridgetoll and value toll (3) friction factors lookup table (4) k-factors matrix
A simple gravity model is used to distribute the truck trips, with separate friction factors used for each class of truck.
A blended travel time is used as the impedance measure, specifically the weighted average of the AM travel time (one-third weight) and the midday travel time (two-thirds weight).
Input
Level-of-service matrices for the AM peak period (6 am to 10 am) and midday period (10 am to 3 pm) which contain truck-class specific estimates of congested travel time (in minutes)
A matrix of k-factors, as calibrated by Chuck Purvis. Note the very small truck model does not use k-factors; the small, medium, and large trucks use the same k-factors.
A table of friction factors in text format with the following fields, space separated: - impedance measure (blended travel time); - friction factors for very small trucks; - friction factors for small trucks; - friction factors for medium trucks; and, - friction factors for large trucks.
Notes on distribution steps
load nonres/truck_kfactors_taz.csv load nonres/truckFF.dat Apply friction factors and kfactors to produce balancing matrix apply the gravity models using friction factors from nonres/truckFF.dat (note the very small trucks do not use the K-factors) Can use Emme matrix balancing for this - important note: reference matrices by name and ensure names are unique Trips rounded to 0.01, causes some instability in results
Notes: (1) Based on the BAYCAST truck model, no significant updates. (2) Combined Chuck’s calibration adjustments into the NAICS-based model coefficients.
Constructor for the CommercialVehicleTripDistribution component.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Run controller for model run. |
required |
component
|
Component
|
Parent component of sub-component |
required |
Source code in tm2py/components/demand/commercial.py
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 | |
k_factors
property
¶k_factors
Zone-to-zone values of truck K factors.
Returns:
| Name | Type | Description |
|---|---|---|
NumpyArray |
Zone-to-zone values of truck K factors. |
friction_factors
property
¶friction_factors
Table of friction factors for each time band by truck class.
Returns:
| Type | Description |
|---|---|
|
pd.DataFrame: DataFrame of friction factors read from disk. |
blended_skims
¶blended_skims(mode: str)
Get blended skim. Creates it if doesn’t already exist.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mode
|
str
|
Mode for skim |
required |
Returns:
| Name | Type | Description |
|---|---|---|
_type_ |
description |
Source code in tm2py/components/demand/commercial.py
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 | |
friction_factor_matrices
¶friction_factor_matrices(trk_class: str, k_factors: Union[None, NumpyArray] = None) -> NumpyArray
Zone to zone NumpyArray of impedances for a given truck class.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
trk_class
|
str
|
Truck class abbreviated name |
required |
k_factors
|
Union[None, NumpyArray]
|
If not None, gives an zone-by-zone array of k-factors–additive impedances to be added on top of friciton factors. Defaults to None. |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
NumpyArray |
NumpyArray
|
Zone-by-zone matrix of friction factors |
Source code in tm2py/components/demand/commercial.py
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 | |
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/commercial.py
629 630 631 632 | |
run
¶run(tripends_df) -> Dict[str, NumpyArray]
Run commercial vehicle trip distribution.
Source code in tm2py/components/demand/commercial.py
634 635 636 637 638 639 640 641 | |
CommercialVehicleTimeOfDay
¶
CommercialVehicleTimeOfDay(controller: RunController, component: Component)
Bases: Subcomponent
Commercial vehicle (truck) Time of Day Split for 4 sizes of truck.
Input: Trips origin and destination matrices by 4 truck sizes Ouput: 20 trips origin and destination matrices by 4 truck sizes by 5 times periods
Note
The diurnal factors are taken from the BAYCAST-90 model with adjustments made
during calibration to the very small truck values to better match counts.
Constructor for the CommercialVehicleTimeOfDay component.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Run controller for model run. |
required |
component
|
Component
|
Parent component of sub-component |
required |
Source code in tm2py/components/demand/commercial.py
767 768 769 770 771 772 773 774 775 776 777 778 779 780 | |
class_period_splits
property
¶class_period_splits
Returns split fraction dictonary mapped to [time period class][time period].
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/commercial.py
807 808 809 810 | |
run
¶run(daily_demand: Dict[str, NumpyArray]) -> Dict[str, Dict[str, NumpyArray]]
Splits the daily demand by time of day based on factors in the config.
Uses self.config.truck.classes.{class_name}.time_of_day_split to split the daily demand.
TODO use TimePeriodSplit ¶
Args: daily_demand: dictionary of truck type name to numpy array of truck type daily demand
Returns:
| Type | Description |
|---|---|
Dict[str, Dict[str, NumpyArray]]
|
Nested dictionary of truck class: time period name => numpy array of demand |
Source code in tm2py/components/demand/commercial.py
812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 | |
CommercialVehicleTollChoice
¶
CommercialVehicleTollChoice(controller, component)
Bases: Subcomponent
Commercial vehicle (truck) toll choice.
A binomial choice model for very small, small, medium, and large trucks. A separate value toll paying versus no value toll paying path choice model is applied to each of the twenty time period and vehicle type combinations.
(1) Trip tables by time of day and truck class
(2) Skims providing the time and cost for value toll and non-value toll paths for each; the matrix names in the OMX files are: “{period}{cls_name}_time” “{period}{cls_name}dist” “{period}{cls_name}bridgetoll{grp_name}” “{period}{cls_name}toll_time” “{period}{cls_name}toll_dist” “{period}{cls_name}toll_bridgetoll{grp_name}” “{period}_{cls_name}toll_valuetoll{grp_name}” Where period is the assignment period, cls_name is the truck assignment class name (as very small, small and medium truck are assigned as the same class) and grp_name is the truck type name (as the tolls are calculated separately for very small, small and medium).
(1) TOLLCLASS is a code, 1 through 10 are reserved for bridges; 11 and up is
reserved for value toll facilities.
1 2 3 4 5 6 7 | |
Constructor for Commercial Vehicle Toll Choice.
Also calls Subclass init().
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
model run controller |
required | |
component
|
parent component |
required |
Source code in tm2py/components/demand/commercial.py
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 | |
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/demand/commercial.py
902 903 904 905 | |
run
¶run(trkclass_tp_demand_dict)
Split per-period truck demands into nontoll and toll classes.
Uses OMX skims output from highway assignment: traffic_skims_{period}.omx
Source code in tm2py/components/demand/commercial.py
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 | |
Functions ¶
Configuration:
tm2py.config.TruckConfig
¶
Truck model parameters.
Attributes ¶
highway_demand_file
instance-attribute
¶highway_demand_file: str
@validator(“classes”) def class_consistency(cls, v, values): # TODO Can’t get to work righ tnow _class_names = [c.name for c in v] _gen_classes = [c.name for c in values[“trip_gen”]] _dist_classes = [c.name for c in values[“trip_dist”]] _time_classes = [c.name for c in values[“time_split”]] _toll_classes = [c.name for c in values[“toll_choice”]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Inter-regional Demand ¶
External travel demand entering and leaving the model region.
tm2py.components.demand.internal_external
¶
Module containing Internal <-> External trip model.
Classes ¶
InternalExternal
¶
InternalExternal(controller: 'RunController')
Bases: Component
Develop Internal <-> External trip tables from land use and impedances.
- Grow demand from base year using static rates ::ExternalDemand
- Split by time of day using static factors ::TimePeriodSplit
- Apply basic toll binomial choice model: ::ExternalTollChoice
Governed by InternalExternalConfig
Source code in tm2py/components/demand/internal_external.py
46 47 48 49 50 51 52 53 54 55 56 | |
validate_inputs
¶validate_inputs()
Validate inputs to component.
Source code in tm2py/components/demand/internal_external.py
62 63 64 65 | |
run
¶run()
Run internal/external travel demand component.
Source code in tm2py/components/demand/internal_external.py
67 68 69 70 71 72 73 74 | |
ExternalDemand
¶
ExternalDemand(controller, component)
Bases: Subcomponent
Forecast of daily internal<->external demand based on growth from a base year.
Create a daily matrix that includes internal/external, external/internal, and external/external passenger vehicle travel (based on Census 2000 journey-to-work flows). These trip tables are based on total traffic counts, which include trucks, but trucks are not explicitly segmented from passenger vehicles. This short-coming is a hold-over from BAYCAST and will be addressed in the next model update.
The row and column totals are taken from count station data provided by Caltrans. The BAYCAST 2006 IX matrix is used as the base matrix and scaled to match forecast year growth assumptions. The script generates estimates for the model forecast year; the growth rates were discussed with neighboring MPOs as part of the SB 375 target setting process.
Input: (1) Station-specific assumed growth rates for each forecast year (the lack of external/external movements through the region allows simple factoring of cells without re-balancing); (2) An input base matrix derived from the Census journey-to-work data.
Output: (1) Four-table, forecast-year specific trip tables containing internal/external, external/internal, and external/external vehicle (xxx or person xxx) travel.
Governed by class DemandGrowth Config:
highway_demand_file:
input_demand_file:
input_demand_matrixname_tmpl:
modes:
reference_year:
annual_growth_rate:
special_gateway_adjust:
Source code in tm2py/components/demand/internal_external.py
127 128 129 130 131 | |
run
¶run(base_demand: Dict[str, NumpyArray] = None) -> Dict[str, NumpyArray]
Calculate adjusted demand based on scenario year and growth rates.
Steps: - 1.1 apply special factors to certain gateways based on ID - 1.2 apply gateway-specific annual growth rates to results of step 1 to generate year specific forecast
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
demand
|
dictionary of input daily demand matrices (numpy arrays) |
required |
Returns:
| Type | Description |
|---|---|
Dict[str, NumpyArray]
|
Dictionary of Numpy matrices of daily PA by class mode |
Source code in tm2py/components/demand/internal_external.py
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
ExternalTollChoice
¶
ExternalTollChoice(controller, component)
Bases: Subcomponent
Toll choice ¶
Apply a binomial choice model for drive alone, shared ride 2, and shared ride 3 internal/external personal vehicle travel.
(1) Time-period-specific origin/destination matrices of drive alone, shared ride 2,
and share ride 3+ internal/external trip tables.
1 2 3 4 5 6 7 8 9 10 11 | |
Output: Five, six-table trip matrices, one for each time period. Two tables for each vehicle class representing value-toll paying path trips and non-value-toll paying path trips
Governed by TollClassConfig:
1 2 3 4 5 6 7 8 | |
Source code in tm2py/components/demand/internal_external.py
239 240 241 242 243 244 245 246 247 248 249 250 251 252 | |
run
¶run(period_demand: Dict[str, Dict[str, NumpyArray]]) -> Dict[str, Dict[str, NumpyArray]]
Binary toll / non-toll choice model by class.
input: result of ix_time_of_day skims: traffic_skims{period}.omx, where {period} is the time period ID, {class} is the class name da, sr2, sr2, with the following matrix names Non-value-toll paying time: {period}{class}_time, Non-value-toll distance: {period}{class}dist, Non-value-toll bridge toll is: {period}{class}bridgetoll{class}, Value-toll paying time is: {period}{class}toll_time, Value-toll paying distance is: {period}{class}toll_dist, Value-toll bridge toll is: {period}{class}toll_bridgetoll{class}, Value-toll value toll is: {period}{class}toll_valuetoll{class},
STEPS: 3.1: For each time of day, for each da, sr2, sr3, calculate - utility of toll and nontoll - probability of toll / nontoll - split demand into toll and nontoll matrices
Source code in tm2py/components/demand/internal_external.py
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 | |
Functions ¶
Configuration:
tm2py.config.InternalExternalConfig
¶
Internal <-> External model parameters.
Visitor Demand ¶
Tourist and visitor travel patterns within the region.
tm2py.components.demand.visitor
¶
Visitor module.
🛣️ Highway Network Components ¶
Components for highway network modeling, assignment, and analysis.
Highway Modeling Workflow
- Network Building: Load and process highway network data
- MAZ Connectivity: Connect micro-zones to highway access points
- Traffic Assignment: Assign vehicle trips to network links
- Performance Analysis: Calculate travel times, speeds, and congestion
Highway Network Management ¶
Core highway network data structures and utilities.
tm2py.components.network.highway.highway_network
¶
Module for highway network preparation steps.
Creates required attributes and populates input values needed for highway assignments. The toll values, VDFs, per-class cost (tolls+operating costs), modes and skim link attributes are calculated.
The following link attributes are used as input
- “@capclass”: link capclass index
- “length”: standard link length, in miles
- “@tollbooth”: label to separate bridgetolls from valuetolls
- “@tollseg”: toll segment, used to index toll value lookups from the toll file (under config.highway.tolls.file_path)
- “@ft”: functional class, used to assign VDFs
The following keys and tables are used from the config
highway.tolls.file_path: relative path to input toll file highway.tolls.src_vehicle_group_names: names used in tolls file for toll class values highway.tolls.dst_vehicle_group_names: corresponding names used in network attributes toll classes highway.tolls.valuetoll_start_tollbooth_code: index to split point bridge tolls (< this value) from distance value tolls (>= this value) highway.classes: the list of assignment classes, see the notes under highway_assign for detailed explanation highway.capclass_lookup: the lookup table mapping the link @capclass setting to capacity (@capacity), free_flow_speed (@free_flow_speec) and critical_speed (used to calculate @ja for akcelik type functions) highway.generic_highway_mode_code: unique (with other mode_codes) single character used to label entire auto network in Emme highway.maz_to_maz.mode_code: unique (with other mode_codes) single character used to label MAZ local auto network including connectors
The following link attributes are created (overwritten) and are subsequently used in the highway assignments. - “@flow_XX”: link PCE flows per class, where XX is the class name in the config - “@maz_flow”: Assigned MAZ-to-MAZ flow
The following attributes are calculated
- vdf: volume delay function to use
- “@capacity”: total link capacity
- “@ja”: akcelik delay parameter
- “@hov_length”: length with HOV lanes
- “@toll_length”: length with tolls
- “@bridgetoll_YY”: the bridge toll for class subgroup YY
- “@valuetoll_YY”: the “value”, non-bridge toll for class subgroup YY
- “@cost_YY”: total cost for class YY
Classes ¶
PrepareNetwork
¶
PrepareNetwork(controller: RunController)
Bases: Component
Highway network preparation.
Constructor for PPrepareNetwork.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Reference to run controller object. |
required |
Source code in tm2py/components/network/highway/highway_network.py
66 67 68 69 70 71 72 73 74 75 76 | |
run
¶run()
Run network preparation step.
Source code in tm2py/components/network/highway/highway_network.py
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | |
validate_inputs
¶validate_inputs()
Validate inputs files are correct, raise if an error is found.
Source code in tm2py/components/network/highway/highway_network.py
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | |
Highway Traffic Assignment ¶
Traffic assignment algorithms and congestion modeling.
tm2py.components.network.highway.highway_assign
¶
Highway assignment and skim component.
Performs equilibrium traffic assignment and generates resulting skims. The assignmend is configured using the “highway” table in the source config. See the config documentation for details. The traffic assignment runs according to the list of assignment classes under highway.classes.
Other relevant parameters from the config are: - emme.num_processors: number of processors as integer or “MAX” or “MAX-N” - time_periods[].emme_scenario_id: Emme scenario number to use for each period - time_periods[].highway_capacity_factor
The Emme network must have the following attributes available:
Link - attributes: - “length” in feet - “vdf”, volume delay function (volume delay functions must also be setup) - “@useclass”, vehicle-class restrictions classification, auto-only, HOV only - “@free_flow_time”, the free flow time (in minutes) - “@tollXX_YY”, the toll for period XX and class subgroup (see truck class) named YY, used together with @tollbooth to generate @bridgetoll_YY and @valuetoll_YY - “@maz_flow”, the background traffic MAZ-to-MAZ SP assigned flow from highway_maz, if controller.iteration > 0 - modes: must be set on links and match the specified mode codes in the traffic config
Network results - attributes: - @flow_XX: link PCE flows per class, where XX is the class name in the config - timau: auto travel time - volau: total assigned flow in PCE
Notes: - Output matrices are in miles, minutes, and cents (2010 dollars) and are stored/ as real values; - Intrazonal distance/time is one half the distance/time to the nearest neighbor; - Intrazonal bridge and value tolls are assumed to be zero
Classes ¶
HighwayAssignment
¶
HighwayAssignment(controller: 'RunController')
Bases: Component
Highway assignment and skims. Args: controller: parent RunController object
Constructor for HighwayAssignment components.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Reference to current run controller. |
required |
Source code in tm2py/components/network/highway/highway_assign.py
76 77 78 79 80 81 82 83 84 85 86 | |
highway_emmebank
property
¶highway_emmebank
The ProxyEmmebank object connect to the EMMEBANK for the highway assignment.
validate_inputs
¶validate_inputs()
Validate inputs files are correct, raise if an error is found.
Source code in tm2py/components/network/highway/highway_assign.py
108 109 | |
run
¶run()
Run highway assignment.
Source code in tm2py/components/network/highway/highway_assign.py
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | |
run_in_process
¶run_in_process(times: List[str], num_processors: Union[int, str])
Start highway assignments in same process
Source code in tm2py/components/network/highway/highway_assign.py
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | |
setup_process_launchers
¶setup_process_launchers(distribution)
Setup (copy data) databases for running assignments in separate processes
Source code in tm2py/components/network/highway/highway_assign.py
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | |
start_proccesses
¶start_proccesses(launchers)
Start separate processes for running assignments
Source code in tm2py/components/network/highway/highway_assign.py
182 183 184 185 186 187 188 189 | |
AssignmentLauncher
¶
AssignmentLauncher(emmebank: Emmebank, iteration: int)
Bases: BaseAssignmentLauncher
Manages Emme-related data (matrices and scenarios) for multiple time periods and kicks off assignment in a subprocess.
Source code in tm2py/emme/manager.py
551 552 553 554 555 556 557 558 559 560 561 562 | |
AssignmentRunner
¶
AssignmentRunner(project_path: str, emmebank_path: str, scenario_id: Union[str, int], time: str, iteration: int, assign_spec: Dict, demand_matrices: List[str], skim_matrices: List[str], omx_file_path: str, logger=None)
Constructor to run the highway assignment for the specified time period.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
project_path
|
str
|
path to existing EMME project (*.emp file) |
required |
emmebank_path
|
str
|
path to existing EMME databsae (emmebank) file |
required |
scenario_id
|
str
|
existing scenario ID for assignment run |
required |
time
|
str
|
time period ID (only used for logging messages) |
required |
iteration
|
List[str]
|
global iteration number |
required |
assign_spec
|
Dict
|
EMME SOLA assignment specification |
required |
skim_matrices
|
List[str]
|
list of skim matrix ID. |
required |
omx_file_path
|
str
|
path to resulting output of skim matrices to OMX |
required |
logger
|
Logger
|
optional logger object if running in process. If not specified a new logger reference is created. |
None
|
Source code in tm2py/components/network/highway/highway_assign.py
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 | |
assign_spec_no_analysis
property
¶assign_spec_no_analysis
Return modified SOLA assignment specification with no analyses.
run
¶run()
Run time period highway assignment
Source code in tm2py/components/network/highway/highway_assign.py
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 | |
Highway-MAZ Connectivity ¶
Micro-zone access point connections to the highway network.
tm2py.components.network.highway.highway_maz
¶
Assigns and skims MAZ-to-MAZ demand along shortest generalized cost path.
MAZ to MAZ demand is read in from separate OMX matrices as defined under the config table highway.maz_to_maz.demand_county_groups,
The demand is expected to be short distance (e.g. <0.5 miles), or within the same TAZ. The demand is grouped into bins of origin -> all destinations, by distance (straight-line) to furthest destination. This limits the size of the shortest path calculated to the minimum required. The bin edges have been predefined after testing as (in miles): [0.0, 0.9, 1.2, 1.8, 2.5, 5.0, 10.0, max_dist]
Input: Emme network with: Link attributes: - time attribute, either timau (resulting VDF congested time) or @free_flow_time Node attributes: @maz_id, x, y, and #node_county Demand matrices under highway.maz_to_maz.demand_file, and can have a placeholder auto_{period}MAZ_AUTO{number}_{period}.omx
Output: The resulting MAZ-MAZ flows are saved in link @maz_flow which is used as background traffic in the equilibrium Highway assignment.
Classes ¶
AssignMAZSPDemand
¶
AssignMAZSPDemand(controller: RunController)
Bases: Component
MAZ-to-MAZ shortest-path highway assignment.
Calculates shortest path between MAZs with demand in the Emme network and assigns flow.
MAZ-to-MAZ shortest-path highway assignment.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
parent Controller object |
required |
Source code in tm2py/components/network/highway/highway_maz.py
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | |
validate_inputs
¶validate_inputs()
Validate inputs files are correct, raise if an error is found.
Source code in tm2py/components/network/highway/highway_maz.py
110 111 112 113 | |
run
¶run()
Run MAZ-to-MAZ shortest path assignment.
Source code in tm2py/components/network/highway/highway_maz.py
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | |
SkimMAZCosts
¶
SkimMAZCosts(controller: RunController)
Bases: Component
MAZ-to-MAZ shortest-path skim of time, distance and toll.
MAZ-to-MAZ shortest-path skim of time, distance and toll.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
parent RunController object |
required |
Source code in tm2py/components/network/highway/highway_maz.py
670 671 672 673 674 675 676 677 678 679 680 681 | |
validate_inputs
¶validate_inputs()
Validate inputs files are correct, raise if an error is found.
Source code in tm2py/components/network/highway/highway_maz.py
695 696 697 698 | |
run
¶run()
Run shortest path skims for all available MAZ-to-MAZ O-D pairs.
Runs a shortest path builder for each county, using a maz_skim_cost to limit the search. The valid gen cost (time + cost), distance and toll (drive alone) are written to CSV at the output_skim_file path: FROM_ZONE, TO_ZONE, COST, DISTANCE, BRIDGETOLL
The following config inputs are used directly in this component. Note also that the network mode_code is prepared in the highway_network component using the excluded_links.
config.highway.maz_to_maz: skim_period: name of the period used for the skim, must match one the defined config.time_periods demand_county_groups: used for the list of counties, creates a list out of all listed counties under [].counties output_skim_file: relative path to save the skims value_of_time: value of time used to convert tolls and auto operating cost operating_cost_per_mile: auto operating cost max_skim_cost: max cost value used to limit the shortest path search mode_code:
Source code in tm2py/components/network/highway/highway_maz.py
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 | |
Highway Configuration Classes ¶
tm2py.config.HighwayConfig
¶
Highway assignment and skims parameters.
Properties
Functions ¶
valid_skim_template
¶
valid_skim_template(value)
Validate skim template has correct {} and extension.
Source code in tm2py/config.py
983 984 985 986 987 988 989 990 991 992 | |
valid_skim_matrix_name_template
¶
valid_skim_matrix_name_template(value)
Validate skim matrix template has correct {}.
Source code in tm2py/config.py
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 | |
unique_capclass_numbers
¶
unique_capclass_numbers(value)
Validate list of capclass_lookup has unique .capclass values.
Source code in tm2py/config.py
1008 1009 1010 1011 1012 1013 1014 | |
unique_class_names
¶
unique_class_names(value)
Validate list of classes has unique .name values.
Source code in tm2py/config.py
1016 1017 1018 1019 1020 1021 1022 | |
validate_class_mode_excluded_links
¶
validate_class_mode_excluded_links(value, values)
Validate list of classes has unique .mode_code or .excluded_links match.
Source code in tm2py/config.py
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 | |
validate_class_keyword_lists
¶
validate_class_keyword_lists(value, values)
Validate classes .skims, .toll, and .excluded_links values.
Source code in tm2py/config.py
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 | |
tm2py.config.HighwayClassConfig
¶
Highway assignment class definition.
Note that excluded_links, skims and toll attribute names include vehicle groups (“{vehicle}”) which reference the list of highway.toll.dst_vehicle_group_names (see HighwayTollsConfig). The default example model config uses: “da”, “sr2”, “sr3”, “vsm”, sml”, “med”, “lrg”
Example single class config
name = “da” description= “drive alone” mode_code= “d” [[highway.classes.demand]] source = “household” name = “SOV_GP_{period}” [[highway.classes.demand]] source = “air_passenger” name = “da” [[highway.classes.demand]] source = “internal_external” name = “da” excluded_links = [“is_toll_da”, “is_sr2”], value_of_time = 18.93, # $ / hr operating_cost_per_mile = 17.23, # cents / mile toll = [“@bridgetoll_da”] skims = [“time”, “dist”, “freeflowtime”, “bridgetoll_da”],
Properties
tm2py.config.HighwayTollsConfig
¶
Highway assignment and skim input tolls and related parameters.
Properties
Functions ¶
dst_vehicle_group_names_length
¶
dst_vehicle_group_names_length(value, values)
Validate dst_vehicle_group_names has same length as src_vehicle_group_names.
Source code in tm2py/config.py
841 842 843 844 845 846 847 848 849 850 851 | |
tm2py.config.DemandCountyGroupConfig
¶
Grouping of counties for assignment and demand files.
Properties
tm2py.config.HighwayMazToMazConfig
¶
Highway MAZ to MAZ shortest path assignment and skim parameters.
Properties
Functions ¶
unique_group_numbers
¶
unique_group_numbers(value)
Validate list of demand_county_groups has unique .number values.
Source code in tm2py/config.py
918 919 920 921 922 923 | |
🚌 Transit Network Components ¶
Public transit system modeling including bus, rail, ferry, and other transit modes.
Transit Modeling Workflow
- Network Definition: Transit lines, stops, and schedules
- Service Patterns: Frequency, capacity, and routing
- Path Building: Transit path enumeration and choice
- Assignment: Passenger flow assignment to transit services
Transit Assignment ¶
Transit passenger assignment and capacity analysis.
tm2py.components.network.transit.transit_assign
¶
Transit assignment module.
Classes ¶
TransitAssignment
¶
TransitAssignment(controller: 'RunController')
Bases: Component
Run transit assignment.
Constructor for TransitAssignment.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
'RunController'
|
RunController object. |
required |
Source code in tm2py/components/network/transit/transit_assign.py
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 | |
validate_inputs
¶validate_inputs()
Validate the inputs.
Source code in tm2py/components/network/transit/transit_assign.py
422 423 | |
run
¶run()
Run transit assignments.
Source code in tm2py/components/network/transit/transit_assign.py
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 | |
TransitAssignmentClass
¶
TransitAssignmentClass(tclass_config: TransitClassConfig, config: TransitConfig, time_period: str, iteration: int, num_processors: int, fare_modes: Dict[str, Set[str]], spec_dir: str)
Transit assignment class, represents data from config and conversion to Emme specs.
Internal properties
Assignment class constructor.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tclass_config
|
TransitClassConfig
|
the transit class config (TransitClassConfig) |
required |
config
|
TransitConfig
|
the root transit assignment config (TransitConfig) |
required |
time_period
|
str
|
the time period name |
required |
iteration
|
int
|
the current iteration |
required |
num_processors
|
int
|
the number of processors to use, loaded from config |
required |
fare_modes
|
Dict[str, Set[str]]
|
the mapping from the generated fare mode ID to the original source mode ID |
required |
spec_dir
|
str
|
directory to find the generated journey levels tables from the apply fares step |
required |
Source code in tm2py/components/network/transit/transit_assign.py
1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 | |
Functions ¶
time_period_capacity
¶
time_period_capacity(vehicle_capacity: float, headway: float, time_period_duration: float) -> float
summary
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
vehicle_capacity
|
float
|
Vehicle capacity per hour. For vehicles with multiple cars (i.e. trainsets), should be the capacity of all of them that are traveling together. |
required |
headway
|
float
|
Vehicle (or train sets) per hour. |
required |
time_period_duration
|
float
|
duration of the time period in minutes |
required |
Returns:
| Name | Type | Description |
|---|---|---|
float |
float
|
capacity for the whole time period |
Source code in tm2py/components/network/transit/transit_assign.py
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | |
func_returns_crowded_segment_cost
¶
func_returns_crowded_segment_cost(time_period_duration, weights: CcrWeightsConfig)
function that returns the calc_segment_cost function for emme assignment, with partial preloaded parameters acts like partial as emme does not take partial
Source code in tm2py/components/network/transit/transit_assign.py
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | |
func_returns_segment_congestion
¶
func_returns_segment_congestion(time_period_duration, scenario, weights: CongestedWeightsConfig, use_fares: bool = False)
function that returns the calc_segment_cost function for emme assignment, with partial preloaded parameters acts like partial as emme does not take partial
Source code in tm2py/components/network/transit/transit_assign.py
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | |
calc_total_offs
¶
calc_total_offs(line) -> float
Calculate total alightings for a line.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
line
|
_type_
|
description |
required |
Source code in tm2py/components/network/transit/transit_assign.py
196 197 198 199 200 201 202 203 204 205 206 207 208 | |
calc_offs_thru_segment
¶
calc_offs_thru_segment(segment) -> float
summary
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
segment
|
_type_
|
description |
required |
Returns:
| Name | Type | Description |
|---|---|---|
float |
float
|
description |
Source code in tm2py/components/network/transit/transit_assign.py
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 | |
calc_extra_wait_time
¶
calc_extra_wait_time(segment, segment_capacity: float, eawt_weights, mode_config: dict, use_fares: bool = False)
Calculate extra added wait time based on…
TODO document fully. ¶
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
segment
|
_type_
|
Emme transit segment object. |
required |
segment_capacity
|
float
|
description |
required |
eawt_weights
|
extra added wait time weights |
required | |
mode_config
|
dict
|
mode character to mode config |
required |
use_fares
|
bool
|
description. Defaults to False. |
False
|
Returns:
| Name | Type | Description |
|---|---|---|
_type_ |
description |
Source code in tm2py/components/network/transit/transit_assign.py
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | |
calc_adjusted_headway
¶
calc_adjusted_headway(segment, segment_capacity: float) -> float
Headway adjusted based on ....?
TODO: add documentation about source and theory behind this.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
segment
|
Emme transit segment object |
required | |
segment_capacity
|
float
|
description |
required |
Returns:
| Name | Type | Description |
|---|---|---|
float |
float
|
Adjusted headway |
Source code in tm2py/components/network/transit/transit_assign.py
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | |
func_returns_calc_updated_perceived_headway
¶
func_returns_calc_updated_perceived_headway(time_period_duration, eawt_weights, mode_config, use_fares)
function that returns the calc_headway function for emme assignment, with partial preloaded parameters acts like partial as emme does not take partial
Source code in tm2py/components/network/transit/transit_assign.py
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 | |
Transit Skimming ¶
Travel time and cost matrix generation for transit services.
tm2py.components.network.transit.transit_skim
¶
Transit skims module.
Classes ¶
TransitSkim
¶
TransitSkim(controller: 'RunController')
Bases: Component
Transit skim calculation methods.
Constructor for TransitSkim class.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
'RunController'
|
The RunController instance. |
required |
Source code in tm2py/components/network/transit/transit_skim.py
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | |
skim_properties
property
¶skim_properties
List of Skim Property named tuples: name, description.
TODO put these in config.
skim_outputs
property
¶skim_outputs
List of Skim Property named tuples: name, description.
TODO put these in config.
validate_inputs
¶validate_inputs()
Validate inputs.
Source code in tm2py/components/network/transit/transit_skim.py
54 55 56 57 | |
run
¶run()
Run transit skims.
Source code in tm2py/components/network/transit/transit_skim.py
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | |
emmebank_skim_matrices
¶emmebank_skim_matrices(time_periods: List[str] = None, transit_classes=None, skim_properties: Skimproperty = None) -> dict
Gets skim matrices from emmebank, or lazily creates them if they don’t already exist.
Source code in tm2py/components/network/transit/transit_skim.py
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | |
run_skim_set
¶run_skim_set(time_period: str, transit_class: str)
Run the transit skim calculations for a given time period and assignment class.
Results are stored in transit emmebank.
Steps
- determine if using transit capacity constraint
- skim walk, wait time, boardings, and fares
- skim in vehicle time by mode
- mask transfers above max amount
- mask if doesn’t have required modes
Source code in tm2py/components/network/transit/transit_skim.py
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | |
skim_walk_wait_boards_fares
¶skim_walk_wait_boards_fares(time_period: str, transit_class: str)
Skim wait, walk, board, and fares for a given time period and transit assignment class.
Skim the first and total wait time, number of boardings, (transfers + 1) fares, total walk time, total in-vehicle time.
Source code in tm2py/components/network/transit/transit_skim.py
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | |
skim_invehicle_time_by_mode
¶skim_invehicle_time_by_mode(time_period: str, transit_class: str, use_ccr: bool = False) -> None
Skim in-vehicle by mode for a time period and transit class and store results in Emmebank.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
time_period
|
str
|
time period abbreviation |
required |
transit_class
|
str
|
transit class name |
required |
use_ccr
|
bool
|
if True, will use crowding, capacity, and reliability (ccr). Defaults to False |
False
|
Source code in tm2py/components/network/transit/transit_skim.py
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 | |
skim_drive_walk
¶skim_drive_walk(time_period: str, transit_class: str) -> None
Source code in tm2py/components/network/transit/transit_skim.py
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 | |
skim_penalty_toll
¶skim_penalty_toll(time_period: str, transit_class: str) -> None
Source code in tm2py/components/network/transit/transit_skim.py
678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 | |
skim_reliability_crowding_capacity
¶skim_reliability_crowding_capacity(time_period: str, transit_class) -> None
Generate skim results for CCR assignment and stores results in Emmebank.
Generates the following: 1. Link Unreliability: LINKREL 2. Crowding penalty: CROWD 3. Extra added wait time: EAWT 4. Capacity penalty: CAPPEN
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
time_period
|
str
|
time period abbreviation |
required |
transit_class
|
transit class |
required |
Source code in tm2py/components/network/transit/transit_skim.py
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 | |
skim_crowding
¶skim_crowding(time_period: str, transit_class) -> None
Source code in tm2py/components/network/transit/transit_skim.py
806 807 808 809 810 811 | |
mask_if_not_required_modes
¶mask_if_not_required_modes(time_period: str, transit_class) -> None
Enforce the required_mode_combo parameter by setting IVTs to 0 if don’t have required modes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
time_period
|
str
|
Time period name abbreviation |
required |
transit_class
|
_type_
|
description |
required |
Source code in tm2py/components/network/transit/transit_skim.py
896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 | |
mask_above_max_transfers
¶mask_above_max_transfers(time_period: str, transit_class)
Reset skims to 0 if number of transfers is greater than max_transfers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
time_period
|
str
|
Time period name abbreviation |
required |
transit_class
|
_type_
|
description |
required |
Source code in tm2py/components/network/transit/transit_skim.py
930 931 932 933 934 935 936 937 938 939 940 941 942 | |
Transit Configuration Classes ¶
tm2py.config.TransitModeConfig
¶
Transit mode definition (see also mode in the Emme API).
Functions ¶
in_vehicle_perception_factor_valid
¶
in_vehicle_perception_factor_valid(value, values)
Validate in_vehicle_perception_factor exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1116 1117 1118 1119 1120 1121 | |
speed_or_time_factor_valid
¶
speed_or_time_factor_valid(value, values)
Validate speed_or_time_factor exists if assign_type is AUX_TRANSIT.
Source code in tm2py/config.py
1123 1124 1125 1126 1127 1128 | |
initial_boarding_penalty_valid
¶
initial_boarding_penalty_valid(value, values)
Validate initial_boarding_penalty exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1130 1131 1132 1133 1134 1135 | |
transfer_boarding_penalty_valid
¶
transfer_boarding_penalty_valid(value, values)
Validate transfer_boarding_penalty exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1137 1138 1139 1140 1141 1142 | |
headway_fraction_valid
¶
headway_fraction_valid(value, values)
Validate headway_fraction exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1144 1145 1146 1147 1148 1149 | |
transfer_wait_perception_factor_valid
¶
transfer_wait_perception_factor_valid(value, values)
Validate transfer_wait_perception_factor exists if assign_type is TRANSIT.
Source code in tm2py/config.py
1151 1152 1153 1154 1155 1156 | |
mode_id_valid
classmethod
¶
mode_id_valid(value)
Validate mode_id.
Source code in tm2py/config.py
1158 1159 1160 1161 1162 1163 | |
tm2py.config.TransitConfig
¶
Transit assignment parameters.
🚶 Active Transportation Components ¶
Development Status
Active transportation components (walking, cycling) are currently under development. Documentation will be added as these components are implemented.
🔌 EMME Integration ¶
Interface layers for integrating with EMME transportation planning software.
EMME Software
EMME is a comprehensive transportation planning software package. tm2py provides Python wrappers for EMME functionality.
tm2py.emme
¶
Emme components module.
Configuration:
tm2py.config.EmmeConfig
¶
Emme-specific parameters.
Properties
📊 Data Models & Validation ¶
Data validation models ensuring input file integrity and consistency.
Data Validation Philosophy
tm2py uses Pandera for robust data validation. Data models define expected schemas, data types, and validation rules for all input files.
Input File Documentation
For detailed information about input file formats and requirements, see Input Files Documentation 📁
MAZ Data Model ¶
Micro-Analysis Zone land use data validation and management.
MAZ Input File Format
For information about the mazData.csv file structure and field requirements, see MAZ Data Input Documentation 🗂️
tm2py.data_models.maz_data
¶
MAZ Data Model for TM2.0 Transportation Modeling
This module provides data validation and management for Micro-Analysis Zone (MAZ) data, which forms the foundation of land use inputs for the TM2.0 transportation model.
Overview ¶
MAZ (Micro-Analysis Zone) data represents fine-grained geographic units that contain detailed land use, demographic, and employment information. This data is crucial for:
- Trip generation modeling based on land use characteristics
- Accessibility calculations for transportation modes
- Economic and demographic analysis at a granular geographic level
- Integration with larger Traffic Analysis Zones (TAZ) for model hierarchy
Key Components ¶
MAZData : pandera.model.DataFrameModel Primary data validation class containing 60+ attributes for land use characteristics including employment by sector, demographic data, parking supply, and density measures.
pandera.model.DataFrameModel
Manages the mapping between model node IDs and sequential IDs for MAZ, TAZ, and external zones to ensure consistent geographic referencing.
Data Structure ¶
The MAZ data follows a hierarchical structure where: - Multiple MAZs can belong to a single TAZ (Traffic Analysis Zone) - Each MAZ has unique identifiers (original and sequential) - Land use data is categorized by employment sectors, housing types, and amenities - Validation ensures data consistency and completeness for modeling
Usage ¶
This module is typically used during the data preparation phase of transportation modeling to validate and standardize land use inputs before they are consumed by trip generation and other demand modeling components.
Example ¶
from pathlib import Path
from tm2py.data_models.maz_data import load_maz_data, create_sequential_index
# Create node ID crosswalk from Lasso network build output
xwalk_file = Path('model_to_emme_node_id.csv')
crosswalk = create_sequential_index(xwalk_file)
# Load and validate MAZ data
maz_file = Path('maz_land_use_data.csv')
maz_data = load_maz_data(maz_file, crosswalk)
Classes ¶
MAZData
¶
Micro-Analysis Zone (MAZ) Land Use Data Validation Model.
This class validates MAZ-level land use data used in TM2.0 transportation modeling. MAZs represent the finest geographic resolution for land use data, containing detailed information about employment by sector, demographics, parking supply, and accessibility measures. This data drives trip generation and other demand modeling components.
The validation ensures data consistency, proper data types, and logical constraints across all land use attributes before they are consumed by the transportation model.
Geographic Hierarchy ¶
- MAZ (Micro-Analysis Zone): Finest geographic unit
- TAZ (Traffic Analysis Zone): Aggregates multiple MAZs
- District/County: Higher-level geographic groupings
Data Categories ¶
- Geographic Identifiers: MAZ/TAZ IDs, coordinates, district/county information
- Demographics: Households, population, school enrollment by type
- Employment by Sector: 21 detailed employment categories (retail, manufacturing, services, etc.)
- Parking Supply: Hourly, daily, and monthly parking by destination type
- Density Measures: Employment, population, and household densities within ½ mile
- Accessibility: Intersection counts and density classifications
Employment Categories ¶
The model includes detailed employment data across major sectors:
- Primary: Agriculture (ag), Natural Resources (natres)
- Manufacturing: Bio (man_bio), Light (man_lgt), Heavy (man_hvy), Tech (man_tech)
- Services: Professional (prof), Business (serv_bus), Personal (serv_pers), Social (serv_soc)
- Retail: Local (ret_loc), Regional (ret_reg)
- Education: K-12 (ed_k12), Higher Ed (ed_high), Other (ed_oth)
- Other: Government (gov), Health, Construction (constr), Transportation (transp), etc.
Parking Data Structure ¶
Parking supply is categorized by: - Duration: Hourly (h), Daily (d), Monthly (m) - Destination: Same MAZ (sam) vs Other MAZs (oth) - Costs: Average hourly, daily, and monthly parking costs
Density Classifications ¶
Several attributes use binned density measures (1-3 scale): - IntDenBin: Intersection density (walkability proxy) - EmpDenBin: Employment density (job accessibility) - DUDenBin: Household density (residential intensity)
Validation Rules ¶
- All geographic IDs must be unique and non-null
- Employment and demographic counts must be non-negative integers
- Parking costs and areas must be non-negative floats
- Density measures include both raw values and binned classifications
Example ¶
import pandas as pd
from tm2py.data_models.maz_data import MAZData
# Validate MAZ data
maz_df = pd.read_csv('maz_land_use.csv')
validated_data = MAZData.validate(maz_df)
# Access employment totals
total_jobs = validated_data['emp_total'].sum()
retail_jobs = validated_data['ret_loc'].sum() + validated_data['ret_reg'].sum()
# Analyze density patterns
high_density_mazs = validated_data[validated_data['EmpDenBin'] == 3]
walkable_areas = validated_data[validated_data['IntDenBin'] >= 2]
NodeIDCrosswalk
¶
Node ID to Sequential ID Mapping for Transportation Model Geography.
This class validates the crosswalk table that maps original model node IDs to sequential zone identifiers used throughout the TM2.0 transportation model. It ensures consistent geographic referencing across MAZ, TAZ, and external zones.
Purpose ¶
The transportation model requires sequential zone IDs (starting from 1) for efficient matrix operations and memory management, while the underlying network model uses arbitrary node IDs. This crosswalk maintains the mapping between these two ID systems.
Geographic Types ¶
- MAZ (Micro-Analysis Zone): Finest resolution zones for land use data
- TAZ (Traffic Analysis Zone): Aggregated zones for trip matrices
- EXT (External Zone): Special zones for external traffic flows
ID System Design ¶
- Original model_node_id: Arbitrary integers from network model (can have gaps)
- Sequential IDs: Continuous 1-based indexing for each zone type
- Zero values: Indicate the node doesn’t belong to that zone type
Usage in Model ¶
This crosswalk is used to: 1. Convert between original and sequential IDs during data loading 2. Validate that MAZ/TAZ relationships are consistent 3. Ensure all required zones have proper sequential numbering 4. Support matrix operations that require continuous indexing
Data Validation ¶
- All model_node_id values must be unique and non-null
- Sequential IDs must be non-negative integers
- Zero values allowed to indicate non-membership in zone type
- Total count of non-zero sequential IDs should match expected zone counts
Attributes ¶
model_node_id : int
Original node identifier from the transportation network model.
Must be unique across all geographic zone types.
MAZSEQ : int
Sequential MAZ identifier (1-based). Zero if node is not a MAZ.
Used for MAZ-level land use data indexing and trip generation.
TAZSEQ : int
Sequential TAZ identifier (1-based). Zero if node is not a TAZ.
Used for trip matrix indexing and zone-to-zone travel calculations.
EXTSEQ : int
Sequential external zone identifier (1-based). Zero if node is not external.
Used for modeling trips entering/exiting the model region.
Example ¶
import pandas as pd
from tm2py.data_models.maz_data import NodeIDCrosswalk, create_sequential_index
# Create crosswalk from node lists
crosswalk = create_sequential_index(
node_id_df=network_nodes,
maz_N_list=[101, 102, 103],
taz_N_list=[201, 202],
ext_N_list=[301, 302]
)
# Validate the crosswalk
validated = NodeIDCrosswalk.validate(crosswalk)
# Use for ID conversion
maz_sequential = validated.set_index('model_node_id')['MAZSEQ']
original_to_seq = dict(zip(validated['model_node_id'], validated['MAZSEQ']))
Functions ¶
create_sequential_index
¶
create_sequential_index(model_to_emme_node_id_xwalk: Path) -> DataFrame[NodeIDCrosswalk]
Create stable sequential IDs for MAZ, TAZ, and external zones.
This function generates a crosswalk table that maps original model node IDs to sequential zone identifiers (1-based indexing) for efficient matrix operations in the transportation model. It uses predefined node lists to categorize zones into MAZ, TAZ, and external types.
The function handles: - TAZ nodes: Traffic Analysis Zones for trip matrix operations - MAZ nodes: Micro-Analysis Zones including disconnected zones - External nodes: Boundary zones for external trips
Sequential ID Assignment ¶
- TAZ: Sequential numbering based on sort order of node IDs
- MAZ: Includes both connected network nodes and disconnected zones
- EXT: External zones for trips entering/exiting the model region
- Zero values indicate the node doesn’t belong to that zone type
Node List Sources ¶
The function uses module-level constants:
- taz_N_list: Predefined TAZ node ID ranges
- maz_N_list: Predefined MAZ node ID ranges
- external_N_list: External zone node ID range (900001-999999)
- disconnected_maz_N_list: Special disconnected MAZ nodes
Parameters ¶
model_to_emme_node_id_xwalk : pathlib.Path Path to CSV file containing the crosswalk between model node IDs and Emme node IDs, created during the network build process. Must contain columns: ‘emme_node_id’, ‘model_node_id’
Returns ¶
DataFrame[NodeIDCrosswalk] Validated crosswalk with columns: - model_node_id: Original network node identifier - MAZSEQ: Sequential MAZ ID (0 if not a MAZ) - TAZSEQ: Sequential TAZ ID (0 if not a TAZ) - EXTSEQ: Sequential external zone ID (0 if not external)
Raises ¶
ValueError If required columns are missing from the input crosswalk file
Example ¶
from tm2py.data_models.maz_data import create_sequential_index
from pathlib import Path
# Create crosswalk from Lasso network build output
xwalk_file = Path('model_to_emme_node_id.csv')
crosswalk = create_sequential_index(xwalk_file)
# Use crosswalk for ID conversion
maz_lookup = crosswalk.set_index('model_node_id')['MAZSEQ']
sequential_maz_id = maz_lookup[original_node_id]
See Also ¶
NodeIDCrosswalk : The validation schema for the output crosswalk validate_sequential_id : Function to validate MAZ data against this crosswalk
Source code in tm2py/data_models/maz_data.py
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 | |
validate_sequential_id
¶
validate_sequential_id(maz_data_df: DataFrame, node_seq_id_xwalk: DataFrame[NodeIDCrosswalk]) -> None
Validate consistency between MAZ data and node ID crosswalk.
This function ensures that the sequential MAZ and TAZ IDs in the land use data file match the expected values from the node ID crosswalk. This validation is critical for maintaining geographic consistency across model components.
The validation checks that:
- Each MAZ_ORIGINAL in the data maps to the correct MAZ sequential ID
- Each TAZ_ORIGINAL in the data maps to the correct TAZ sequential ID
- No mismatches exist that would cause geographic referencing errors
Validation Process ¶
- Create lookup from original node IDs to sequential IDs
- Map MAZ_ORIGINAL and TAZ_ORIGINAL to expected sequential values
- Compare with actual MAZ and TAZ columns in the data
- Report any mismatches that indicate data inconsistency
Use Case ¶
This function is essential when loading MAZ data from external sources to ensure the geographic identifiers are properly aligned with the transportation model’s internal numbering system.
Parameters ¶
maz_data_df : pd.DataFrame
MAZ land use data containing columns:
- MAZ: Sequential MAZ identifier
- TAZ: Sequential TAZ identifier
- MAZ_ORIGINAL: Original MAZ node ID
- TAZ_ORIGINAL: Original TAZ node ID
node_seq_id_xwalk : DataFrame[NodeIDCrosswalk]
Validated crosswalk mapping original node IDs to sequential IDs.
Created by create_sequential_index function.
Returns ¶
None Function validates in-place and raises exception on failure
Raises ¶
ValueError If any MAZ or TAZ sequential IDs don’t match the crosswalk expectations. Error message includes count of mismatched zones for debugging.
Example ¶
import pandas as pd
from tm2py.data_models.maz_data import validate_sequential_id
# Load data and crosswalk
maz_df = pd.read_csv('maz_land_use.csv')
crosswalk = create_sequential_index(node_xwalk_file)
# Validate consistency
try:
validate_sequential_id(maz_df, crosswalk)
print("MAZ data geographic IDs validated successfully")
except ValueError as e:
print(f"Geographic ID mismatch: {e}")
See Also ¶
create_sequential_index : Creates the required crosswalk load_maz_data : Higher-level function that includes this validation NodeIDCrosswalk : Schema for the crosswalk data
Source code in tm2py/data_models/maz_data.py
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 | |
load_maz_data
¶
load_maz_data(maz_data_file: Path, node_seq_id_xwalk: DataFrame[NodeIDCrosswalk]) -> DataFrame[MAZData]
Load and validate MAZ land use data for transportation modeling.
This is the main function for loading MAZ (Micro-Analysis Zone) land use data into the TM2.0 transportation model. It performs comprehensive validation to ensure data quality and geographic consistency before the data is used in trip generation and other modeling components.
The function performs two levels of validation: 1. Geographic ID validation against the node crosswalk 2. Schema validation against the MAZData model specification
Validation Steps ¶
- Load CSV data from the specified file path
- Validate MAZ/TAZ sequential IDs match the crosswalk expectations
- Validate all data fields against MAZData schema constraints
- Return validated DataFrame ready for modeling use
Data Requirements ¶
The input CSV must contain all required MAZData columns including:
- Geographic identifiers (MAZ, TAZ, original node IDs)
- Employment by sector (21 detailed categories)
- Demographics (households, population, school enrollment)
- Parking supply (hourly, daily, monthly by destination type)
- Density measures and accessibility indicators
Error Handling ¶
The function will raise descriptive errors for common data issues: - Missing or malformed CSV files - Geographic ID mismatches with the crosswalk - Schema violations (wrong data types, negative values, etc.) - Missing required columns or invalid data ranges
Parameters ¶
maz_data_file : pathlib.Path
Path to CSV file containing MAZ land use data.
Must include all required columns as defined in MAZData schema.
node_seq_id_xwalk : DataFrame[NodeIDCrosswalk]
Validated crosswalk mapping original node IDs to sequential zone IDs.
Created by create_sequential_index function.
Returns ¶
DataFrame[MAZData] Validated MAZ land use data conforming to the MAZData schema. All geographic IDs verified against crosswalk and data types validated. Ready for use in trip generation and accessibility calculations.
Raises ¶
FileNotFoundError If the specified maz_data_file does not exist ValueError If geographic IDs don’t match the crosswalk or schema validation fails pd.errors.ParserError If the CSV file is malformed or unreadable
Example ¶
from pathlib import Path
from tm2py.data_models.maz_data import create_sequential_index, load_maz_data
# Create crosswalk and load data
xwalk_file = Path('model_to_emme_node_id.csv')
maz_file = Path('maz_land_use_data.csv')
crosswalk = create_sequential_index(xwalk_file)
maz_data = load_maz_data(maz_file, crosswalk)
# Use validated data
total_population = maz_data['POP'].sum()
employment_by_maz = maz_data['emp_total']
See Also ¶
MAZData : The validation schema applied to the loaded data create_sequential_index : Function to create the required crosswalk validate_sequential_id : Geographic ID validation performed internally
Source code in tm2py/data_models/maz_data.py
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 | |
🛠️ Utilities & Tools ¶
Supporting utilities for logging, file management, and common operations.
Logging System ¶
Comprehensive logging infrastructure for model run monitoring and debugging.
Log Configuration
Logging behavior is configurable through the model configuration files. See the Configuration Guide for details on setting log levels and output destinations.
tm2py.logger
¶
Logging module.
Note the general definition of logging levels as used in tm2py:
highly detailed level information which would rarely be of interest
except for detailed debugging by a developer
Classes ¶
BaseLogger
¶
BaseLogger(log_formatters, log_cache_file)
Base class for logging. Not to be constructed directly.
Source code in tm2py/logger.py
56 57 58 59 60 61 62 63 64 65 66 67 | |
debug_enabled
property
¶debug_enabled: bool
Returns True if DEBUG is currently filtered for display or print to file.
Can be used to enable / disable debug logging which may have a performance impact.
trace_enabled
property
¶trace_enabled: bool
Returns True if TRACE is currently filtered for display or print to file.
Can be used to enable / disable trace logging which may have a performance impact.
log
¶log(text: str, level: LogLevel = 'INFO', indent: bool = True)
Log text to file and display depending upon log level and config.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
level
|
str
|
logging level |
'INFO'
|
indent
|
bool
|
if true indent text based on the number of open contexts |
True
|
Source code in tm2py/logger.py
83 84 85 86 87 88 89 90 91 92 93 94 95 | |
trace
¶trace(text: str, indent: bool = False)
Log text with level=TRACE.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
97 98 99 100 101 102 103 104 | |
debug
¶debug(text: str, indent: bool = False)
Log text with level=DEBUG.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
106 107 108 109 110 111 112 113 | |
detail
¶detail(text: str, indent: bool = False)
Log text with level=DETAIL.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
115 116 117 118 119 120 121 122 | |
info
¶info(text: str, indent: bool = False)
Log text with level=INFO.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
124 125 126 127 128 129 130 131 | |
status
¶status(text: str, indent: bool = False)
Log text with level=STATUS.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
133 134 135 136 137 138 139 140 | |
warn
¶warn(text: str, indent: bool = False)
Log text with level=WARN.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
142 143 144 145 146 147 148 149 | |
error
¶error(text: str, indent: bool = False)
Log text with level=ERROR.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
151 152 153 154 155 156 157 158 | |
fatal
¶fatal(text: str, indent: bool = False)
Log text with level=FATAL.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
False
|
Source code in tm2py/logger.py
160 161 162 163 164 165 166 167 | |
log_time
¶log_time(text: str, level=1, indent=False)
Log message with timestamp
Source code in tm2py/logger.py
169 170 171 172 173 174 175 176 | |
log_start_end
¶log_start_end(text: str, level: LogLevel = 'STATUS')
Use with ‘with’ statement to log the start and end time with message.
If using the Emme logbook (config.logging.use_emme_logbook is True), will also create a logbook nest in the tree view using logbook_trace.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
message text |
required |
level
|
str
|
logging level |
'STATUS'
|
Source code in tm2py/logger.py
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | |
log_dict
¶log_dict(mapping: dict, level: LogLevel = 'DEBUG')
Format dictionary to string and log as text.
Source code in tm2py/logger.py
221 222 223 | |
clear_msg_cache
¶clear_msg_cache()
Clear all log messages from cache.
Source code in tm2py/logger.py
237 238 239 | |
Logger
¶
Logger(controller: RunController)
Bases: BaseLogger
Logging of message text for display, text file, and Emme logbook, as well as notify to slack.
The log message levels can be one of: TRACE, DEBUG, DETAIL, INFO, STATUS, WARN, ERROR, FATAL Which will filter all messages of that severity and higher. See module note on use of descriptive level names.
logger.log(“a message”) with logger.log_start_end(“Running a set of steps”): logger.log(“Message with timestamp”) logger.log(“A debug message”, level=”DEBUG”) # equivalently, use the .debug: logger.debug(“Another debug message”) if logger.debug_enabled: # only generate this report if logging DEBUG logger.log(“A debug report that takes time to produce”, level=”DEBUG”) logger.notify_slack(“A slack message”)
Methods can also be decorated with LogStartEnd (see class for more).
Note that the Logger should only be initialized once per model run. In places where the controller is not available, the last Logger initialized can be obtained from the class method get_logger::
1 | |
Internal properties
Constructor for Logger object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
controller
|
RunController
|
Associated RunController instance. |
required |
Source code in tm2py/logger.py
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 | |
get_logger
classmethod
¶get_logger()
Return the last initialized logger object.
Source code in tm2py/logger.py
350 351 352 353 | |
notify_slack
¶notify_slack(text: str)
Send message to slack if enabled by config.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to send to slack |
required |
Source code in tm2py/logger.py
355 356 357 358 359 360 361 362 | |
ProcessLogger
¶
ProcessLogger(run_log_file_path, log_on_error_file_path, emme_manager)
Bases: BaseLogger
Logger for running in separate process with no RunController.
Constructor for Logger object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
run_log_file_path
|
|
required | |
log_on_error_file_path
|
|
required | |
emme_manager
|
|
required |
Source code in tm2py/logger.py
368 369 370 371 372 373 374 375 376 377 378 | |
LogFormatter
¶
LogFormatter(level: int)
Base class for recording text to log.
Properties
Constructor for LogFormatter.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
level
|
int
|
log filter level (as an int) |
required |
Source code in tm2py/logger.py
389 390 391 392 393 394 395 396 | |
increase_indent
¶increase_indent(level: int)
Increase current indent if the log level is filtered in.
Source code in tm2py/logger.py
403 404 405 406 | |
decrease_indent
¶decrease_indent(level: int)
Decrease current indent if the log level is filtered in.
Source code in tm2py/logger.py
408 409 410 411 | |
log
abstractmethod
¶log(text: str, level: int, indent: bool, timestamp: Union[str, None])
Format and log message text.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
level
|
int
|
logging level |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
required |
timestamp
|
str
|
formatted datetime as a string or None |
required |
Source code in tm2py/logger.py
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | |
LogFile
¶
LogFile(level: int, file_path: str)
Bases: LogFormatter
Format and write log text to file.
Properties
- level: the log level as an int
- file_path: the absolute file path to write to
Constructor for LogFile object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
level
|
int
|
the log level as an int. |
required |
file_path
|
str
|
the absolute file path to write to. |
required |
Source code in tm2py/logger.py
464 465 466 467 468 469 470 471 472 473 | |
open
¶open()
Open the log file for writing.
Source code in tm2py/logger.py
475 476 477 | |
log
¶log(text: str, level: int, indent: bool, timestamp: Union[str, None])
Log text to file and display depending upon log level and config.
Note that log will not write to file until opened with a context.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
level
|
int
|
logging level |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
required |
timestamp
|
str
|
formatted datetime as a string or None for timestamp |
required |
Source code in tm2py/logger.py
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | |
close
¶close()
Close the open log file.
Source code in tm2py/logger.py
495 496 497 498 | |
LogFileLevelOverride
¶
LogFileLevelOverride(level, file_path, iter_component_level, controller)
Bases: LogFile
Format and write log text to file.
Properties
- level: the log level as an int
- file_path: the absolute file path to write to
- iter_component_level: TODO
- controller: TODO
Constructor for LogFileLevelOverride object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
level
|
_type_
|
TODO |
required |
file_path
|
_type_
|
TODO |
required |
iter_component_level
|
_type_
|
TODO |
required |
controller
|
_type_
|
TODO |
required |
Source code in tm2py/logger.py
511 512 513 514 515 516 517 518 519 520 521 522 | |
LogDisplay
¶
LogDisplay(level: int)
Bases: LogFormatter
Format and print log text to console / Notebook.
Properties
- level: the log level as an int
Source code in tm2py/logger.py
389 390 391 392 393 394 395 396 | |
log
¶log(text: str, level: int, indent: bool, timestamp: Union[str, None])
Format and display text on screen (print).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
level
|
int
|
logging level |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
required |
timestamp
|
str
|
formatted datetime as a string or None |
required |
Source code in tm2py/logger.py
539 540 541 542 543 544 545 546 547 548 549 | |
LogCache
¶
LogCache(file_path: str)
Bases: LogFormatter
Caches all messages for later recording in on error logfile.
Properties
- file_path: the absolute file path to write to
Constructor for LogCache object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
file_path
|
str
|
the absolute file path to write to. |
required |
Source code in tm2py/logger.py
559 560 561 562 563 564 565 566 567 | |
open
¶open()
Initialize log file (remove).
Source code in tm2py/logger.py
569 570 571 572 | |
log
¶log(text: str, level: int, indent: bool, timestamp: Union[str, None])
Format and store text for later recording.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
text to log |
required |
level
|
int
|
logging level |
required |
indent
|
bool
|
if true indent text based on the number of open contexts |
required |
timestamp
|
str
|
formatted datetime as a string or None |
required |
Source code in tm2py/logger.py
574 575 576 577 578 579 580 581 582 583 584 585 | |
write_cache
¶write_cache()
Write all cached messages.
Source code in tm2py/logger.py
587 588 589 590 591 592 | |
clear
¶clear()
Clear message cache.
Source code in tm2py/logger.py
594 595 596 | |
LogStartEnd
¶
LogStartEnd(text: str = None, level: str = 'INFO')
Log the start and end time with optional message.
Used as a Component method decorator. If msg is not provided a default message is generated with the object class and method name.
Example:: @LogStartEnd(“Highway assignment and skims”, level=”STATUS”) def run(self): pass
Properties
text (str): message text to use in the start and end record. level (str): logging level as a string.
Constructor for LogStartEnd object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
message text to use in the start and end record. Defaults to None. |
None
|
level
|
str
|
logging level as a string. Defaults to “INFO”. |
'INFO'
|
Source code in tm2py/logger.py
618 619 620 621 622 623 624 625 626 627 | |
SlackNotifier
¶
SlackNotifier(logger: Logger, slack_webhook_url: str = None)
Notify slack of model run status.
The slack channel can be input directly, or is configured via text file found at “M:\Software\Slack\TravelModel_SlackWebhook.txt” (if on MTC server) rr”C:\Software\Slack\TravelModel_SlackWebhook.txt” (if local)
Properties
- logger (Logger): object for logging of trace messages
- slack_webhook_url (str): optional, url to use for sending the message to slack
Constructor for SlackNotifier object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
logger instance. |
required |
slack_webhook_url
|
str
|
. Defaults to None, which is replaced by either: - r”M:\Software\Slack\TravelModel_SlackWebhook.txt” (if on MTC server) - r”C:\Software\Slack\TravelModel_SlackWebhook.txt” (otherwise) |
None
|
Source code in tm2py/logger.py
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 | |
post_message
¶post_message(text)
Posts text to the slack channel via the webhook if slack_webhook_url is found.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
text message to send to slack |
required |
Source code in tm2py/logger.py
704 705 706 707 708 709 710 711 712 713 714 715 716 | |
General Utilities ¶
Common utility functions for file operations, data manipulation, and system integration.
tm2py.tools
¶
Tools module for common resources / shared code and “utilities” in the tm2py package.
Classes ¶
SpatialGridIndex
¶
SpatialGridIndex(size: float)
Simple spatial grid hash for fast (enough) nearest neighbor / within distance searches of points.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
float
|
the size of the grid to use for the index, relative to the point coordinates |
required |
Source code in tm2py/tools.py
329 330 331 332 333 334 335 | |
insert
¶insert(obj: Any, x: float, y: float)
Add new obj with coordinates x and y. Args: obj: any python object, will be returned from search methods “nearest” and “within_distance” x: x-coordinate y: y-coordinate
Source code in tm2py/tools.py
337 338 339 340 341 342 343 344 345 346 | |
nearest
¶nearest(x: float, y: float)
Return the closest object in index to the specified coordinates Args: x: x-coordinate y: y-coordinate
Source code in tm2py/tools.py
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 | |
within_distance
¶within_distance(x: float, y: float, distance: float)
Return all objects in index within the distance of the specified coordinates Args: x: x-coordinate y: y-coordinate distance: distance to search in point coordinate units
Source code in tm2py/tools.py
385 386 387 388 389 390 391 392 393 394 395 396 | |
within_square
¶within_square(x: float, y: float, distance: float)
Return all objects in index within a square box distance of the specified coordinates. Args: x: x-coordinate y: y-coordinate distance: distance to search in point coordinate units
Source code in tm2py/tools.py
398 399 400 401 402 403 404 405 406 407 408 409 | |
Functions ¶
download_unzip
¶
download_unzip(url: str, out_base_dir: str, target_dir: str, zip_filename: str = 'test_data.zip') -> None
Download and unzips a file from a URL. The zip file is removed after extraction.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
url
|
str
|
Full URL do download from. |
required |
out_base_dir
|
str
|
Where to unzip the file. |
required |
target_dir
|
str
|
What to unzip the file as. |
required |
zip_filename
|
str
|
Filename to store zip file as. Defaults to “test_data.zip”. |
'test_data.zip'
|
Source code in tm2py/tools.py
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | |
temp_file
¶
temp_file(mode: str = 'w+', prefix: str = '', suffix: str = '')
Temp file wrapper to return open file handle and named path.
A named temporary file (using mkstemp) with specified prefix and suffix is created and opened with the specified mode. The file handle and path are returned. The file is closed and deleted on exit.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mode
|
str
|
mode to open file, [rw][+][b] |
'w+'
|
prefix
|
str
|
optional text to start temp file name |
''
|
suffix
|
str
|
optional text to end temp file name |
''
|
Source code in tm2py/tools.py
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | |
run_process
¶
run_process(commands: Collection[str], name: str = '')
Run system level commands as blocking process and log output and error messages.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
commands
|
Collection[str]
|
list of one or more commands to execute |
required |
name
|
str
|
optional name to use for the temp bat file |
''
|
Source code in tm2py/tools.py
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | |
interpolate_dfs
¶
interpolate_dfs(df: DataFrame, ref_points: Collection[Union[float, int]], target_point: Union[float, int], ref_col_name: str = 'ends_with') -> pd.DataFrame
Interpolate for the model year assuming linear growth between the reference years.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
df
|
DataFrame
|
dataframe to interpolate on, with ref points contained in column name per ref_col_name. |
required |
ref_points
|
Collection[Union[float, int]]
|
reference years to interpolate between |
required |
target_point
|
Union[float, int]
|
target year |
required |
ref_col_name
|
str
|
column name to use for reference years. Defaults to “ends_with”. |
'ends_with'
|
Source code in tm2py/tools.py
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | |
zonal_csv_to_matrices
¶
zonal_csv_to_matrices(csv_file: str, i_column: str = 'ORIG', j_column: str = 'DEST', value_columns: str = ['VALUE'], default_value: float = 0.0, fill_zones: bool = False, max_zone: int = None, delimiter: str = ',') -> Mapping[str, pd.DataFrame]
Read a CSV file with zonal data and into dataframes.
Input CSV file should have a header row specifying the I, J, and Value column names.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
csv_file
|
str
|
description |
required |
i_column
|
str
|
Name of j zone column. Defaults to “ORIG”. |
'ORIG'
|
j_column
|
str
|
Name of i zone column. Defaults to “DEST”. |
'DEST'
|
value_columns
|
str
|
List of columns to turn into matrices. Defaults to [“VALUE”]. |
['VALUE']
|
default_value
|
float
|
Value to fill empty cells with. Defaults to 0.0. |
0.0
|
fill_zones
|
bool
|
If true, will fill zones without values to max zone with default value. Defaults to False. |
False
|
max_zone
|
int
|
If fill_zones is True, used to determine matrix size. Defaults to max(I, J). |
None
|
delimiter
|
str
|
Input file delimeter. Defaults to “,”. |
','
|
Returns:
| Name | Type | Description |
|---|---|---|
dict |
Mapping[str, DataFrame]
|
Dictionary of Pandas dataframes with matrix names as keys. |
Source code in tm2py/tools.py
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | |
mocked_inro_context
¶
mocked_inro_context()
Mocking of modules which need to be mocked for tests.
Source code in tm2py/tools.py
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | |
emme_context
¶
emme_context()
Return True if Emme is installed.
Source code in tm2py/tools.py
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | |
Example Workflows ¶
Pre-built example configurations and workflows for common modeling scenarios.
Available Examples
The examples module provides ready-to-use configurations for:
- Base year model setup
- Scenario analysis workflows
- Sensitivity testing procedures
- Custom component integration
tm2py.examples
¶
Download and unzip examples for tm2py, used in tests.
Functions ¶
get_example
¶
get_example(example_name: str = _DEFAULT_EXAMPLE_NAME, example_subdir: str = _DEFAULT_EXAMPLE_SUBDIR, root_dir: str = _ROOT_DIR, retrieval_url: str = _DEFAULT_EXAMPLE_URL) -> str
Returns example directory; downloads if necessary from retrieval URL.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
example_name
|
str
|
Used to retrieve sub-folder or create it if doesn’t exist. Defaults to _DEFAULT_EXAMPLE_NAME. |
_DEFAULT_EXAMPLE_NAME
|
example_subdir
|
str
|
Where to find examples within root dir. Defaults to _DEFAULT_EXAMPLE_SUBDIR. |
_DEFAULT_EXAMPLE_SUBDIR
|
root_dir
|
str
|
Root dir of project. Defaults to _ROOT_DIR. |
_ROOT_DIR
|
retrieval_url
|
str
|
URL to retrieve example data zip from. Defaults to _DEFAULT_EXAMPLE_URL. |
_DEFAULT_EXAMPLE_URL
|
Raises:
| Type | Description |
|---|---|
FileNotFoundError
|
If can’t find the files after trying to download it. |
Returns:
| Name | Type | Description |
|---|---|---|
str |
str
|
Path to example data. |
Source code in tm2py/examples.py
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 48 49 | |
📚 Additional Resources ¶
Related Documentation
User Guides & Tutorials
- Installation Guide - Getting started with tm2py
- User Guide - Comprehensive modeling workflow guide
- Process Documentation - Detailed process descriptions
Input & Output Reference
- Input Files - All input file format specifications
- Output Files - Model output descriptions and usage
Technical Documentation
- Architecture Overview - System design and components
- CT-RAMP Documentation - Activity-based modeling framework
- Contributing Guide - Development and contribution guidelines
Need Help?
- Issues & Bug Reports: GitHub Issues
- Discussions & Questions: GitHub Discussions
- Documentation Source: Edit on GitHub