Measured, not promised
Evidence
The old README promised a 30–50% accuracy boost and shipped a model that ignored its inputs. This page only shows numbers a committed script reproduces — wins and losses alike.
The part most libraries hide
We publish the numbers our scripts reproduce — including where we lose
Event-timing audits on real held-out hardware. Lower is better (timing MAE in cycles). In these single-seed June runs APDTFlow won the battery and FD001 audits and lost to a linear baseline on FD002. A November 10-seed re-run of the battery audit put it slightly behind linear on average (mean 10.7 vs 9.7; ahead on 2 of 10 seeds): shown here, not buried.
| Audit (real data, held-out units) | APDTFlow | Linear extrap. | Persistence |
|---|---|---|---|
| Battery end-of-life 3 cells, leave-one-battery-out; June, one seed (10-seed re-run: mean 10.7, behind linear) | 8.3 | 9.7 | 15.4 |
| Turbofan FD001 40 unseen engines, 0.6% false alarms | 8.3 | 8.7 | 11.5 |
| Turbofan FD002 110 unseen engines, 6 operating regimes, 0.0% false alarms | 9.2 | 8.1 | 11.3 |
The trust panel reports its own miss
On cross-unit transfer the windows measured under their 90% target, and for distant events the point estimate saturates toward mid-horizon. That is why the operational rule exists:
schedule by act_by (the window's earliest edge), never by the point estimate.
Full benchmarks and reproduce commands →Source of truth, with per-seed tables: docs/experiment_results.md. Windows are calibrated on the training windows, the library default; holding the most recent windows out instead is an option, and measured worse on these audits (docs/METHODOLOGY.md).
Grid accuracy
Is the base forecaster accurate?
6 datasets, 12-step horizon, MAE relative to seasonal-naive (under 1.0 beats it). APDTFlow beats seasonal-naive on 3 of 6 domains and wins outright on two; on smooth seasonal data the linear and Holt-Winters baselines are stronger, and we show those rows too.
| Dataset | APDTFlow | Linear | Holt-Winters |
|---|---|---|---|
| Daily min temperature (real) | 0.73 | 0.74 | 0.80 |
| Regime-switching nonlinear | 0.77 | 0.83 | 0.86 |
| Trend + dual seasonality | 0.85 | 0.50 | 0.38 |
| Retail-like multiplicative seasonal | 1.01 | 0.68 | 0.81 |
| Electric production (real, 397 pts) | 1.52 | 1.03 | 1.23 |
| Random walk (unpredictable) | 1.86 | 1.15 | 1.12 |
For pure grid accuracy, tuned deep models (NeuralForecast) or zero-shot foundation
models (Chronos-2, TimesFM, Moirai-2) may be stronger. APDTFlow is complementary —
its value is predict_at and
predict_when, which those models do not offer.
The full audit, in pictures
Speed
CPU or GPU?
Training time per epoch, median of all epochs after the first, 3 fits each. Each training step runs as a CUDA graph on the GPU, which is what makes it win; before graph capture the default-size model trained 2x faster on the CPU. Single-window calls are still faster on the CPU.
| Configuration | CPU epoch | GPU epoch | Faster |
|---|---|---|---|
| Default-size model (hidden 16, batch 32) | 4.60 s | 1.04 s | GPU, 4.4x |
| Continuous decoder (hidden 64, batch 64) | 22.4 s | 4.44 s | GPU, 5.0x |
| NASA battery, 119 windows (hidden 16) | 0.81 s | 0.73 s | about even |
| Large model (hidden 128, batch 256) | 41.7 s | 6.10 s | GPU, 6.8x |
Intel Core i7-12700H vs NVIDIA RTX 3050 Ti Laptop GPU (4 GB), WSL2, PyTorch 2.14.1, apdtflow 0.5.0. Full table, inference latency and method: docs/gpu_and_performance.md.
Reproduce every number
That pipeline is how every result on this page was produced — including the ideas we tested and rejected.
python experiments/battery_eol_demo.py
python experiments/turbofan_when_demo.py
python experiments/fd002_robustness_demo.py
python experiments/benchmark_multidomain.py
python benchmarks/benchmark_device.py
Full protocol and per-cell breakdowns:
docs/experiment_results.md.
Have degradation or depletion data? Run
python experiments/audit_predict_when.py
on your own series and
open a PR if APDTFlow wins.