activitysim icon indicating copy to clipboard operation
activitysim copied to clipboard

Accessing global variables defined in settings.yaml

Open asiripanich opened this issue 8 months ago • 0 comments

Describe the bug Hello 👋

I noticed that setting('variable') only works in *_preprocessor.csv files and not in utility specification files.

However, this trip_destination.csv has setting('cbd_threshold'), as shown here:

https://github.com/ActivitySim/activitysim/blob/4abb86f41d8ac0ce68cc8a879b127875049669b8/activitysim/examples/prototype_mtc/configs/trip_destination.csv#L6

This suggests that setting() can be used to access global variables defined in the settings.yaml file within utility specification files. In practice, though, this doesn’t raise an error because the expression is never evaluated (no coefficients are assigned).

Once this is clear to me, I’m more than happy to document the use of setting() in the documentation, as I believe this hasn’t been covered yet.

Also, if setting() was not designed to be used in utility specification files, what is the recommended way to access global variables? For example, I have max_walk_distance that I use in a few places in my configs folder, and I would like to have one variable (for maintainability) rather than defining the same value in multiple files.

To Reproduce Steps to reproduce the behavior:

Create an example

# ActivitySim v1.3
activitysim create -e prototype_mtc
cd prototype_mtc

Go into trip_destination.csv and use setting('cbd_threshold') on a line that has a coefficient.

I picked:

util_size_term,size term,"@np.log1p(size_terms.get(df.dest_taz, df.purpose)) * setting('cbd_threshold')",

Then run the model:

activitysim run -c configs -d data

Screenshots

Here is the error I got:

[00:29.93] INFO: trip_destination.trip_num_1.univ.trip_dest_simulate.interaction_sample_simulate.eval_interaction_utils sharrow_enabled is False
[00:29.93] ERROR: trip_destination.trip_num_1.univ.trip_dest_simulate.interaction_sample_simulate.eval_interaction_utils - NameError (name 'setting' is not defined) evaluating: @np.log1p(size_terms.get(df.dest_taz, df.purpose)) * setting('cbd_threshold') # sharrow: np.log1p(size_terms['sizearray'])
Traceback (most recent call last):
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 288, in eval_interaction_utilities
    v = to_series(eval(expr[1:], globals(), locals_d))
  File "<string>", line 1, in <module>
NameError: name 'setting' is not defined
[00:29.93] ERROR: ===== ERROR IN trip_destination =====
[00:29.93] ERROR: name 'setting' is not defined
Traceback (most recent call last):
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 46, in wrapper
    return func(*args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1641, in trip_destination
    trips_df, save_sample_df = run_trip_destination(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 500, in wrapper
    return function(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1481, in run_trip_destination
    choices, destination_sample = choose_trip_destination(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 500, in wrapper
    return function(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1123, in choose_trip_destination
    destinations = trip_destination_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1019, in trip_destination_simulate
    destinations = interaction_sample_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_sample_simulate.py", line 499, in interaction_sample_simulate
    choices = _interaction_sample_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_sample_simulate.py", line 211, in _interaction_sample_simulate
    ) = interaction_simulate.eval_interaction_utilities(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 370, in eval_interaction_utilities
    raise err
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 288, in eval_interaction_utilities
    v = to_series(eval(expr[1:], globals(), locals_d))
  File "<string>", line 1, in <module>
NameError: name 'setting' is not defined
[00:29.94] ERROR: ===== / =====
[00:29.94] NOTIFY:  time to execute run.trip_destination UNTIL ERROR : 0.723 seconds
[00:29.94] INFO: Time to execute all models until this error : 28.8 seconds (0.5 minutes)
[00:29.94] ERROR: activitysim run encountered an unrecoverable error
Traceback (most recent call last):
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/cli/run.py", line 399, in run
    state.run(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/runner.py", line 170, in __call__
    self.by_name(model)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/runner.py", line 347, in by_name
    self._obj._context = run_named_step(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 83, in run_named_step
    step_func(context, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 367, in run_step
    outcome = error_logging(wrapped_func)(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 46, in wrapper
    return func(*args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1641, in trip_destination
    trips_df, save_sample_df = run_trip_destination(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 500, in wrapper
    return function(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1481, in run_trip_destination
    choices, destination_sample = choose_trip_destination(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 500, in wrapper
    return function(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1123, in choose_trip_destination
    destinations = trip_destination_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1019, in trip_destination_simulate
    destinations = interaction_sample_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_sample_simulate.py", line 499, in interaction_sample_simulate
    choices = _interaction_sample_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_sample_simulate.py", line 211, in _interaction_sample_simulate
    ) = interaction_simulate.eval_interaction_utilities(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 370, in eval_interaction_utilities
    raise err
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 288, in eval_interaction_utilities
    v = to_series(eval(expr[1:], globals(), locals_d))
  File "<string>", line 1, in <module>
NameError: name 'setting' is not defined
[00:29.95] ERROR: name 'setting' is not defined
Traceback (most recent call last):
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/cli/main.py", line 72, in main
    sys.exit(asim.execute())
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/cli/cli.py", line 39, in execute
    return args.afunc(args)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/cli/run.py", line 399, in run
    state.run(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/runner.py", line 170, in __call__
    self.by_name(model)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/runner.py", line 347, in by_name
    self._obj._context = run_named_step(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 83, in run_named_step
    step_func(context, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 367, in run_step
    outcome = error_logging(wrapped_func)(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 46, in wrapper
    return func(*args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1641, in trip_destination
    trips_df, save_sample_df = run_trip_destination(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 500, in wrapper
    return function(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1481, in run_trip_destination
    choices, destination_sample = choose_trip_destination(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/workflow/steps.py", line 500, in wrapper
    return function(state, *args, **kwargs)
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1123, in choose_trip_destination
    destinations = trip_destination_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/abm/models/trip_destination.py", line 1019, in trip_destination_simulate
    destinations = interaction_sample_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_sample_simulate.py", line 499, in interaction_sample_simulate
    choices = _interaction_sample_simulate(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_sample_simulate.py", line 211, in _interaction_sample_simulate
    ) = interaction_simulate.eval_interaction_utilities(
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 370, in eval_interaction_utilities
    raise err
  File "/Users/amarin/GitHub/ext/activitysim/activitysim/core/interaction_simulate.py", line 288, in eval_interaction_utilities
    v = to_series(eval(expr[1:], globals(), locals_d))
  File "<string>", line 1, in <module>
NameError: name 'setting' is not defined

asiripanich avatar Mar 14 '25 13:03 asiripanich