# MLP Random-Sparse Control — BTC 6H

## Decision

Do not promote any random-sparse artifact. The matched random masks and the
logical grouped masks are both materially weaker than the promoted dense
55→16→8→1 baseline on in-sample Calmar, return, and drawdown. Their larger WFO
means do not justify promotion: WFO is internal historical validation, not
true out-of-sample evidence.

## Control design

`random_sparse` is an opt-in first-layer input structure. It samples feature
columns independently for each of the 16 units, while exactly preserving the
logical group's row capacities:

```text
[13, 13, 13, 10, 10, 10, 11, 11, 11, 4, 10, 10, 10, 6, 6, 1]
```

This produces 149 active first-layer edges and permanently blocks 731 of 880.
PyTorch resets every blocked edge to zero after each optimizer step. CMA-ES
flattens only active weights, so it omits those same 731 blocked connections
from its parameter vector. Each artifact stores the generator, mask seed,
feature-order digest, per-row active counts, and selected feature indices.

Training seeds and independent mask seeds were:

| Training seed | Mask seed | Artifact tag |
|---:|---:|---|
| 9090 | 13001 | `random_sparse_v1` |
| 9191 | 13102 | `random_sparse_v1` |
| 9292 | 13203 | `random_sparse_v1` |

The isolated tag cannot collide with dense `bb50` or logical-grouped
artifacts. No winner CSV, live `bb50` artifact, Pine preset, or parameter file
was changed.

## Method and checks

- BTC 6H only; normal training window; 55→16→8→1 architecture.
- Same robust Phase-2 objective, `l2=0.01`, and 300-generation CMA-ES setup as
  the logical grouped experiment.
- Required prechecks passed: `python3 tools/sync_params.py` and
  `python3 tools/check_pine.py`.
- A random-sparse smoke run completed both phases. Its saved first layer had
  zero nonzero values in all 731 blocked positions; its CMA-ES weight/bias
  vector had 310 parameters versus 1,041 dense, a difference of 731.
- Metrics below use the canonical simulator and each artifact's own
  Phase-2-recommended thresholds.

## Replay comparison

| Candidate | IS Calmar | IS P&L | Max DD | Trades | WFO mean / min | Valid folds |
|---|---:|---:|---:|---:|---:|---:|
| Promoted dense baseline | 0.483 | 13,839.5% | -33.46% | 56 | 0.654 / 0.609 | 2 |
| Logical grouped 9090 | 0.087 | 482.4% | -63.44% | 138 | 1.143 / 0.098 | 5 |
| Logical grouped 9191 | 0.128 | 629.9% | -48.61% | 136 | 0.966 / 0.002 | 5 |
| Logical grouped 9292 | 0.099 | 901.9% | -73.48% | 178 | 1.399 / 0.082 | 5 |
| Random sparse 9090 | 0.167 | 2,243.5% | -60.24% | 152 | 1.125 / 0.125 | 5 |
| Random sparse 9191 | 0.124 | 934.3% | -59.45% | 130 | 1.893 / 0.410 | 4 |
| Random sparse 9292 | -10.000 | 153.8% | -49.91% | 1 | 0.000 / -99.000 | 0 |

The `-10.000` Calmar and `-99.000` WFO minimum for random seed 9292 are the
canonical simulator's insufficient-trade sentinels, not a successful low
return. WFO remains internal historical validation, not true OOS; none of
these figures should be treated as a deployment result.

## Threshold-sweep status

The canonical replay above is a preliminary screen, not a separate deep
threshold sweep. The current deep-sweep command writes generic canonical
`results/sweeps/optimization_sweep_strategy_mlp_scores_*` and summary files
without an experiment namespace. Running it would overwrite the active shared
sweep outputs, conflicting with this experiment's isolation constraint.
Therefore no extra threshold sweep was run and none is claimed.

## Interpretation

There is no consistent indication that semantic grouping is materially better
than a capacity-matched random mask. Random seed 9090 had higher IS Calmar
than its grouped counterpart and seed 9191 had a higher WFO mean/minimum, but
the third random mask collapsed to one trade; grouped artifacts were also far
below dense on IS quality. The common result is the important one: hard
first-layer sparsity removes too much capacity for this architecture.

Stop this fully hard-sparse direction. If revisited, test a hybrid first layer
with a limited number of family-specialist units plus dense cross-family units,
rather than forcing all sixteen units into sparse routes. Do not promote based
on WFO mean alone.

## Reproduction

```bash
python tools/run_mlp_train.py \
  --assets COINBASE_BTCUSD --tfs 6H --seeds 3 --seed-start 9090 \
  --tag random_sparse_v1 --input-structure random_sparse \
  --random-mask-seed-start 13001 \
  --fold-objective robust --l2 0.01 --es-workers 1 --parallel-jobs 1
```
