Option B Interleaved Traversal Prototype
Experiment-only prototype for docs/plans/archive/option_b_interleaved_traversal.md.
It does not wire into the trainer and does not replace the production Cython
recursive traversal path.
The prototype implements a small outcome-sampling traversal subset twice:
- recursive baseline: one policy request per forward (
bs=1) - explicit continuation scheduler: many traversal contexts yield at policy states, then policy requests are batched and scattered back to contexts
To make interleaving parity checkable, each traversal context owns its own RNG state. This is intentionally stricter for the prototype scheduler and not a claim that production Cython parity is solved.
Run:
uv run python experiments/option_b_interleaved_traversal/prototype_interleaved.py \
--traversals 64 \
--interleave-width 32 \
--max-depth 8 \
--max-nodes 512 \
--device cpu
CUDA spot check:
uv run python experiments/option_b_interleaved_traversal/prototype_interleaved.py \
--traversals 64 \
--interleave-width 32 \
--max-depth 8 \
--max-nodes 512 \
--device cuda \
--output experiments/option_b_interleaved_traversal/results_cuda.json
2026-05-07 results, legacy/deep-cfr/configs/default.yaml, RTX 3090 host:
| Device | Mode | total s | forward s | scheduler s | batch mean | batch max | speedup |
|---|---|---|---|---|---|---|---|
| CPU | recursive | 0.084 | 0.054 | - | 1.0 | 1 | 1.00x |
| CPU | interleaved | 0.018 | 0.005 | 0.003 | 32.0 | 32 | 4.71x |
| CUDA | recursive | 0.195 | 0.144 | - | 1.0 | 1 | 1.00x |
| CUDA | interleaved | 0.028 | 0.014 | 0.003 | 32.0 | 32 | 6.98x |
Interpretation: the scheduling shape works in the prototype. Explicit continuations can raise realized policy batch size from 1 to the interleave width while preserving prototype value/stat/sample parity. The next risk is not whether batching can be formed; it is whether the full production Cython CFR state machine can be represented safely with the same continuation discipline.