andreas11112's picture
cascade custom_miner generator v1
f1564cd verified
|
Raw
History Blame Contribute Delete
3.7 kB
# custom_miner β€” the generator you submit
A cascade `DataGenerator` (`generator.Generator`) that turns one integer `seed`
into a corpus of univariate float series. The subnet holds the model, seeds, and
compute identical between king and challenger, so **the only thing that moves
your score is the distribution this generator emits.**
## The idea: compete on prior *diversity + realism*
The reference/genesis generators win by covering the shapes a forecaster must
handle. This one mixes **10 process families**, each fully seed-deterministic and
vectorised:
| family | what it contributes |
|--------|--------------------|
| `trend_seasonal_ar` | level + slope + multi-seasonal sinusoids + AR(1) noise |
| `regime_shift` | piecewise level & variance regimes (structural breaks) |
| `multiplicative` | positive level Γ— seasonal factor Γ— multiplicative noise |
| `ar2` | AR(2), stationarity-guaranteed (Levinson-Durbin), incl. near-unit-root |
| `integrated` | I(1)/I(2) random walks with drift |
| `threshold_ar` | SETAR β€” regime-switching nonlinear recurrence |
| `chaotic` | bounded chaotic maps (logistic / sine) |
| `rff_gp` | smooth GP-like samples via random Fourier features |
| `intermittent` | zero-inflated / intermittent demand |
| `pulse_outlier` | smooth base + sparse pulses/outliers + flat gaps |
The mixture weights (`family_weights` in [`config.json`](config.json)) were tuned
with `local_validator` against a broad multi-domain eval: strong seasonal
coverage matters (most real series are seasonal) while every family keeps
meaningful mass so the prior generalises across non-seasonal domains too.
## Contract compliance (what `cascade verify` checks)
* **Determinism** β€” every value comes from one `np.random.default_rng(seed)` in a
fixed draw order β†’ byte-identical corpus at a fixed seed (the property the
trainer audits by building twice).
* **Code-only** β€” no shipped weights, no network, no clock; imports are numpy +
`cascade.interface` only (on the allowlist, clear of the static-guard blocklist).
* **Bounded + finite** β€” 1-D float64 series, length in `[min_length, max_length]`,
finite; `_sanitize` is the hard backstop.
* **Fast** β€” vectorised per family (a batched time-axis recurrence, never a
per-series Python loop), so draining the full `corpus_n_series` (16384) stays
well under `max_generate_seconds`.
Verify it yourself:
```bash
python -m cascade.miner.cli verify custom/custom_miner
# OK: generator would be accepted by the trainer.
# corpus_digest (seed=0): 8ecf44e7ebbb601f… [deterministic]
```
## How to make it yours
1. **Tune the mixture** β€” edit `family_weights` in `config.json` (no code change),
then re-run `python -m custom.local_validator` and watch the LCB / per-domain
win-rate move. This is the cheapest, safest lever.
2. **Add/replace a family** β€” add a `_yourfamily(rng, n, L) -> (n, L)` builder,
register it in `_FAMILIES` / `_DEFAULT_WEIGHTS` / the `builders` tuple. Keep it
vectorised and seed-deterministic; `_sanitize` guarantees finiteness.
3. **Re-verify + re-A/B** every change: `verify` must stay green and you want the
local KOTH verdict trending up before you deploy.
## Files
```
custom_miner/
generator.py class Generator(DataGenerator) β€” the mixture-of-priors
config.json name/description, length band, family_weights
requirements.txt hash-locked deps (numpy only). The trainer only FORMAT-checks
this file (it does not reinstall β€” the sandbox ships the
allowlisted stack), so the placeholder zero-hash is accepted,
as in the shipped reference generators. Real hashes optional.
```