Models (core.py) — four scikit-learn HistGradientBoosting models on real ASTraM data:
road-closure / barricade classifier (AUC 0.79; surfaces ~57% of closures while flagging only ~16%
of incidents), priority classifier (recovers the ASTraM rule), clearance-time regressor (median
error ~35 min on a heavy-tailed target), and a daily volume forecaster (beats the naïve baseline).
Plus the recommender, planned-event planner, explainability (risk_factors), corridor hour-profile,
and surge detector.
Console (app.py)
- 🛰 Live Operations — real-time discrete-event engine: incidents arrive on Bengaluru's real per-hour rates, are scored live by the models, and consume a finite officer pool. Moving City Pressure gauge, live map, force-utilisation, congestion-ripple board, dispatch log, 💥 Inject.
- ⚡ Live Triage — instant dispatch ticket + "Why this call" explainability.
- 📋 Plan Event — pre-deployment plan for planned events, scaled by crowd size.
- 🗺 Hotspot Map — geospatial chokepoint view.
- 📈 Forecast & Staffing — 7-day forecast with surge alerts + officer allocation.
- 🧪 Model Card — transparent metrics + proactive-advantage stat.
Simulation (sim.py) — arrival/severity sampling, officer-pool state machine, congestion ripple.
Infra — deployed live on Streamlit Cloud; resilient data loader finds the CSV by pattern regardless of filename/location; no heavy dependencies.
A scoped intent + entity parser turns plain-English questions into model-backed answers:
- "Officers for a festival on Hosur Road Saturday evening?" → full pre-deployment plan
- "Closure risk on Mysore Road?" → corridor risk profile
- "Worst hotspots this week" → ranked chokepoints
- "7-day incident forecast" → volume forecast + surge days
Fuzzy corridor matching, cause synonyms, day/time/crowd extraction, and a graceful help fallback. Runs fully offline — no external API or keys — so it deploys clean and works in the live demo.
Quantifies what PulseGrid's dispatch logic is worth. The same event-surge incident stream is replayed under a reactive control room (FIFO, no reserve) vs PulseGrid (severity-first dispatch + forecast-aware reserve) on identical officers. Headline result:
~50% faster to critical incidents — average wait-for-units on road-closure & High-priority incidents drops from ~51 min to ~24 min on a 16-officer force (stable across random seeds).
Sliders vary force size and surge intensity; the advantage holds throughout.
| File | Change |
|---|---|
assistant.py |
new — offline NL co-pilot |
sim.py |
added compare_policies + stream/policy simulators |
app.py |
added two tabs (💬 Ask the Console, 🧠 Policy Lab); now 8 tabs |
APPROACH.md |
capabilities list updated to 8 features |
CHANGELOG.md |
new — this file |
core.py |
unchanged this update (resilient loader from the prior fix) |
Honest hardening of the engine, not cosmetic relabelling:
- Clearance → calibrated band. Replaced the weak point estimate with P50/P90 quantile regression + a conformal calibration to verified 90% coverage (was 81%).
- Closure → calibration + operating points. Kept AUC at its honest data ceiling (~0.79) but added a low Brier (0.08) and a full recall/precision/flag-rate table across thresholds. (Out-of-fold target encoding was tested and removed — it didn't improve AUC, so it isn't claimed.)
- Forecast. Reported the honest ~15% lift over a seasonal-naive baseline.
- Pressure index. Cap now calibrated from real concurrent severity-weighted load (90th pct), not a hardcoded constant.
- Simulator validated. Its sampled stream reproduces the real hour-of-day incidence at r≈0.98.
- Diversion. Now recommends the nearest parallel corridor by geography.
Files touched: core.py (quantile band, conformal cal, operating points, diversion, centroids),
sim.py (calibrated cap, arrival-fidelity check), app.py (Model Card rigor panel, calibrated band
in triage, geographic diversion), README.md, APPROACH.md.