The January 2025 Eaton and Palisades fires killed 29 people and destroyed 16,000+ structures near Los Angeles. Operational cellular-automaton + Rothermel spread models underestimated the fires by ~10×. Evacuation routing systems (Waze, county VEOR feeds) didn't use spread forecasts. Fire-crew placement was decided by the Incident Commander on intuition.
PyroPredict is an end-to-end open-source pipeline that addresses all three gaps in pure NumPy on a single CPU.
The paper is at paper/pyropredict.pdf.
pip install -e .
pytest -q tests/ # 10 unit tests, ~1.5s
make reproduce # all 3 experiments, ~30s on CPU
make paper # build paper/pyropredict.pdf- Landscape model: fuel, terrain, roads, water, population on a 2D grid.
- Weather: Santa Ana / Diablo wind streams + typical-summer baselines.
- Rothermel CA spread: 8-neighbour propagation with wind + slope corrections.
- Hybrid CA + ridge residual: closed-form bias-correction multiplier.
- Forecast-aware evacuation router: Dijkstra on road graph with dynamically-blocked edges from the spread forecast.
- Forecast-aware crew placement: greedy submodular maximisation of expected population protected.
| Path | Purpose |
|---|---|
pyropredict/landscape.py |
5 fuel archetypes + synthetic landscapes |
pyropredict/weather.py |
Santa Ana / typical summer streams |
pyropredict/spread.py |
Rothermel + 8-neighbour CA |
pyropredict/forecast.py |
Hybrid CA + ridge multiplier |
pyropredict/evacuation.py |
Forecast-aware Dijkstra router |
pyropredict/resources.py |
Greedy submodular crew placement |
tests/ |
10 unit tests, all green |
experiments/spread_accuracy.py |
CA vs hybrid IoU across 3 spotting intensities |
experiments/evacuation.py |
Naive vs forecast-aware routing |
experiments/resources.py |
Crew placement comparison |
scripts/make_figures.py |
Build figures from results |
paper/pyropredict.tex |
Paper source |
paper/figures/*.pdf |
Real figures from real data |
results/*.json |
Raw experiment records |
| Experiment | Result |
|---|---|
| CA IoU under heavy spotting | 0.828 |
| Hybrid IoU under heavy spotting | 0.830 (small gain; residual learner needs spatial awareness) |
| Naive routing residents trapped | 27.2% (~3,627 people per scenario) |
| Forecast-aware routing residents trapped | 0% |
| Lives saved per scenario | +3,627 ± 155 |
| Crews K=3 forecast-aware lives saved | ~230 |
| Crews K=3 forecast-blind population-greedy | ~36 |
| Crews K=10 forecast-blind catches up to | K=3 forecast-aware |
- Spotting model. Ridge multiplier is a global correction; the spatial pattern of ember-driven ignitions needs a CNN/graph net residual. No real fire-perimeter data to train this in v0.1.
- Synthetic landscape. Real LANDFIRE FBFM13 + USGS DEM + Census population integration is future work.
- Evacuation experiment uses fixed-time road threats to isolate the routing decision. Production would derive threat times from the spread forecast and inherit its bias.
- No validation against published Palisades / Eaton 2025 perimeters. Data exists; v0.1 hasn't ingested it.
- Walking-only evacuation. Mixed-mode (vehicle + walking under congestion) router is future work.
MIT.
@misc{debes2026pyropredict,
title = {PyroPredict: Real-Time Wildfire Spread Forecasting
with Forecast-Aware Evacuation Routing and Resource Deployment},
author = {Debes, Anwar},
year = {2026},
note = {Reference implementation v0.1, May 2026}
}