Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
83849a4
add in validation pages and fix bug with export of data not available…
wesley-darling Jun 3, 2026
232d233
Fixed bug with exported widgets not resetting plots; fixed bug with o…
wesley-darling Jun 8, 2026
c2b1fa9
Added modebar with PNG export, CSV export, and sortable tables. TODO:…
wesley-darling Jun 8, 2026
3401256
fix typo in nonmandatory tour summary fn
wesley-darling Jun 9, 2026
42816ee
Merge branch 'main' of https://github.com/RSGInc/activitysim_visualizer
wesley-darling Jun 10, 2026
09922ee
Fix typo in non-mandatory frequency summary fn
wesley-darling Jun 10, 2026
fadb783
add all tours/trips skims; fix couple UI bugs.
wesley-darling Jun 12, 2026
af19154
initialize draft wiki
wesley-darling Jun 12, 2026
2d58b35
added way to read in pre-generated summaries
wesley-darling Jun 16, 2026
7f5088e
added validation summaries; added VMT based on either skimjoin result…
wesley-darling Jun 17, 2026
879bcb4
added A/B comparison tables with % diff and RMSE
wesley-darling Jun 26, 2026
c5fde88
Update to table labeling
wesley-darling Jun 26, 2026
cd831ed
added separate period selectors to traffic validation page
wesley-darling Jul 6, 2026
f2f27dd
added facility type mapping; fixed top count location table columns
wesley-darling Jul 6, 2026
ff89258
fixed traffic validation page, added mode breakdown for VMT
wesley-darling Jul 7, 2026
10c9492
fixed Geography selectors
wesley-darling Jul 7, 2026
a2252d6
fix commercial validation section of VMT page
wesley-darling Jul 7, 2026
a27efc0
updated regional validation page, removed commuting flows from long-t…
wesley-darling Jul 7, 2026
8463f0d
added config option display.density_hover_mode to view all densities …
wesley-darling Jul 7, 2026
e6593c9
added bar hover mode to config
wesley-darling Jul 7, 2026
34bc95b
update csv export schema
wesley-darling Jul 7, 2026
f452375
Update export to re-use states
wesley-darling Jul 7, 2026
51ae353
rename "external" to "demo" to reduce confusion; add check mark widge…
wesley-darling Jul 7, 2026
3098441
change from shadow pricing to employment/enrollment match
wesley-darling Jul 8, 2026
10d4305
small changes to validation summaries; added table to traffic validat…
wesley-darling Jul 8, 2026
de7f85b
Move time period creation from skimjoin to prepare step
wesley-darling Jul 9, 2026
dd8fea4
rename hypothetical skim tables config option
wesley-darling Jul 9, 2026
feae039
Added non-motorized VMT prepare-step lookup; summary fn; and validat…
wesley-darling Jul 9, 2026
a8607a0
added VMT totals table
wesley-darling Jul 9, 2026
a10f22f
Added check box to hide largest alternative
wesley-darling Jul 9, 2026
7084426
Added caps to relevant dashboard pages
wesley-darling Jul 9, 2026
cf2e760
Added household size segmentation for auto ownership; cleaned up geog…
wesley-darling Jul 9, 2026
5eb4f9e
Updated language around auto sufficiency
wesley-darling Jul 9, 2026
5a164f3
fixed hours presentation on time distribution plots; fixed hover for …
wesley-darling Jul 10, 2026
37b8c00
Switch from hide drive alone to hide auto modes; remove bar-normaliza…
wesley-darling Jul 10, 2026
8ee2739
Removed non-mandatory tour purpose selector, edited accompanying table
wesley-darling Jul 10, 2026
992e542
fix internal external table presentation; add TAZ geography to PNR page
wesley-darling Jul 10, 2026
6d872e6
Fixed Titles for Trip purpose and mode charts
wesley-darling Jul 10, 2026
06e5407
Added distance range selector for live dashboard
wesley-darling Jul 10, 2026
d571125
Updated bike skims; fixed distance binning with Mandatory tour distan…
wesley-darling Jul 10, 2026
3490283
added schema for validation summaries
wesley-darling Jul 10, 2026
64aaab1
block Bokeh warning; fix VMT validation control for live dashboard
wesley-darling Jul 10, 2026
4f8793f
Move logging to runtime module; fix bug with skimjoin running twice; …
wesley-darling Jul 13, 2026
4420f42
simplify dashboard page model.
wesley-darling Jul 13, 2026
98e3ed2
Simplify page authoring
wesley-darling Jul 13, 2026
3129272
Make workflow contracts more explicit; added new query API for dashbo…
wesley-darling Jul 13, 2026
332f93b
Simplified pipeline
wesley-darling Jul 13, 2026
ff050ce
Simplify HTML export.
wesley-darling Jul 13, 2026
09e8200
replace components with focused modules; migrate dashboard pages to n…
wesley-darling Jul 14, 2026
d868c89
Updated summary API and migrated all summaries to new API
wesley-darling Jul 14, 2026
ab5a1b9
Replace get_filtered_view with memoized query; Add page feature compo…
wesley-darling Jul 14, 2026
e58e3a7
Clean up repo
wesley-darling Jul 14, 2026
59de7e3
Updated tests
wesley-darling Jul 14, 2026
68e8923
fix bug with geographies on mandatory location choice page; rearrange…
wesley-darling Jul 14, 2026
1c8ca16
Merge validation summaries with refactored APIs
wesley-darling Jul 14, 2026
3f2cd2f
clean up CLI and repo; remove temporary files
wesley-darling Jul 15, 2026
f7f5d30
decompose large pages into mixins
wesley-darling Jul 15, 2026
e53c5b9
Added config reference pages
wesley-darling Jul 15, 2026
51b536c
Merge wiki documentation and refresh for current architecture
wesley-darling Jul 15, 2026
f92f557
Expand wiki extension guides
wesley-darling Jul 15, 2026
c441bd1
Make user workflows config driven
wesley-darling Jul 15, 2026
3c18668
Add worked wiki extension examples
wesley-darling Jul 15, 2026
4c358f6
Clarify wiki runtime and extension contracts
wesley-darling Jul 15, 2026
4e0e001
Add extensible weighting mode registry
wesley-darling Jul 15, 2026
5f992c3
Add column-based weighting extension
wesley-darling Jul 15, 2026
d4c8a78
replace RMSE with PRMSE
wesley-darling Jul 20, 2026
8000266
add calculation notes dropdown for each section. TODO: test HTML expo…
wesley-darling Jul 20, 2026
54ee1e5
Update calculation notes; add notes per plot.
wesley-darling Jul 21, 2026
a3d8968
Remove generated and local-only files from branch
wesley-darling Jul 28, 2026
cd47c08
Update CI coverage for dashboard and export changes
wesley-darling Jul 28, 2026
f84e581
Merge branch 'calculation-notes'
wesley-darling Jul 29, 2026
7171e3a
Remove unintended reference and ADR files
wesley-darling Jul 29, 2026
cfc96a7
Merge main into refactored page APIs
wesley-darling Jul 29, 2026
369284b
Consolidate documentation in wiki
wesley-darling Jul 29, 2026
deed7a2
Refresh example configs and untrack local notebook
wesley-darling Jul 29, 2026
059f27e
Remove obsolete tour time diagnostic script
wesley-darling Jul 29, 2026
e2d8a57
fix bug with schema, data not available card, and tour type column
wesley-darling Jul 31, 2026
beb4880
Fixed bug with export not treating config as override map, improve se…
wesley-darling Jul 31, 2026
e83e11d
Update stale tests
wesley-darling Aug 1, 2026
3890bd0
Added JSON streaming during export, check serialization during JSON c…
wesley-darling Aug 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,36 @@ on:
workflow_dispatch:

jobs:
pytest:
pytest-fast:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.12"]

steps:
- name: Check out repo
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Sync locked dependencies
run: uv sync --locked --group dev

- name: Run correctness lint
if: matrix.python-version == '3.12'
run: uv run ruff check .

- name: Run fast tests
run: uv run pytest --basetemp .pytest_tmp -m "not full_export"

pytest-full-export:
runs-on: windows-latest

steps:
Expand All @@ -22,8 +51,8 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Sync dependencies
run: uv sync
- name: Sync locked dependencies
run: uv sync --locked --group dev

- name: Run tests
run: uv run --with pytest pytest --basetemp .pytest_tmp
- name: Run exhaustive export tests
run: uv run pytest --basetemp .pytest_tmp -m full_export
22 changes: 20 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ instance/
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
Expand Down Expand Up @@ -225,4 +224,23 @@ tmp*/
*.parquet
*.json

plans/
plans/

# Local runtime and diagnostic artifacts
/artifacts/
/artifacts_2/
/logs/
/.manual_logging_test/
/.posit/publish/
/codex_tmp_check/
/config_1.yaml
/configs/artifacts/
/configs/artifacts_2/
/configs/scratch.py
/configs/skimjoin_odot_series15.yaml
/configs/will*.yaml
/pytest-output.txt
/raw_school_dropoff.ipynb
/prepared_table_filter_example.ipynb
/scratch.ipynb
/test
160 changes: 113 additions & 47 deletions README.md

Large diffs are not rendered by default.

52 changes: 45 additions & 7 deletions config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,32 @@ log_level: INFO

pipeline:
steps:
- prepare
- skimjoin
- segment
- summarize
- dashboard
dashboard_mode: live # live | export | host
# Add `prepare`, `skimjoin`, or `segment` when those explicit stages are
# needed. Summarize automatically prepares data when no valid cache exists.
dashboard_mode: live # none | live | export | host
overwrite: false

# Optional named alternatives backed by columns retained in prepared tables.
# weighting:
# modes:
# calibrated:
# label: Calibrated
# columns:
# households: calibrated_hh_weight
# persons: calibrated_person_weight
# trips: calibrated_trip_weight

# Advanced trusted calculations only. Each importable module defines
# register_weighting_modes(registry); settings are available on Config and enter
# summary cache identity.
# extensions:
# modules: [my_project.weighting]
# settings:
# calibrated:
# multiplier: 1.0

# ---------------------------------------------------------------------------
# ActivitySim output file names
# Use stems (no extension) for automatic format detection.
Expand Down Expand Up @@ -49,7 +67,7 @@ runs:
- dir: path\to\activitysim\output\run1
label: Base
# skimjoin:
# config_path: configs/example_skimjoin.yaml
# config_path: example_skimjoin_config.yaml
# skim_files:
# - C:\path\to\model_skims\*.omx
# - C:\path\to\model_skims\maz_stop_walk.csv
Expand Down Expand Up @@ -128,8 +146,10 @@ prepare:
# Settings for the `skimjoin` step, to be used as defaults.
# ---------------------------------------------------------------------------
skimjoin:
failure_policy: record # record | error
create_hypothetical_skim_tables: false
defaults:
config_path: configs/example_skimjoin.yaml
config_path: example_skimjoin_config.yaml
skim_files:
- C:\path\to\model_skims\*.omx
- C:\path\to\model_skims\maz_stop_walk.csv
Expand All @@ -141,7 +161,7 @@ skimjoin:
# ---------------------------------------------------------------------------
segment:
dashboard:
segmentation_type: person_sex
segmentation_type: signup_platform
visibility: segments_only # full_only | segments_only | full_and_segments
definitions:
signup_platform:
Expand Down Expand Up @@ -169,10 +189,16 @@ segment:
# ---------------------------------------------------------------------------
summarize:
weighting_modes: [weighted, unweighted]
failure_policy: record # record | error
pnr_tour_modes:
- PNR_TRANSIT
# Controls additional mapped geography aggregations only. Summaries may still
# emit all_geographies totals, and native prepared home geographies such as
# home_taz, home_county, and home_mpo can appear when those columns exist.
geography:
enabled: false
# Configured mappings create columns such as home_geo__district,
# work_geo__county, or land_use_geo__district.
# landuse_col: COUNTY
# mapping:
# 1: County 1
Expand All @@ -188,6 +214,7 @@ summarize:
# ---------------------------------------------------------------------------
dashboard:
title: "ActivitySim Comparison Visualizer"
include_notes: true
enable_maz_geographies: false
live:
pages:
Expand All @@ -200,6 +227,7 @@ dashboard:
- validation
export:
output_path: exports/dashboard.html
# `pages` overrides matching live pages; it is not an inclusion list.
# dashboard:
# weighting: [unweighted]
# pages:
Expand All @@ -212,8 +240,18 @@ dashboard:
# enabled: false
# school_table:
# enabled: false
# Reserved for a future hosted-dashboard implementation. These settings are
# validated but intentionally ignored by the current runtime.
# host:
# account: my-connect-cloud-account
# app_id: 12345
# title: ActivitySim Comparison Visualizer
# verify: true

display:
missing_data_display: card # card | blank
# bar_hover_mode: all # closest | all
# density_hover_mode: all # closest | all
labels:
person_type:
mapping:
Expand Down
8 changes: 8 additions & 0 deletions dashboard/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@
from dashboard.data_access import (
DashboardPreparedRunProvider,
DashboardSummarySeries,
PageData,
RunTables,
)
from dashboard.state import DashboardState
from dashboard.page_base import DashboardPage
from dashboard.page_definitions import dashboard_page

__all__ = [
"DashboardPreparedRunProvider",
"DashboardPage",
"DashboardState",
"DashboardSummarySeries",
"PageData",
"RunTables",
"dashboard_page",
]
16 changes: 5 additions & 11 deletions dashboard/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,15 @@
import panel as pn

from dashboard import DashboardState
from dashboard.components import (
build_run_legend_panes,
set_percent_mode,
set_run_colors,
set_run_label_order,
)
from dashboard.rendering import RenderContext, run_legend_panes
from dashboard.page_registry import (
build_dashboard_prepared_run_provider,
build_registered_live_pages,
resolve_live_navigation_entries,
)
from dashboard.page_base import GroupedDashboardPage
from processor.models import RunData
from processor.summarize.cache import SummaryRun
from processor.summarize.cache_types import SummaryRun
from runtime.config import Config

pn.extension("plotly", "tabulator", sizing_mode="stretch_width")
Expand All @@ -39,17 +34,17 @@ def build_dashboard(
summary_runs: list[SummaryRun] | None = None,
) -> pn.template.FastListTemplate:
"""Assemble the full Panel dashboard from a list of (label, RunData) tuples."""
set_run_colors(config.run_colors)
prepared_run_provider = build_dashboard_prepared_run_provider(prepared_runs, config)
state = DashboardState(
summary_runs=summary_runs,
weighting_modes=config.weighting_modes,
weighting_definitions=config.weighting_mode_definitions,
config=config,
prepared_run_provider=prepared_run_provider,
dashboard_segmentation_type=config.segmentation.dashboard.segmentation_type,
default_segmentation_visibility=config.segmentation.dashboard.visibility,
)
run_labels = state.run_labels
set_run_label_order(run_labels)

weight_mode = pn.widgets.RadioButtonGroup(
name="Weighting",
Expand All @@ -70,7 +65,6 @@ def build_dashboard(
# if static_export:
# weight_mode.disabled = True
# value_mode.disabled = True
# set_percent_mode(True)
# pages = build_registered_live_pages(state, config)
# for page in pages:
# page.mark_stale()
Expand Down Expand Up @@ -141,7 +135,7 @@ def _on_value_change(event) -> None:

sidebar_items = [
pn.pane.Markdown("## Runs Loaded"),
*build_run_legend_panes(run_labels),
*run_legend_panes(RenderContext.from_dashboard(config, state)),
pn.layout.Divider(),
pn.pane.Markdown("## Display Options"),
pn.pane.HTML(
Expand Down
Loading
Loading