33from __future__ import annotations
44
55import logging
6+ from typing import Any
67
78import numba as nb
89import numpy as np
910import pandas as pd
1011
1112from activitysim .core import assign , chunk , los , workflow
13+ from activitysim .core .configuration .base import PydanticReadable
1214
1315logger = logging .getLogger (__name__ )
1416
1517
18+ class AccessibilitySettings (PydanticReadable ):
19+ """
20+ Settings for aggregate accessibility component.
21+ """
22+
23+ CONSTANTS : dict [str , Any ] = {}
24+
25+ land_use_columns : list [str ] = []
26+ """Only include the these columns in the computational tables
27+
28+ Memory usage is reduced by only listing the minimum columns needed by
29+ the SPEC, and nothing extra.
30+ """
31+
32+ SPEC : str = "accessibility.csv"
33+ """Filename for the accessibility specification (csv) file."""
34+
35+
1636@nb .njit
1737def _accumulate_accessibility (arr , orig_zone_count , dest_zone_count ):
1838 assert arr .size == orig_zone_count * dest_zone_count
@@ -144,6 +164,10 @@ def compute_accessibility(
144164 land_use : pd .DataFrame ,
145165 accessibility : pd .DataFrame ,
146166 network_los : los .Network_LOS ,
167+ model_settings : AccessibilitySettings | None = None ,
168+ model_settings_file_name : str = "accessibility.yaml" ,
169+ trace_label : str = "compute_accessibility" ,
170+ output_table_name : str = "accessibility" ,
147171) -> None :
148172 """
149173 Compute accessibility for each zone in land use file using expressions from accessibility_spec
@@ -160,40 +184,44 @@ def compute_accessibility(
160184 product mutes large differences. The decay function on the walk accessibility measure is
161185 steeper than automobile or transit. The minimum accessibility is zero.
162186 """
187+ if model_settings is None :
188+ model_settings = AccessibilitySettings .read_settings_file (
189+ state .filesystem , model_settings_file_name
190+ )
163191
164- trace_label = "compute_accessibility"
165- model_settings = state .filesystem .read_model_settings ("accessibility.yaml" )
166192 assignment_spec = assign .read_assignment_spec (
167- state .filesystem .get_config_file_path ("accessibility.csv" )
193+ state .filesystem .get_config_file_path (model_settings . SPEC )
168194 )
169195
170196 accessibility_df = accessibility
171197 if len (accessibility_df .columns ) > 0 :
172198 logger .warning (
173- f"accessibility table is not empty. Columns:{ list (accessibility_df .columns )} "
199+ f"accessibility table is not empty. "
200+ f"Columns:{ list (accessibility_df .columns )} "
174201 )
175202 raise RuntimeError ("accessibility table is not empty." )
176203
177- constants = model_settings .get ( " CONSTANTS" , {})
204+ constants = model_settings .CONSTANTS
178205
179- # only include the land_use columns needed by spec, as specified by land_use_columns model_setting
180- land_use_columns = model_settings .get ("land_use_columns" , [])
206+ # only include the land_use columns needed by spec,
207+ # as specified by land_use_columns model_setting
208+ land_use_columns = model_settings .land_use_columns
181209 land_use_df = land_use
182210 land_use_df = land_use_df [land_use_columns ]
183211
184212 logger .info (
185- f"Running { trace_label } with { len (accessibility_df .index )} orig zones { len (land_use_df )} dest zones"
213+ f"Running { trace_label } with { len (accessibility_df .index )} orig zones "
214+ f"{ len (land_use_df )} dest zones"
186215 )
187216
188217 accessibilities_list = []
189218
190219 for (
191- i ,
220+ _i ,
192221 chooser_chunk ,
193- chunk_trace_label ,
222+ _chunk_trace_label ,
194223 chunk_sizer ,
195224 ) in chunk .adaptive_chunked_choosers (state , accessibility_df , trace_label ):
196-
197225 accessibilities = compute_accessibilities_for_zones (
198226 state ,
199227 chooser_chunk ,
@@ -211,4 +239,4 @@ def compute_accessibility(
211239 logger .info (f"{ trace_label } computed accessibilities { accessibility_df .shape } " )
212240
213241 # - write table to pipeline
214- state .add_table ("accessibility" , accessibility_df )
242+ state .add_table (output_table_name , accessibility_df )
0 commit comments