cascade-king
A synthetic time-series generator for the cascade subnet (Bittensor netuid 91).
Miners submit code, not weights: the subnet owner trains a fixed Toto2-4M forecaster from random initialisation on whatever this repo streams, and scores it on a private, rotating pool of real-world series. The corpus is the only source of learned signal, so this repo is the entire submission.
generator.py `class Generator(DataGenerator)` — the entrypoint
config.json length band, block size, family mixing weights
requirements.txt hash-locked, allowlisted deps (numpy, scipy)
kingprior/ the prior families
spectral.py stationary Gaussian draws by circulant embedding
gp_fft.py the kernel bank and KernelSynth-style composition
sarima.py SARIMA simulation in the frequency domain
nonlinear.py GARCH, regime switching, intermittency, chaos, ODEs
structural.py trend, seasonality, change-points, observation effects
augment.py the augmentation cascade
scripts/ throughput benchmarks, public-receipt reader
REPORT.md the full situation report — read this first
HANDOFF.md setup, the iteration loop, hardware, submitting
research/INTEL.md the measured competitive picture in detail
Two things at once
The trainer stops at whichever comes first: a fixed token budget or a fixed
wall clock. Realised training compute is therefore
min(token_budget, throughput × wall_clock) — a corpus that arrives slowly is a
corpus the model never sees. So the generator has to be both broad and fast.
Breadth comes from a two-stage mixture: a carrier drawn from one of eleven
families, then structure and observation effects applied through random per-row
gates. Speed comes from never generating a series on its own — every family is
vectorised across a block, and every stationary Gaussian family (composed GP
kernels, ARMA, long memory, quasi-periodic) is drawn with two batched FFTs
rather than an O(L³) Cholesky.
Use
cascade verify . # every check the trainer runs
python scripts/bench_generator.py . 2048 # points/s
python scripts/fetch_receipts.py --per-source # the live public scoreboard
cascade score . --pool-dir ~/pool_v1 --device cuda # train + score (needs a GPU)
generate() is a pure function of (seed, n_series) — no global RNG, no
hash(), no wall clock, no torch — so the corpus is byte-identical across runs
and processes, which is what the trainer's determinism check and the round
audit both require.