Skip to content

Commit

Permalink
Merge e4eaa0a into 367cbac
Browse files Browse the repository at this point in the history
  • Loading branch information
jpn-- committed Jun 10, 2022
2 parents 367cbac + e4eaa0a commit 95e70ed
Show file tree
Hide file tree
Showing 338 changed files with 24,604 additions and 10,302 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,5 @@ _test_est
*_local/
*_local.*

**/__sharrowcache__
**/output/
10 changes: 8 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ env:
global:
- TEST_ENV=activitysim-test

cache:
directories:
- activitysim/examples/example_mtc/test/output/cache

jobs:
include:
# Add new TEST_SUITE jobs as needed via Travis build matrix expansion
Expand All @@ -18,10 +22,12 @@ jobs:
- env: TEST_SUITE=activitysim/cli
- env: TEST_SUITE=activitysim/core

- stage: Examples
- stage: Primary Example
name: "MTC Example"
env: TEST_SUITE=activitysim/examples/example_mtc/test
- name: "MTC Extended Example"

- stage: Other Examples
name: "MTC Extended Example"
env: TEST_SUITE=activitysim/examples/example_mtc_extended/test
- name: "Multizone Example"
env: TEST_SUITE=activitysim/examples/example_multiple_zone/test
Expand Down
4 changes: 2 additions & 2 deletions activitysim/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
# See full license in LICENSE.txt.


__version__ = '1.0.4'
__doc__ = 'Activity-Based Travel Modeling'
__version__ = "1.0.4"
__doc__ = "Activity-Based Travel Modeling"
25 changes: 25 additions & 0 deletions activitysim/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import os
import sys


def main():
# clean up message formatting
if sys.argv and sys.argv[0].endswith("__main__.py"):
sys.argv[0] = "activitysim"

# threadstopper
if "--fast" not in sys.argv:
os.environ["MKL_NUM_THREADS"] = "1"
os.environ["OMP_NUM_THREADS"] = "1"
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["NUMBA_NUM_THREADS"] = "1"
os.environ["VECLIB_MAXIMUM_THREADS"] = "1"
os.environ["NUMEXPR_NUM_THREADS"] = "1"

from .cli.main import main

main()


if __name__ == "__main__":
main()
34 changes: 21 additions & 13 deletions activitysim/abm/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,28 @@
def households_sample_size(settings, override_hh_ids):

if override_hh_ids is None:
return settings.get('households_sample_size', 0)
return settings.get("households_sample_size", 0)
else:
return 0 if override_hh_ids is None else len(override_hh_ids)


@inject.injectable(cache=True)
def override_hh_ids(settings):

hh_ids_filename = settings.get('hh_ids', None)
hh_ids_filename = settings.get("hh_ids", None)
if hh_ids_filename is None:
return None

file_path = config.data_file_path(hh_ids_filename, mandatory=False)
if not file_path:
logger.error("hh_ids file name '%s' specified in settings not found" % hh_ids_filename)
logger.error(
"hh_ids file name '%s' specified in settings not found" % hh_ids_filename
)
return None

df = pd.read_csv(file_path, comment='#')
df = pd.read_csv(file_path, comment="#")

if 'household_id' not in df.columns:
if "household_id" not in df.columns:
logger.error("No 'household_id' column in hh_ids file %s" % hh_ids_filename)
return None

Expand All @@ -47,19 +49,23 @@ def override_hh_ids(settings):
logger.error("No households in hh_ids file %s" % hh_ids_filename)
return None

logger.info("Using hh_ids list with %s households from file %s" %
(len(household_ids), hh_ids_filename))
logger.info(
"Using hh_ids list with %s households from file %s"
% (len(household_ids), hh_ids_filename)
)

return household_ids


@inject.injectable(cache=True)
def trace_hh_id(settings):

id = settings.get('trace_hh_id', None)
id = settings.get("trace_hh_id", None)

if id and not isinstance(id, int):
logger.warning("setting trace_hh_id is wrong type, should be an int, but was %s" % type(id))
logger.warning(
"setting trace_hh_id is wrong type, should be an int, but was %s" % type(id)
)
id = None

return id
Expand All @@ -68,9 +74,11 @@ def trace_hh_id(settings):
@inject.injectable(cache=True)
def trace_od(settings):

od = settings.get('trace_od', None)
od = settings.get("trace_od", None)

if od and not (isinstance(od, list) and len(od) == 2 and all(isinstance(x, int) for x in od)):
if od and not (
isinstance(od, list) and len(od) == 2 and all(isinstance(x, int) for x in od)
):
logger.warning("setting trace_od should be a list of length 2, but was %s" % od)
od = None

Expand All @@ -79,11 +87,11 @@ def trace_od(settings):

@inject.injectable(cache=True)
def chunk_size(settings):
_chunk_size = int(settings.get('chunk_size', 0) or 0)
_chunk_size = int(settings.get("chunk_size", 0) or 0)

return _chunk_size


@inject.injectable(cache=True)
def check_for_variability(settings):
return bool(settings.get('check_for_variability', False))
return bool(settings.get("check_for_variability", False))
4 changes: 4 additions & 0 deletions activitysim/abm/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,9 @@
from . import trip_scheduling_choice
from . import trip_matrices
from . import summarize
from . import work_from_home
from . import telecommute_frequency
from . import transit_pass_subsidy
from . import transit_pass_ownership
from . import vehicle_allocation
from . import vehicle_type_choice
109 changes: 68 additions & 41 deletions activitysim/abm/models/accessibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,31 @@


def compute_accessibilities_for_zones(
accessibility_df,
land_use_df,
assignment_spec,
constants,
network_los,
trace_od,
trace_label):
accessibility_df,
land_use_df,
assignment_spec,
constants,
network_los,
trace_od,
trace_label,
):

orig_zones = accessibility_df.index.values
dest_zones = land_use_df.index.values

orig_zone_count = len(orig_zones)
dest_zone_count = len(dest_zones)

logger.info("Running %s with %d orig zones %d dest zones" %
(trace_label, orig_zone_count, dest_zone_count))
logger.info(
"Running %s with %d orig zones %d dest zones"
% (trace_label, orig_zone_count, dest_zone_count)
)

# create OD dataframe
od_df = pd.DataFrame(
data={
'orig': np.repeat(orig_zones, dest_zone_count),
'dest': np.tile(dest_zones, orig_zone_count)
"orig": np.repeat(orig_zones, dest_zone_count),
"dest": np.tile(dest_zones, orig_zone_count),
}
)

Expand All @@ -53,27 +56,32 @@ def compute_accessibilities_for_zones(

# merge land_use_columns into od_df
logger.info(f"{trace_label}: merge land_use_columns into od_df")
od_df = pd.merge(od_df, land_use_df, left_on='dest', right_index=True).sort_index()
od_df = pd.merge(od_df, land_use_df, left_on="dest", right_index=True).sort_index()
chunk.log_df(trace_label, "od_df", od_df)

locals_d = {
'log': np.log,
'exp': np.exp,
'network_los': network_los,
"log": np.log,
"exp": np.exp,
"network_los": network_los,
}
locals_d.update(constants)

skim_dict = network_los.get_default_skim_dict()
locals_d['skim_od'] = skim_dict.wrap('orig', 'dest').set_df(od_df)
locals_d['skim_do'] = skim_dict.wrap('dest', 'orig').set_df(od_df)
locals_d["skim_od"] = skim_dict.wrap("orig", "dest").set_df(od_df)
locals_d["skim_do"] = skim_dict.wrap("dest", "orig").set_df(od_df)

if network_los.zone_system == los.THREE_ZONE:
locals_d['tvpb'] = network_los.tvpb
locals_d["tvpb"] = network_los.tvpb

logger.info(f"{trace_label}: assign.assign_variables")
results, trace_results, trace_assigned_locals \
= assign.assign_variables(assignment_spec, od_df, locals_d,
trace_rows=trace_od_rows, trace_label=trace_label, chunk_log=True)
results, trace_results, trace_assigned_locals = assign.assign_variables(
assignment_spec,
od_df,
locals_d,
trace_rows=trace_od_rows,
trace_label=trace_label,
chunk_log=True,
)

chunk.log_df(trace_label, "results", results)
logger.info(f"{trace_label}: have results")
Expand All @@ -87,23 +95,29 @@ def compute_accessibilities_for_zones(
if trace_od:

if not trace_od_rows.any():
logger.warning(f"trace_od not found origin = {trace_orig}, dest = {trace_dest}")
logger.warning(
f"trace_od not found origin = {trace_orig}, dest = {trace_dest}"
)
else:

# add OD columns to trace results
df = pd.concat([od_df[trace_od_rows], trace_results], axis=1)

# dump the trace results table (with _temp variables) to aid debugging
tracing.trace_df(df,
label='accessibility',
index_label='skim_offset',
slicer='NONE',
warn_if_empty=True)
tracing.trace_df(
df,
label="accessibility",
index_label="skim_offset",
slicer="NONE",
warn_if_empty=True,
)

if trace_assigned_locals:
tracing.write_csv(trace_assigned_locals, file_name="accessibility_locals")
tracing.write_csv(
trace_assigned_locals, file_name="accessibility_locals"
)

return(accessibility_df)
return accessibility_df


@inject.step()
Expand All @@ -125,32 +139,45 @@ def compute_accessibility(land_use, accessibility, network_los, chunk_size, trac
steeper than automobile or transit. The minimum accessibility is zero.
"""

trace_label = 'compute_accessibility'
model_settings = config.read_model_settings('accessibility.yaml')
assignment_spec = assign.read_assignment_spec(config.config_file_path('accessibility.csv'))
trace_label = "compute_accessibility"
model_settings = config.read_model_settings("accessibility.yaml")
assignment_spec = assign.read_assignment_spec(
config.config_file_path("accessibility.csv")
)

accessibility_df = accessibility.to_frame()
if len(accessibility_df.columns) > 0:
logger.warning(f"accessibility table is not empty. Columns:{list(accessibility_df.columns)}")
logger.warning(
f"accessibility table is not empty. Columns:{list(accessibility_df.columns)}"
)
raise RuntimeError(f"accessibility table is not empty.")

constants = config.get_model_constants(model_settings)

# only include the land_use columns needed by spec, as specified by land_use_columns model_setting
land_use_columns = model_settings.get('land_use_columns', [])
land_use_columns = model_settings.get("land_use_columns", [])
land_use_df = land_use.to_frame()
land_use_df = land_use_df[land_use_columns]

logger.info(f"Running {trace_label} with {len(accessibility_df.index)} orig zones {len(land_use_df)} dest zones")
logger.info(
f"Running {trace_label} with {len(accessibility_df.index)} orig zones {len(land_use_df)} dest zones"
)

accessibilities_list = []

for i, chooser_chunk, chunk_trace_label in \
chunk.adaptive_chunked_choosers(accessibility_df, chunk_size, trace_label):

accessibilities = \
compute_accessibilities_for_zones(chooser_chunk, land_use_df, assignment_spec,
constants, network_los, trace_od, trace_label)
for i, chooser_chunk, chunk_trace_label in chunk.adaptive_chunked_choosers(
accessibility_df, chunk_size, trace_label
):

accessibilities = compute_accessibilities_for_zones(
chooser_chunk,
land_use_df,
assignment_spec,
constants,
network_los,
trace_od,
trace_label,
)
accessibilities_list.append(accessibilities)

accessibility_df = pd.concat(accessibilities_list)
Expand Down

0 comments on commit 95e70ed

Please sign in to comment.