・VISHWAS / PORTFOLIO
0%
INITIALIZING EXPERIENCE
BENGALURU · AM PEAK● LIVE 07:30FILE 04/11

Glacies

A digital twin of Bengaluru's transit, built to ask “what if”.

● OBSERVED● ESTIMATED● SIMULATED● ASSUMED

Glacies models Bengaluru's bus and metro network from open data, generates synthetic morning-peak demand, routes and assigns every trip, then compares any changed network against the baseline — travel time, waiting, transfers, crowding and access to jobs. It runs on a laptop.

● THE GAP

Planners can't easily see what a timetable change, a route cut or a new corridor would do to commuters before they make it — city-scale models are expensive, closed and opaque.

MODEL STATUS BOARDFROM THE REPO
zones
stops modelled
OD trips assigned
boardings simulated
median one-to-one route
architecture decision records

The line

6 stations · data → decision

  1. STN 01

    Ingest

    BMTC and metro GTFS, OpenStreetMap, WorldPop population and a jobs proxy become one canonical network on H3 zones.

  2. STN 02

    Route

    A Rust RAPTOR router, called from Python, builds zone-to-zone travel times for departures every minute across the morning peak.

  3. STN 03

    Measure access

    The share of jobs reachable in 15 / 30 / 45 / 60 minutes, with inequality measured as a Gini coefficient.

  4. STN 04

    Generate demand

    A doubly-constrained gravity model produces work and education trips, calibrated against metro gate counts.

  5. STN 05

    Assign & crowd

    Trips are assigned with a crowding loop — fixed alternatives, a logit split and MSA averaging — giving loads per vehicle segment.

  6. STN 06

    Compare & optimise

    Scenario files change headways, remove routes or add corridors; NSGA-II searches headways trading waiting time against fleet hours.

What-if lens

drag the split · baseline ⟷ scenario
⟷
BASELINESCENARIO
- - - route removed━━ frequency changed━━ unchanged
● PANEL 01

Pro & Easy views

A map workbench with Explore / Design / Compare / Data modes, and a plain-language view that answers one question with a shareable link.

● PANEL 02

Scenario builder

Draw the draft network before running — removed routes dashed red, frequency changes amber, new routes ice.

● PANEL 03

What-If Lens

A draggable before/after split across the map.

● PANEL 04

Background simulations

Queued jobs with stage progress, cancelling, caching and recovery when a worker drops.

● PANEL 05

Honest numbers

Every figure is badged Observed, Estimated, Simulated or Assumed.

Decision records

ADR · 01
ACCEPTED

Rust routing core

RAPTOR with range searches, a parallel matrix build and journey bundles, exposed to Python through PyO3.

crates/raptor/src ↗
ADR · 02
ACCEPTED

Crowding-aware assignment

A fixed choice set per trip, a logit split and method-of-successive-averages — no expensive re-routing every iteration.

src/glacies/assignment/crowding.py ↗
ADR · 03
ACCEPTED

Proven optimiser

NSGA-II was validated by brute-forcing a two-route toy network and recovering its exact Pareto front.

tests/test_optimise_toy.py ↗
ADR · 04
ACCEPTED

Byte-identical builds

Same data, scenario, config and seed rewrite identical Parquet; provenance labels are enforced in code.

src/glacies/provenance.py ↗
FRONTEND React 19 / TypeScript / Vite / deck.gl / MapLibreBACKEND Python / FastAPI / Typer CLI / RQ · ValkeyCOMPUTE Rust RAPTOR / PyO3 / Polars / DuckDB / H3 / pymooINFRA PostGIS / Docker Compose / GitHub Actions
Open the repository ↗
NEXT DEPARTUREPLATFORM 05 · NOW
Panenka →Football statistics, elevated.