Spaces:
Runtime error
Runtime error
| # FlowTwin — Demo Guide | |
| Everything needed to run the demonstration, in order, with what to say and what | |
| to do if something goes wrong. | |
| --- | |
| ## Before you start | |
| ```bash | |
| ./run.sh # Windows: run.bat | |
| ``` | |
| Open **http://127.0.0.1:8000**. Check the top-right connection chip reads | |
| **live** once a run starts. | |
| Pre-flight checklist (two minutes): | |
| - [ ] `python scripts/build_venues.py` — venues and scenarios regenerate cleanly | |
| - [ ] `cd backend && python -m pytest -q` — the suite passes | |
| - [ ] `python scripts/ui_check.py` — drives the whole acceptance path in a real browser and saves screenshots to `shots/` | |
| - [ ] `benchmarks/BENCHMARKS.md` exists and is current | |
| - [ ] Optional: `python scripts/fetch_hf_model.py` — with network access, so the Perception panel shows a live model | |
| - [ ] Optional: `python scripts/record_fallback.py` — records both scenarios as replay insurance | |
| Keyboard shortcuts during the demo: | |
| | Key | Action | | |
| |---|---| | |
| | `Space` | play / pause | | |
| | `1`–`6` | speed 1× / 2× / 5× / 10× / 20× / 40× | | |
| | `S` | simulate strategies | | |
| | `Esc` | close the drawer or a modal | | |
| --- | |
| ## The 6-minute run | |
| ### 0:00 — The hook | |
| > "Formula 1 has spent decades learning to turn telemetry into strategy. But the | |
| > cars aren't the only thing moving on race day. Hundreds of thousands of people | |
| > move through gates, corridors and transport links that have a fixed capacity. | |
| > There is telemetry for the car. Where is the telemetry for the crowd?" | |
| Point at the header: **FlowTwin · Crowd Race Control**. Four scenarios in the | |
| switcher; the map is the product. | |
| ### 0:30 — The problem | |
| > "Existing crowd monitoring tells an operator where people *are*. The dangerous | |
| > question is where the flow is going to *fail* — and what to do about it before | |
| > it does." | |
| ### 1:00 — Simulation 1: prove the engine | |
| **Do:** with *F1 Circuit Stress Test* selected, press **Run simulation**. Set | |
| speed to **20×**. | |
| > "Forty thousand spectators, a fictional but realistically proportioned Grand | |
| > Prix venue. Four exits, six spectator zones. The chequered flag has just | |
| > fallen. Those are individual simulated people — each with their own walking | |
| > speed, destination and willingness to follow instructions." | |
| **Point out:** the venue emptying, the metrics strip filling, the flow arrows. | |
| At **T+04:00** a red banner flashes across the map: **Exit B throughput reduced | |
| by 50%**. | |
| > "That's a scripted infrastructure failure — and it's a real change to the | |
| > simulated network, not a caption. Half of Exit B's lanes are out of service." | |
| ### 2:00 — SEE and PREDICT | |
| Watch the East Concourse corridor turn yellow, then orange. The Alerts panel | |
| raises a card. | |
| > "FlowTwin isn't reacting to a threshold. The alert carries a *cause* — inflow | |
| > at capacity, the queue growing, walking speed collapsing — and, once the | |
| > projection crosses the critical line, a *lead time*." | |
| **Point out** the alert reading **"Projected critical in ~50 s"** and the | |
| Prediction panel bars stepping up across now / +30 / +60 / +90 / +120 s. | |
| > "That projection comes from a gradient-boosted model trained on the simulator's | |
| > own ground truth and validated on seeds it never saw. Click *Model accuracy* — | |
| > it beats the physics baseline by roughly 40 to 60 per cent depending on the | |
| > horizon, and if it hadn't, the system would refuse to load it." | |
| *(Optional: open **Model accuracy** for five seconds.)* | |
| ### 3:00 — SIMULATE | |
| **Do:** press **Simulate strategies** (or `S`). Takes a few seconds. | |
| > "This is the part that isn't a dashboard. FlowTwin has just cloned the current | |
| > crowd state eight times — byte identical, same random seed — applied a | |
| > different intervention to each copy, and simulated all of them forward five | |
| > minutes." | |
| The drawer opens. Walk the table left to right: | |
| > "Doing nothing: peak density around 3, the corridor critical for over two | |
| > minutes, a queue of nearly 5,000. Redirecting 40%: peak density down about a | |
| > quarter, critical time to zero, the queue down by a quarter — for essentially | |
| > no change in average journey time. | |
| > | |
| > These aren't rules of thumb. Every number in this table was measured from a | |
| > simulation that actually ran." | |
| Then the **Why this strategy?** column: | |
| > "Primary bottleneck, predicted critical time, the recommended action, and the | |
| > reason — expressed as measured changes against doing nothing. The margin over | |
| > the runner-up is there too. No language model is anywhere in this decision." | |
| ### 4:00 — ACT | |
| **Do:** press **Apply intervention**. | |
| > "The operator stays in control. FlowTwin recommends; a human decides." | |
| **Point out:** green dashed reroute paths appear on the map; the queue metric | |
| starts falling; the alert drops from critical to warning; the intervention is | |
| recorded in the event timeline with how many people accepted the instruction. | |
| > "Note that not everyone complies — that's modelled per person. About seventy | |
| > per cent of those instructed actually change route, which is what makes the | |
| > measured improvement believable." | |
| ### 4:45 — Simulation 2: prove it matters | |
| **Do:** click **02 · Barcelona 2022 Counterfactual**. | |
| > "Now the same intelligence against a real Formula 1 crowd-flow failure." | |
| **Read the left rail deliberately** — this is the credibility moment: | |
| > "The 2022 Spanish Grand Prix. 277,836 reported weekend attendance. Documented | |
| > severe road and public-transport congestion, long concession queues. Formula 1 | |
| > publicly told the promoter the situation was not acceptable. Those are facts, | |
| > each with a source. | |
| > | |
| > What we do *not* have is the original spectator telemetry — it isn't public. | |
| > So we did not recreate Barcelona. We reconstructed the documented conditions | |
| > with a transparent model, and every assumption is labelled as one: the mode | |
| > split, the corridor capacities, the departure curve, the walking speeds." | |
| Scroll to the **Evidence & assumptions** panel and let the two lists be seen. | |
| **Do:** run it at 20×. The rail interchange saturates and the north side backs | |
| up. | |
| > "The failure here isn't inside the circuit. It's the transport interface — and | |
| > that matches what was reported." | |
| **Do:** press **Simulate strategies**. | |
| > "The question is not *what happened*. It's: given the documented conditions, | |
| > what would an AI race engineer have recommended?" | |
| ### 5:30 — Results | |
| > "Across independent random seeds of the full simulation — baseline shortest | |
| > path, a static pre-event plan, and the full FlowTwin loop — peak density falls | |
| > by more than half, time spent in critical conditions goes to zero, and the | |
| > maximum queue falls by around 60 per cent, with average journey time slightly | |
| > *better*, not worse." | |
| Quote from `benchmarks/BENCHMARKS.md`. Every figure is generated by | |
| `scripts/run_benchmarks.py`. | |
| ### 5:45 — Close | |
| > "Most systems stop at detection. FlowTwin closes the loop: observe, predict, | |
| > simulate the alternatives, and recommend the one that measurably works. | |
| > | |
| > Don't wait for the bottleneck. Simulate the intervention before it happens." | |
| --- | |
| ## Optional beats | |
| **Perception (30 s).** Click **Perception** in the header. Shows the candidate | |
| chain, the active Hugging Face model and the observation schema both input modes | |
| share. Upload a crowd photo to get a live count. If no model is loaded it says | |
| exactly why — which is itself the point: it never invents a number. | |
| **What-if (30 s).** Change attendance or Exit B capacity in the left rail and | |
| press **Run simulation**. Every run is reproducible from its seed. | |
| **Reproducibility (15 s).** Point at the seed in the metrics strip. Same venue, | |
| same scenario, same seed, same run — the test suite asserts it. | |
| --- | |
| ## If something goes wrong | |
| **A simulation will not start.** Every scenario has a recorded run. Start it | |
| explicitly: | |
| ```bash | |
| curl -X POST localhost:8000/api/simulation/start \ | |
| -H 'content-type: application/json' \ | |
| -d '{"venue_id":"circuit_alpha","scenario_id":"circuit_alpha_post_race","use_recording":true}' | |
| ``` | |
| The dashboard behaves identically — same frames, same strategy comparison. Record | |
| them beforehand with `python scripts/record_fallback.py`. | |
| **The connection chip says `reconnecting`.** The stream reconnects on its own with | |
| backoff. The simulation keeps running; nothing is lost. | |
| **Strategy simulation is slow.** It is doing real work — eight full simulations | |
| over a five-minute horizon. Lower the horizon, or reduce attendance in the | |
| What-If panel before the run. | |
| **The browser tab was reloaded.** Just press **Run simulation** again. Orphaned | |
| sessions stop themselves and are reaped. | |
| **Perception says unavailable.** Expected without `torch`/`transformers` or | |
| network access. It is not on the critical path — say so and move on; the panel | |
| already explains it on screen. | |
| --- | |
| ## Questions you should expect | |
| **"Isn't this just shortest-path routing?"** | |
| No. Shortest path is the *baseline we measure against*. FlowTwin weights routes | |
| by live congestion, predicted state, capacity and risk — and then simulates | |
| several interventions before choosing one. The benchmark shows shortest path, | |
| static routing and FlowTwin side by side. | |
| **"Where does the data come from?"** | |
| Synthetic agents, because they give exact ground truth: we know precisely what | |
| happened under every intervention, which is what makes honest benchmarking | |
| possible. For real-world observation there's a Hugging Face crowd model feeding | |
| the same schema. For Barcelona, documented facts and labelled assumptions. | |
| **"Is this actually AI?"** | |
| Machine-learned crowd perception and a trained future-state predictor validated | |
| on held-out seeds. The *decision* comes from simulation and optimisation — which | |
| is deliberate. A numerical safety-adjacent decision should be measurable and | |
| reproducible, and an LLM is neither. | |
| **"Did you recreate Barcelona?"** | |
| No, and the interface says so. The original crowd telemetry isn't public. We | |
| reconstructed documented conditions and separate evidence from assumption on | |
| screen throughout. | |
| **"Can you guarantee this prevents a crush?"** | |
| No. It is decision support. It shows a recommendation, its cause, its lead time | |
| and its expected outcome; a trained operator decides. Real deployment would need | |
| venue calibration, sensor integration and operational validation. | |
| **"Why is average travel time barely different?"** | |
| Because that's the honest result over that window, and it's the point: the safety | |
| gain doesn't cost mobility. The optimizer weights travel time explicitly, and if | |
| a strategy bought density at the price of a much longer walk, the score would say | |
| so — some candidates in the table do exactly that. | |