tensorlink-dev commited on
Commit
ed7b8dc
Β·
verified Β·
1 Parent(s): 1e9ac51

Upload folder using huggingface_hub

Browse files
Files changed (9) hide show
  1. README.md +93 -0
  2. config.json +121 -0
  3. evals/eval-1d.json +571 -0
  4. evals/eval-1h.json +1284 -0
  5. evals/eval-4h.json +1224 -0
  6. evals/eval-5m.json +1259 -0
  7. forecast_wrapper.py +358 -0
  8. model.py +1305 -0
  9. weights.safetensors +3 -0
README.md ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Yumoto-alpha-v0.1-22m
2
+
3
+ *Yuma Rao visited us in a dream and told us to build a time-series
4
+ foundation model for subnet alpha tokens. So we did.*
5
+
6
+ One 22M-parameter probabilistic forecaster for Bittensor subnet-alpha
7
+ OHLCV markets, covering four timeframes (5m / 1h / 4h / 1d) with a single
8
+ model. Its edge is **uncertainty calibration**: full quantile bands
9
+ (q10…q90) per candle per horizon step, sharp enough to beat classical
10
+ statistical specialists on their home turf at short and daily horizons β€”
11
+ at 1/113th the size of frontier time-series foundation models.
12
+
13
+ ## What it is
14
+
15
+ - **Architecture**: patch transformer (patch 32, context 4096), windowed
16
+ causal time attention, variate attention with role masking, trained by
17
+ contiguous-patch masked infilling; 9-quantile pinball heads. Decodes
18
+ the full horizon in one forward pass.
19
+ - **Inputs**: OHLCV β€” Close/Open/High/Low as joint targets, volume as a
20
+ past covariate.
21
+ - **Outputs**: quantiles q10…q90 for each of C/O/H/L at every horizon
22
+ step β€” a full probabilistic candle per step, with calibrated range
23
+ (H/L) forecasts for free.
24
+
25
+ ## How it's trained
26
+
27
+ 1. **Pretrained** on a large synthetic corpus of mechanistically diverse
28
+ generators (trend, seasonality, regime switches, bursts, chaos, …),
29
+ then **fine-tuned on real subnet-alpha candles only** β€” no synthetic
30
+ data in the fine-tune.
31
+ 2. **Future-Guided Learning** in the fine-tune loss (after Nature
32
+ s41467-025-63786-4, adapted to masked-patch training): a no-grad pass
33
+ of the same network is shown slightly more of the future, and the
34
+ model's quantiles on the still-hidden region are pulled toward that
35
+ privileged pass. Self-distillation from a time-privileged teacher β€”
36
+ one clean model at inference.
37
+ 3. **Three seeds β†’ weight soup β†’ 15% blend back toward the pretrained
38
+ base** (WiSE-FT, Ξ± = 0.85). Weight-space operations only: the shipped
39
+ artifact is exactly one 22M model.
40
+ 4. **A hurdle-mixture decode rule** for illiquid markets, built into the
41
+ bundle's inference code: the wrapper estimates per-step P(no price
42
+ movement) from the context's own tick frequency, and the predictive
43
+ law becomes `Ο€_tΒ·Ξ΄(last price) + (1βˆ’Ο€_t)Β·model band`, with Ο€
44
+ compounding away over the horizon. On instruments that barely trade it
45
+ collapses the band exactly as fast as the evidence allows; on liquid
46
+ markets it is an exact no-op. Deterministic and causal β€” no second
47
+ model, no post-hoc ensembling.
48
+
49
+ ## Held-out evaluation
50
+
51
+ Holdout = the final segment of every asset's history (never seen in
52
+ training); 110–125 assets per timeframe, 10 forecast origins per asset.
53
+ Metric = mean pinball loss over 9 quantiles Γ· a naive baseline (flat
54
+ last-close with empirical step-change quantiles), geometric mean over
55
+ assets. **Lower is better; < 1.0 beats naive.**
56
+
57
+ | cell | **Yumoto-alpha-v0.1-22m** | best classical specialist |
58
+ |---|---|---|
59
+ | 5m H12 | **0.857** | 0.928 (bootstrap) |
60
+ | 5m H144 | 0.870 | **0.739** (AutoTheta) |
61
+ | 1h H24 | **0.686**ΒΉ | 0.841 (bootstrap) |
62
+ | 1h H168 | 0.591 | **0.550** (GBM-EWMA) |
63
+ | 4h H42 | **0.760** | 0.803 (GBM-EWMA) |
64
+ | 4h H180 | 0.665 | **0.653** (GBM-t) |
65
+ | 1d H30 | 0.667 | **0.646** (GBM-EWMA) |
66
+
67
+ ΒΉ One asset produced an exactly-zero-error forecast (the hurdle rule on a
68
+ fully frozen market); it is excluded because a geometric mean cannot
69
+ absorb a literal zero. Including it with a floor makes this cell better,
70
+ not worse.
71
+
72
+ The classical column is the *per-cell best* of eight tuned statistical
73
+ models (GBM variants, bootstrap, AutoARIMA/ETS/Theta, seasonal-naive) β€”
74
+ a different specialist per cell; the model competes against all of them
75
+ at once and wins 3 of 7 cells outright, within 3.5% on two more.
76
+
77
+ ## General-benchmark robustness
78
+
79
+ Scored zero-shot-style on the full public **GIFT-Eval** suite (97
80
+ configs, official protocol) despite being crypto-specialized:
81
+ **0.523 CRPS-ratio / 0.759 MASE-ratio vs naive** β€” competitive with
82
+ general-purpose foundation models on a benchmark it was never tuned for.
83
+
84
+ ## Using it
85
+
86
+ ```
87
+ from forecast_wrapper import Wrapper
88
+ w = Wrapper("path/to/bundle", device="cuda")
89
+ q = w.forecast_quantiles_mv(ohlcv_history, horizon, n_targets=4) # (B,4,H,9)
90
+ ```
91
+
92
+ The bundle is self-contained: `weights.safetensors`, `config.json`,
93
+ `model.py`, `forecast_wrapper.py` (hurdle rule included). No adapters.
config.json ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "arch": "cascade-model",
3
+ "config": {
4
+ "d_model": 512,
5
+ "num_layers": 6,
6
+ "num_heads": 8,
7
+ "head_dim": 64,
8
+ "patch_size": 32,
9
+ "mlp_expansion": 2,
10
+ "d_ff": 1368,
11
+ "num_quantiles": 9,
12
+ "head_mlp_hidden": 0,
13
+ "ffn_swiglu": false,
14
+ "embed_skip_mlp": 0,
15
+ "embed_mask_token": false,
16
+ "no_out_mlp": false,
17
+ "context_length": 4096,
18
+ "horizon": 64,
19
+ "max_patches": 134,
20
+ "layer_group_size": 6,
21
+ "cpm_c_max": 16,
22
+ "cpm_p_max": 0.4,
23
+ "residual_mult": 0.75,
24
+ "use_variate_roles": true,
25
+ "binary_passthrough": true,
26
+ "time_window": 64,
27
+ "attn_sinks": 0,
28
+ "attn_impl": "sdpa",
29
+ "use_rope": true,
30
+ "rope_base": 10000.0,
31
+ "rope_scale": 1.0,
32
+ "xpos_scale_base": 512.0,
33
+ "yarn": false,
34
+ "yarn_alpha": 0.5,
35
+ "yarn_beta": 8.0,
36
+ "attn_temp": 1.0,
37
+ "rope_partial_k": 0,
38
+ "rope_learnable": false,
39
+ "rope_scale_jitter": 0.0,
40
+ "time_mixer": "attention"
41
+ },
42
+ "quantile_levels": [
43
+ 0.1,
44
+ 0.2,
45
+ 0.3,
46
+ 0.4,
47
+ 0.5,
48
+ 0.6,
49
+ 0.7,
50
+ 0.8,
51
+ 0.9
52
+ ],
53
+ "arm": "fgl0-s0",
54
+ "env": {
55
+ "torch": "2.11.0+cu128",
56
+ "cuda": "12.8",
57
+ "gpu": "NVIDIA RTX PRO 6000 Blackwell Server Edition",
58
+ "arch": [
59
+ "sm_75",
60
+ "sm_80",
61
+ "sm_86",
62
+ "sm_90",
63
+ "sm_100",
64
+ "sm_120"
65
+ ],
66
+ "batch_size": 64,
67
+ "context_length": 4096,
68
+ "token_budget": 1429855920,
69
+ "channels": 5,
70
+ "channel_mode": "mixed",
71
+ "obs_loss_weight": 9.0,
72
+ "n_targets": 4,
73
+ "n_future_cov": 0,
74
+ "mix_p": 0.5,
75
+ "mixup_p": 0.5,
76
+ "mixup_alpha": 1.5,
77
+ "mixup_k_max": 3,
78
+ "tirex_aug": true,
79
+ "aug_freq": false,
80
+ "aug_warp": false,
81
+ "aug_jitter": false,
82
+ "cpm_p_max": 0.4,
83
+ "cpm_c_max": 16,
84
+ "time_window": 64,
85
+ "optimizer": "normuon",
86
+ "base_lr": 0.0002,
87
+ "normuon_lr": 0.001,
88
+ "normuon_momentum": 0.96,
89
+ "normuon_beta2": 0.999,
90
+ "adam_betas": [
91
+ 0.91,
92
+ 0.972
93
+ ],
94
+ "lr_schedule": "toto2",
95
+ "warmup_fraction": 0.01,
96
+ "decay_tail_fraction": 0.0175,
97
+ "grad_clip": 7.0,
98
+ "mup_base_width": 512,
99
+ "toto2_recipe": true,
100
+ "gen_children": [
101
+ "/home/ubuntu/work/cascade-model/generators/fitproc2m"
102
+ ],
103
+ "gen_weights": null,
104
+ "real_root": "data/subnet_ft2",
105
+ "real_frac": 1.0,
106
+ "tempopfn_repo": null,
107
+ "tempopfn_length": 4096,
108
+ "tempopfn_split_long": false,
109
+ "tempopfn_shards": null,
110
+ "shard_unique_points": null,
111
+ "init_weights": "results/e19-22m400k/t22m400k-s0/weights.safetensors",
112
+ "shards_real_root": null,
113
+ "dynsys": null,
114
+ "dyn_loss": null,
115
+ "tempopfn_frac": 0.0,
116
+ "tempopfn_augment": null,
117
+ "tempopfn_priors": null,
118
+ "tempopfn_drop_priors": null,
119
+ "corpus_stats_scope": "synthetic-only"
120
+ }
121
+ }
evals/eval-1d.json ADDED
@@ -0,0 +1,571 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundle": "results/fitproc2/wsoup85-fgl0-hurdle",
3
+ "data": "data/subnet_ft2/holdout_1d.npz",
4
+ "mode": "ohlc",
5
+ "levels": [
6
+ 0.1,
7
+ 0.2,
8
+ 0.3,
9
+ 0.4,
10
+ 0.5,
11
+ 0.6,
12
+ 0.7,
13
+ 0.8,
14
+ 0.9
15
+ ],
16
+ "horizons": {
17
+ "30": {
18
+ "n_assets": 109,
19
+ "geomean_ratio": 0.6674229777531065,
20
+ "median_ratio": 0.7404197425259056,
21
+ "beat_naive_frac": 0.8623853211009175,
22
+ "per_asset": {
23
+ "TAOUSD": {
24
+ "ratio": 0.588874093828663,
25
+ "mase": 1.1149915946431446,
26
+ "n_origins": 10
27
+ },
28
+ "sn1": {
29
+ "ratio": 0.724640015235163,
30
+ "mase": 2.6445008038342515,
31
+ "n_origins": 10
32
+ },
33
+ "sn10": {
34
+ "ratio": 0.9103289708885336,
35
+ "mase": 4.328152508106414,
36
+ "n_origins": 10
37
+ },
38
+ "sn100": {
39
+ "ratio": 1.2407608712083513,
40
+ "mase": 0.10145343677674779,
41
+ "n_origins": 10
42
+ },
43
+ "sn101": {
44
+ "ratio": 1.2725390559579055,
45
+ "mase": 0.07800309387028985,
46
+ "n_origins": 10
47
+ },
48
+ "sn104": {
49
+ "ratio": 0.8666244291235855,
50
+ "mase": 10.200680811406054,
51
+ "n_origins": 10
52
+ },
53
+ "sn105": {
54
+ "ratio": 0.7038467514902994,
55
+ "mase": 2.299460279527001,
56
+ "n_origins": 10
57
+ },
58
+ "sn106": {
59
+ "ratio": 0.8848334587824198,
60
+ "mase": 3.4302479865444195,
61
+ "n_origins": 10
62
+ },
63
+ "sn107": {
64
+ "ratio": 1.3417166324087495,
65
+ "mase": 6.954622269068004,
66
+ "n_origins": 10
67
+ },
68
+ "sn108": {
69
+ "ratio": 0.951565624033092,
70
+ "mase": 2.1135174703521997,
71
+ "n_origins": 10
72
+ },
73
+ "sn109": {
74
+ "ratio": 0.7389881285329933,
75
+ "mase": 1.9531538742049739,
76
+ "n_origins": 10
77
+ },
78
+ "sn11": {
79
+ "ratio": 0.7572414810161076,
80
+ "mase": 2.692753652254189,
81
+ "n_origins": 10
82
+ },
83
+ "sn110": {
84
+ "ratio": 0.9822044131655802,
85
+ "mase": 0.6258444067549884,
86
+ "n_origins": 10
87
+ },
88
+ "sn111": {
89
+ "ratio": 0.8651171238528031,
90
+ "mase": 13.483809572283436,
91
+ "n_origins": 10
92
+ },
93
+ "sn112": {
94
+ "ratio": 1.0374728376519984,
95
+ "mase": 6.233267037676972,
96
+ "n_origins": 10
97
+ },
98
+ "sn113": {
99
+ "ratio": 1.1945385206907815,
100
+ "mase": 2.578974937085221,
101
+ "n_origins": 10
102
+ },
103
+ "sn114": {
104
+ "ratio": 0.8132793620825602,
105
+ "mase": 2.3091828516519515,
106
+ "n_origins": 10
107
+ },
108
+ "sn115": {
109
+ "ratio": 4.42316826357496,
110
+ "mase": 0.05957224600629043,
111
+ "n_origins": 10
112
+ },
113
+ "sn117": {
114
+ "ratio": 1.6440985938707806,
115
+ "mase": 0.10512244465589861,
116
+ "n_origins": 10
117
+ },
118
+ "sn118": {
119
+ "ratio": 0.14873827287944785,
120
+ "mase": 0.36301145767873094,
121
+ "n_origins": 10
122
+ },
123
+ "sn119": {
124
+ "ratio": 0.04561823811768441,
125
+ "mase": 0.07641299327731525,
126
+ "n_origins": 10
127
+ },
128
+ "sn12": {
129
+ "ratio": 0.8582599345196608,
130
+ "mase": 3.360867702726838,
131
+ "n_origins": 10
132
+ },
133
+ "sn120": {
134
+ "ratio": 0.5749622193586239,
135
+ "mase": 1.7889012780726414,
136
+ "n_origins": 10
137
+ },
138
+ "sn121": {
139
+ "ratio": 0.494316186951276,
140
+ "mase": 1.2288262750319519,
141
+ "n_origins": 10
142
+ },
143
+ "sn123": {
144
+ "ratio": 1.0467572640834855,
145
+ "mase": 1.6356808486123031,
146
+ "n_origins": 10
147
+ },
148
+ "sn124": {
149
+ "ratio": 1.333323556077913,
150
+ "mase": 5.214344859916125,
151
+ "n_origins": 10
152
+ },
153
+ "sn125": {
154
+ "ratio": 1.0093673061990092,
155
+ "mase": 3.143244380341099,
156
+ "n_origins": 10
157
+ },
158
+ "sn126": {
159
+ "ratio": 0.8170719621797041,
160
+ "mase": 3.5455890383632007,
161
+ "n_origins": 10
162
+ },
163
+ "sn127": {
164
+ "ratio": 0.5037424642704973,
165
+ "mase": 0.9573276415238663,
166
+ "n_origins": 10
167
+ },
168
+ "sn128": {
169
+ "ratio": 0.7995732110101806,
170
+ "mase": 5.202807155064694,
171
+ "n_origins": 10
172
+ },
173
+ "sn13": {
174
+ "ratio": 0.6246503435642847,
175
+ "mase": 1.7774881143954198,
176
+ "n_origins": 10
177
+ },
178
+ "sn14": {
179
+ "ratio": 0.9120930461186886,
180
+ "mase": 8.652030201366648,
181
+ "n_origins": 10
182
+ },
183
+ "sn15": {
184
+ "ratio": 0.6706481216499842,
185
+ "mase": 2.9747133869629008,
186
+ "n_origins": 10
187
+ },
188
+ "sn17": {
189
+ "ratio": 0.6812454135629261,
190
+ "mase": 3.892370257350882,
191
+ "n_origins": 10
192
+ },
193
+ "sn18": {
194
+ "ratio": 0.9513416584710903,
195
+ "mase": 3.49500588196522,
196
+ "n_origins": 10
197
+ },
198
+ "sn19": {
199
+ "ratio": 0.594513099259639,
200
+ "mase": 2.4362604900230793,
201
+ "n_origins": 10
202
+ },
203
+ "sn2": {
204
+ "ratio": 0.5076649593171041,
205
+ "mase": 1.228484034950763,
206
+ "n_origins": 10
207
+ },
208
+ "sn20": {
209
+ "ratio": 0.6097106807772743,
210
+ "mase": 2.790087595423158,
211
+ "n_origins": 10
212
+ },
213
+ "sn21": {
214
+ "ratio": 0.8840596319906984,
215
+ "mase": 4.619867894527331,
216
+ "n_origins": 10
217
+ },
218
+ "sn22": {
219
+ "ratio": 0.6678592851079739,
220
+ "mase": 2.068173032827946,
221
+ "n_origins": 10
222
+ },
223
+ "sn23": {
224
+ "ratio": 0.974274147075604,
225
+ "mase": 6.723742890415802,
226
+ "n_origins": 10
227
+ },
228
+ "sn24": {
229
+ "ratio": 0.7866657125466893,
230
+ "mase": 3.252736576203285,
231
+ "n_origins": 10
232
+ },
233
+ "sn25": {
234
+ "ratio": 0.9372853189905967,
235
+ "mase": 17.80443053713267,
236
+ "n_origins": 10
237
+ },
238
+ "sn27": {
239
+ "ratio": 0.9381358138892044,
240
+ "mase": 4.91399009254794,
241
+ "n_origins": 10
242
+ },
243
+ "sn28": {
244
+ "ratio": 0.8757053069303564,
245
+ "mase": 7.071031131904736,
246
+ "n_origins": 10
247
+ },
248
+ "sn29": {
249
+ "ratio": 0.32273294453046997,
250
+ "mase": 2.0879121125198776,
251
+ "n_origins": 10
252
+ },
253
+ "sn3": {
254
+ "ratio": 0.34793943641255537,
255
+ "mase": 1.3217710573705732,
256
+ "n_origins": 10
257
+ },
258
+ "sn30": {
259
+ "ratio": 0.801372056821779,
260
+ "mase": 3.388315070516473,
261
+ "n_origins": 10
262
+ },
263
+ "sn31": {
264
+ "ratio": 0.896170651341823,
265
+ "mase": 2.6003496967904596,
266
+ "n_origins": 10
267
+ },
268
+ "sn32": {
269
+ "ratio": 0.618906541015713,
270
+ "mase": 1.5738646057627468,
271
+ "n_origins": 10
272
+ },
273
+ "sn33": {
274
+ "ratio": 0.6189896044598815,
275
+ "mase": 1.8096772860516797,
276
+ "n_origins": 10
277
+ },
278
+ "sn34": {
279
+ "ratio": 0.49025045160954356,
280
+ "mase": 3.104391721465908,
281
+ "n_origins": 10
282
+ },
283
+ "sn35": {
284
+ "ratio": 0.6130718836301257,
285
+ "mase": 1.1988945428620132,
286
+ "n_origins": 10
287
+ },
288
+ "sn37": {
289
+ "ratio": 0.9544375205217083,
290
+ "mase": 3.4486433408021155,
291
+ "n_origins": 10
292
+ },
293
+ "sn38": {
294
+ "ratio": 0.5024948720180459,
295
+ "mase": 4.273818795582662,
296
+ "n_origins": 10
297
+ },
298
+ "sn39": {
299
+ "ratio": 0.20311664147704178,
300
+ "mase": 0.8248382209490146,
301
+ "n_origins": 10
302
+ },
303
+ "sn4": {
304
+ "ratio": 1.0640524748992426,
305
+ "mase": 4.8831784568932575,
306
+ "n_origins": 10
307
+ },
308
+ "sn41": {
309
+ "ratio": 0.5643289827743234,
310
+ "mase": 1.522308444559678,
311
+ "n_origins": 10
312
+ },
313
+ "sn42": {
314
+ "ratio": 0.7286935702587092,
315
+ "mase": 2.832083519599004,
316
+ "n_origins": 10
317
+ },
318
+ "sn43": {
319
+ "ratio": 0.3137639177369193,
320
+ "mase": 1.7411051558251267,
321
+ "n_origins": 10
322
+ },
323
+ "sn44": {
324
+ "ratio": 0.6094239287184442,
325
+ "mase": 3.02886822928476,
326
+ "n_origins": 10
327
+ },
328
+ "sn45": {
329
+ "ratio": 0.6617984965581486,
330
+ "mase": 1.1819659231670532,
331
+ "n_origins": 10
332
+ },
333
+ "sn46": {
334
+ "ratio": 0.812536873053265,
335
+ "mase": 5.086116329852832,
336
+ "n_origins": 10
337
+ },
338
+ "sn47": {
339
+ "ratio": 0.6802826514049788,
340
+ "mase": 1.9020973377645376,
341
+ "n_origins": 10
342
+ },
343
+ "sn48": {
344
+ "ratio": 0.45013340209981306,
345
+ "mase": 1.8990066471712568,
346
+ "n_origins": 10
347
+ },
348
+ "sn49": {
349
+ "ratio": 1.009202737453913,
350
+ "mase": 3.3715450302555747,
351
+ "n_origins": 10
352
+ },
353
+ "sn5": {
354
+ "ratio": 0.7882128802839301,
355
+ "mase": 3.7747132579290024,
356
+ "n_origins": 10
357
+ },
358
+ "sn50": {
359
+ "ratio": 0.6800297712890168,
360
+ "mase": 1.2898417233994401,
361
+ "n_origins": 10
362
+ },
363
+ "sn51": {
364
+ "ratio": 0.9116114557133238,
365
+ "mase": 11.961750088941445,
366
+ "n_origins": 10
367
+ },
368
+ "sn52": {
369
+ "ratio": 0.6095594611755983,
370
+ "mase": 2.7955179304577733,
371
+ "n_origins": 10
372
+ },
373
+ "sn53": {
374
+ "ratio": 0.8677454080012669,
375
+ "mase": 113.36993825510177,
376
+ "n_origins": 10
377
+ },
378
+ "sn54": {
379
+ "ratio": 0.6705245583580045,
380
+ "mase": 2.251731658617063,
381
+ "n_origins": 10
382
+ },
383
+ "sn55": {
384
+ "ratio": 0.6702704435454031,
385
+ "mase": 5.632040642455741,
386
+ "n_origins": 10
387
+ },
388
+ "sn56": {
389
+ "ratio": 0.4498678564161519,
390
+ "mase": 2.0261457640832847,
391
+ "n_origins": 10
392
+ },
393
+ "sn6": {
394
+ "ratio": 0.3229055933084646,
395
+ "mase": 1.0577461281951444,
396
+ "n_origins": 10
397
+ },
398
+ "sn60": {
399
+ "ratio": 0.9447000789079169,
400
+ "mase": 4.502386038909113,
401
+ "n_origins": 10
402
+ },
403
+ "sn61": {
404
+ "ratio": 1.0889197399549855,
405
+ "mase": 8.24778561362107,
406
+ "n_origins": 10
407
+ },
408
+ "sn62": {
409
+ "ratio": 0.23770499860466812,
410
+ "mase": 0.9890703427897984,
411
+ "n_origins": 10
412
+ },
413
+ "sn63": {
414
+ "ratio": 0.6666296713531977,
415
+ "mase": 1.5557721070929018,
416
+ "n_origins": 10
417
+ },
418
+ "sn64": {
419
+ "ratio": 0.9341267178093001,
420
+ "mase": 6.656612527744552,
421
+ "n_origins": 10
422
+ },
423
+ "sn65": {
424
+ "ratio": 0.7326040974664147,
425
+ "mase": 3.1585547530174596,
426
+ "n_origins": 10
427
+ },
428
+ "sn66": {
429
+ "ratio": 0.7461497880101647,
430
+ "mase": 3.926761014464423,
431
+ "n_origins": 10
432
+ },
433
+ "sn67": {
434
+ "ratio": 0.02920579042392672,
435
+ "mase": 0.19129403374774406,
436
+ "n_origins": 10
437
+ },
438
+ "sn68": {
439
+ "ratio": 0.773142914773532,
440
+ "mase": 3.1416007546772096,
441
+ "n_origins": 10
442
+ },
443
+ "sn7": {
444
+ "ratio": 0.7201926062840324,
445
+ "mase": 2.313856303723195,
446
+ "n_origins": 10
447
+ },
448
+ "sn71": {
449
+ "ratio": 0.8885666779592687,
450
+ "mase": 2.099174232746467,
451
+ "n_origins": 10
452
+ },
453
+ "sn72": {
454
+ "ratio": 0.5965499264806197,
455
+ "mase": 2.4978456027648837,
456
+ "n_origins": 10
457
+ },
458
+ "sn73": {
459
+ "ratio": 0.5741154665538385,
460
+ "mase": 1.5365039424675775,
461
+ "n_origins": 10
462
+ },
463
+ "sn74": {
464
+ "ratio": 0.842243536668463,
465
+ "mase": 3.7986388962841,
466
+ "n_origins": 10
467
+ },
468
+ "sn75": {
469
+ "ratio": 0.48554180265566216,
470
+ "mase": 1.9288041205217683,
471
+ "n_origins": 10
472
+ },
473
+ "sn76": {
474
+ "ratio": 0.7172935203494248,
475
+ "mase": 2.03560065566011,
476
+ "n_origins": 10
477
+ },
478
+ "sn77": {
479
+ "ratio": 1.1152374588319285,
480
+ "mase": 17.167606744504003,
481
+ "n_origins": 10
482
+ },
483
+ "sn79": {
484
+ "ratio": 0.6225648593914812,
485
+ "mase": 7.023734683365881,
486
+ "n_origins": 10
487
+ },
488
+ "sn8": {
489
+ "ratio": 0.4785061000913379,
490
+ "mase": 2.378900097095272,
491
+ "n_origins": 10
492
+ },
493
+ "sn80": {
494
+ "ratio": 0.9709346909612429,
495
+ "mase": 13.239986773670413,
496
+ "n_origins": 10
497
+ },
498
+ "sn81": {
499
+ "ratio": 0.3533961110953852,
500
+ "mase": 1.5744252668100667,
501
+ "n_origins": 10
502
+ },
503
+ "sn83": {
504
+ "ratio": 0.7780878168352359,
505
+ "mase": 10.141521138534056,
506
+ "n_origins": 10
507
+ },
508
+ "sn85": {
509
+ "ratio": 0.6311327242678457,
510
+ "mase": 1.3761945592298306,
511
+ "n_origins": 10
512
+ },
513
+ "sn87": {
514
+ "ratio": 0.9428084076646472,
515
+ "mase": 4.4759902691112705,
516
+ "n_origins": 10
517
+ },
518
+ "sn88": {
519
+ "ratio": 0.6661973263429307,
520
+ "mase": 1.8495454044554023,
521
+ "n_origins": 10
522
+ },
523
+ "sn89": {
524
+ "ratio": 0.9540844726031443,
525
+ "mase": 11.699950890794236,
526
+ "n_origins": 10
527
+ },
528
+ "sn9": {
529
+ "ratio": 0.9414377875000441,
530
+ "mase": 5.657857021550661,
531
+ "n_origins": 10
532
+ },
533
+ "sn91": {
534
+ "ratio": 0.7404197425259056,
535
+ "mase": 3.4298481632450772,
536
+ "n_origins": 10
537
+ },
538
+ "sn93": {
539
+ "ratio": 0.7098536274723702,
540
+ "mase": 2.0065574457856608,
541
+ "n_origins": 10
542
+ },
543
+ "sn94": {
544
+ "ratio": 1.5899586314266714,
545
+ "mase": 0.24914962016318218,
546
+ "n_origins": 10
547
+ },
548
+ "sn95": {
549
+ "ratio": 0.9790926762254463,
550
+ "mase": 6.249048580281955,
551
+ "n_origins": 10
552
+ },
553
+ "sn96": {
554
+ "ratio": 0.015412353046207637,
555
+ "mase": 0.26563032322333413,
556
+ "n_origins": 10
557
+ },
558
+ "sn97": {
559
+ "ratio": 0.4709980844190403,
560
+ "mase": 1.1094915757879904,
561
+ "n_origins": 10
562
+ },
563
+ "sn98": {
564
+ "ratio": 0.8386280452457158,
565
+ "mase": 2.093986221186904,
566
+ "n_origins": 10
567
+ }
568
+ }
569
+ }
570
+ }
571
+ }
evals/eval-1h.json ADDED
@@ -0,0 +1,1284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundle": "results/fitproc2/wsoup85-fgl0-hurdle",
3
+ "data": "data/subnet_ft2/holdout_1h.npz",
4
+ "mode": "ohlc",
5
+ "levels": [
6
+ 0.1,
7
+ 0.2,
8
+ 0.3,
9
+ 0.4,
10
+ 0.5,
11
+ 0.6,
12
+ 0.7,
13
+ 0.8,
14
+ 0.9
15
+ ],
16
+ "horizons": {
17
+ "24": {
18
+ "n_assets": 125,
19
+ "geomean_ratio": 0.0,
20
+ "median_ratio": 0.7928260569129003,
21
+ "beat_naive_frac": 0.936,
22
+ "per_asset": {
23
+ "TAOUSD": {
24
+ "ratio": 0.9099731991367889,
25
+ "mase": 3.559941896137207,
26
+ "n_origins": 10
27
+ },
28
+ "sn1": {
29
+ "ratio": 0.8211414994659473,
30
+ "mase": 2.9151897377484906,
31
+ "n_origins": 10
32
+ },
33
+ "sn10": {
34
+ "ratio": 0.9644576581896008,
35
+ "mase": 5.729199542726961,
36
+ "n_origins": 10
37
+ },
38
+ "sn100": {
39
+ "ratio": 0.9238632540288041,
40
+ "mase": 2.186728409810368,
41
+ "n_origins": 10
42
+ },
43
+ "sn101": {
44
+ "ratio": 0.4816296871293914,
45
+ "mase": 0.9801764092790574,
46
+ "n_origins": 10
47
+ },
48
+ "sn102": {
49
+ "ratio": 0.5839264841497609,
50
+ "mase": 1.014899287097653,
51
+ "n_origins": 10
52
+ },
53
+ "sn104": {
54
+ "ratio": 0.3925602856536365,
55
+ "mase": 0.6199854455627185,
56
+ "n_origins": 10
57
+ },
58
+ "sn105": {
59
+ "ratio": 0.6030293598763803,
60
+ "mase": 0.985989914055655,
61
+ "n_origins": 10
62
+ },
63
+ "sn106": {
64
+ "ratio": 0.9066052024950811,
65
+ "mase": 5.034073399252336,
66
+ "n_origins": 10
67
+ },
68
+ "sn107": {
69
+ "ratio": 0.9629433100475153,
70
+ "mase": 4.808661674980754,
71
+ "n_origins": 10
72
+ },
73
+ "sn108": {
74
+ "ratio": 0.89350758061748,
75
+ "mase": 5.245974743562461,
76
+ "n_origins": 10
77
+ },
78
+ "sn109": {
79
+ "ratio": 0.798357877119845,
80
+ "mase": 2.3046639298748244,
81
+ "n_origins": 10
82
+ },
83
+ "sn11": {
84
+ "ratio": 1.0027932738941634,
85
+ "mase": 4.266834697832175,
86
+ "n_origins": 10
87
+ },
88
+ "sn110": {
89
+ "ratio": 0.9866244179827407,
90
+ "mase": 9.369694060803925,
91
+ "n_origins": 10
92
+ },
93
+ "sn111": {
94
+ "ratio": 1.0271116490506822,
95
+ "mase": 9.71338367072177,
96
+ "n_origins": 10
97
+ },
98
+ "sn112": {
99
+ "ratio": 0.9462268293804295,
100
+ "mase": 8.353925743494758,
101
+ "n_origins": 10
102
+ },
103
+ "sn113": {
104
+ "ratio": 0.4372065991805312,
105
+ "mase": 0.9620420311376368,
106
+ "n_origins": 10
107
+ },
108
+ "sn114": {
109
+ "ratio": 0.6710543064911593,
110
+ "mase": 1.5652455339942632,
111
+ "n_origins": 10
112
+ },
113
+ "sn115": {
114
+ "ratio": 0.8261158584501561,
115
+ "mase": 1.1851955094579563,
116
+ "n_origins": 10
117
+ },
118
+ "sn116": {
119
+ "ratio": 0.45617882488821543,
120
+ "mase": 0.864752595652253,
121
+ "n_origins": 10
122
+ },
123
+ "sn117": {
124
+ "ratio": 0.4383431408943167,
125
+ "mase": 0.7814004363397944,
126
+ "n_origins": 10
127
+ },
128
+ "sn118": {
129
+ "ratio": 0.9712733741595985,
130
+ "mase": 2.576472034889849,
131
+ "n_origins": 10
132
+ },
133
+ "sn119": {
134
+ "ratio": 0.3770008366573281,
135
+ "mase": 1.1835628761840955,
136
+ "n_origins": 10
137
+ },
138
+ "sn12": {
139
+ "ratio": 0.3330984224610944,
140
+ "mase": 0.837438418374748,
141
+ "n_origins": 10
142
+ },
143
+ "sn120": {
144
+ "ratio": 0.895713530522417,
145
+ "mase": 4.313096503419332,
146
+ "n_origins": 10
147
+ },
148
+ "sn121": {
149
+ "ratio": 0.3891448787676748,
150
+ "mase": 0.8895188976423095,
151
+ "n_origins": 10
152
+ },
153
+ "sn122": {
154
+ "ratio": 0.4258020996214738,
155
+ "mase": 1.3859207578933685,
156
+ "n_origins": 10
157
+ },
158
+ "sn123": {
159
+ "ratio": 0.7928260569129003,
160
+ "mase": 2.1667753831021037,
161
+ "n_origins": 10
162
+ },
163
+ "sn124": {
164
+ "ratio": 0.9204230906631579,
165
+ "mase": 5.051662843703364,
166
+ "n_origins": 10
167
+ },
168
+ "sn125": {
169
+ "ratio": 0.4855539654569293,
170
+ "mase": 1.0433107321332449,
171
+ "n_origins": 10
172
+ },
173
+ "sn126": {
174
+ "ratio": 0.37425147762916616,
175
+ "mase": 0.542784852901055,
176
+ "n_origins": 10
177
+ },
178
+ "sn127": {
179
+ "ratio": 0.826988012119036,
180
+ "mase": 2.287637910627174,
181
+ "n_origins": 10
182
+ },
183
+ "sn128": {
184
+ "ratio": 0.5955376577004804,
185
+ "mase": 1.4326868920650706,
186
+ "n_origins": 10
187
+ },
188
+ "sn13": {
189
+ "ratio": 0.3780828629313393,
190
+ "mase": 0.8503236652152714,
191
+ "n_origins": 10
192
+ },
193
+ "sn14": {
194
+ "ratio": 0.686924989437737,
195
+ "mase": 1.688720348729086,
196
+ "n_origins": 10
197
+ },
198
+ "sn15": {
199
+ "ratio": 0.932624592781024,
200
+ "mase": 3.394315740975059,
201
+ "n_origins": 10
202
+ },
203
+ "sn16": {
204
+ "ratio": 0.5178188919358234,
205
+ "mase": 1.6068999503820156,
206
+ "n_origins": 10
207
+ },
208
+ "sn17": {
209
+ "ratio": 0.9010422232900572,
210
+ "mase": 3.056591309331566,
211
+ "n_origins": 10
212
+ },
213
+ "sn18": {
214
+ "ratio": 0.9316635806893558,
215
+ "mase": 4.567479037831696,
216
+ "n_origins": 10
217
+ },
218
+ "sn19": {
219
+ "ratio": 0.6335034331656396,
220
+ "mase": 1.9896328969783965,
221
+ "n_origins": 10
222
+ },
223
+ "sn2": {
224
+ "ratio": 0.36653692247208786,
225
+ "mase": 0.7884823011373355,
226
+ "n_origins": 10
227
+ },
228
+ "sn20": {
229
+ "ratio": 0.44872775242845514,
230
+ "mase": 0.8906679549504241,
231
+ "n_origins": 10
232
+ },
233
+ "sn21": {
234
+ "ratio": 0.7142886733932562,
235
+ "mase": 2.1856937427708494,
236
+ "n_origins": 10
237
+ },
238
+ "sn22": {
239
+ "ratio": 0.5370880365600099,
240
+ "mase": 1.2437018856226363,
241
+ "n_origins": 10
242
+ },
243
+ "sn23": {
244
+ "ratio": 0.8359186739023419,
245
+ "mase": 2.4843170867829474,
246
+ "n_origins": 10
247
+ },
248
+ "sn24": {
249
+ "ratio": 0.34511902751319185,
250
+ "mase": 0.527414949697901,
251
+ "n_origins": 10
252
+ },
253
+ "sn25": {
254
+ "ratio": 0.854991675286837,
255
+ "mase": 17.067566739720462,
256
+ "n_origins": 10
257
+ },
258
+ "sn26": {
259
+ "ratio": 0.50981131617458,
260
+ "mase": 1.8237654383687054,
261
+ "n_origins": 10
262
+ },
263
+ "sn27": {
264
+ "ratio": 0.4201054919622308,
265
+ "mase": 0.7831607988192698,
266
+ "n_origins": 10
267
+ },
268
+ "sn28": {
269
+ "ratio": 0.9716672884448693,
270
+ "mase": 6.620075292887577,
271
+ "n_origins": 10
272
+ },
273
+ "sn29": {
274
+ "ratio": 0.7193864723126723,
275
+ "mase": 2.031296070934475,
276
+ "n_origins": 10
277
+ },
278
+ "sn3": {
279
+ "ratio": 1.015935808021696,
280
+ "mase": 6.97628331768139,
281
+ "n_origins": 10
282
+ },
283
+ "sn30": {
284
+ "ratio": 0.9206872867172066,
285
+ "mase": 4.130105870736298,
286
+ "n_origins": 10
287
+ },
288
+ "sn31": {
289
+ "ratio": 1.0124219337617626,
290
+ "mase": 6.146861229131343,
291
+ "n_origins": 10
292
+ },
293
+ "sn32": {
294
+ "ratio": 0.4131909372314771,
295
+ "mase": 0.9652776276655974,
296
+ "n_origins": 10
297
+ },
298
+ "sn33": {
299
+ "ratio": 0.636834071809915,
300
+ "mase": 1.8804656872677343,
301
+ "n_origins": 10
302
+ },
303
+ "sn34": {
304
+ "ratio": 0.51592802794793,
305
+ "mase": 1.7819551183035753,
306
+ "n_origins": 10
307
+ },
308
+ "sn35": {
309
+ "ratio": 0.8640559913484894,
310
+ "mase": 3.2234748280931185,
311
+ "n_origins": 10
312
+ },
313
+ "sn37": {
314
+ "ratio": 0.9435239116146619,
315
+ "mase": 5.753384661251346,
316
+ "n_origins": 10
317
+ },
318
+ "sn38": {
319
+ "ratio": 0.8993932984474249,
320
+ "mase": 2.7122152325836635,
321
+ "n_origins": 10
322
+ },
323
+ "sn39": {
324
+ "ratio": 1.108226158778601,
325
+ "mase": 3.985226747325476,
326
+ "n_origins": 10
327
+ },
328
+ "sn4": {
329
+ "ratio": 0.968263614386594,
330
+ "mase": 5.497224404008315,
331
+ "n_origins": 10
332
+ },
333
+ "sn40": {
334
+ "ratio": 0.22863519323937648,
335
+ "mase": 0.4852801976521417,
336
+ "n_origins": 10
337
+ },
338
+ "sn41": {
339
+ "ratio": 0.332833114348808,
340
+ "mase": 0.8456874993582137,
341
+ "n_origins": 10
342
+ },
343
+ "sn42": {
344
+ "ratio": 0.4003270693058984,
345
+ "mase": 0.9927462466823825,
346
+ "n_origins": 10
347
+ },
348
+ "sn43": {
349
+ "ratio": 0.7023411100923905,
350
+ "mase": 3.6888628854343257,
351
+ "n_origins": 10
352
+ },
353
+ "sn44": {
354
+ "ratio": 1.0161184253027882,
355
+ "mase": 6.562614976468029,
356
+ "n_origins": 10
357
+ },
358
+ "sn45": {
359
+ "ratio": 0.9434229032340888,
360
+ "mase": 6.309146470706924,
361
+ "n_origins": 10
362
+ },
363
+ "sn46": {
364
+ "ratio": 0.7732972440862613,
365
+ "mase": 2.178964739537759,
366
+ "n_origins": 10
367
+ },
368
+ "sn47": {
369
+ "ratio": 0.704209450253542,
370
+ "mase": 1.72420404640847,
371
+ "n_origins": 10
372
+ },
373
+ "sn48": {
374
+ "ratio": 0.3586923726362881,
375
+ "mase": 0.9404994748290243,
376
+ "n_origins": 10
377
+ },
378
+ "sn49": {
379
+ "ratio": 0.9568909515473307,
380
+ "mase": 7.042653673805469,
381
+ "n_origins": 10
382
+ },
383
+ "sn5": {
384
+ "ratio": 0.6582275252722609,
385
+ "mase": 1.8621380022857654,
386
+ "n_origins": 10
387
+ },
388
+ "sn50": {
389
+ "ratio": 0.9963494825883185,
390
+ "mase": 5.596672951331695,
391
+ "n_origins": 10
392
+ },
393
+ "sn51": {
394
+ "ratio": 0.9380584595971575,
395
+ "mase": 9.182648838632726,
396
+ "n_origins": 10
397
+ },
398
+ "sn52": {
399
+ "ratio": 0.4758189331033769,
400
+ "mase": 1.1857265665738408,
401
+ "n_origins": 10
402
+ },
403
+ "sn53": {
404
+ "ratio": 0.8464325439007951,
405
+ "mase": 9.91413209769456,
406
+ "n_origins": 10
407
+ },
408
+ "sn54": {
409
+ "ratio": 0.8663963251444613,
410
+ "mase": 2.7167597246884925,
411
+ "n_origins": 10
412
+ },
413
+ "sn55": {
414
+ "ratio": 0.7341910044238699,
415
+ "mase": 1.8624925037141535,
416
+ "n_origins": 10
417
+ },
418
+ "sn56": {
419
+ "ratio": 0.8474648666257784,
420
+ "mase": 2.537542555652703,
421
+ "n_origins": 10
422
+ },
423
+ "sn57": {
424
+ "ratio": 0.48490333924163087,
425
+ "mase": 1.3736916045851946,
426
+ "n_origins": 10
427
+ },
428
+ "sn58": {
429
+ "ratio": 0.6208044406967781,
430
+ "mase": 2.405319786562752,
431
+ "n_origins": 10
432
+ },
433
+ "sn6": {
434
+ "ratio": 0.7648460033387705,
435
+ "mase": 1.925985310859074,
436
+ "n_origins": 10
437
+ },
438
+ "sn60": {
439
+ "ratio": 0.968433576947959,
440
+ "mase": 4.257514696975507,
441
+ "n_origins": 10
442
+ },
443
+ "sn61": {
444
+ "ratio": 0.9369827240512834,
445
+ "mase": 10.881261198557466,
446
+ "n_origins": 10
447
+ },
448
+ "sn62": {
449
+ "ratio": 0.3303069985305508,
450
+ "mase": 0.640979988017595,
451
+ "n_origins": 10
452
+ },
453
+ "sn63": {
454
+ "ratio": 0.5996357938669469,
455
+ "mase": 1.4699875558169695,
456
+ "n_origins": 10
457
+ },
458
+ "sn64": {
459
+ "ratio": 0.9100672413405264,
460
+ "mase": 4.9701523575591855,
461
+ "n_origins": 10
462
+ },
463
+ "sn65": {
464
+ "ratio": 0.9286100471048963,
465
+ "mase": 5.166353581392764,
466
+ "n_origins": 10
467
+ },
468
+ "sn66": {
469
+ "ratio": 0.3150918446013128,
470
+ "mase": 0.5177092081303796,
471
+ "n_origins": 10
472
+ },
473
+ "sn67": {
474
+ "ratio": 2.8895848130336566,
475
+ "mase": 0.2992958254683967,
476
+ "n_origins": 10
477
+ },
478
+ "sn68": {
479
+ "ratio": 0.6249266924137108,
480
+ "mase": 2.090854187855355,
481
+ "n_origins": 10
482
+ },
483
+ "sn69": {
484
+ "ratio": 0.3666347410440579,
485
+ "mase": 0.8096786009100585,
486
+ "n_origins": 10
487
+ },
488
+ "sn7": {
489
+ "ratio": 0.6590841938523517,
490
+ "mase": 1.5260503071362224,
491
+ "n_origins": 10
492
+ },
493
+ "sn71": {
494
+ "ratio": 0.9653904802836206,
495
+ "mase": 3.4703462195406725,
496
+ "n_origins": 10
497
+ },
498
+ "sn72": {
499
+ "ratio": 0.9818079401413271,
500
+ "mase": 5.514878907309477,
501
+ "n_origins": 10
502
+ },
503
+ "sn73": {
504
+ "ratio": 0.42601704627972725,
505
+ "mase": 0.949614179620279,
506
+ "n_origins": 10
507
+ },
508
+ "sn74": {
509
+ "ratio": 0.5510060606138546,
510
+ "mase": 1.6070539625549218,
511
+ "n_origins": 10
512
+ },
513
+ "sn75": {
514
+ "ratio": 0.9237623287284785,
515
+ "mase": 4.715957680787559,
516
+ "n_origins": 10
517
+ },
518
+ "sn76": {
519
+ "ratio": 0.604492708557892,
520
+ "mase": 1.1072047342270435,
521
+ "n_origins": 10
522
+ },
523
+ "sn77": {
524
+ "ratio": 0.9401192765227799,
525
+ "mase": 4.088392556370423,
526
+ "n_origins": 10
527
+ },
528
+ "sn78": {
529
+ "ratio": 0.8465868448090175,
530
+ "mase": 1.8324192856588475,
531
+ "n_origins": 10
532
+ },
533
+ "sn79": {
534
+ "ratio": 0.8420365802431585,
535
+ "mase": 3.281764539357969,
536
+ "n_origins": 10
537
+ },
538
+ "sn8": {
539
+ "ratio": 0.9412244476908845,
540
+ "mase": 7.402551087728235,
541
+ "n_origins": 10
542
+ },
543
+ "sn80": {
544
+ "ratio": 0.9098570827848194,
545
+ "mase": 11.752648884068511,
546
+ "n_origins": 10
547
+ },
548
+ "sn81": {
549
+ "ratio": 0.8404389011286985,
550
+ "mase": 2.1051055198870205,
551
+ "n_origins": 10
552
+ },
553
+ "sn82": {
554
+ "ratio": 0.7822239248503312,
555
+ "mase": 1.0753738905238195,
556
+ "n_origins": 10
557
+ },
558
+ "sn83": {
559
+ "ratio": 0.2796373639634712,
560
+ "mase": 0.6700711416969615,
561
+ "n_origins": 10
562
+ },
563
+ "sn84": {
564
+ "ratio": 0.6507719703074952,
565
+ "mase": 0.8741711396449494,
566
+ "n_origins": 10
567
+ },
568
+ "sn85": {
569
+ "ratio": 0.627479349396202,
570
+ "mase": 1.5793876999484109,
571
+ "n_origins": 10
572
+ },
573
+ "sn86": {
574
+ "ratio": 0.0,
575
+ "mase": 0.0,
576
+ "n_origins": 10
577
+ },
578
+ "sn87": {
579
+ "ratio": 0.9500345420487044,
580
+ "mase": 3.8785578694078744,
581
+ "n_origins": 10
582
+ },
583
+ "sn88": {
584
+ "ratio": 0.9373387635022492,
585
+ "mase": 6.514046740419002,
586
+ "n_origins": 10
587
+ },
588
+ "sn89": {
589
+ "ratio": 0.30961006564472077,
590
+ "mase": 0.7170409983227407,
591
+ "n_origins": 10
592
+ },
593
+ "sn9": {
594
+ "ratio": 0.9753219697333869,
595
+ "mase": 6.565642167519287,
596
+ "n_origins": 10
597
+ },
598
+ "sn90": {
599
+ "ratio": 0.8339860018627111,
600
+ "mase": 3.0559797229629093,
601
+ "n_origins": 10
602
+ },
603
+ "sn91": {
604
+ "ratio": 0.5808224517958317,
605
+ "mase": 1.1080240378681905,
606
+ "n_origins": 10
607
+ },
608
+ "sn92": {
609
+ "ratio": 0.8942767192576349,
610
+ "mase": 2.9354946736112764,
611
+ "n_origins": 10
612
+ },
613
+ "sn93": {
614
+ "ratio": 0.9584808120205827,
615
+ "mase": 10.87533462485032,
616
+ "n_origins": 10
617
+ },
618
+ "sn94": {
619
+ "ratio": 0.8772433751876558,
620
+ "mase": 2.662735973306941,
621
+ "n_origins": 10
622
+ },
623
+ "sn95": {
624
+ "ratio": 0.8540133192760636,
625
+ "mase": 5.9240823070066515,
626
+ "n_origins": 10
627
+ },
628
+ "sn96": {
629
+ "ratio": 1.2250740122371533,
630
+ "mase": 0.27015832739655554,
631
+ "n_origins": 10
632
+ },
633
+ "sn97": {
634
+ "ratio": 0.6472833001285045,
635
+ "mase": 0.9771080687406128,
636
+ "n_origins": 10
637
+ },
638
+ "sn98": {
639
+ "ratio": 0.3548340527797729,
640
+ "mase": 0.8464215390353514,
641
+ "n_origins": 10
642
+ },
643
+ "sn99": {
644
+ "ratio": 0.7138554618448916,
645
+ "mase": 1.945182405398431,
646
+ "n_origins": 10
647
+ }
648
+ }
649
+ },
650
+ "168": {
651
+ "n_assets": 125,
652
+ "geomean_ratio": 0.5912573329477064,
653
+ "median_ratio": 0.7023140005309937,
654
+ "beat_naive_frac": 0.896,
655
+ "per_asset": {
656
+ "TAOUSD": {
657
+ "ratio": 0.9100752102649408,
658
+ "mase": 7.679984254965317,
659
+ "n_origins": 10
660
+ },
661
+ "sn1": {
662
+ "ratio": 0.4438750839998818,
663
+ "mase": 4.619418991484161,
664
+ "n_origins": 10
665
+ },
666
+ "sn10": {
667
+ "ratio": 0.8827478451574644,
668
+ "mase": 17.29298694944316,
669
+ "n_origins": 10
670
+ },
671
+ "sn100": {
672
+ "ratio": 0.7306435768968533,
673
+ "mase": 3.313861892278839,
674
+ "n_origins": 10
675
+ },
676
+ "sn101": {
677
+ "ratio": 0.45040632664107205,
678
+ "mase": 2.3341703836065784,
679
+ "n_origins": 10
680
+ },
681
+ "sn102": {
682
+ "ratio": 0.5067737185921924,
683
+ "mase": 3.503420247365548,
684
+ "n_origins": 10
685
+ },
686
+ "sn104": {
687
+ "ratio": 0.20788542097397764,
688
+ "mase": 1.6770846067781704,
689
+ "n_origins": 10
690
+ },
691
+ "sn105": {
692
+ "ratio": 0.4918874338088409,
693
+ "mase": 1.6166938577149192,
694
+ "n_origins": 10
695
+ },
696
+ "sn106": {
697
+ "ratio": 0.9115560342130526,
698
+ "mase": 11.074499122396341,
699
+ "n_origins": 10
700
+ },
701
+ "sn107": {
702
+ "ratio": 1.06562497185661,
703
+ "mase": 15.895674465912892,
704
+ "n_origins": 10
705
+ },
706
+ "sn108": {
707
+ "ratio": 0.8920214916321676,
708
+ "mase": 12.608933021545328,
709
+ "n_origins": 10
710
+ },
711
+ "sn109": {
712
+ "ratio": 0.9050193716083643,
713
+ "mase": 6.3619973908863034,
714
+ "n_origins": 10
715
+ },
716
+ "sn11": {
717
+ "ratio": 0.6173831349527319,
718
+ "mase": 6.1996851582371155,
719
+ "n_origins": 10
720
+ },
721
+ "sn110": {
722
+ "ratio": 1.0369594859070947,
723
+ "mase": 24.98880953458835,
724
+ "n_origins": 10
725
+ },
726
+ "sn111": {
727
+ "ratio": 1.129513483998636,
728
+ "mase": 20.946627123673025,
729
+ "n_origins": 10
730
+ },
731
+ "sn112": {
732
+ "ratio": 0.840092854633076,
733
+ "mase": 21.558534721777868,
734
+ "n_origins": 10
735
+ },
736
+ "sn113": {
737
+ "ratio": 0.24434462000489912,
738
+ "mase": 1.4299642501485779,
739
+ "n_origins": 10
740
+ },
741
+ "sn114": {
742
+ "ratio": 0.6368066823483389,
743
+ "mase": 4.063485789769237,
744
+ "n_origins": 10
745
+ },
746
+ "sn115": {
747
+ "ratio": 0.734094025220814,
748
+ "mase": 3.9965255774615547,
749
+ "n_origins": 10
750
+ },
751
+ "sn116": {
752
+ "ratio": 0.17495444909429522,
753
+ "mase": 2.7649901489012874,
754
+ "n_origins": 10
755
+ },
756
+ "sn117": {
757
+ "ratio": 0.26369154204403294,
758
+ "mase": 1.2361515157036946,
759
+ "n_origins": 10
760
+ },
761
+ "sn118": {
762
+ "ratio": 0.9021119947158496,
763
+ "mase": 6.181163739928855,
764
+ "n_origins": 10
765
+ },
766
+ "sn119": {
767
+ "ratio": 0.41239115348726185,
768
+ "mase": 6.236132271279508,
769
+ "n_origins": 10
770
+ },
771
+ "sn12": {
772
+ "ratio": 0.43442699335661866,
773
+ "mase": 7.321839573525009,
774
+ "n_origins": 10
775
+ },
776
+ "sn120": {
777
+ "ratio": 0.9871911332725375,
778
+ "mase": 10.159962724795218,
779
+ "n_origins": 10
780
+ },
781
+ "sn121": {
782
+ "ratio": 0.316471885314022,
783
+ "mase": 3.2851996197605904,
784
+ "n_origins": 10
785
+ },
786
+ "sn122": {
787
+ "ratio": 0.15027962147130014,
788
+ "mase": 2.362615466156081,
789
+ "n_origins": 10
790
+ },
791
+ "sn123": {
792
+ "ratio": 0.6848133199174291,
793
+ "mase": 4.8520500327051685,
794
+ "n_origins": 10
795
+ },
796
+ "sn124": {
797
+ "ratio": 1.1260303024240084,
798
+ "mase": 22.30860791421475,
799
+ "n_origins": 10
800
+ },
801
+ "sn125": {
802
+ "ratio": 0.21915090411862428,
803
+ "mase": 2.5329645338443596,
804
+ "n_origins": 10
805
+ },
806
+ "sn126": {
807
+ "ratio": 0.31821256477284865,
808
+ "mase": 1.8662823293087163,
809
+ "n_origins": 10
810
+ },
811
+ "sn127": {
812
+ "ratio": 0.7046241166125854,
813
+ "mase": 5.353207457211217,
814
+ "n_origins": 10
815
+ },
816
+ "sn128": {
817
+ "ratio": 0.5332536855559383,
818
+ "mase": 6.900957341922866,
819
+ "n_origins": 10
820
+ },
821
+ "sn13": {
822
+ "ratio": 0.5613371370354806,
823
+ "mase": 4.552263712849844,
824
+ "n_origins": 10
825
+ },
826
+ "sn14": {
827
+ "ratio": 0.7023140005309937,
828
+ "mase": 7.659361309742066,
829
+ "n_origins": 10
830
+ },
831
+ "sn15": {
832
+ "ratio": 1.023450627575242,
833
+ "mase": 14.687836385442003,
834
+ "n_origins": 10
835
+ },
836
+ "sn16": {
837
+ "ratio": 0.24396147038637292,
838
+ "mase": 3.4808056107833396,
839
+ "n_origins": 10
840
+ },
841
+ "sn17": {
842
+ "ratio": 0.6701195173611982,
843
+ "mase": 10.827556762515933,
844
+ "n_origins": 10
845
+ },
846
+ "sn18": {
847
+ "ratio": 0.7934861579235609,
848
+ "mase": 8.595499004618864,
849
+ "n_origins": 10
850
+ },
851
+ "sn19": {
852
+ "ratio": 0.792444665766595,
853
+ "mase": 14.54652455754288,
854
+ "n_origins": 10
855
+ },
856
+ "sn2": {
857
+ "ratio": 0.9613129709455558,
858
+ "mase": 10.387824727215362,
859
+ "n_origins": 10
860
+ },
861
+ "sn20": {
862
+ "ratio": 0.5492204106949773,
863
+ "mase": 3.389618815514995,
864
+ "n_origins": 10
865
+ },
866
+ "sn21": {
867
+ "ratio": 0.7639724165790677,
868
+ "mase": 7.908770910465448,
869
+ "n_origins": 10
870
+ },
871
+ "sn22": {
872
+ "ratio": 0.39411192759747843,
873
+ "mase": 2.549521622316424,
874
+ "n_origins": 10
875
+ },
876
+ "sn23": {
877
+ "ratio": 0.8168344848075498,
878
+ "mase": 6.517589601240204,
879
+ "n_origins": 10
880
+ },
881
+ "sn24": {
882
+ "ratio": 0.3252817232770648,
883
+ "mase": 1.2395460663127518,
884
+ "n_origins": 10
885
+ },
886
+ "sn25": {
887
+ "ratio": 0.893069007859292,
888
+ "mase": 54.405590331014416,
889
+ "n_origins": 10
890
+ },
891
+ "sn26": {
892
+ "ratio": 0.19195734112972276,
893
+ "mase": 2.8574828607381413,
894
+ "n_origins": 10
895
+ },
896
+ "sn27": {
897
+ "ratio": 0.589178500703813,
898
+ "mase": 3.1580550481798277,
899
+ "n_origins": 10
900
+ },
901
+ "sn28": {
902
+ "ratio": 0.9641285137229935,
903
+ "mase": 13.73957590343457,
904
+ "n_origins": 10
905
+ },
906
+ "sn29": {
907
+ "ratio": 0.808338082509486,
908
+ "mase": 13.43166239245011,
909
+ "n_origins": 10
910
+ },
911
+ "sn3": {
912
+ "ratio": 0.9902122667863987,
913
+ "mase": 15.687289798759382,
914
+ "n_origins": 10
915
+ },
916
+ "sn30": {
917
+ "ratio": 0.802329223546456,
918
+ "mase": 7.951715356291156,
919
+ "n_origins": 10
920
+ },
921
+ "sn31": {
922
+ "ratio": 0.9128299819300025,
923
+ "mase": 7.786309497325637,
924
+ "n_origins": 10
925
+ },
926
+ "sn32": {
927
+ "ratio": 0.6201151481593595,
928
+ "mase": 4.8767233894430095,
929
+ "n_origins": 10
930
+ },
931
+ "sn33": {
932
+ "ratio": 0.7664513290334893,
933
+ "mase": 8.12940031415799,
934
+ "n_origins": 10
935
+ },
936
+ "sn34": {
937
+ "ratio": 0.6781981966265448,
938
+ "mase": 9.485026832691725,
939
+ "n_origins": 10
940
+ },
941
+ "sn35": {
942
+ "ratio": 0.8371713248376367,
943
+ "mase": 8.444572926007117,
944
+ "n_origins": 10
945
+ },
946
+ "sn37": {
947
+ "ratio": 0.8604372480031328,
948
+ "mase": 21.818056606717704,
949
+ "n_origins": 10
950
+ },
951
+ "sn38": {
952
+ "ratio": 0.6890261382184673,
953
+ "mase": 5.673408288852618,
954
+ "n_origins": 10
955
+ },
956
+ "sn39": {
957
+ "ratio": 1.0852344282936282,
958
+ "mase": 18.854264797546385,
959
+ "n_origins": 10
960
+ },
961
+ "sn4": {
962
+ "ratio": 0.8043390655003738,
963
+ "mase": 12.309229642502702,
964
+ "n_origins": 10
965
+ },
966
+ "sn40": {
967
+ "ratio": 0.058884831132228005,
968
+ "mase": 1.0945463750121973,
969
+ "n_origins": 10
970
+ },
971
+ "sn41": {
972
+ "ratio": 0.1524851291093199,
973
+ "mase": 1.4156308026116413,
974
+ "n_origins": 10
975
+ },
976
+ "sn42": {
977
+ "ratio": 0.9269195364702056,
978
+ "mase": 11.8040283947565,
979
+ "n_origins": 10
980
+ },
981
+ "sn43": {
982
+ "ratio": 1.1899729758044402,
983
+ "mase": 51.88570679977294,
984
+ "n_origins": 10
985
+ },
986
+ "sn44": {
987
+ "ratio": 0.8050048242812977,
988
+ "mase": 7.8145599890865185,
989
+ "n_origins": 10
990
+ },
991
+ "sn45": {
992
+ "ratio": 0.7354542370326859,
993
+ "mase": 14.17314326499596,
994
+ "n_origins": 10
995
+ },
996
+ "sn46": {
997
+ "ratio": 0.8640120867906319,
998
+ "mase": 8.860408404367137,
999
+ "n_origins": 10
1000
+ },
1001
+ "sn47": {
1002
+ "ratio": 0.5815052627856627,
1003
+ "mase": 3.7873907912589284,
1004
+ "n_origins": 10
1005
+ },
1006
+ "sn48": {
1007
+ "ratio": 0.3938034373080971,
1008
+ "mase": 3.7191502680454467,
1009
+ "n_origins": 10
1010
+ },
1011
+ "sn49": {
1012
+ "ratio": 0.9746467778194559,
1013
+ "mase": 30.37524045903674,
1014
+ "n_origins": 10
1015
+ },
1016
+ "sn5": {
1017
+ "ratio": 0.5124963495380332,
1018
+ "mase": 9.05919331794893,
1019
+ "n_origins": 10
1020
+ },
1021
+ "sn50": {
1022
+ "ratio": 0.6748968649825268,
1023
+ "mase": 7.812514908267832,
1024
+ "n_origins": 10
1025
+ },
1026
+ "sn51": {
1027
+ "ratio": 0.8960899201707188,
1028
+ "mase": 27.701417848939723,
1029
+ "n_origins": 10
1030
+ },
1031
+ "sn52": {
1032
+ "ratio": 0.762058352543706,
1033
+ "mase": 11.907619533064139,
1034
+ "n_origins": 10
1035
+ },
1036
+ "sn53": {
1037
+ "ratio": 0.938498762031826,
1038
+ "mase": 29.474731561413012,
1039
+ "n_origins": 10
1040
+ },
1041
+ "sn54": {
1042
+ "ratio": 0.7364866042739933,
1043
+ "mase": 5.0612012952468985,
1044
+ "n_origins": 10
1045
+ },
1046
+ "sn55": {
1047
+ "ratio": 0.45688778135976693,
1048
+ "mase": 3.054664315892751,
1049
+ "n_origins": 10
1050
+ },
1051
+ "sn56": {
1052
+ "ratio": 0.6147015531871757,
1053
+ "mase": 6.460889496857033,
1054
+ "n_origins": 10
1055
+ },
1056
+ "sn57": {
1057
+ "ratio": 0.13193987091868054,
1058
+ "mase": 2.223215873491268,
1059
+ "n_origins": 10
1060
+ },
1061
+ "sn58": {
1062
+ "ratio": 0.3716650084319622,
1063
+ "mase": 8.86397154822343,
1064
+ "n_origins": 10
1065
+ },
1066
+ "sn6": {
1067
+ "ratio": 0.369871730432288,
1068
+ "mase": 1.9442287638304208,
1069
+ "n_origins": 10
1070
+ },
1071
+ "sn60": {
1072
+ "ratio": 0.8195637235658098,
1073
+ "mase": 9.50288355487155,
1074
+ "n_origins": 10
1075
+ },
1076
+ "sn61": {
1077
+ "ratio": 0.9183091000323272,
1078
+ "mase": 15.072353355302221,
1079
+ "n_origins": 10
1080
+ },
1081
+ "sn62": {
1082
+ "ratio": 0.3622111816619363,
1083
+ "mase": 2.4285060842746553,
1084
+ "n_origins": 10
1085
+ },
1086
+ "sn63": {
1087
+ "ratio": 0.6818897402043701,
1088
+ "mase": 5.02948809059371,
1089
+ "n_origins": 10
1090
+ },
1091
+ "sn64": {
1092
+ "ratio": 1.2082937911805636,
1093
+ "mase": 26.318711374094196,
1094
+ "n_origins": 10
1095
+ },
1096
+ "sn65": {
1097
+ "ratio": 1.023422985109473,
1098
+ "mase": 27.256243259958328,
1099
+ "n_origins": 10
1100
+ },
1101
+ "sn66": {
1102
+ "ratio": 0.4178216614437362,
1103
+ "mase": 2.696127156985599,
1104
+ "n_origins": 10
1105
+ },
1106
+ "sn67": {
1107
+ "ratio": 0.7256006442157982,
1108
+ "mase": 1.2404957706721353,
1109
+ "n_origins": 10
1110
+ },
1111
+ "sn68": {
1112
+ "ratio": 0.6105094945176525,
1113
+ "mase": 8.902969974480158,
1114
+ "n_origins": 10
1115
+ },
1116
+ "sn69": {
1117
+ "ratio": 0.2963017186869316,
1118
+ "mase": 3.929552248726135,
1119
+ "n_origins": 10
1120
+ },
1121
+ "sn7": {
1122
+ "ratio": 0.5092109593531934,
1123
+ "mase": 4.584884429037224,
1124
+ "n_origins": 10
1125
+ },
1126
+ "sn71": {
1127
+ "ratio": 0.9589608651941428,
1128
+ "mase": 13.904260400129598,
1129
+ "n_origins": 10
1130
+ },
1131
+ "sn72": {
1132
+ "ratio": 1.069597526072891,
1133
+ "mase": 19.699345144633266,
1134
+ "n_origins": 10
1135
+ },
1136
+ "sn73": {
1137
+ "ratio": 0.49156334729917994,
1138
+ "mase": 5.331010615316575,
1139
+ "n_origins": 10
1140
+ },
1141
+ "sn74": {
1142
+ "ratio": 0.3498748751195492,
1143
+ "mase": 3.5344200008891193,
1144
+ "n_origins": 10
1145
+ },
1146
+ "sn75": {
1147
+ "ratio": 0.8610338713274657,
1148
+ "mase": 10.3311394178343,
1149
+ "n_origins": 10
1150
+ },
1151
+ "sn76": {
1152
+ "ratio": 0.5713863944256178,
1153
+ "mase": 2.8828316807214414,
1154
+ "n_origins": 10
1155
+ },
1156
+ "sn77": {
1157
+ "ratio": 0.9083553635822804,
1158
+ "mase": 16.847773628126813,
1159
+ "n_origins": 10
1160
+ },
1161
+ "sn78": {
1162
+ "ratio": 0.8236671957519094,
1163
+ "mase": 11.791774957047624,
1164
+ "n_origins": 10
1165
+ },
1166
+ "sn79": {
1167
+ "ratio": 0.9336356426784087,
1168
+ "mase": 14.833680324429588,
1169
+ "n_origins": 10
1170
+ },
1171
+ "sn8": {
1172
+ "ratio": 1.2305257885256762,
1173
+ "mase": 27.571565874570336,
1174
+ "n_origins": 10
1175
+ },
1176
+ "sn80": {
1177
+ "ratio": 0.9255675372305814,
1178
+ "mase": 27.484800603309353,
1179
+ "n_origins": 10
1180
+ },
1181
+ "sn81": {
1182
+ "ratio": 0.7870056781034819,
1183
+ "mase": 7.9507811898814955,
1184
+ "n_origins": 10
1185
+ },
1186
+ "sn82": {
1187
+ "ratio": 0.3074067813153488,
1188
+ "mase": 1.7766035332154038,
1189
+ "n_origins": 10
1190
+ },
1191
+ "sn83": {
1192
+ "ratio": 0.38917933127065985,
1193
+ "mase": 4.755467355460388,
1194
+ "n_origins": 10
1195
+ },
1196
+ "sn84": {
1197
+ "ratio": 0.44122856249403364,
1198
+ "mase": 2.4826598084817535,
1199
+ "n_origins": 10
1200
+ },
1201
+ "sn85": {
1202
+ "ratio": 0.46647173836747785,
1203
+ "mase": 2.9402907304879857,
1204
+ "n_origins": 10
1205
+ },
1206
+ "sn86": {
1207
+ "ratio": 0.3046358340581454,
1208
+ "mase": 80.45356450706991,
1209
+ "n_origins": 10
1210
+ },
1211
+ "sn87": {
1212
+ "ratio": 0.98149180335189,
1213
+ "mase": 11.071090340140314,
1214
+ "n_origins": 10
1215
+ },
1216
+ "sn88": {
1217
+ "ratio": 1.0033684803757987,
1218
+ "mase": 12.65384013059474,
1219
+ "n_origins": 10
1220
+ },
1221
+ "sn89": {
1222
+ "ratio": 0.3670642765206676,
1223
+ "mase": 4.333878735482116,
1224
+ "n_origins": 10
1225
+ },
1226
+ "sn9": {
1227
+ "ratio": 0.8021808528940881,
1228
+ "mase": 13.717250378665106,
1229
+ "n_origins": 10
1230
+ },
1231
+ "sn90": {
1232
+ "ratio": 0.944664933292554,
1233
+ "mase": 15.133822535298634,
1234
+ "n_origins": 10
1235
+ },
1236
+ "sn91": {
1237
+ "ratio": 0.5700116014669724,
1238
+ "mase": 3.820971829658756,
1239
+ "n_origins": 10
1240
+ },
1241
+ "sn92": {
1242
+ "ratio": 0.4667407428417494,
1243
+ "mase": 8.952819460503436,
1244
+ "n_origins": 10
1245
+ },
1246
+ "sn93": {
1247
+ "ratio": 1.0776715540210007,
1248
+ "mase": 44.747392736935744,
1249
+ "n_origins": 10
1250
+ },
1251
+ "sn94": {
1252
+ "ratio": 0.6816537170566556,
1253
+ "mase": 4.661249256992374,
1254
+ "n_origins": 10
1255
+ },
1256
+ "sn95": {
1257
+ "ratio": 0.7543603469812513,
1258
+ "mase": 20.890270711614626,
1259
+ "n_origins": 10
1260
+ },
1261
+ "sn96": {
1262
+ "ratio": 0.314890999686123,
1263
+ "mase": 0.8023941524821053,
1264
+ "n_origins": 10
1265
+ },
1266
+ "sn97": {
1267
+ "ratio": 0.34897380324327637,
1268
+ "mase": 1.5975141852829988,
1269
+ "n_origins": 10
1270
+ },
1271
+ "sn98": {
1272
+ "ratio": 0.2479518856037744,
1273
+ "mase": 2.191532528954685,
1274
+ "n_origins": 10
1275
+ },
1276
+ "sn99": {
1277
+ "ratio": 0.33502414615582404,
1278
+ "mase": 4.929613706571547,
1279
+ "n_origins": 10
1280
+ }
1281
+ }
1282
+ }
1283
+ }
1284
+ }
evals/eval-4h.json ADDED
@@ -0,0 +1,1224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundle": "results/fitproc2/wsoup85-fgl0-hurdle",
3
+ "data": "data/subnet_ft2/holdout_4h.npz",
4
+ "mode": "ohlc",
5
+ "levels": [
6
+ 0.1,
7
+ 0.2,
8
+ 0.3,
9
+ 0.4,
10
+ 0.5,
11
+ 0.6,
12
+ 0.7,
13
+ 0.8,
14
+ 0.9
15
+ ],
16
+ "horizons": {
17
+ "42": {
18
+ "n_assets": 119,
19
+ "geomean_ratio": 0.7601712952828521,
20
+ "median_ratio": 0.80283196182496,
21
+ "beat_naive_frac": 0.9243697478991597,
22
+ "per_asset": {
23
+ "TAOUSD": {
24
+ "ratio": 0.6374269629347838,
25
+ "mase": 2.1412454834492327,
26
+ "n_origins": 10
27
+ },
28
+ "sn1": {
29
+ "ratio": 0.7071442791470918,
30
+ "mase": 3.236120456117732,
31
+ "n_origins": 10
32
+ },
33
+ "sn10": {
34
+ "ratio": 0.9235717838401625,
35
+ "mase": 5.5238464017471935,
36
+ "n_origins": 10
37
+ },
38
+ "sn100": {
39
+ "ratio": 0.7421261130427927,
40
+ "mase": 1.7075040834120192,
41
+ "n_origins": 10
42
+ },
43
+ "sn101": {
44
+ "ratio": 0.7667647408453792,
45
+ "mase": 2.870135365479246,
46
+ "n_origins": 10
47
+ },
48
+ "sn102": {
49
+ "ratio": 0.6555855807664686,
50
+ "mase": 2.2891113404792915,
51
+ "n_origins": 10
52
+ },
53
+ "sn104": {
54
+ "ratio": 0.7927062285095884,
55
+ "mase": 8.632927125300247,
56
+ "n_origins": 10
57
+ },
58
+ "sn105": {
59
+ "ratio": 0.7402119028607586,
60
+ "mase": 1.9723910182530073,
61
+ "n_origins": 10
62
+ },
63
+ "sn106": {
64
+ "ratio": 1.0002149558808302,
65
+ "mase": 4.81340981856827,
66
+ "n_origins": 10
67
+ },
68
+ "sn107": {
69
+ "ratio": 1.0952015156317085,
70
+ "mase": 6.928486455506595,
71
+ "n_origins": 10
72
+ },
73
+ "sn108": {
74
+ "ratio": 0.9587118130348637,
75
+ "mase": 5.9778290217634575,
76
+ "n_origins": 10
77
+ },
78
+ "sn109": {
79
+ "ratio": 0.664510077034069,
80
+ "mase": 1.746853776402394,
81
+ "n_origins": 10
82
+ },
83
+ "sn11": {
84
+ "ratio": 0.8444834537428717,
85
+ "mase": 4.550801655310258,
86
+ "n_origins": 10
87
+ },
88
+ "sn110": {
89
+ "ratio": 1.0015605766491853,
90
+ "mase": 8.816947615711387,
91
+ "n_origins": 10
92
+ },
93
+ "sn111": {
94
+ "ratio": 0.8799261605159608,
95
+ "mase": 6.1923915499061,
96
+ "n_origins": 10
97
+ },
98
+ "sn112": {
99
+ "ratio": 0.9876387141583952,
100
+ "mase": 6.513805034748749,
101
+ "n_origins": 10
102
+ },
103
+ "sn113": {
104
+ "ratio": 0.867840939564275,
105
+ "mase": 2.7278253131287498,
106
+ "n_origins": 10
107
+ },
108
+ "sn114": {
109
+ "ratio": 0.747700766397717,
110
+ "mase": 2.275733187907876,
111
+ "n_origins": 10
112
+ },
113
+ "sn115": {
114
+ "ratio": 0.8567755760134165,
115
+ "mase": 1.0319649288562387,
116
+ "n_origins": 10
117
+ },
118
+ "sn116": {
119
+ "ratio": 0.6070390445127525,
120
+ "mase": 7.948035418653019,
121
+ "n_origins": 10
122
+ },
123
+ "sn117": {
124
+ "ratio": 0.9396260806677816,
125
+ "mase": 5.404646289003614,
126
+ "n_origins": 10
127
+ },
128
+ "sn118": {
129
+ "ratio": 0.8802408776017544,
130
+ "mase": 4.622196719592173,
131
+ "n_origins": 10
132
+ },
133
+ "sn119": {
134
+ "ratio": 0.7859194635761246,
135
+ "mase": 3.9739871641618336,
136
+ "n_origins": 10
137
+ },
138
+ "sn12": {
139
+ "ratio": 1.1178346865617548,
140
+ "mase": 6.3772803201011845,
141
+ "n_origins": 10
142
+ },
143
+ "sn120": {
144
+ "ratio": 0.7627967079933433,
145
+ "mase": 4.394599176119626,
146
+ "n_origins": 10
147
+ },
148
+ "sn121": {
149
+ "ratio": 0.8087200990676922,
150
+ "mase": 4.227298678340115,
151
+ "n_origins": 10
152
+ },
153
+ "sn122": {
154
+ "ratio": 0.6705107839370132,
155
+ "mase": 3.509774002610324,
156
+ "n_origins": 10
157
+ },
158
+ "sn123": {
159
+ "ratio": 0.800099979798776,
160
+ "mase": 2.2335847881513513,
161
+ "n_origins": 10
162
+ },
163
+ "sn124": {
164
+ "ratio": 1.0601988984468589,
165
+ "mase": 7.804416101090395,
166
+ "n_origins": 10
167
+ },
168
+ "sn125": {
169
+ "ratio": 0.6981453694457836,
170
+ "mase": 3.5168595537014244,
171
+ "n_origins": 10
172
+ },
173
+ "sn126": {
174
+ "ratio": 0.6468460006250786,
175
+ "mase": 2.2692930664358344,
176
+ "n_origins": 10
177
+ },
178
+ "sn127": {
179
+ "ratio": 0.8809865430179745,
180
+ "mase": 3.3651752591002073,
181
+ "n_origins": 10
182
+ },
183
+ "sn128": {
184
+ "ratio": 0.865582592044921,
185
+ "mase": 5.843544690328019,
186
+ "n_origins": 10
187
+ },
188
+ "sn13": {
189
+ "ratio": 0.803341884201458,
190
+ "mase": 2.591629074553585,
191
+ "n_origins": 10
192
+ },
193
+ "sn14": {
194
+ "ratio": 0.7923346203136108,
195
+ "mase": 2.820124454280129,
196
+ "n_origins": 10
197
+ },
198
+ "sn15": {
199
+ "ratio": 0.9341121792131656,
200
+ "mase": 5.554048923204436,
201
+ "n_origins": 10
202
+ },
203
+ "sn17": {
204
+ "ratio": 0.8418337806309949,
205
+ "mase": 5.766741537758487,
206
+ "n_origins": 10
207
+ },
208
+ "sn18": {
209
+ "ratio": 0.8797320974564435,
210
+ "mase": 4.013699224096511,
211
+ "n_origins": 10
212
+ },
213
+ "sn19": {
214
+ "ratio": 0.6032547545759042,
215
+ "mase": 2.9568181656940906,
216
+ "n_origins": 10
217
+ },
218
+ "sn2": {
219
+ "ratio": 0.7941147875814694,
220
+ "mase": 2.7430698737150476,
221
+ "n_origins": 10
222
+ },
223
+ "sn20": {
224
+ "ratio": 0.8268839181249031,
225
+ "mase": 3.2322962053074797,
226
+ "n_origins": 10
227
+ },
228
+ "sn21": {
229
+ "ratio": 0.7776060313608363,
230
+ "mase": 2.5900389171732106,
231
+ "n_origins": 10
232
+ },
233
+ "sn22": {
234
+ "ratio": 0.599855007950146,
235
+ "mase": 1.4727342490841182,
236
+ "n_origins": 10
237
+ },
238
+ "sn23": {
239
+ "ratio": 0.9627344018376658,
240
+ "mase": 5.0063605465032905,
241
+ "n_origins": 10
242
+ },
243
+ "sn24": {
244
+ "ratio": 0.9176187466565344,
245
+ "mase": 4.070067466476585,
246
+ "n_origins": 10
247
+ },
248
+ "sn25": {
249
+ "ratio": 0.8793919384674335,
250
+ "mase": 23.622918648201985,
251
+ "n_origins": 10
252
+ },
253
+ "sn26": {
254
+ "ratio": 0.7334303457806416,
255
+ "mase": 4.187871236326281,
256
+ "n_origins": 10
257
+ },
258
+ "sn27": {
259
+ "ratio": 0.9473700851903468,
260
+ "mase": 6.065530295605566,
261
+ "n_origins": 10
262
+ },
263
+ "sn28": {
264
+ "ratio": 0.9370399866814607,
265
+ "mase": 5.0284824238952455,
266
+ "n_origins": 10
267
+ },
268
+ "sn29": {
269
+ "ratio": 0.5762630681825547,
270
+ "mase": 2.6442135121313433,
271
+ "n_origins": 10
272
+ },
273
+ "sn3": {
274
+ "ratio": 0.7408011815462175,
275
+ "mase": 2.5672025558515807,
276
+ "n_origins": 10
277
+ },
278
+ "sn30": {
279
+ "ratio": 0.8162081387505737,
280
+ "mase": 3.414835586452559,
281
+ "n_origins": 10
282
+ },
283
+ "sn31": {
284
+ "ratio": 0.8608452312918584,
285
+ "mase": 3.2753521885401984,
286
+ "n_origins": 10
287
+ },
288
+ "sn32": {
289
+ "ratio": 0.6717679202169944,
290
+ "mase": 2.1534546207890557,
291
+ "n_origins": 10
292
+ },
293
+ "sn33": {
294
+ "ratio": 0.5045451262392753,
295
+ "mase": 1.824153028773081,
296
+ "n_origins": 10
297
+ },
298
+ "sn34": {
299
+ "ratio": 0.7651535237778423,
300
+ "mase": 4.194402885158806,
301
+ "n_origins": 10
302
+ },
303
+ "sn35": {
304
+ "ratio": 0.5953034517118768,
305
+ "mase": 1.9006677643549783,
306
+ "n_origins": 10
307
+ },
308
+ "sn37": {
309
+ "ratio": 0.879130982797314,
310
+ "mase": 6.465346983425736,
311
+ "n_origins": 10
312
+ },
313
+ "sn38": {
314
+ "ratio": 0.7805361539423233,
315
+ "mase": 3.5136285418607662,
316
+ "n_origins": 10
317
+ },
318
+ "sn39": {
319
+ "ratio": 0.7750306664738563,
320
+ "mase": 1.8273366862264013,
321
+ "n_origins": 10
322
+ },
323
+ "sn4": {
324
+ "ratio": 0.8705079794788888,
325
+ "mase": 5.294973912625434,
326
+ "n_origins": 10
327
+ },
328
+ "sn41": {
329
+ "ratio": 0.6842181953748515,
330
+ "mase": 2.4058731757404384,
331
+ "n_origins": 10
332
+ },
333
+ "sn42": {
334
+ "ratio": 0.9842525474806115,
335
+ "mase": 4.625881791013822,
336
+ "n_origins": 10
337
+ },
338
+ "sn43": {
339
+ "ratio": 0.7862112036273466,
340
+ "mase": 5.557810971671016,
341
+ "n_origins": 10
342
+ },
343
+ "sn44": {
344
+ "ratio": 0.8563587826360379,
345
+ "mase": 4.528940482387421,
346
+ "n_origins": 10
347
+ },
348
+ "sn45": {
349
+ "ratio": 0.8635624653481881,
350
+ "mase": 3.635022065868841,
351
+ "n_origins": 10
352
+ },
353
+ "sn46": {
354
+ "ratio": 0.820750926297373,
355
+ "mase": 3.69478430159735,
356
+ "n_origins": 10
357
+ },
358
+ "sn47": {
359
+ "ratio": 0.6414703802819941,
360
+ "mase": 1.8545958963595097,
361
+ "n_origins": 10
362
+ },
363
+ "sn48": {
364
+ "ratio": 0.8407190335112471,
365
+ "mase": 5.3369191689806605,
366
+ "n_origins": 10
367
+ },
368
+ "sn49": {
369
+ "ratio": 1.009223553277079,
370
+ "mase": 6.39763143165436,
371
+ "n_origins": 10
372
+ },
373
+ "sn5": {
374
+ "ratio": 0.5538935631584493,
375
+ "mase": 3.500551049854523,
376
+ "n_origins": 10
377
+ },
378
+ "sn50": {
379
+ "ratio": 0.7995697563842056,
380
+ "mase": 2.852216980181863,
381
+ "n_origins": 10
382
+ },
383
+ "sn51": {
384
+ "ratio": 1.0059167133629985,
385
+ "mase": 11.902346460501631,
386
+ "n_origins": 10
387
+ },
388
+ "sn52": {
389
+ "ratio": 0.7857289293024864,
390
+ "mase": 5.415362623726307,
391
+ "n_origins": 10
392
+ },
393
+ "sn53": {
394
+ "ratio": 0.8536415020657838,
395
+ "mase": 30.750708723548406,
396
+ "n_origins": 10
397
+ },
398
+ "sn54": {
399
+ "ratio": 0.8953451360977959,
400
+ "mase": 3.6595069642700184,
401
+ "n_origins": 10
402
+ },
403
+ "sn55": {
404
+ "ratio": 0.794236647804419,
405
+ "mase": 3.1371882268074236,
406
+ "n_origins": 10
407
+ },
408
+ "sn56": {
409
+ "ratio": 0.35202138764334745,
410
+ "mase": 1.3872054808743202,
411
+ "n_origins": 10
412
+ },
413
+ "sn57": {
414
+ "ratio": 0.3592055079125456,
415
+ "mase": 1.7675032305529337,
416
+ "n_origins": 10
417
+ },
418
+ "sn6": {
419
+ "ratio": 0.4350542291877049,
420
+ "mase": 1.050886778990209,
421
+ "n_origins": 10
422
+ },
423
+ "sn60": {
424
+ "ratio": 0.9358066131348576,
425
+ "mase": 4.630392705968347,
426
+ "n_origins": 10
427
+ },
428
+ "sn61": {
429
+ "ratio": 0.9769634806769028,
430
+ "mase": 9.783434879517293,
431
+ "n_origins": 10
432
+ },
433
+ "sn62": {
434
+ "ratio": 0.5507556781078301,
435
+ "mase": 1.9674086744125947,
436
+ "n_origins": 10
437
+ },
438
+ "sn63": {
439
+ "ratio": 0.80283196182496,
440
+ "mase": 2.6501885941440393,
441
+ "n_origins": 10
442
+ },
443
+ "sn64": {
444
+ "ratio": 0.9037060096746216,
445
+ "mase": 6.478926973579205,
446
+ "n_origins": 10
447
+ },
448
+ "sn65": {
449
+ "ratio": 1.0259222560880876,
450
+ "mase": 6.86804041113346,
451
+ "n_origins": 10
452
+ },
453
+ "sn66": {
454
+ "ratio": 0.6731840375485715,
455
+ "mase": 2.287444588766688,
456
+ "n_origins": 10
457
+ },
458
+ "sn67": {
459
+ "ratio": 0.3690580805417027,
460
+ "mase": 0.4033513561782756,
461
+ "n_origins": 10
462
+ },
463
+ "sn68": {
464
+ "ratio": 0.8685349259120358,
465
+ "mase": 4.8760983568360405,
466
+ "n_origins": 10
467
+ },
468
+ "sn69": {
469
+ "ratio": 0.5796411296792447,
470
+ "mase": 4.353849319147135,
471
+ "n_origins": 10
472
+ },
473
+ "sn7": {
474
+ "ratio": 0.8755991255854364,
475
+ "mase": 3.5784649652559195,
476
+ "n_origins": 10
477
+ },
478
+ "sn71": {
479
+ "ratio": 0.957491006367195,
480
+ "mase": 4.999191681131073,
481
+ "n_origins": 10
482
+ },
483
+ "sn72": {
484
+ "ratio": 0.9961067094981138,
485
+ "mase": 6.309798331482321,
486
+ "n_origins": 10
487
+ },
488
+ "sn73": {
489
+ "ratio": 0.48963112421736105,
490
+ "mase": 1.6581983712721573,
491
+ "n_origins": 10
492
+ },
493
+ "sn74": {
494
+ "ratio": 0.7535325462327388,
495
+ "mase": 3.717902535995752,
496
+ "n_origins": 10
497
+ },
498
+ "sn75": {
499
+ "ratio": 0.6638557059957947,
500
+ "mase": 2.788077307614449,
501
+ "n_origins": 10
502
+ },
503
+ "sn76": {
504
+ "ratio": 0.7541127687666422,
505
+ "mase": 2.0080141698237286,
506
+ "n_origins": 10
507
+ },
508
+ "sn77": {
509
+ "ratio": 0.6702376318546666,
510
+ "mase": 3.0981722013063804,
511
+ "n_origins": 10
512
+ },
513
+ "sn78": {
514
+ "ratio": 0.8768876396180595,
515
+ "mase": 6.454151139114798,
516
+ "n_origins": 10
517
+ },
518
+ "sn79": {
519
+ "ratio": 0.7730553066015577,
520
+ "mase": 3.1940507108310685,
521
+ "n_origins": 10
522
+ },
523
+ "sn8": {
524
+ "ratio": 0.7999729005172113,
525
+ "mase": 6.443244131860463,
526
+ "n_origins": 10
527
+ },
528
+ "sn80": {
529
+ "ratio": 1.0031576140237783,
530
+ "mase": 16.34372814537322,
531
+ "n_origins": 10
532
+ },
533
+ "sn81": {
534
+ "ratio": 0.6956173875851428,
535
+ "mase": 2.361083799935629,
536
+ "n_origins": 10
537
+ },
538
+ "sn82": {
539
+ "ratio": 0.5841790550412778,
540
+ "mase": 2.4479521966551903,
541
+ "n_origins": 10
542
+ },
543
+ "sn83": {
544
+ "ratio": 0.5089115728019465,
545
+ "mase": 2.0774264588466833,
546
+ "n_origins": 10
547
+ },
548
+ "sn84": {
549
+ "ratio": 0.1384790748483693,
550
+ "mase": 0.4765101652836849,
551
+ "n_origins": 10
552
+ },
553
+ "sn85": {
554
+ "ratio": 0.7539469830534062,
555
+ "mase": 2.282384617378815,
556
+ "n_origins": 10
557
+ },
558
+ "sn87": {
559
+ "ratio": 0.8910263084275057,
560
+ "mase": 4.705515042024457,
561
+ "n_origins": 10
562
+ },
563
+ "sn88": {
564
+ "ratio": 0.9940163470711401,
565
+ "mase": 4.55153271234836,
566
+ "n_origins": 10
567
+ },
568
+ "sn89": {
569
+ "ratio": 0.9069558150718225,
570
+ "mase": 9.213556276743283,
571
+ "n_origins": 10
572
+ },
573
+ "sn9": {
574
+ "ratio": 0.8620188004024174,
575
+ "mase": 5.207492186614988,
576
+ "n_origins": 10
577
+ },
578
+ "sn91": {
579
+ "ratio": 0.8051287676971559,
580
+ "mase": 3.2986597502715647,
581
+ "n_origins": 10
582
+ },
583
+ "sn92": {
584
+ "ratio": 0.6729157356119645,
585
+ "mase": 3.7648276218513406,
586
+ "n_origins": 10
587
+ },
588
+ "sn93": {
589
+ "ratio": 0.841951876030432,
590
+ "mase": 4.967110234092439,
591
+ "n_origins": 10
592
+ },
593
+ "sn94": {
594
+ "ratio": 0.9365188511934545,
595
+ "mase": 14.746501970243584,
596
+ "n_origins": 10
597
+ },
598
+ "sn95": {
599
+ "ratio": 0.9197255239679806,
600
+ "mase": 7.533171857949272,
601
+ "n_origins": 10
602
+ },
603
+ "sn96": {
604
+ "ratio": 0.4379800075965892,
605
+ "mase": 0.3468525434566399,
606
+ "n_origins": 10
607
+ },
608
+ "sn97": {
609
+ "ratio": 0.49321998151859137,
610
+ "mase": 1.257271756258718,
611
+ "n_origins": 10
612
+ },
613
+ "sn98": {
614
+ "ratio": 0.8059665117017629,
615
+ "mase": 3.746914285174997,
616
+ "n_origins": 10
617
+ }
618
+ }
619
+ },
620
+ "180": {
621
+ "n_assets": 119,
622
+ "geomean_ratio": 0.6648861794694962,
623
+ "median_ratio": 0.7801427739329858,
624
+ "beat_naive_frac": 0.773109243697479,
625
+ "per_asset": {
626
+ "TAOUSD": {
627
+ "ratio": 0.4940239746610212,
628
+ "mase": 2.757963453991154,
629
+ "n_origins": 10
630
+ },
631
+ "sn1": {
632
+ "ratio": 0.5626370924422698,
633
+ "mase": 6.333518026598001,
634
+ "n_origins": 10
635
+ },
636
+ "sn10": {
637
+ "ratio": 1.059826943946805,
638
+ "mase": 7.7261818785654315,
639
+ "n_origins": 10
640
+ },
641
+ "sn100": {
642
+ "ratio": 0.779913099481865,
643
+ "mase": 3.123361111099452,
644
+ "n_origins": 10
645
+ },
646
+ "sn101": {
647
+ "ratio": 0.6445989445566135,
648
+ "mase": 8.268098202144657,
649
+ "n_origins": 10
650
+ },
651
+ "sn102": {
652
+ "ratio": 0.9974791817447289,
653
+ "mase": 5.882968938210494,
654
+ "n_origins": 10
655
+ },
656
+ "sn104": {
657
+ "ratio": 0.7975023671915658,
658
+ "mase": 27.345707618950858,
659
+ "n_origins": 10
660
+ },
661
+ "sn105": {
662
+ "ratio": 0.4954448326367603,
663
+ "mase": 4.710097865119769,
664
+ "n_origins": 10
665
+ },
666
+ "sn106": {
667
+ "ratio": 1.1747150236518622,
668
+ "mase": 15.749453698649674,
669
+ "n_origins": 10
670
+ },
671
+ "sn107": {
672
+ "ratio": 1.2977087516148293,
673
+ "mase": 13.162793167806308,
674
+ "n_origins": 10
675
+ },
676
+ "sn108": {
677
+ "ratio": 0.8533895970582301,
678
+ "mase": 7.115462254695481,
679
+ "n_origins": 10
680
+ },
681
+ "sn109": {
682
+ "ratio": 0.6344506755704805,
683
+ "mase": 3.717775811439555,
684
+ "n_origins": 10
685
+ },
686
+ "sn11": {
687
+ "ratio": 0.8240956010011685,
688
+ "mase": 8.601585800728943,
689
+ "n_origins": 10
690
+ },
691
+ "sn110": {
692
+ "ratio": 0.8331984641894167,
693
+ "mase": 12.427990743151717,
694
+ "n_origins": 10
695
+ },
696
+ "sn111": {
697
+ "ratio": 0.6794769233913877,
698
+ "mase": 12.96306393786161,
699
+ "n_origins": 10
700
+ },
701
+ "sn112": {
702
+ "ratio": 1.1578686843505792,
703
+ "mase": 28.833970655004734,
704
+ "n_origins": 10
705
+ },
706
+ "sn113": {
707
+ "ratio": 1.1359927887902432,
708
+ "mase": 10.203521100401874,
709
+ "n_origins": 10
710
+ },
711
+ "sn114": {
712
+ "ratio": 0.6993419427297124,
713
+ "mase": 5.5493976076977045,
714
+ "n_origins": 10
715
+ },
716
+ "sn115": {
717
+ "ratio": 0.682202966322553,
718
+ "mase": 1.9126082016868478,
719
+ "n_origins": 10
720
+ },
721
+ "sn116": {
722
+ "ratio": 0.4011167089003711,
723
+ "mase": 17.766273979706686,
724
+ "n_origins": 10
725
+ },
726
+ "sn117": {
727
+ "ratio": 0.9402373459907077,
728
+ "mase": 20.43510056862763,
729
+ "n_origins": 10
730
+ },
731
+ "sn118": {
732
+ "ratio": 0.6061731191080284,
733
+ "mase": 14.45748057349033,
734
+ "n_origins": 10
735
+ },
736
+ "sn119": {
737
+ "ratio": 0.6976552034810688,
738
+ "mase": 9.843045566901152,
739
+ "n_origins": 10
740
+ },
741
+ "sn12": {
742
+ "ratio": 1.3928842905085668,
743
+ "mase": 18.30555147492309,
744
+ "n_origins": 10
745
+ },
746
+ "sn120": {
747
+ "ratio": 0.39109041935608696,
748
+ "mase": 5.739340345585171,
749
+ "n_origins": 10
750
+ },
751
+ "sn121": {
752
+ "ratio": 0.9708904832750709,
753
+ "mase": 10.900261036941103,
754
+ "n_origins": 10
755
+ },
756
+ "sn122": {
757
+ "ratio": 1.3277198304547064,
758
+ "mase": 14.736915124306096,
759
+ "n_origins": 10
760
+ },
761
+ "sn123": {
762
+ "ratio": 1.2826684520898104,
763
+ "mase": 7.147385504555592,
764
+ "n_origins": 10
765
+ },
766
+ "sn124": {
767
+ "ratio": 1.2814980574612442,
768
+ "mase": 20.536464187066372,
769
+ "n_origins": 10
770
+ },
771
+ "sn125": {
772
+ "ratio": 0.6929286464807345,
773
+ "mase": 6.657787425096045,
774
+ "n_origins": 10
775
+ },
776
+ "sn126": {
777
+ "ratio": 0.794069983088623,
778
+ "mase": 10.985105602421864,
779
+ "n_origins": 10
780
+ },
781
+ "sn127": {
782
+ "ratio": 0.9772330161936184,
783
+ "mase": 6.870091578391461,
784
+ "n_origins": 10
785
+ },
786
+ "sn128": {
787
+ "ratio": 1.018853747199785,
788
+ "mase": 23.2991240112348,
789
+ "n_origins": 10
790
+ },
791
+ "sn13": {
792
+ "ratio": 1.014572947047947,
793
+ "mase": 9.47586504483213,
794
+ "n_origins": 10
795
+ },
796
+ "sn14": {
797
+ "ratio": 0.5484527753997128,
798
+ "mase": 4.751896494651266,
799
+ "n_origins": 10
800
+ },
801
+ "sn15": {
802
+ "ratio": 0.7099787092112302,
803
+ "mase": 8.331732732721344,
804
+ "n_origins": 10
805
+ },
806
+ "sn17": {
807
+ "ratio": 0.67260044051494,
808
+ "mase": 13.934115118769993,
809
+ "n_origins": 10
810
+ },
811
+ "sn18": {
812
+ "ratio": 1.0320689924061683,
813
+ "mase": 18.40304973107085,
814
+ "n_origins": 10
815
+ },
816
+ "sn19": {
817
+ "ratio": 0.42222167181009856,
818
+ "mase": 6.2489473510370805,
819
+ "n_origins": 10
820
+ },
821
+ "sn2": {
822
+ "ratio": 0.9064053520639183,
823
+ "mase": 5.9992787252734265,
824
+ "n_origins": 10
825
+ },
826
+ "sn20": {
827
+ "ratio": 1.2494633882050359,
828
+ "mase": 9.154070164696938,
829
+ "n_origins": 10
830
+ },
831
+ "sn21": {
832
+ "ratio": 0.8725547436181732,
833
+ "mase": 9.249746858101348,
834
+ "n_origins": 10
835
+ },
836
+ "sn22": {
837
+ "ratio": 1.0135700418306552,
838
+ "mase": 4.785346597154318,
839
+ "n_origins": 10
840
+ },
841
+ "sn23": {
842
+ "ratio": 0.79281227744171,
843
+ "mase": 15.267309002769553,
844
+ "n_origins": 10
845
+ },
846
+ "sn24": {
847
+ "ratio": 0.9719870133734286,
848
+ "mase": 13.800441647596537,
849
+ "n_origins": 10
850
+ },
851
+ "sn25": {
852
+ "ratio": 0.8995368023756446,
853
+ "mase": 113.95814327633609,
854
+ "n_origins": 10
855
+ },
856
+ "sn26": {
857
+ "ratio": 1.362610857686514,
858
+ "mase": 18.760540569355012,
859
+ "n_origins": 10
860
+ },
861
+ "sn27": {
862
+ "ratio": 0.9991306578042368,
863
+ "mase": 18.672180552729323,
864
+ "n_origins": 10
865
+ },
866
+ "sn28": {
867
+ "ratio": 1.186217457922142,
868
+ "mase": 11.757642157782598,
869
+ "n_origins": 10
870
+ },
871
+ "sn29": {
872
+ "ratio": 0.15281727266611728,
873
+ "mase": 7.590069064856231,
874
+ "n_origins": 10
875
+ },
876
+ "sn3": {
877
+ "ratio": 0.4256936491784678,
878
+ "mase": 6.194665315043804,
879
+ "n_origins": 10
880
+ },
881
+ "sn30": {
882
+ "ratio": 0.6044700341082879,
883
+ "mase": 6.374110727580789,
884
+ "n_origins": 10
885
+ },
886
+ "sn31": {
887
+ "ratio": 0.9922691841224541,
888
+ "mase": 9.454196998894421,
889
+ "n_origins": 10
890
+ },
891
+ "sn32": {
892
+ "ratio": 0.7304252548438163,
893
+ "mase": 4.13745632892132,
894
+ "n_origins": 10
895
+ },
896
+ "sn33": {
897
+ "ratio": 0.34773607192611355,
898
+ "mase": 3.3663470208939628,
899
+ "n_origins": 10
900
+ },
901
+ "sn34": {
902
+ "ratio": 0.4614726661046808,
903
+ "mase": 9.89684708945384,
904
+ "n_origins": 10
905
+ },
906
+ "sn35": {
907
+ "ratio": 0.4972319795424258,
908
+ "mase": 5.244491768969606,
909
+ "n_origins": 10
910
+ },
911
+ "sn37": {
912
+ "ratio": 0.8020423731286973,
913
+ "mase": 9.545543151527779,
914
+ "n_origins": 10
915
+ },
916
+ "sn38": {
917
+ "ratio": 0.45712713634835234,
918
+ "mase": 7.141657311551365,
919
+ "n_origins": 10
920
+ },
921
+ "sn39": {
922
+ "ratio": 0.20963304954074696,
923
+ "mase": 2.794827694721739,
924
+ "n_origins": 10
925
+ },
926
+ "sn4": {
927
+ "ratio": 0.8005307005510586,
928
+ "mase": 10.436226550519534,
929
+ "n_origins": 10
930
+ },
931
+ "sn41": {
932
+ "ratio": 0.8605010231982768,
933
+ "mase": 11.971605346587666,
934
+ "n_origins": 10
935
+ },
936
+ "sn42": {
937
+ "ratio": 1.3689479978359351,
938
+ "mase": 14.655799331144213,
939
+ "n_origins": 10
940
+ },
941
+ "sn43": {
942
+ "ratio": 0.4901882593502441,
943
+ "mase": 7.341072069913391,
944
+ "n_origins": 10
945
+ },
946
+ "sn44": {
947
+ "ratio": 0.9329982649527557,
948
+ "mase": 12.301802811814117,
949
+ "n_origins": 10
950
+ },
951
+ "sn45": {
952
+ "ratio": 1.3037136376380494,
953
+ "mase": 17.931659373259237,
954
+ "n_origins": 10
955
+ },
956
+ "sn46": {
957
+ "ratio": 0.5755304672927835,
958
+ "mase": 9.39125689246538,
959
+ "n_origins": 10
960
+ },
961
+ "sn47": {
962
+ "ratio": 0.6748065609305832,
963
+ "mase": 3.586670631812459,
964
+ "n_origins": 10
965
+ },
966
+ "sn48": {
967
+ "ratio": 1.085874270820543,
968
+ "mase": 13.993366676068938,
969
+ "n_origins": 10
970
+ },
971
+ "sn49": {
972
+ "ratio": 0.9245479276458992,
973
+ "mase": 6.461255383271468,
974
+ "n_origins": 10
975
+ },
976
+ "sn5": {
977
+ "ratio": 0.5012696691755827,
978
+ "mase": 7.517873526492543,
979
+ "n_origins": 10
980
+ },
981
+ "sn50": {
982
+ "ratio": 0.8089920051539174,
983
+ "mase": 5.828199166452922,
984
+ "n_origins": 10
985
+ },
986
+ "sn51": {
987
+ "ratio": 1.2032016198402007,
988
+ "mase": 60.399877383132164,
989
+ "n_origins": 10
990
+ },
991
+ "sn52": {
992
+ "ratio": 0.6702815389326855,
993
+ "mase": 11.652785024735037,
994
+ "n_origins": 10
995
+ },
996
+ "sn53": {
997
+ "ratio": 0.8980190019845828,
998
+ "mase": 199.62117545231155,
999
+ "n_origins": 10
1000
+ },
1001
+ "sn54": {
1002
+ "ratio": 0.8274822789424391,
1003
+ "mase": 6.2583123637510605,
1004
+ "n_origins": 10
1005
+ },
1006
+ "sn55": {
1007
+ "ratio": 0.838619986576889,
1008
+ "mase": 8.374655606764568,
1009
+ "n_origins": 10
1010
+ },
1011
+ "sn56": {
1012
+ "ratio": 0.24861908200731844,
1013
+ "mase": 3.7824237772884732,
1014
+ "n_origins": 10
1015
+ },
1016
+ "sn57": {
1017
+ "ratio": 0.448543359633677,
1018
+ "mase": 6.319049308611438,
1019
+ "n_origins": 10
1020
+ },
1021
+ "sn6": {
1022
+ "ratio": 0.33655575426304624,
1023
+ "mase": 3.0958884094307635,
1024
+ "n_origins": 10
1025
+ },
1026
+ "sn60": {
1027
+ "ratio": 1.2180570023514212,
1028
+ "mase": 9.800856274456445,
1029
+ "n_origins": 10
1030
+ },
1031
+ "sn61": {
1032
+ "ratio": 0.9988664648188126,
1033
+ "mase": 17.869850222928335,
1034
+ "n_origins": 10
1035
+ },
1036
+ "sn62": {
1037
+ "ratio": 0.16577541087061615,
1038
+ "mase": 2.6793971814244095,
1039
+ "n_origins": 10
1040
+ },
1041
+ "sn63": {
1042
+ "ratio": 0.7300361458865862,
1043
+ "mase": 4.217420172672373,
1044
+ "n_origins": 10
1045
+ },
1046
+ "sn64": {
1047
+ "ratio": 0.6825232194169509,
1048
+ "mase": 21.28024424980693,
1049
+ "n_origins": 10
1050
+ },
1051
+ "sn65": {
1052
+ "ratio": 1.151180396966063,
1053
+ "mase": 12.163495734685819,
1054
+ "n_origins": 10
1055
+ },
1056
+ "sn66": {
1057
+ "ratio": 0.7783528528872017,
1058
+ "mase": 10.9150226360862,
1059
+ "n_origins": 10
1060
+ },
1061
+ "sn67": {
1062
+ "ratio": 0.021643253480577843,
1063
+ "mase": 1.1038662750341937,
1064
+ "n_origins": 10
1065
+ },
1066
+ "sn68": {
1067
+ "ratio": 0.7801427739329858,
1068
+ "mase": 11.661689453322904,
1069
+ "n_origins": 10
1070
+ },
1071
+ "sn69": {
1072
+ "ratio": 0.3094505391541589,
1073
+ "mase": 17.69735516381146,
1074
+ "n_origins": 10
1075
+ },
1076
+ "sn7": {
1077
+ "ratio": 1.0949988706079605,
1078
+ "mase": 11.334592686164179,
1079
+ "n_origins": 10
1080
+ },
1081
+ "sn71": {
1082
+ "ratio": 0.988583311352759,
1083
+ "mase": 7.712346762720289,
1084
+ "n_origins": 10
1085
+ },
1086
+ "sn72": {
1087
+ "ratio": 1.210450673843138,
1088
+ "mase": 15.782227948007668,
1089
+ "n_origins": 10
1090
+ },
1091
+ "sn73": {
1092
+ "ratio": 0.6517406927077237,
1093
+ "mase": 6.387853328523764,
1094
+ "n_origins": 10
1095
+ },
1096
+ "sn74": {
1097
+ "ratio": 1.109294993042469,
1098
+ "mase": 10.867231416664707,
1099
+ "n_origins": 10
1100
+ },
1101
+ "sn75": {
1102
+ "ratio": 0.562977548088772,
1103
+ "mase": 9.698752212178052,
1104
+ "n_origins": 10
1105
+ },
1106
+ "sn76": {
1107
+ "ratio": 0.4348554918888121,
1108
+ "mase": 3.2640487014868294,
1109
+ "n_origins": 10
1110
+ },
1111
+ "sn77": {
1112
+ "ratio": 0.3928741425611278,
1113
+ "mase": 7.661367057764007,
1114
+ "n_origins": 10
1115
+ },
1116
+ "sn78": {
1117
+ "ratio": 0.8094432115039205,
1118
+ "mase": 11.365159118113743,
1119
+ "n_origins": 10
1120
+ },
1121
+ "sn79": {
1122
+ "ratio": 0.4954359184768149,
1123
+ "mase": 5.6078331594394895,
1124
+ "n_origins": 10
1125
+ },
1126
+ "sn8": {
1127
+ "ratio": 0.5144765263113888,
1128
+ "mase": 14.169757959249385,
1129
+ "n_origins": 10
1130
+ },
1131
+ "sn80": {
1132
+ "ratio": 1.0120408933607823,
1133
+ "mase": 63.428446149284845,
1134
+ "n_origins": 10
1135
+ },
1136
+ "sn81": {
1137
+ "ratio": 0.2584921763222318,
1138
+ "mase": 4.310925931300132,
1139
+ "n_origins": 10
1140
+ },
1141
+ "sn82": {
1142
+ "ratio": 0.6792726230012001,
1143
+ "mase": 6.619027201872795,
1144
+ "n_origins": 10
1145
+ },
1146
+ "sn83": {
1147
+ "ratio": 0.2898022890549245,
1148
+ "mase": 8.691071077896622,
1149
+ "n_origins": 10
1150
+ },
1151
+ "sn84": {
1152
+ "ratio": 0.02697289241775519,
1153
+ "mase": 1.3869202342260354,
1154
+ "n_origins": 10
1155
+ },
1156
+ "sn85": {
1157
+ "ratio": 0.6573533745132937,
1158
+ "mase": 4.300989338131328,
1159
+ "n_origins": 10
1160
+ },
1161
+ "sn87": {
1162
+ "ratio": 0.7401321415520679,
1163
+ "mase": 8.416043840483315,
1164
+ "n_origins": 10
1165
+ },
1166
+ "sn88": {
1167
+ "ratio": 0.9163211488127513,
1168
+ "mase": 9.253032065706524,
1169
+ "n_origins": 10
1170
+ },
1171
+ "sn89": {
1172
+ "ratio": 0.9948598847326969,
1173
+ "mase": 21.574941998652214,
1174
+ "n_origins": 10
1175
+ },
1176
+ "sn9": {
1177
+ "ratio": 0.6062103899744757,
1178
+ "mase": 7.48151962790908,
1179
+ "n_origins": 10
1180
+ },
1181
+ "sn91": {
1182
+ "ratio": 0.7312495640395211,
1183
+ "mase": 10.239937176504382,
1184
+ "n_origins": 10
1185
+ },
1186
+ "sn92": {
1187
+ "ratio": 0.6343095750571582,
1188
+ "mase": 6.887866024551988,
1189
+ "n_origins": 10
1190
+ },
1191
+ "sn93": {
1192
+ "ratio": 0.5783305482356069,
1193
+ "mase": 6.391467248850258,
1194
+ "n_origins": 10
1195
+ },
1196
+ "sn94": {
1197
+ "ratio": 0.9737908750562859,
1198
+ "mase": 37.868891280123776,
1199
+ "n_origins": 10
1200
+ },
1201
+ "sn95": {
1202
+ "ratio": 0.9454692800280923,
1203
+ "mase": 12.516253950961142,
1204
+ "n_origins": 10
1205
+ },
1206
+ "sn96": {
1207
+ "ratio": 0.022548944095851682,
1208
+ "mase": 1.2326726504857173,
1209
+ "n_origins": 10
1210
+ },
1211
+ "sn97": {
1212
+ "ratio": 0.5985718350968059,
1213
+ "mase": 2.8984334283863493,
1214
+ "n_origins": 10
1215
+ },
1216
+ "sn98": {
1217
+ "ratio": 1.3539909051878454,
1218
+ "mase": 9.588963373369188,
1219
+ "n_origins": 10
1220
+ }
1221
+ }
1222
+ }
1223
+ }
1224
+ }
evals/eval-5m.json ADDED
@@ -0,0 +1,1259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundle": "results/fitproc2/wsoup85-fgl0-hurdle",
3
+ "data": "data/subnet_ft2/holdout_5m.npz",
4
+ "mode": "ohlc",
5
+ "levels": [
6
+ 0.1,
7
+ 0.2,
8
+ 0.3,
9
+ 0.4,
10
+ 0.5,
11
+ 0.6,
12
+ 0.7,
13
+ 0.8,
14
+ 0.9
15
+ ],
16
+ "horizons": {
17
+ "12": {
18
+ "n_assets": 120,
19
+ "geomean_ratio": 0.8569025696603942,
20
+ "median_ratio": 0.9375360865477722,
21
+ "beat_naive_frac": 0.8166666666666667,
22
+ "per_asset": {
23
+ "TAOUSD": {
24
+ "ratio": 0.9243151437245186,
25
+ "mase": 2.914639503690425,
26
+ "n_origins": 10
27
+ },
28
+ "sn1": {
29
+ "ratio": 0.931779403705062,
30
+ "mase": 1.4153528160830429,
31
+ "n_origins": 10
32
+ },
33
+ "sn10": {
34
+ "ratio": 0.9468710821894832,
35
+ "mase": 4.109818445320265,
36
+ "n_origins": 10
37
+ },
38
+ "sn100": {
39
+ "ratio": 0.9146538409277817,
40
+ "mase": 3.7878699856138844,
41
+ "n_origins": 10
42
+ },
43
+ "sn101": {
44
+ "ratio": 0.9988302219974093,
45
+ "mase": 3.516210449625286,
46
+ "n_origins": 10
47
+ },
48
+ "sn102": {
49
+ "ratio": 0.6213847116186267,
50
+ "mase": 1.294283407211906,
51
+ "n_origins": 10
52
+ },
53
+ "sn103": {
54
+ "ratio": 0.9923547457350458,
55
+ "mase": 10.90087217399522,
56
+ "n_origins": 10
57
+ },
58
+ "sn104": {
59
+ "ratio": 0.996742996979195,
60
+ "mase": 6.1283081285447105,
61
+ "n_origins": 10
62
+ },
63
+ "sn105": {
64
+ "ratio": 0.9083982180468424,
65
+ "mase": 3.2600153200811817,
66
+ "n_origins": 10
67
+ },
68
+ "sn106": {
69
+ "ratio": 0.9333487535060949,
70
+ "mase": 8.489513835278924,
71
+ "n_origins": 10
72
+ },
73
+ "sn107": {
74
+ "ratio": 0.8904939597368255,
75
+ "mase": 4.459383505968991,
76
+ "n_origins": 10
77
+ },
78
+ "sn108": {
79
+ "ratio": 0.9797276043302334,
80
+ "mase": 4.103612693079853,
81
+ "n_origins": 10
82
+ },
83
+ "sn109": {
84
+ "ratio": 0.9804100317466065,
85
+ "mase": 8.774243764282925,
86
+ "n_origins": 10
87
+ },
88
+ "sn11": {
89
+ "ratio": 0.9818399250517127,
90
+ "mase": 11.65714471698871,
91
+ "n_origins": 10
92
+ },
93
+ "sn110": {
94
+ "ratio": 0.9693443524070015,
95
+ "mase": 5.126508499642743,
96
+ "n_origins": 10
97
+ },
98
+ "sn111": {
99
+ "ratio": 0.9306584514477618,
100
+ "mase": 4.80211656032144,
101
+ "n_origins": 10
102
+ },
103
+ "sn112": {
104
+ "ratio": 0.9615492547580763,
105
+ "mase": 14.717329765585303,
106
+ "n_origins": 10
107
+ },
108
+ "sn113": {
109
+ "ratio": 0.9877165474853576,
110
+ "mase": 3.1474583698509506,
111
+ "n_origins": 10
112
+ },
113
+ "sn114": {
114
+ "ratio": 1.0101968321757633,
115
+ "mase": 6.9388214464249796,
116
+ "n_origins": 10
117
+ },
118
+ "sn115": {
119
+ "ratio": 0.9595181577926852,
120
+ "mase": 0.503212555298056,
121
+ "n_origins": 10
122
+ },
123
+ "sn116": {
124
+ "ratio": 0.9266033996063751,
125
+ "mase": 1.9668599504507096,
126
+ "n_origins": 10
127
+ },
128
+ "sn117": {
129
+ "ratio": 0.9952434823335911,
130
+ "mase": 5.771795989537984,
131
+ "n_origins": 10
132
+ },
133
+ "sn118": {
134
+ "ratio": 0.9003159091701053,
135
+ "mase": 3.8691791560859894,
136
+ "n_origins": 10
137
+ },
138
+ "sn119": {
139
+ "ratio": 0.8571252683258519,
140
+ "mase": 0.5523469688050122,
141
+ "n_origins": 10
142
+ },
143
+ "sn12": {
144
+ "ratio": 0.9998283511803386,
145
+ "mase": 9.235773768216108,
146
+ "n_origins": 10
147
+ },
148
+ "sn120": {
149
+ "ratio": 0.5355582029922076,
150
+ "mase": 0.9183088370291184,
151
+ "n_origins": 10
152
+ },
153
+ "sn121": {
154
+ "ratio": 0.9196740025552045,
155
+ "mase": 1.313571678525647,
156
+ "n_origins": 10
157
+ },
158
+ "sn122": {
159
+ "ratio": 0.9901001165703628,
160
+ "mase": 17.607511937392545,
161
+ "n_origins": 10
162
+ },
163
+ "sn123": {
164
+ "ratio": 1.0037642329826062,
165
+ "mase": 4.530282962028994,
166
+ "n_origins": 10
167
+ },
168
+ "sn124": {
169
+ "ratio": 0.8282033320945345,
170
+ "mase": 1.8660509962107565,
171
+ "n_origins": 10
172
+ },
173
+ "sn125": {
174
+ "ratio": 0.11974216085802813,
175
+ "mase": 0.0,
176
+ "n_origins": 10
177
+ },
178
+ "sn126": {
179
+ "ratio": 0.9758178122600205,
180
+ "mase": 11.871527777777874,
181
+ "n_origins": 10
182
+ },
183
+ "sn127": {
184
+ "ratio": 0.6324258652028895,
185
+ "mase": 0.5454457092252504,
186
+ "n_origins": 10
187
+ },
188
+ "sn13": {
189
+ "ratio": 1.0111148933630894,
190
+ "mase": 3.750710631040385,
191
+ "n_origins": 10
192
+ },
193
+ "sn14": {
194
+ "ratio": 0.9569244573696121,
195
+ "mase": 0.5668604651163198,
196
+ "n_origins": 10
197
+ },
198
+ "sn15": {
199
+ "ratio": 0.9295777783028076,
200
+ "mase": 8.043681570348523,
201
+ "n_origins": 10
202
+ },
203
+ "sn16": {
204
+ "ratio": 0.8194376997488386,
205
+ "mase": 1.163228200142748,
206
+ "n_origins": 10
207
+ },
208
+ "sn17": {
209
+ "ratio": 1.003626471958072,
210
+ "mase": 8.318707254713011,
211
+ "n_origins": 10
212
+ },
213
+ "sn18": {
214
+ "ratio": 0.9711266213941432,
215
+ "mase": 5.874050550815076,
216
+ "n_origins": 10
217
+ },
218
+ "sn19": {
219
+ "ratio": 0.9602349299662697,
220
+ "mase": 5.348928827920653,
221
+ "n_origins": 10
222
+ },
223
+ "sn2": {
224
+ "ratio": 1.0224053534502389,
225
+ "mase": 5.552162276750288,
226
+ "n_origins": 10
227
+ },
228
+ "sn20": {
229
+ "ratio": 1.0003748376769723,
230
+ "mase": 4.8712719857250315,
231
+ "n_origins": 10
232
+ },
233
+ "sn21": {
234
+ "ratio": 1.0264223930839242,
235
+ "mase": 10.076039794421353,
236
+ "n_origins": 10
237
+ },
238
+ "sn22": {
239
+ "ratio": 0.9861059273193261,
240
+ "mase": 8.220784213224022,
241
+ "n_origins": 10
242
+ },
243
+ "sn23": {
244
+ "ratio": 0.749544176045925,
245
+ "mase": 1.7032175707719197,
246
+ "n_origins": 10
247
+ },
248
+ "sn24": {
249
+ "ratio": 0.8297186870374278,
250
+ "mase": 2.183642834096534,
251
+ "n_origins": 10
252
+ },
253
+ "sn25": {
254
+ "ratio": 0.7796052895533019,
255
+ "mase": 1.6078023657213842,
256
+ "n_origins": 10
257
+ },
258
+ "sn26": {
259
+ "ratio": 0.9782284295893836,
260
+ "mase": 33.041339446158354,
261
+ "n_origins": 10
262
+ },
263
+ "sn27": {
264
+ "ratio": 0.8387644653904359,
265
+ "mase": 1.9754600612095685,
266
+ "n_origins": 10
267
+ },
268
+ "sn28": {
269
+ "ratio": 0.8488682136930159,
270
+ "mase": 3.037465674610093,
271
+ "n_origins": 10
272
+ },
273
+ "sn3": {
274
+ "ratio": 0.6273534048391771,
275
+ "mase": 0.9193180760633812,
276
+ "n_origins": 10
277
+ },
278
+ "sn30": {
279
+ "ratio": 0.9616684339857207,
280
+ "mase": 3.0114672986157847,
281
+ "n_origins": 10
282
+ },
283
+ "sn31": {
284
+ "ratio": 0.8916146608949437,
285
+ "mase": 4.243635782890181,
286
+ "n_origins": 10
287
+ },
288
+ "sn32": {
289
+ "ratio": 0.4652220002769915,
290
+ "mase": 0.1685185185185418,
291
+ "n_origins": 10
292
+ },
293
+ "sn33": {
294
+ "ratio": 1.055714503307049,
295
+ "mase": 2.669033652361985,
296
+ "n_origins": 10
297
+ },
298
+ "sn34": {
299
+ "ratio": 0.9945208114761621,
300
+ "mase": 5.460852403399792,
301
+ "n_origins": 10
302
+ },
303
+ "sn35": {
304
+ "ratio": 0.9656173682620742,
305
+ "mase": 2.4187038569487367,
306
+ "n_origins": 10
307
+ },
308
+ "sn37": {
309
+ "ratio": 0.8112469017239939,
310
+ "mase": 1.5519012214363306,
311
+ "n_origins": 10
312
+ },
313
+ "sn38": {
314
+ "ratio": 0.8972600814916628,
315
+ "mase": 11.863538474200496,
316
+ "n_origins": 10
317
+ },
318
+ "sn39": {
319
+ "ratio": 0.7692544998403149,
320
+ "mase": 1.072743496044741,
321
+ "n_origins": 10
322
+ },
323
+ "sn4": {
324
+ "ratio": 0.9041237336922492,
325
+ "mase": 2.467607872883877,
326
+ "n_origins": 10
327
+ },
328
+ "sn40": {
329
+ "ratio": 0.8176366156776466,
330
+ "mase": 0.520056604800567,
331
+ "n_origins": 10
332
+ },
333
+ "sn41": {
334
+ "ratio": 0.9923102357634975,
335
+ "mase": 21.66068718090222,
336
+ "n_origins": 10
337
+ },
338
+ "sn42": {
339
+ "ratio": 0.9998078778381794,
340
+ "mase": 13.209677419355204,
341
+ "n_origins": 10
342
+ },
343
+ "sn44": {
344
+ "ratio": 0.9965985006077301,
345
+ "mase": 4.898667809204135,
346
+ "n_origins": 10
347
+ },
348
+ "sn45": {
349
+ "ratio": 1.0651677447175065,
350
+ "mase": 4.535150378001013,
351
+ "n_origins": 10
352
+ },
353
+ "sn46": {
354
+ "ratio": 0.9382279358328639,
355
+ "mase": 4.43650521696489,
356
+ "n_origins": 10
357
+ },
358
+ "sn47": {
359
+ "ratio": 0.9864301833258071,
360
+ "mase": 32.936785771768854,
361
+ "n_origins": 10
362
+ },
363
+ "sn48": {
364
+ "ratio": 0.8419377354347897,
365
+ "mase": 0.3681229773463299,
366
+ "n_origins": 10
367
+ },
368
+ "sn49": {
369
+ "ratio": 0.9431691627832307,
370
+ "mase": 2.7076818607279742,
371
+ "n_origins": 10
372
+ },
373
+ "sn5": {
374
+ "ratio": 1.1363068641925838,
375
+ "mase": 0.9506950908236231,
376
+ "n_origins": 10
377
+ },
378
+ "sn50": {
379
+ "ratio": 1.0019776697219986,
380
+ "mase": 4.657816030911135,
381
+ "n_origins": 10
382
+ },
383
+ "sn51": {
384
+ "ratio": 0.8725227003648021,
385
+ "mase": 1.9870726678038773,
386
+ "n_origins": 10
387
+ },
388
+ "sn53": {
389
+ "ratio": 0.6048652597981019,
390
+ "mase": 1.0842658255508462,
391
+ "n_origins": 10
392
+ },
393
+ "sn54": {
394
+ "ratio": 1.0157397089204176,
395
+ "mase": 7.944264939003498,
396
+ "n_origins": 10
397
+ },
398
+ "sn55": {
399
+ "ratio": 0.9262476990472354,
400
+ "mase": 2.931541105241035,
401
+ "n_origins": 10
402
+ },
403
+ "sn56": {
404
+ "ratio": 0.5713578240387188,
405
+ "mase": 0.8130470813696437,
406
+ "n_origins": 10
407
+ },
408
+ "sn57": {
409
+ "ratio": 1.0090423739659646,
410
+ "mase": 3.446564885496225,
411
+ "n_origins": 10
412
+ },
413
+ "sn58": {
414
+ "ratio": 0.9592543202504102,
415
+ "mase": 9.010612039078703,
416
+ "n_origins": 10
417
+ },
418
+ "sn6": {
419
+ "ratio": 0.7838774761919867,
420
+ "mase": 1.57049641739512,
421
+ "n_origins": 10
422
+ },
423
+ "sn60": {
424
+ "ratio": 0.8640033288014318,
425
+ "mase": 3.3796989255800827,
426
+ "n_origins": 10
427
+ },
428
+ "sn61": {
429
+ "ratio": 0.9729690863096107,
430
+ "mase": 5.291278122042142,
431
+ "n_origins": 10
432
+ },
433
+ "sn62": {
434
+ "ratio": 0.6626186521106131,
435
+ "mase": 1.0715122115604374,
436
+ "n_origins": 10
437
+ },
438
+ "sn63": {
439
+ "ratio": 0.7046349516336592,
440
+ "mase": 0.6277865754548951,
441
+ "n_origins": 10
442
+ },
443
+ "sn64": {
444
+ "ratio": 0.8269579816865127,
445
+ "mase": 3.263393710505745,
446
+ "n_origins": 10
447
+ },
448
+ "sn65": {
449
+ "ratio": 0.6280645672877764,
450
+ "mase": 1.3368168094253678,
451
+ "n_origins": 10
452
+ },
453
+ "sn66": {
454
+ "ratio": 0.5468044012738311,
455
+ "mase": 0.566131641159626,
456
+ "n_origins": 10
457
+ },
458
+ "sn67": {
459
+ "ratio": 1.0468180340765625,
460
+ "mase": 5.198736569568437,
461
+ "n_origins": 10
462
+ },
463
+ "sn68": {
464
+ "ratio": 0.7573154399304336,
465
+ "mase": 2.34083003832336,
466
+ "n_origins": 10
467
+ },
468
+ "sn69": {
469
+ "ratio": 1.1779525195037865,
470
+ "mase": 1.1727564518222513,
471
+ "n_origins": 10
472
+ },
473
+ "sn7": {
474
+ "ratio": 0.0683681242735113,
475
+ "mase": 0.0,
476
+ "n_origins": 10
477
+ },
478
+ "sn71": {
479
+ "ratio": 0.7547148966589621,
480
+ "mase": 1.7282789201518698,
481
+ "n_origins": 10
482
+ },
483
+ "sn72": {
484
+ "ratio": 1.0301005245237957,
485
+ "mase": 11.402147971360336,
486
+ "n_origins": 10
487
+ },
488
+ "sn73": {
489
+ "ratio": 1.0049698322288878,
490
+ "mase": 1.9304830287206727,
491
+ "n_origins": 10
492
+ },
493
+ "sn74": {
494
+ "ratio": 1.0271064013600886,
495
+ "mase": 5.507561992304493,
496
+ "n_origins": 10
497
+ },
498
+ "sn75": {
499
+ "ratio": 0.725046694689897,
500
+ "mase": 1.8303012825926912,
501
+ "n_origins": 10
502
+ },
503
+ "sn76": {
504
+ "ratio": 1.0094896120509966,
505
+ "mase": 6.466424829900495,
506
+ "n_origins": 10
507
+ },
508
+ "sn77": {
509
+ "ratio": 0.6048937104203308,
510
+ "mase": 0.513992649716849,
511
+ "n_origins": 10
512
+ },
513
+ "sn78": {
514
+ "ratio": 0.9806327547323608,
515
+ "mase": 4.688020097672489,
516
+ "n_origins": 10
517
+ },
518
+ "sn79": {
519
+ "ratio": 0.9503748989753938,
520
+ "mase": 2.861587036489522,
521
+ "n_origins": 10
522
+ },
523
+ "sn8": {
524
+ "ratio": 1.1491382906303964,
525
+ "mase": 3.1740037702774444,
526
+ "n_origins": 10
527
+ },
528
+ "sn80": {
529
+ "ratio": 0.9407022949227098,
530
+ "mase": 2.7390422697421593,
531
+ "n_origins": 10
532
+ },
533
+ "sn81": {
534
+ "ratio": 0.5401982808952285,
535
+ "mase": 0.6074723252330168,
536
+ "n_origins": 10
537
+ },
538
+ "sn82": {
539
+ "ratio": 0.8682214633231652,
540
+ "mase": 3.5516160277228765,
541
+ "n_origins": 10
542
+ },
543
+ "sn83": {
544
+ "ratio": 0.8197445419501499,
545
+ "mase": 9.214977935361555,
546
+ "n_origins": 10
547
+ },
548
+ "sn84": {
549
+ "ratio": 0.9769863595152528,
550
+ "mase": 7.290055248618788,
551
+ "n_origins": 10
552
+ },
553
+ "sn85": {
554
+ "ratio": 0.8589891470967628,
555
+ "mase": 2.118002503231339,
556
+ "n_origins": 10
557
+ },
558
+ "sn87": {
559
+ "ratio": 0.9014818927646848,
560
+ "mase": 4.871765109900731,
561
+ "n_origins": 10
562
+ },
563
+ "sn88": {
564
+ "ratio": 0.9281456004558014,
565
+ "mase": 4.108614203331204,
566
+ "n_origins": 10
567
+ },
568
+ "sn89": {
569
+ "ratio": 0.8897470485072828,
570
+ "mase": 1.933166981386301,
571
+ "n_origins": 10
572
+ },
573
+ "sn9": {
574
+ "ratio": 1.1438584835701424,
575
+ "mase": 2.550676265611177,
576
+ "n_origins": 10
577
+ },
578
+ "sn90": {
579
+ "ratio": 0.9219668708619657,
580
+ "mase": 6.157078347920467,
581
+ "n_origins": 10
582
+ },
583
+ "sn91": {
584
+ "ratio": 0.9368442372626804,
585
+ "mase": 3.722305487747481,
586
+ "n_origins": 10
587
+ },
588
+ "sn92": {
589
+ "ratio": 1.0017233933744167,
590
+ "mase": 6.8568703380381315,
591
+ "n_origins": 10
592
+ },
593
+ "sn93": {
594
+ "ratio": 0.8916400233595648,
595
+ "mase": 3.9013617575868937,
596
+ "n_origins": 10
597
+ },
598
+ "sn94": {
599
+ "ratio": 0.9944019842475262,
600
+ "mase": 16.13451144778279,
601
+ "n_origins": 10
602
+ },
603
+ "sn95": {
604
+ "ratio": 0.9749476335961622,
605
+ "mase": 3.4096881965438537,
606
+ "n_origins": 10
607
+ },
608
+ "sn96": {
609
+ "ratio": 0.6927191792441173,
610
+ "mase": 1.2146284590499228,
611
+ "n_origins": 10
612
+ },
613
+ "sn97": {
614
+ "ratio": 0.934084525214288,
615
+ "mase": 3.2536196785057045,
616
+ "n_origins": 10
617
+ },
618
+ "sn99": {
619
+ "ratio": 0.95284116914995,
620
+ "mase": 4.723307629960292,
621
+ "n_origins": 10
622
+ }
623
+ }
624
+ },
625
+ "144": {
626
+ "n_assets": 125,
627
+ "geomean_ratio": 0.8695586567912015,
628
+ "median_ratio": 0.8967055730048042,
629
+ "beat_naive_frac": 0.912,
630
+ "per_asset": {
631
+ "TAOUSD": {
632
+ "ratio": 1.0217977684948898,
633
+ "mase": 8.710885235694734,
634
+ "n_origins": 10
635
+ },
636
+ "sn1": {
637
+ "ratio": 0.8859553105627054,
638
+ "mase": 17.181933029934555,
639
+ "n_origins": 10
640
+ },
641
+ "sn10": {
642
+ "ratio": 0.8503648590727556,
643
+ "mase": 14.116444790597395,
644
+ "n_origins": 10
645
+ },
646
+ "sn100": {
647
+ "ratio": 0.8920521820506798,
648
+ "mase": 14.699195042125769,
649
+ "n_origins": 10
650
+ },
651
+ "sn101": {
652
+ "ratio": 1.0101726313209942,
653
+ "mase": 43.6365948896486,
654
+ "n_origins": 10
655
+ },
656
+ "sn102": {
657
+ "ratio": 0.8345071211148652,
658
+ "mase": 9.848469783183507,
659
+ "n_origins": 10
660
+ },
661
+ "sn103": {
662
+ "ratio": 0.9778785693748754,
663
+ "mase": 47.865411684306615,
664
+ "n_origins": 10
665
+ },
666
+ "sn104": {
667
+ "ratio": 1.0010522274978708,
668
+ "mase": 67.22952270026953,
669
+ "n_origins": 10
670
+ },
671
+ "sn105": {
672
+ "ratio": 0.958468323429395,
673
+ "mase": 11.26242471682766,
674
+ "n_origins": 10
675
+ },
676
+ "sn106": {
677
+ "ratio": 0.9100146450884468,
678
+ "mase": 57.232065504891324,
679
+ "n_origins": 10
680
+ },
681
+ "sn107": {
682
+ "ratio": 0.7956096182878916,
683
+ "mase": 12.272666587809045,
684
+ "n_origins": 10
685
+ },
686
+ "sn108": {
687
+ "ratio": 0.8804324650703563,
688
+ "mase": 17.850640538525482,
689
+ "n_origins": 10
690
+ },
691
+ "sn109": {
692
+ "ratio": 0.9330424674117583,
693
+ "mase": 58.46413715646617,
694
+ "n_origins": 10
695
+ },
696
+ "sn11": {
697
+ "ratio": 0.9234546476928365,
698
+ "mase": 37.03378762863159,
699
+ "n_origins": 10
700
+ },
701
+ "sn110": {
702
+ "ratio": 0.9129786518097437,
703
+ "mase": 17.09583195120017,
704
+ "n_origins": 10
705
+ },
706
+ "sn111": {
707
+ "ratio": 0.9022227138784714,
708
+ "mase": 18.338403496478318,
709
+ "n_origins": 10
710
+ },
711
+ "sn112": {
712
+ "ratio": 0.9782250905353135,
713
+ "mase": 63.83773716990079,
714
+ "n_origins": 10
715
+ },
716
+ "sn113": {
717
+ "ratio": 0.9809006934530131,
718
+ "mase": 43.17235151588498,
719
+ "n_origins": 10
720
+ },
721
+ "sn114": {
722
+ "ratio": 0.9499575133681246,
723
+ "mase": 20.335883086169382,
724
+ "n_origins": 10
725
+ },
726
+ "sn115": {
727
+ "ratio": 0.8121994380128376,
728
+ "mase": 28.872994170076012,
729
+ "n_origins": 10
730
+ },
731
+ "sn116": {
732
+ "ratio": 0.8397013492806894,
733
+ "mase": 27.400753812263268,
734
+ "n_origins": 10
735
+ },
736
+ "sn117": {
737
+ "ratio": 0.991047740635639,
738
+ "mase": 144.29506615913388,
739
+ "n_origins": 10
740
+ },
741
+ "sn118": {
742
+ "ratio": 0.9617820066522527,
743
+ "mase": 20.321387381395418,
744
+ "n_origins": 10
745
+ },
746
+ "sn119": {
747
+ "ratio": 0.8747321872272174,
748
+ "mase": 27.75265296633018,
749
+ "n_origins": 10
750
+ },
751
+ "sn12": {
752
+ "ratio": 1.1539874469962834,
753
+ "mase": 34.567536190041864,
754
+ "n_origins": 10
755
+ },
756
+ "sn120": {
757
+ "ratio": 0.9278741576528905,
758
+ "mase": 24.136033016769687,
759
+ "n_origins": 10
760
+ },
761
+ "sn121": {
762
+ "ratio": 0.973782395309567,
763
+ "mase": 24.540108418042337,
764
+ "n_origins": 10
765
+ },
766
+ "sn122": {
767
+ "ratio": 0.9913317125895283,
768
+ "mase": 44.60645520927915,
769
+ "n_origins": 10
770
+ },
771
+ "sn123": {
772
+ "ratio": 0.8350749026531844,
773
+ "mase": 16.78469272658742,
774
+ "n_origins": 10
775
+ },
776
+ "sn124": {
777
+ "ratio": 0.91156559288487,
778
+ "mase": 22.884078681009928,
779
+ "n_origins": 10
780
+ },
781
+ "sn125": {
782
+ "ratio": 0.9953666531797456,
783
+ "mase": 21.453249930322112,
784
+ "n_origins": 10
785
+ },
786
+ "sn126": {
787
+ "ratio": 0.8208377039520478,
788
+ "mase": 47.218481681665686,
789
+ "n_origins": 10
790
+ },
791
+ "sn127": {
792
+ "ratio": 0.7507972687881863,
793
+ "mase": 13.9825930882627,
794
+ "n_origins": 10
795
+ },
796
+ "sn128": {
797
+ "ratio": 0.9362833462208643,
798
+ "mase": 15.803473735779663,
799
+ "n_origins": 10
800
+ },
801
+ "sn13": {
802
+ "ratio": 1.0369636312146493,
803
+ "mase": 44.28186452286375,
804
+ "n_origins": 10
805
+ },
806
+ "sn14": {
807
+ "ratio": 0.5804718455480326,
808
+ "mase": 18.73518813063186,
809
+ "n_origins": 10
810
+ },
811
+ "sn15": {
812
+ "ratio": 0.8858292049899102,
813
+ "mase": 20.832773913152046,
814
+ "n_origins": 10
815
+ },
816
+ "sn16": {
817
+ "ratio": 0.540469544557578,
818
+ "mase": 7.110025504054074,
819
+ "n_origins": 10
820
+ },
821
+ "sn17": {
822
+ "ratio": 0.961773040335513,
823
+ "mase": 36.215443998637966,
824
+ "n_origins": 10
825
+ },
826
+ "sn18": {
827
+ "ratio": 0.996849147979048,
828
+ "mase": 32.97249377544224,
829
+ "n_origins": 10
830
+ },
831
+ "sn19": {
832
+ "ratio": 0.7909827615623507,
833
+ "mase": 18.446126473573127,
834
+ "n_origins": 10
835
+ },
836
+ "sn2": {
837
+ "ratio": 0.8004252157092535,
838
+ "mase": 19.643773547920034,
839
+ "n_origins": 10
840
+ },
841
+ "sn20": {
842
+ "ratio": 0.7251870968300413,
843
+ "mase": 37.122265735355924,
844
+ "n_origins": 10
845
+ },
846
+ "sn21": {
847
+ "ratio": 0.8019775947842485,
848
+ "mase": 22.88621813367402,
849
+ "n_origins": 10
850
+ },
851
+ "sn22": {
852
+ "ratio": 1.0058814640021623,
853
+ "mase": 93.13110144790525,
854
+ "n_origins": 10
855
+ },
856
+ "sn23": {
857
+ "ratio": 0.9486986666859901,
858
+ "mase": 42.24119835498095,
859
+ "n_origins": 10
860
+ },
861
+ "sn24": {
862
+ "ratio": 0.8304553263038431,
863
+ "mase": 13.013395779603506,
864
+ "n_origins": 10
865
+ },
866
+ "sn25": {
867
+ "ratio": 0.860526092964779,
868
+ "mase": 10.370710600879464,
869
+ "n_origins": 10
870
+ },
871
+ "sn26": {
872
+ "ratio": 0.9499212518662344,
873
+ "mase": 58.388093552927366,
874
+ "n_origins": 10
875
+ },
876
+ "sn27": {
877
+ "ratio": 0.9469480575163061,
878
+ "mase": 35.0632637961872,
879
+ "n_origins": 10
880
+ },
881
+ "sn28": {
882
+ "ratio": 0.9588196677142842,
883
+ "mase": 27.141196967578914,
884
+ "n_origins": 10
885
+ },
886
+ "sn29": {
887
+ "ratio": 1.0242994058879413,
888
+ "mase": 231.31447186439993,
889
+ "n_origins": 10
890
+ },
891
+ "sn3": {
892
+ "ratio": 0.8898059309194231,
893
+ "mase": 20.221434257112556,
894
+ "n_origins": 10
895
+ },
896
+ "sn30": {
897
+ "ratio": 0.8651750017343384,
898
+ "mase": 18.544330649345515,
899
+ "n_origins": 10
900
+ },
901
+ "sn31": {
902
+ "ratio": 0.961082212765688,
903
+ "mase": 21.631373433995474,
904
+ "n_origins": 10
905
+ },
906
+ "sn32": {
907
+ "ratio": 0.7337069583412643,
908
+ "mase": 25.16088548637792,
909
+ "n_origins": 10
910
+ },
911
+ "sn33": {
912
+ "ratio": 0.8087812330412981,
913
+ "mase": 31.088868517634054,
914
+ "n_origins": 10
915
+ },
916
+ "sn34": {
917
+ "ratio": 0.8416880771387749,
918
+ "mase": 19.22490326597332,
919
+ "n_origins": 10
920
+ },
921
+ "sn35": {
922
+ "ratio": 0.9044489821420332,
923
+ "mase": 19.266258643973213,
924
+ "n_origins": 10
925
+ },
926
+ "sn37": {
927
+ "ratio": 0.834007614391259,
928
+ "mase": 21.935277405792174,
929
+ "n_origins": 10
930
+ },
931
+ "sn38": {
932
+ "ratio": 0.9962147140232119,
933
+ "mase": 52.880514114858634,
934
+ "n_origins": 10
935
+ },
936
+ "sn39": {
937
+ "ratio": 0.8428449042291665,
938
+ "mase": 10.783101328872716,
939
+ "n_origins": 10
940
+ },
941
+ "sn4": {
942
+ "ratio": 0.9508289491735119,
943
+ "mase": 37.70049056123005,
944
+ "n_origins": 10
945
+ },
946
+ "sn40": {
947
+ "ratio": 0.8387831425092696,
948
+ "mase": 28.57228755938949,
949
+ "n_origins": 10
950
+ },
951
+ "sn41": {
952
+ "ratio": 0.8967055730048042,
953
+ "mase": 82.3046919666805,
954
+ "n_origins": 10
955
+ },
956
+ "sn42": {
957
+ "ratio": 0.955513630446943,
958
+ "mase": 112.74228467430973,
959
+ "n_origins": 10
960
+ },
961
+ "sn43": {
962
+ "ratio": 0.38498312527771994,
963
+ "mase": 5.477698176403117,
964
+ "n_origins": 10
965
+ },
966
+ "sn44": {
967
+ "ratio": 0.8938567357700996,
968
+ "mase": 23.215719787484606,
969
+ "n_origins": 10
970
+ },
971
+ "sn45": {
972
+ "ratio": 0.8909079299447316,
973
+ "mase": 35.801651407499754,
974
+ "n_origins": 10
975
+ },
976
+ "sn46": {
977
+ "ratio": 0.8659715896191346,
978
+ "mase": 11.320417370190858,
979
+ "n_origins": 10
980
+ },
981
+ "sn47": {
982
+ "ratio": 0.9792587424402253,
983
+ "mase": 93.67984648270198,
984
+ "n_origins": 10
985
+ },
986
+ "sn48": {
987
+ "ratio": 0.6026160780899604,
988
+ "mase": 13.496524476901818,
989
+ "n_origins": 10
990
+ },
991
+ "sn49": {
992
+ "ratio": 0.9080837842516091,
993
+ "mase": 18.657574193183624,
994
+ "n_origins": 10
995
+ },
996
+ "sn5": {
997
+ "ratio": 0.4124215732056892,
998
+ "mase": 11.971399195782325,
999
+ "n_origins": 10
1000
+ },
1001
+ "sn50": {
1002
+ "ratio": 0.9629165378473064,
1003
+ "mase": 25.00070132419499,
1004
+ "n_origins": 10
1005
+ },
1006
+ "sn51": {
1007
+ "ratio": 0.8013146133681427,
1008
+ "mase": 17.95355481392795,
1009
+ "n_origins": 10
1010
+ },
1011
+ "sn52": {
1012
+ "ratio": 1.0770560160907712,
1013
+ "mase": 68.09023423650629,
1014
+ "n_origins": 10
1015
+ },
1016
+ "sn53": {
1017
+ "ratio": 0.8306812825196536,
1018
+ "mase": 8.23156410625504,
1019
+ "n_origins": 10
1020
+ },
1021
+ "sn54": {
1022
+ "ratio": 0.881941716661875,
1023
+ "mase": 17.366526465411145,
1024
+ "n_origins": 10
1025
+ },
1026
+ "sn55": {
1027
+ "ratio": 0.9537658771756208,
1028
+ "mase": 36.76119172014495,
1029
+ "n_origins": 10
1030
+ },
1031
+ "sn56": {
1032
+ "ratio": 0.9236857993139064,
1033
+ "mase": 73.77672474399132,
1034
+ "n_origins": 10
1035
+ },
1036
+ "sn57": {
1037
+ "ratio": 0.999387169907059,
1038
+ "mase": 111.52442591924616,
1039
+ "n_origins": 10
1040
+ },
1041
+ "sn58": {
1042
+ "ratio": 0.8059375441250611,
1043
+ "mase": 83.95159241141104,
1044
+ "n_origins": 10
1045
+ },
1046
+ "sn6": {
1047
+ "ratio": 0.8804944026116206,
1048
+ "mase": 24.570812202657038,
1049
+ "n_origins": 10
1050
+ },
1051
+ "sn60": {
1052
+ "ratio": 0.8525426821055875,
1053
+ "mase": 15.255730960500024,
1054
+ "n_origins": 10
1055
+ },
1056
+ "sn61": {
1057
+ "ratio": 0.9630263348281641,
1058
+ "mase": 17.987349455453316,
1059
+ "n_origins": 10
1060
+ },
1061
+ "sn62": {
1062
+ "ratio": 0.7264188339927717,
1063
+ "mase": 18.953797792951306,
1064
+ "n_origins": 10
1065
+ },
1066
+ "sn63": {
1067
+ "ratio": 0.9066686148279953,
1068
+ "mase": 27.18642475276923,
1069
+ "n_origins": 10
1070
+ },
1071
+ "sn64": {
1072
+ "ratio": 0.4452512185150887,
1073
+ "mase": 15.430802493487281,
1074
+ "n_origins": 10
1075
+ },
1076
+ "sn65": {
1077
+ "ratio": 0.8151551513110047,
1078
+ "mase": 12.663825559940076,
1079
+ "n_origins": 10
1080
+ },
1081
+ "sn66": {
1082
+ "ratio": 0.8291481641353483,
1083
+ "mase": 12.66435331822775,
1084
+ "n_origins": 10
1085
+ },
1086
+ "sn67": {
1087
+ "ratio": 1.0395831827356314,
1088
+ "mase": 44.692607061689536,
1089
+ "n_origins": 10
1090
+ },
1091
+ "sn68": {
1092
+ "ratio": 0.6951993400309205,
1093
+ "mase": 16.137106671351308,
1094
+ "n_origins": 10
1095
+ },
1096
+ "sn69": {
1097
+ "ratio": 0.9941975810362784,
1098
+ "mase": 210.3069153588661,
1099
+ "n_origins": 10
1100
+ },
1101
+ "sn7": {
1102
+ "ratio": 0.9031413356844574,
1103
+ "mase": 42.3713092254516,
1104
+ "n_origins": 10
1105
+ },
1106
+ "sn71": {
1107
+ "ratio": 0.8876409135934156,
1108
+ "mase": 10.437379266714423,
1109
+ "n_origins": 10
1110
+ },
1111
+ "sn72": {
1112
+ "ratio": 0.8915833823254472,
1113
+ "mase": 56.58546436953286,
1114
+ "n_origins": 10
1115
+ },
1116
+ "sn73": {
1117
+ "ratio": 0.9396649093512319,
1118
+ "mase": 60.5194991878116,
1119
+ "n_origins": 10
1120
+ },
1121
+ "sn74": {
1122
+ "ratio": 0.8961613882880278,
1123
+ "mase": 67.33062009168744,
1124
+ "n_origins": 10
1125
+ },
1126
+ "sn75": {
1127
+ "ratio": 0.8584708354509981,
1128
+ "mase": 15.752250008828417,
1129
+ "n_origins": 10
1130
+ },
1131
+ "sn76": {
1132
+ "ratio": 0.9594258891047532,
1133
+ "mase": 85.65089655754088,
1134
+ "n_origins": 10
1135
+ },
1136
+ "sn77": {
1137
+ "ratio": 0.7604282045451413,
1138
+ "mase": 15.783610421977826,
1139
+ "n_origins": 10
1140
+ },
1141
+ "sn78": {
1142
+ "ratio": 0.8905783900194192,
1143
+ "mase": 13.316300347569006,
1144
+ "n_origins": 10
1145
+ },
1146
+ "sn79": {
1147
+ "ratio": 0.6341128777833023,
1148
+ "mase": 14.019521241947322,
1149
+ "n_origins": 10
1150
+ },
1151
+ "sn8": {
1152
+ "ratio": 0.8700181668039847,
1153
+ "mase": 21.863211634847858,
1154
+ "n_origins": 10
1155
+ },
1156
+ "sn80": {
1157
+ "ratio": 0.9048746118990336,
1158
+ "mase": 7.47732482243397,
1159
+ "n_origins": 10
1160
+ },
1161
+ "sn81": {
1162
+ "ratio": 0.7422273816216619,
1163
+ "mase": 8.283866283605038,
1164
+ "n_origins": 10
1165
+ },
1166
+ "sn82": {
1167
+ "ratio": 0.956396836955509,
1168
+ "mase": 38.570950557314546,
1169
+ "n_origins": 10
1170
+ },
1171
+ "sn83": {
1172
+ "ratio": 0.7375291133901192,
1173
+ "mase": 51.734409756003416,
1174
+ "n_origins": 10
1175
+ },
1176
+ "sn84": {
1177
+ "ratio": 0.9311433512482037,
1178
+ "mase": 148.0320204268663,
1179
+ "n_origins": 10
1180
+ },
1181
+ "sn85": {
1182
+ "ratio": 0.828689772158864,
1183
+ "mase": 17.468229044361415,
1184
+ "n_origins": 10
1185
+ },
1186
+ "sn87": {
1187
+ "ratio": 0.9717483078464719,
1188
+ "mase": 19.32749432818073,
1189
+ "n_origins": 10
1190
+ },
1191
+ "sn88": {
1192
+ "ratio": 0.9013456839550715,
1193
+ "mase": 23.540028412065965,
1194
+ "n_origins": 10
1195
+ },
1196
+ "sn89": {
1197
+ "ratio": 0.9164944420017417,
1198
+ "mase": 42.55112779045927,
1199
+ "n_origins": 10
1200
+ },
1201
+ "sn9": {
1202
+ "ratio": 0.7691865336584661,
1203
+ "mase": 23.037199489517594,
1204
+ "n_origins": 10
1205
+ },
1206
+ "sn90": {
1207
+ "ratio": 0.9480288609891467,
1208
+ "mase": 24.02101553726804,
1209
+ "n_origins": 10
1210
+ },
1211
+ "sn91": {
1212
+ "ratio": 0.785169065969023,
1213
+ "mase": 11.471282085505289,
1214
+ "n_origins": 10
1215
+ },
1216
+ "sn92": {
1217
+ "ratio": 0.8701254363208387,
1218
+ "mase": 68.59709282879105,
1219
+ "n_origins": 10
1220
+ },
1221
+ "sn93": {
1222
+ "ratio": 0.959125691103473,
1223
+ "mase": 19.820239991137324,
1224
+ "n_origins": 10
1225
+ },
1226
+ "sn94": {
1227
+ "ratio": 1.041316090177819,
1228
+ "mase": 41.93283481289839,
1229
+ "n_origins": 10
1230
+ },
1231
+ "sn95": {
1232
+ "ratio": 0.8067421493270648,
1233
+ "mase": 19.504511719613863,
1234
+ "n_origins": 10
1235
+ },
1236
+ "sn96": {
1237
+ "ratio": 0.8172504350853603,
1238
+ "mase": 13.941767471818123,
1239
+ "n_origins": 10
1240
+ },
1241
+ "sn97": {
1242
+ "ratio": 0.9558483120869641,
1243
+ "mase": 27.029455098265615,
1244
+ "n_origins": 10
1245
+ },
1246
+ "sn98": {
1247
+ "ratio": 1.0471468484767448,
1248
+ "mase": 65.32840895022676,
1249
+ "n_origins": 10
1250
+ },
1251
+ "sn99": {
1252
+ "ratio": 0.9834519798647178,
1253
+ "mase": 44.08026045946475,
1254
+ "n_origins": 10
1255
+ }
1256
+ }
1257
+ }
1258
+ }
1259
+ }
forecast_wrapper.py ADDED
@@ -0,0 +1,358 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Auto-generated by cascade_model. Loads an arm checkpoint and decodes the
2
+ full horizon in one forward pass via contiguous patch masking.
3
+
4
+ forecast_quantiles_batch(histories, horizon) -> (B, horizon, num_q)
5
+ forecast_quantiles(history, horizon) -> (1, horizon, num_q)
6
+ forecast(history, horizon, num_samples) -> (1, num_samples, horizon)
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import hashlib
12
+ import importlib.util
13
+ import json
14
+ import sys
15
+ from pathlib import Path
16
+
17
+ import numpy as np
18
+ import torch
19
+
20
+ STABLE_DECODE_STEPS = 768
21
+
22
+
23
+
24
+ def _hurdle_mix(res_row, ctx_row, levels=None):
25
+ """Apply the zero-movement hurdle to one row's (..., H, Q) quantiles."""
26
+ lv = np.asarray(levels if levels is not None else
27
+ [.1, .2, .3, .4, .5, .6, .7, .8, .9], dtype=np.float64)
28
+ tail = ctx_row[-2016:]
29
+ if len(tail) < 128:
30
+ return res_row
31
+ d = np.abs(np.diff(tail))
32
+ p_move = float(np.mean(d > 1e-12))
33
+ if p_move > 0.60: # live asset: exact no-op
34
+ return res_row
35
+ p_move = max(p_move, 1e-4)
36
+ v = float(tail[-1])
37
+ Hn = res_row.shape[-2]
38
+ out = res_row.copy()
39
+ for t in range(Hn):
40
+ pi = (1.0 - p_move) ** (t + 1)
41
+ if pi < 1e-3:
42
+ break # later steps: even less mass
43
+ q = np.sort(res_row[..., t, :], axis=-1)
44
+ flat_q = q.reshape(-1, q.shape[-1])
45
+ flat_o = out[..., t, :].reshape(-1, q.shape[-1])
46
+ for r in range(flat_q.shape[0]):
47
+ qr = flat_q[r]
48
+ Fv = float(np.interp(v, qr, lv, left=0.0, right=1.0))
49
+ lo = (1.0 - pi) * Fv
50
+ hi = lo + pi
51
+ newq = np.empty_like(qr)
52
+ for j, l in enumerate(lv):
53
+ if l < lo:
54
+ newq[j] = float(np.interp(l / (1.0 - pi), lv, qr))
55
+ elif l <= hi:
56
+ newq[j] = v
57
+ else:
58
+ newq[j] = float(np.interp((l - pi) / (1.0 - pi), lv, qr))
59
+ flat_o[r] = newq
60
+ return out
61
+
62
+ def _load_model_module(d: Path):
63
+ spec = importlib.util.spec_from_file_location("cascade_model_ckpt", d / "model.py")
64
+ mod = importlib.util.module_from_spec(spec)
65
+ sys.modules[spec.name] = mod
66
+ spec.loader.exec_module(mod)
67
+ return mod
68
+
69
+
70
+ class Wrapper:
71
+ def __init__(self, checkpoint_dir, device: str = "cpu"):
72
+ d = Path(checkpoint_dir)
73
+ self.device = device
74
+ cfg_obj = json.loads((d / "config.json").read_text())
75
+ self.m = _load_model_module(d)
76
+ self.cfg = self.m.CascadeModelConfig(**cfg_obj["config"])
77
+ self.quantile_levels = [float(v) for v in cfg_obj["quantile_levels"]]
78
+ self.levels = torch.tensor(self.quantile_levels, dtype=torch.float32, device=device)
79
+ self.model = self.m.CascadeModel(self.cfg).to(device).eval()
80
+ from safetensors.torch import load_file
81
+ self.model.load_state_dict(load_file(str(d / "weights.safetensors")))
82
+
83
+ def _prep(self, histories):
84
+ """Return (context, missing_mask), both (B, window_len).
85
+
86
+ Real series have gaps. GIFT-Eval's electricity is 25% NaN, bitbrains
87
+ 14%, car_parts 12% β€” and an unhandled NaN propagates through the causal
88
+ scaler into every prediction, so the whole config fails with "Forecast
89
+ contains NaN values". That silently cost 23 of 97 configs, concentrated
90
+ on exactly the messy observability data this model is for.
91
+
92
+ The architecture already handles this: the model takes a binary mask
93
+ channel (1 = unobserved), and causal_standardize excludes masked entries
94
+ from its statistics so they carry the last observed stats forward. It is
95
+ the same mechanism training uses for CPM. Inference simply never
96
+ populated it from NaNs.
97
+
98
+ Masked positions are zero-filled in the value channel β€” the model sees
99
+ the mask bit, not the filler.
100
+ """
101
+ ps = self.cfg.patch_size
102
+ n_ctx = max(2, self.cfg.context_length // ps)
103
+ window = n_ctx * ps
104
+ rows, masks = [], []
105
+ for h in histories:
106
+ h = np.asarray(h, dtype=np.float64).reshape(-1)
107
+ miss = ~np.isfinite(h)
108
+ if h.shape[0] < window:
109
+ # Left-pad with the first OBSERVED value, and mark the pad
110
+ # unobserved so it cannot bias the causal statistics.
111
+ obs = h[~miss]
112
+ fill = obs[0] if obs.size else 0.0
113
+ pad_n = window - h.shape[0]
114
+ h = np.concatenate([np.full(pad_n, fill), h])
115
+ miss = np.concatenate([np.ones(pad_n, dtype=bool), miss])
116
+ else:
117
+ h, miss = h[-window:], miss[-window:]
118
+ if miss.all():
119
+ # Nothing observed at all: fall back to zeros, all-observed, so
120
+ # the scaler's eps floor keeps the forward pass finite.
121
+ h = np.zeros_like(h); miss = np.zeros_like(miss)
122
+ else:
123
+ h = np.where(miss, 0.0, h)
124
+ rows.append(h)
125
+ masks.append(miss.astype(np.float64))
126
+ x = torch.as_tensor(np.stack(rows), dtype=torch.float64, device=self.device)
127
+ m = torch.as_tensor(np.stack(masks), dtype=torch.float64, device=self.device)
128
+ return x, m
129
+
130
+ @torch.no_grad()
131
+ def _decode_block_z(self, z, block: int, miss=None):
132
+ ps = self.cfg.patch_size
133
+ ctx_p = min(z.shape[1] // ps, self.cfg.max_patches - block)
134
+ ctx = z[:, -ctx_p * ps:].view(z.shape[0], ctx_p, ps)
135
+ filler = torch.zeros(z.shape[0], block, ps, dtype=ctx.dtype, device=self.device)
136
+ # Per-ENTRY mask: horizon patches are fully unobserved, and context
137
+ # patches carry whichever entries were missing in the history. A
138
+ # patch-level mask would be too coarse β€” one missing step would blank
139
+ # the whole 32-step patch.
140
+ m_ctx = (torch.zeros(z.shape[0], ctx_p * ps, dtype=ctx.dtype, device=self.device)
141
+ if miss is None else miss[:, -ctx_p * ps:].to(ctx.dtype))
142
+ m_ctx = m_ctx.view(z.shape[0], ctx_p, ps)
143
+ m_hz = torch.ones(z.shape[0], block, ps, dtype=ctx.dtype, device=self.device)
144
+ mask = torch.cat([m_ctx, m_hz], dim=1)
145
+ pred = self.model(torch.cat([ctx, filler], dim=1), mask=mask)
146
+ q = pred[:, ctx_p - 1: ctx_p + block - 1]
147
+ q, _ = torch.sort(q, dim=-1)
148
+ return q.reshape(z.shape[0], block * ps, -1)
149
+
150
+ @torch.no_grad()
151
+ def _decode_quantiles(self, x, horizon: int, miss=None):
152
+ ps = self.cfg.patch_size
153
+ stable = max(1, min(STABLE_DECODE_STEPS // ps, self.cfg.max_patches - 2))
154
+ remaining = -(-int(horizon) // ps)
155
+ lo = hi = None
156
+ out = []
157
+ if miss is None:
158
+ miss = torch.zeros_like(x)
159
+ while remaining > 0:
160
+ block = min(remaining, stable)
161
+ # Mask-aware scaling: missing entries are excluded from the causal
162
+ # statistics, so they carry the last observed loc/scale forward
163
+ # instead of poisoning them with NaN.
164
+ z, loc_t, scale_t = self.m.causal_standardize(
165
+ x, mask=miss, binary_passthrough=self.cfg.binary_passthrough
166
+ )
167
+ loc = loc_t[:, -1:].double().unsqueeze(-1)
168
+ scale = scale_t[:, -1:].double().unsqueeze(-1)
169
+ if lo is None:
170
+ # Clamp bounds from the OBSERVED range only β€” a masked entry is
171
+ # zero-filled, and letting that zero set the bound would drag
172
+ # the clamp toward the origin on a series that never visits it.
173
+ obs = torch.where(miss > 0, torch.nan, x)
174
+ lo = obs.nan_to_num(nan=float("inf")).min(dim=-1, keepdim=True).values.unsqueeze(-1) - 1e4 * scale
175
+ hi = obs.nan_to_num(nan=float("-inf")).max(dim=-1, keepdim=True).values.unsqueeze(-1) + 1e4 * scale
176
+ qz = self._decode_block_z(z.to(torch.float32), block, miss=miss)
177
+ q = torch.sinh(qz.double()) * scale + loc
178
+ q = torch.clamp(q, min=lo, max=hi)
179
+ out.append(q)
180
+ remaining -= block
181
+ if remaining > 0:
182
+ committed = q[..., q.shape[-1] // 2]
183
+ x = torch.cat([x, committed], dim=1)
184
+ # Committed medians are OBSERVED context for later blocks.
185
+ miss = torch.cat([miss, torch.zeros_like(committed)], dim=1)
186
+ return torch.cat(out, dim=1)[:, : int(horizon)]
187
+
188
+ @torch.no_grad()
189
+ def forecast_quantiles_batch(self, histories, horizon: int) -> np.ndarray:
190
+ x, miss = self._prep(list(histories))
191
+ q = self._decode_quantiles(x, horizon, miss=miss)
192
+ qq = q.detach().cpu().numpy().astype(np.float64)
193
+
194
+ # HURDLE (2026-09-02): zero-movement mixture, horizon-aware.
195
+ try:
196
+ _H = [np.asarray(h, dtype=np.float64) for h in histories]
197
+ for _b, _h in enumerate(_H):
198
+ _row = _h[0] if _h.ndim == 2 else _h
199
+ qq[_b] = _hurdle_mix(qq[_b], _row)
200
+ except Exception:
201
+ pass
202
+ return qq
203
+
204
+ def forecast_quantiles(self, history, horizon: int) -> np.ndarray:
205
+ return self.forecast_quantiles_batch([history], horizon)
206
+
207
+ # ── Β§2: multivariate decode with future-known covariates ─────────────────
208
+ #
209
+ # The univariate path above cannot express this experiment at all: _prep
210
+ # flattens to 1-D and the model call passes no variate_types, so
211
+ # roles_on = cfg.use_variate_roles and variate_types is not None
212
+ # is False at EVERY inference, and a role-trained checkpoint decodes with
213
+ # its role embeddings inert. Everything below exists so a covariate can
214
+ # actually reach the model.
215
+
216
+ @torch.no_grad()
217
+ def forecast_quantiles_mv(self, histories, horizon: int, *, n_targets: int = 1,
218
+ n_future_cov: int = 0, future=None) -> np.ndarray:
219
+ """Decode targets given past history and KNOWN future covariates.
220
+
221
+ histories (B, C, L) channels 0..n_targets-1 are targets; the LAST
222
+ n_future_cov are future-known; the rest are
223
+ past covariates. Matches assign_roles(), which
224
+ is positional by channel index β€” so the caller
225
+ must not permute variates.
226
+ future (B, n_future_cov, horizon) the covariate values over the
227
+ forecast window. Required when n_future_cov>0:
228
+ that knowledge IS the feature being tested.
229
+ returns (B, n_targets, horizon, num_q)
230
+
231
+ Standardisation runs over context AND horizon in one causal pass. That
232
+ is deliberate and matches training: causal_standardize excludes masked
233
+ entries from its statistics, so the target rows' zero-filled horizon
234
+ cannot corrupt their own loc/scale, while the covariate rows β€” genuinely
235
+ observed across the horizon β€” keep updating exactly as they did during
236
+ training. Freezing the covariate scaler at the last context step instead
237
+ would introduce a train/inference mismatch that no error would surface.
238
+ """
239
+ ps = self.cfg.patch_size
240
+ H = int(horizon)
241
+ x = np.asarray(histories, dtype=np.float64)
242
+ if x.ndim != 3:
243
+ raise ValueError(f"histories must be (B, C, L); got {x.shape}")
244
+ B, C, L = x.shape
245
+ if not 1 <= n_targets <= C:
246
+ raise ValueError(f"n_targets={n_targets} outside 1..C={C}")
247
+ if n_future_cov < 0 or n_targets + n_future_cov > C:
248
+ raise ValueError(f"n_targets={n_targets} + n_future_cov={n_future_cov} > C={C}")
249
+ if n_future_cov and future is None:
250
+ raise ValueError("n_future_cov>0 requires `future` values")
251
+
252
+ # Positional roles, mirroring cascade_model.batching.assign_roles.
253
+ roles = np.full(C, 1, dtype=np.int64) # ROLE_PAST_COV
254
+ roles[:n_targets] = 0 # ROLE_TARGET
255
+ if n_future_cov:
256
+ roles[C - n_future_cov:] = 2 # ROLE_FUTURE_COV
257
+
258
+ hz_p = max(1, -(-H // ps))
259
+ n_ctx = max(2, self.cfg.context_length // ps)
260
+ if n_ctx + hz_p > self.cfg.max_patches:
261
+ n_ctx = self.cfg.max_patches - hz_p
262
+ if n_ctx < 2:
263
+ raise ValueError(
264
+ f"horizon {H} needs {hz_p} patches; max_patches="
265
+ f"{self.cfg.max_patches} leaves no room for context")
266
+ window, hz = n_ctx * ps, hz_p * ps
267
+
268
+ vals = np.zeros((B, C, window + hz), dtype=np.float64)
269
+ miss = np.zeros((B, C, window + hz), dtype=np.float64)
270
+ for b in range(B):
271
+ for c in range(C):
272
+ h = x[b, c]
273
+ m = ~np.isfinite(h)
274
+ if h.shape[0] < window:
275
+ obs = h[~m]
276
+ fill = obs[0] if obs.size else 0.0
277
+ pad = window - h.shape[0]
278
+ h = np.concatenate([np.full(pad, fill), h])
279
+ m = np.concatenate([np.ones(pad, dtype=bool), m])
280
+ else:
281
+ h, m = h[-window:], m[-window:]
282
+ if m.all():
283
+ h, m = np.zeros_like(h), np.zeros_like(m)
284
+ vals[b, c, :window] = np.where(m, 0.0, h)
285
+ miss[b, c, :window] = m.astype(np.float64)
286
+ miss[:, :, window:] = 1.0 # horizon unobserved …
287
+
288
+ if n_future_cov:
289
+ f = np.asarray(future, dtype=np.float64)
290
+ if f.ndim == 2:
291
+ f = f[:, None, :]
292
+ if f.shape[:2] != (B, n_future_cov):
293
+ raise ValueError(
294
+ f"future must be (B={B}, n_future_cov={n_future_cov}, >=H); got {f.shape}")
295
+ if f.shape[2] < H:
296
+ raise ValueError(f"future covers {f.shape[2]} steps; horizon is {H}")
297
+ # Pad to the patch boundary by repeating the last known value: those
298
+ # steps sit past the requested horizon and are sliced off below.
299
+ g = np.concatenate([f[:, :, :H], np.repeat(f[:, :, H - 1:H], hz - H, axis=2)],
300
+ axis=2) if hz > H else f[:, :, :hz]
301
+ fm = ~np.isfinite(g)
302
+ vals[:, C - n_future_cov:, window:] = np.where(fm, 0.0, g)
303
+ miss[:, C - n_future_cov:, window:] = fm.astype(np.float64) # … except these
304
+
305
+ xt = torch.as_tensor(vals, dtype=torch.float64, device=self.device)
306
+ mt = torch.as_tensor(miss, dtype=torch.float64, device=self.device)
307
+ z, loc, scale = self.m.causal_standardize(
308
+ xt.reshape(B * C, -1), mask=mt.reshape(B * C, -1),
309
+ binary_passthrough=self.cfg.binary_passthrough)
310
+ P = n_ctx + hz_p
311
+ patches = z.reshape(B, C, P, ps).to(torch.float32)
312
+ pmask = mt.reshape(B, C, P, ps).to(torch.float32)
313
+ vt = torch.as_tensor(roles, device=self.device)
314
+
315
+ pred = self.model(patches, mask=pmask, variate_types=vt) # (B,C,P,ps,Q)
316
+ q = pred[:, :n_targets, n_ctx - 1: n_ctx + hz_p - 1]
317
+ q, _ = torch.sort(q, dim=-1)
318
+ q = q.reshape(B, n_targets, hz, -1)[:, :, :H]
319
+
320
+ # Invert with the TARGET rows' anchors at the last context step; they are
321
+ # frozen across the horizon anyway, since those entries are masked.
322
+ loc = loc.reshape(B, C, -1)[:, :n_targets, window - 1][..., None, None]
323
+ scale = scale.reshape(B, C, -1)[:, :n_targets, window - 1][..., None, None]
324
+ out = torch.sinh(q.double()) * scale.double() + loc.double()
325
+ res = out.detach().cpu().numpy().astype(np.float64)
326
+
327
+ # HURDLE (2026-09-02): zero-movement mixture, horizon-aware.
328
+ try:
329
+ _H = [np.asarray(h, dtype=np.float64) for h in histories]
330
+ for _b, _h in enumerate(_H):
331
+ _row = _h[0] if _h.ndim == 2 else _h
332
+ res[_b] = _hurdle_mix(res[_b], _row)
333
+ except Exception:
334
+ pass
335
+ return res
336
+
337
+ @torch.no_grad()
338
+ def forecast(self, history, horizon: int, num_samples: int) -> np.ndarray:
339
+ hist = np.asarray(history, dtype=np.float64).reshape(-1)
340
+ seed_src = (hist.tobytes() + int(horizon).to_bytes(8, "big")
341
+ + int(num_samples).to_bytes(8, "big"))
342
+ seed = int.from_bytes(hashlib.sha256(seed_src).digest()[:8], "big") & ((1 << 63) - 1)
343
+ generator = torch.Generator(device=self.device)
344
+ generator.manual_seed(seed)
345
+ x, miss = self._prep([hist])
346
+ q = self._decode_quantiles(x, horizon, miss=miss)[0]
347
+ nq = q.shape[-1]
348
+ levels = self.levels
349
+ u = torch.rand(int(num_samples), int(horizon), device=self.device, generator=generator)
350
+ idx = torch.searchsorted(levels, u.clamp(levels[0].item(), levels[-1].item()))
351
+ idx = idx.clamp(1, nq - 1)
352
+ qe = q.unsqueeze(0).expand(u.shape[0], -1, -1)
353
+ vl = torch.gather(qe, -1, (idx - 1).unsqueeze(-1)).squeeze(-1)
354
+ vh = torch.gather(qe, -1, idx.unsqueeze(-1)).squeeze(-1)
355
+ ql = levels[idx - 1].double(); qh = levels[idx].double()
356
+ frac = ((u.double() - ql) / (qh - ql).clamp_min(1e-8)).clamp(0, 1)
357
+ out = vl + frac * (vh - vl)
358
+ return out.detach().cpu().numpy().reshape(1, int(num_samples), int(horizon))
model.py ADDED
@@ -0,0 +1,1305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Toto2 backbone + the four upgrades.
2
+
3
+ Forked from ``cascade/trainer/toto2_model.py`` @ cascade main 5e885b3. The fork
4
+ is deliberate rather than a subclass: the changes thread through ``_Block.forward``
5
+ (attention masks), ``Toto2Model.forward`` (variate roles), and the scaler, and
6
+ this file has to stay **self-contained torch** because it is copied into every
7
+ checkpoint as ``model.py`` so a wrapper can rebuild the architecture to load
8
+ weights. No cascade imports.
9
+
10
+ What differs from upstream, and why:
11
+
12
+ * **Β§0 grouping is honoured per size.** Upstream's ``Toto2Config`` has
13
+ ``layer_group_size`` but ``from_contract`` never reads it, so every size
14
+ inherits 4. Every released rung sets it equal to ``num_layers`` (one variate
15
+ layer each), so a 24-layer model inheriting 4 gets six.
16
+
17
+ * **Β§2 future-known covariates.** Variate roles are positional β€” channels
18
+ ``0..n_targets-1`` are targets, the rest covariates β€” because the corpus is
19
+ finite floats with no role axis and the generator contract cannot express
20
+ observability. Roles drive three things: a learned 3-way type embedding, a
21
+ per-type time mask (targets and past covariates stay strictly causal, future-
22
+ known covariates may attend bidirectionally), and an asymmetric variate mask
23
+ (a covariate query can never read a target key). That trio is what makes
24
+ target-causality hold by induction over block depth β€” none of it is specific
25
+ to a recurrent mixer, which is why this is a mask change and not a backbone
26
+ rewrite.
27
+
28
+ * **Β§2b binary detector.** Under the arcsinh scaler a sparse binary column is
29
+ degenerate: the gap between the two standardised levels blows up as the
30
+ positive rate goes to zero. Real future-known covariates are mostly binary and
31
+ sparse (deploy flags, maintenance windows, cron ticks), so binary rows bypass
32
+ the affine and keep their {0,1} encoding.
33
+
34
+ * **Β§3 windowed time attention.** A bounded window ``W`` over the patch axis,
35
+ for the inference-time probe. Set ``time_window = 0`` for unbounded (the
36
+ default, and what training uses).
37
+
38
+ Everything else β€” CPM, the robust causal scaler, PerDimScale, xPos, the u-ΞΌP
39
+ residual scheme, the pinball head β€” is upstream's, unchanged.
40
+ """
41
+
42
+ from __future__ import annotations
43
+
44
+ import math
45
+ import os
46
+ from dataclasses import dataclass, field
47
+
48
+ import torch
49
+ import torch.nn as nn
50
+ import torch.nn.functional as F
51
+
52
+ QUANTILE_LEVELS = (0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)
53
+
54
+ # Variate roles. Positional by convention: channels 0..n_targets-1 are targets.
55
+ ROLE_TARGET = 0
56
+ ROLE_PAST_COV = 1
57
+ ROLE_FUTURE_COV = 2
58
+ N_ROLES = 3
59
+
60
+ Z_CLAMP = 64.0
61
+
62
+
63
+ @dataclass
64
+ class CascadeModelConfig:
65
+ d_model: int = 256
66
+ num_layers: int = 4
67
+ num_heads: int = 4
68
+ head_dim: int = 64
69
+ patch_size: int = 32
70
+ mlp_expansion: int = 2
71
+ d_ff: int = 0
72
+ num_quantiles: int = 9
73
+ # Toto-2.0-style deep output head: 0 = the original single linear (every
74
+ # checkpoint before 2026-08-31), >0 = 2-layer MLP head with that hidden
75
+ # width plus a skip projection. The skip carries the linear-head function,
76
+ # and linear2 is ZERO-INIT, so at init the MLP head computes exactly what
77
+ # a fresh linear head would β€” and a warm-start can drop pretrained linear
78
+ # head weights into the skip (trainer remaps head.weight -> head.skip.*)
79
+ # making "add head depth to a trained model" an exact no-op at step 0.
80
+ head_mlp_hidden: int = 0
81
+ # Toto-2.0's exact FFN: bias-free SwiGLU (fc1 emits gate+value, 2*d_ff)
82
+ # instead of our plain GELU 2-layer. Tensor-verified on the 4m release
83
+ # (ffn.fc1 [1376, 256] = 2*688, ffn.fc2 [256, 688], no biases).
84
+ ffn_swiglu: bool = False
85
+ # Toto-2.0's exact input: skip-projection residual MLP patch->hidden->d
86
+ # (patch_proj.{linear1,linear2,skip_proj} in the release, hidden 4*d)
87
+ # replacing our Linear patch_embed + dim-preserving _ResidualMLP.
88
+ embed_skip_mlp: int = 0
89
+ # T4FIX (2026-09-01): MAE-style learned mask token. Fully-missing patches
90
+ # get this d_model vector INSTEAD of embedding (zeros||mask-flag) β€” the
91
+ # nonlinear embed then only ever sees real data. Registered because the
92
+ # t4 bisect showed the skip-MLP embed learns ~2x worse CPM fill with
93
+ # overdispersed quantiles when it must embed the missing-patch input
94
+ # itself. False = off (byte-identical).
95
+ embed_mask_token: bool = False
96
+ # Toto-2.0 has NO dim-preserving MLP between the final norm and the head
97
+ # (only the fused output head) β€” drop ours for exact replication.
98
+ no_out_mlp: bool = False
99
+ context_length: int = 4096
100
+ horizon: int = 64
101
+ max_patches: int = 256
102
+ layer_group_size: int = 4
103
+ cpm_c_max: int = 16
104
+ cpm_p_max: float = 0.4
105
+ residual_mult: float = 0.75
106
+ # ── Β§2 ────────────────────────────────────────────────────────────────────
107
+ #: Enable the variate-type embedding and the role-aware masks. Off β‡’ this
108
+ #: model is numerically upstream's.
109
+ use_variate_roles: bool = False
110
+ #: Bypass the arcsinh affine for rows that are binary. Only meaningful with
111
+ #: roles on, but harmless (and still correct) without them.
112
+ binary_passthrough: bool = False
113
+ # ── Β§3 ────────────────────────────────────────────────────────────────────
114
+ #: Bounded time-attention window in PATCHES. 0 = unbounded (training).
115
+ time_window: int = 0
116
+ # Attention sinks: first N patches always visible under a window.
117
+ # 0 = off, which is bit-identical to the pre-sinks behaviour.
118
+ attn_sinks: int = 0
119
+ #: Attention implementation for the WINDOWED time axis.
120
+ #: "sdpa" β€” additive mask into scaled_dot_product_attention. Correct,
121
+ #: but supplying any attn_mask drops SDPA off its fused kernel and
122
+ #: onto the materialised-matrix path: measured 0.73x one-shot.
123
+ #: "flex" β€” compile the mask INTO a fused kernel via flex_attention.
124
+ #: The prize is removing that ~27% overhead, NOT block sparsity: at
125
+ #: ctx 4096 the time axis is 128 patches, where a W=64 window skips only
126
+ #: 25% of positions and attention is a few percent of a layer anyway.
127
+ #: Requires torch >= 2.5 AND a compiler toolchain: torch.compile drives
128
+ #: Triton, which builds a small C extension and therefore needs the
129
+ #: Python dev headers. A slim image often lacks them, in which case
130
+ #: compilation raises and this degrades to sdpa (numerically identical,
131
+ #: verified to ~4e-7 relative) rather than killing the run. To supply
132
+ #: them without root:
133
+ #: uv python install 3.12
134
+ #: export CPATH=$HOME/.local/share/uv/python/cpython-3.12.*/include/python3.12
135
+ #: NOTE the helper links only against libcuda, not libpython, so headers
136
+ #: from any 3.12.x build are sufficient.
137
+ attn_impl: str = "sdpa"
138
+ #: EXP-F control: disable rotary position encoding entirely. The whole
139
+ #: rope family is downstream of an ARITHMETIC diagnosis (19/32 pairs never
140
+ #: complete half a turn); this measures whether position encoding is load-
141
+ #: bearing at all on a 128-position axis. If skill barely moves, the rest of
142
+ #: the family is a distraction.
143
+ use_rope: bool = True
144
+ #: EXP-B: the frequency-ladder base. 10000 was chosen for language contexts
145
+ #: of many thousands of tokens. rope_scale SHIFTS the ladder uniformly; base
146
+ #: COMPRESSES it, which is the knob that owns the diagnosed problem β€” the
147
+ #: spread from 1.0 to 1.3e-4 rad/position across only 128 positions.
148
+ #: base ~ 46 makes all 32 pairs complete at least half a turn at L=128,
149
+ #: versus 13 at stock, and costs nothing at the fast end.
150
+ rope_base: float = 10000.0
151
+ #: Position-interpolation scale on the ROTATION only (see _xpos). 1.0 = stock.
152
+ #: s < 1 spreads positions across more of the frequency ladder; s > 1
153
+ #: compresses them. Not a learned parameter, so it can also be swept at
154
+ #: inference on a fixed checkpoint.
155
+ rope_scale: float = 1.0
156
+ #: xPos DECAY width. 512 is inherited from a much longer-sequence setting;
157
+ #: against a 128-position axis the decay exponent only spans +-0.125. This is
158
+ #: the one part of xPos credited with extrapolation that the rope family
159
+ #: never swept. 512 reproduces every result recorded so far.
160
+ xpos_scale_base: float = 512.0
161
+ #: YaRN / NTK-by-parts: interpolate SLOW pairs, leave FAST pairs
162
+ #: extrapolating, instead of PI's uniform rescale. Off reproduces stock.
163
+ yarn: bool = False
164
+ #: Ramp bounds in ROTATIONS-per-context. Defaults are set for a 128-position
165
+ #: axis (r spans ~0.002 to ~20.4), NOT YaRN's published 1/32, which assume
166
+ #: thousands of tokens and would put every pair below the ramp here β€”
167
+ #: silently degrading to plain PI, the method EXP-C measured failing.
168
+ yarn_alpha: float = 0.5
169
+ yarn_beta: float = 8.0
170
+ #: YaRN attention temperature. 1.0 = off.
171
+ attn_temp: float = 1.0
172
+ #: PARTIAL ROPE: rotate only the fastest ``k`` frequency pairs and leave the
173
+ #: rest untouched. 0 = rotate all (stock).
174
+ #:
175
+ #: Motivated by EXP-B rather than by the LLM literature. Lowering the base
176
+ #: (46, 100) made things monotonically WORSE, worst on short horizon. The
177
+ #: reading: slow pairs act as near-content dims, and compressing the ladder
178
+ #: forces them to rotate, destroying that.
179
+ #:
180
+ #: CAREFUL with the thresholds β€” an earlier version of this comment conflated
181
+ #: them and a test caught it. At 128 positions:
182
+ #: * 13 pairs are USABLE (T*f >= pi, can disambiguate across the context),
183
+ #: * but only the 7 beyond pair 25 are NEGLIGIBLE (T*f < 0.1).
184
+ #: Truncating at 13 moves the layer output ~39%; at 25 it moves <2%. So the
185
+ #: split is a smooth gradient, not a clean 13/19 partition, and the pairs
186
+ #: between are doing real work.
187
+ #:
188
+ #: This makes the allocation explicit and tunable rather than an accident of
189
+ #: the base. The interesting sweep range is therefore k in ~[13, 32].
190
+ rope_partial_k: int = 0
191
+ #: LEARNABLE frequency ladder: promote inv_freq from a fixed buffer to a
192
+ #: parameter (32 scalars per time layer). EXP-B swept ONE degree of freedom
193
+ #: and found nothing; this gives 32 and lets the model choose its own
194
+ #: geometry. Also diagnostic β€” the learned ladder can be read off afterwards,
195
+ #: which says more than any sweep. Stored in log space so frequencies stay
196
+ #: positive and the optimiser moves them multiplicatively.
197
+ rope_learnable: bool = False
198
+ #: TRAINING-time scale randomisation (Β§ option 1). 0 = off. Otherwise each
199
+ #: forward draws rope_scale log-uniformly from [1/j, j], so the model learns
200
+ #: a scale-INVARIANT distance metric rather than memorising one spacing.
201
+ #: This is the training-side counterpart to PI, and the direct response to
202
+ #: EXP-C: you cannot bolt interpolation on at deploy, so train it in.
203
+ rope_scale_jitter: float = 0.0
204
+ #: ARCH 2x2 B-row: the TIME-axis sequence mixer. "attention" (default) is
205
+ #: the existing xPos MHA and is bit-identical to the pre-field model (no
206
+ #: extra parameters are created, so old checkpoints load unchanged).
207
+ #: "mlstm" swaps ONLY the mixing operator inside the same pre-norm /
208
+ #: depth-scaled-residual scaffold for a TiRex/xLSTM-style matrix-LSTM:
209
+ #: the stabilized parallel form from NX-AI mlstm_kernels native_stablef
210
+ #: (logsigmoid forget gates, tril log-decay matrix, row-max stabilizer m,
211
+ #: qk scale Dh^-0.5, n = max(|sum C~|, exp(-m)) + 1e-6), gate soft-cap 15,
212
+ #: per-head LayerNorm (eps 1e-6, weight only), sigmoid output gate β€”
213
+ #: verified against the published kernel source 2026-08-30. Variate-axis
214
+ #: blocks stay attention (variates are unordered). Position comes from the
215
+ #: recurrence, so rope/xPos and window masks do not apply to this mixer;
216
+ #: future-known-covariate rows get a reversed second pass, averaged, to
217
+ #: keep the Β§2 bidirectional contract.
218
+ time_mixer: str = "attention"
219
+
220
+ @property
221
+ def ffn_hidden(self) -> int:
222
+ return self.d_ff if self.d_ff > 0 else self.d_model * self.mlp_expansion
223
+
224
+ def to_dict(self) -> dict:
225
+ return {k: getattr(self, k) for k in self.__dataclass_fields__}
226
+
227
+ def time_mixer_plan(self) -> list:
228
+ """Per-layer mixer assignment. None = derive from time_mixer scalar.
229
+
230
+ "pattern:<m0>,<m1>,..." assigns the k-th TIME block (variate blocks
231
+ always stay attention) the k-th entry, cycling if the pattern is
232
+ shorter than the time-block count. H1 (TiRex-2-skeleton hybrid,
233
+ 2026-08-30): "pattern:mlstm,slstm,mlstm,attention,slstm" β€” alternating
234
+ recurrence with one windowed-attention time layer at ~2/3 depth.
235
+ """
236
+ tm = str(getattr(self, "time_mixer", "attention"))
237
+ if not tm.startswith("pattern:"):
238
+ return [None] * self.num_layers
239
+ pat = [x.strip() for x in tm[len("pattern:"):].split(",") if x.strip()]
240
+ bad = [x for x in pat if x not in ("attention", "mlstm", "slstm", "mamba")]
241
+ if bad or not pat:
242
+ raise ValueError(f"bad time_mixer pattern entries: {bad or 'empty'}")
243
+ plan, k = [], 0
244
+ for i in range(self.num_layers):
245
+ if self.layer_axis(i) == "time":
246
+ plan.append(pat[k % len(pat)])
247
+ k += 1
248
+ else:
249
+ plan.append("attention")
250
+ return plan
251
+
252
+ def layer_axis(self, i: int) -> str:
253
+ g = max(1, self.layer_group_size)
254
+ return "variate" if i % g == g - 1 else "time"
255
+
256
+ @classmethod
257
+ def from_size(cls, size, **overrides) -> CascadeModelConfig:
258
+ """Build from a :class:`cascade_model.sizes.Size`, honouring its grouping."""
259
+ ctx = int(overrides.pop("context_length", 4096))
260
+ hz = int(overrides.pop("horizon", 64))
261
+ return cls(
262
+ d_model=size.d_model, num_layers=size.num_layers,
263
+ num_heads=size.num_heads, head_dim=size.head_dim,
264
+ patch_size=size.patch_size, d_ff=size.d_ff,
265
+ layer_group_size=size.layer_group_size,
266
+ context_length=ctx, horizon=hz,
267
+ max_patches=max(8, (ctx + hz) // size.patch_size + 4),
268
+ **overrides,
269
+ )
270
+
271
+
272
+ # ── robust causal scaler ─────────────────────────────────────────────────────
273
+
274
+
275
+ def is_binary_row(x: torch.Tensor, *, atol: float = 1e-9) -> torch.Tensor:
276
+ """``(B,)`` bool: which rows of ``(B, L)`` carry only the values 0 and 1.
277
+
278
+ TiRex-2's binary detector. A sparse binary column under an arcsinh scaler is
279
+ degenerate β€” with positive rate ``p``, the standardised gap between the two
280
+ levels grows like ``1/sqrt(p(1-p))`` and diverges as ``p β†’ 0``, so the exact
281
+ signal a deploy flag carries is the thing the scaler destroys.
282
+ """
283
+ return ((x.abs() < atol) | ((x - 1.0).abs() < atol)).all(dim=-1)
284
+
285
+
286
+ def causal_standardize(
287
+ x: torch.Tensor,
288
+ mask: torch.Tensor | None = None,
289
+ *,
290
+ min_obs: int = 8,
291
+ eps: float = 1e-5,
292
+ binary_passthrough: bool = False,
293
+ ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
294
+ """Per-step causal location/scale under an arcsinh transform.
295
+
296
+ ``x`` is ``(B, L)``; ``mask`` is optional binary ``(B, L)``, 1 = unobserved.
297
+ Returns ``(z, loc, scale)``, each ``(B, L)``, with
298
+ ``z = arcsinh((x - loc) / scale)``.
299
+
300
+ With ``binary_passthrough`` a row detected as binary gets ``loc = 0``,
301
+ ``scale = 1`` β€” the identity, so ``z = arcsinh(x)`` maps {0,1} to
302
+ {0, 0.8814} and the encoding survives at any positive rate.
303
+ """
304
+ B, L = x.shape
305
+ keep = torch.ones_like(x) if mask is None else 1.0 - mask.to(x.dtype)
306
+ x64 = x.double()
307
+ k64 = keep.double()
308
+ ref = x64.gather(-1, (k64 > 0).to(torch.int64).argmax(dim=-1, keepdim=True))
309
+ xk = (x64 - ref) * k64
310
+ n = k64.cumsum(dim=-1)
311
+ cnt = n.clamp_min(1.0)
312
+ loc = xk.cumsum(dim=-1) / cnt
313
+ var = (xk * xk).cumsum(dim=-1) / cnt - loc * loc
314
+ loc = loc + ref
315
+ scale = var.clamp_min(0.0).sqrt().clamp_min(eps)
316
+ ok = n >= float(min_obs)
317
+ has = ok.any(dim=-1)
318
+ first = torch.where(
319
+ has, ok.to(torch.int64).argmax(dim=-1), torch.full((B,), L - 1, device=x.device)
320
+ )[:, None]
321
+ loc = torch.where(ok, loc, loc.gather(-1, first))
322
+ scale = torch.where(ok, scale, scale.gather(-1, first))
323
+ if binary_passthrough:
324
+ binr = is_binary_row(x)[:, None]
325
+ loc = torch.where(binr, torch.zeros_like(loc), loc)
326
+ scale = torch.where(binr, torch.ones_like(scale), scale)
327
+ z = torch.asinh((x64 - loc) / scale).clamp_(-Z_CLAMP, Z_CLAMP)
328
+ return z.to(x.dtype), loc.to(x.dtype), scale.to(x.dtype)
329
+
330
+
331
+ def patch_anchors(loc, scale, patch_size: int):
332
+ B, L = loc.shape
333
+ P = L // patch_size
334
+ return (
335
+ loc.view(B, P, patch_size)[:, :, -1],
336
+ scale.view(B, P, patch_size)[:, :, -1],
337
+ )
338
+
339
+
340
+ def invert_standardize(z, loc, scale):
341
+ return torch.sinh(z) * scale + loc
342
+
343
+
344
+ # ── masks (Β§2, Β§3) ───────────────────────────────────────────────────────────
345
+
346
+
347
+ def variate_mask(
348
+ variate_types: torch.Tensor, group_ids: torch.Tensor | None = None
349
+ ) -> torch.Tensor:
350
+ """``(V, V)`` additive mask for the variate-attention axis.
351
+
352
+ Two rules, and the asymmetry is the whole point:
353
+
354
+ * variates only attend within their own group (block-diagonal, as upstream's
355
+ grouped variate attention already assumes),
356
+ * a covariate QUERY may never read a target KEY.
357
+
358
+ The second is what preserves target-causality once future-known covariates
359
+ are allowed to attend bidirectionally along time. Without it, a future-known
360
+ covariate at horizon position t could read a target key, attend forward in
361
+ time, and leak a future target value back into an earlier prediction β€” the
362
+ exact failure that shows up as a suspiciously good benchmark score.
363
+ """
364
+ v = variate_types.reshape(-1)
365
+ if group_ids is None:
366
+ group_ids = torch.zeros_like(v)
367
+ g = group_ids.reshape(-1)
368
+ same_group = g.view(-1, 1) == g.view(1, -1)
369
+ q_is_cov = (v != ROLE_TARGET).view(-1, 1)
370
+ k_is_tgt = (v == ROLE_TARGET).view(1, -1)
371
+ allowed = same_group & ~(q_is_cov & k_is_tgt)
372
+ # A row that can see nothing would produce NaN from softmax over all -inf.
373
+ # Self-attention is always legal, so pin the diagonal.
374
+ allowed = allowed | torch.eye(v.numel(), dtype=torch.bool, device=v.device)
375
+ out = torch.zeros(allowed.shape, dtype=torch.float32, device=v.device)
376
+ return out.masked_fill(~allowed, float("-inf"))
377
+
378
+
379
+ def window_mask(T: int, W: int, *, causal: bool, sinks: int = 0,
380
+ device=None) -> torch.Tensor:
381
+ """``(T, T)`` additive mask for a bounded attention window of ``W`` patches.
382
+
383
+ ``causal`` keeps the band strictly at or below the diagonal. ``W <= 0``
384
+ means unbounded, in which case the caller should skip the mask entirely and
385
+ stay on the fast kernel path.
386
+
387
+ ``sinks`` keeps the first ``S`` positions permanently visible to every query
388
+ IN ADDITION to the sliding band β€” "attention sinks" (arXiv 2309.17453).
389
+ Softmax attention concentrates heavily on the earliest positions regardless
390
+ of their content, so a sliding window that evicts them destabilises the
391
+ distribution; retaining a handful recovers most of the loss at a fraction of
392
+ the cache. That matters here because Β§3 measured a 512-step window failing
393
+ with a textbook horizon gradient (+3.40 / +6.04 / +9.48% MASE, worst on
394
+ long), which is the signature this mechanism predicts.
395
+
396
+ ``sinks=0`` is the exact previous behaviour.
397
+ """
398
+ i = torch.arange(T, device=device).view(-1, 1)
399
+ j = torch.arange(T, device=device).view(1, -1)
400
+ allowed = (j > i - W) & (j < i + W) if not causal else (j <= i) & (j > i - W)
401
+ if sinks > 0:
402
+ sink = j < int(sinks)
403
+ # A sink is still bound by causality when the axis is causal β€” a target
404
+ # row must never read forward, sink or not.
405
+ allowed = allowed | (sink & (j <= i)) if causal else allowed | sink
406
+ out = torch.zeros((T, T), dtype=torch.float32, device=device)
407
+ return out.masked_fill(~allowed, float("-inf"))
408
+
409
+
410
+ _FLEX_CACHE: dict = {}
411
+ _FLEX_FN = None
412
+
413
+
414
+ class _FlexUnavailable:
415
+ """Sentinel: flex was tried and failed; never try again this process."""
416
+
417
+ def __call__(self, *a, **k):
418
+ raise RuntimeError("flex unavailable")
419
+
420
+
421
+ _FLEX_UNAVAILABLE = _FlexUnavailable()
422
+
423
+
424
+ def _additive_from_block(block_mask, q):
425
+ """Recover a dense additive mask from a BlockMask, for the fallback path."""
426
+ dense = block_mask.to_dense() if hasattr(block_mask, "to_dense") else None
427
+ if dense is None:
428
+ return None
429
+ m = dense[0, 0].to(torch.bool)
430
+ out = torch.zeros(m.shape, dtype=q.dtype, device=q.device)
431
+ return out.masked_fill(~m, float("-inf"))
432
+
433
+
434
+ def _flex_fn():
435
+ """``flex_attention``, COMPILED, because uncompiled it defeats the purpose.
436
+
437
+ Called eagerly, flex_attention warns and falls back to an unfused
438
+ implementation that materialises the full scores matrix β€” precisely the
439
+ pessimisation the sdpa+mask path already suffers. Compiling is what turns
440
+ the mask into a fused kernel and recovers the ~27%.
441
+
442
+ Compiled once and cached at module level: torch.compile has real warmup cost
443
+ and re-tracing per call would cost far more than the kernel saves.
444
+ """
445
+ global _FLEX_FN
446
+ if _FLEX_FN is _FLEX_UNAVAILABLE:
447
+ raise RuntimeError("flex unavailable")
448
+ if _FLEX_FN is None:
449
+ from torch.nn.attention.flex_attention import flex_attention
450
+
451
+ _FLEX_FN = torch.compile(flex_attention, dynamic=True)
452
+ return _FLEX_FN
453
+
454
+
455
+ def flex_block_mask(T: int, W: int, *, causal: bool, sinks: int = 0, device=None):
456
+ """A ``BlockMask`` matching :func:`window_mask`, for ``flex_attention``.
457
+
458
+ Built from the SAME predicate as the additive mask so the two paths cannot
459
+ drift apart β€” a fused kernel that quietly attends over a slightly different
460
+ set than the reference would be indistinguishable from a real result.
461
+
462
+ Cached: constructing a BlockMask is not free and the shape is fixed for a
463
+ given (T, W, sinks, causal, device).
464
+ """
465
+ from torch.nn.attention.flex_attention import create_block_mask
466
+
467
+ key = (int(T), int(W), int(sinks), bool(causal), str(device))
468
+ hit = _FLEX_CACHE.get(key)
469
+ if hit is not None:
470
+ return hit
471
+
472
+ Wi, Si = int(W), int(sinks)
473
+
474
+ def mask_mod(b, h, q, kv):
475
+ band = ((kv > q - Wi) & (kv <= q)) if causal else ((kv > q - Wi) & (kv < q + Wi))
476
+ if Si > 0:
477
+ sink = kv < Si
478
+ band = band | (sink & (kv <= q)) if causal else band | sink
479
+ return band
480
+
481
+ bm = create_block_mask(mask_mod, B=None, H=None, Q_LEN=int(T), KV_LEN=int(T),
482
+ device=device)
483
+ _FLEX_CACHE[key] = bm
484
+ return bm
485
+
486
+
487
+ # ── building blocks ──────────────────────────────────────────────────────────
488
+
489
+
490
+ class _SwiGLU(nn.Module):
491
+ """Toto-2.0's block FFN: bias-free gated unit, fc1 -> (gate, value)."""
492
+
493
+ def __init__(self, dim: int, hidden: int):
494
+ super().__init__()
495
+ self.fc1 = nn.Linear(dim, 2 * hidden, bias=False)
496
+ self.fc2 = nn.Linear(hidden, dim, bias=False)
497
+
498
+ def forward(self, x):
499
+ g, v = self.fc1(x).chunk(2, dim=-1)
500
+ return self.fc2(F.silu(g) * v)
501
+
502
+
503
+ class _ResidualMLP(nn.Module):
504
+ def __init__(self, dim: int, hidden: int):
505
+ super().__init__()
506
+ self.net = nn.Sequential(
507
+ nn.Linear(dim, hidden, bias=False),
508
+ nn.SiLU(),
509
+ nn.Linear(hidden, dim, bias=False),
510
+ )
511
+
512
+ def forward(self, x):
513
+ return x + self.net(x)
514
+
515
+
516
+ class _MLPHead(nn.Module):
517
+ """Toto-2.0-style deep output head: skip(x) + linear2(act(linear1(x))).
518
+
519
+ Datadog's checkpoint puts 1.79M params here (512 -> 2048 -> 288 + skip)
520
+ where our recipe has always used the 0.15M single linear β€” the largest
521
+ structural difference between the two models, targeted at distribution
522
+ shape, which is where ALL measured fine-tune value lives (MASE flat,
523
+ CRPS gains). linear2 is zero-init so the head starts as exactly the skip
524
+ (i.e. exactly a linear head): from scratch that is the standard init, and
525
+ a warm-start that maps pretrained head weights onto the skip is an exact
526
+ function-preserving upgrade.
527
+ """
528
+
529
+ def __init__(self, dim: int, hidden: int, out: int):
530
+ super().__init__()
531
+ self.skip = nn.Linear(dim, out)
532
+ self.linear1 = nn.Linear(dim, hidden)
533
+ self.act = nn.SiLU()
534
+ self.linear2 = nn.Linear(hidden, out)
535
+
536
+ def forward(self, x):
537
+ return self.skip(x) + self.linear2(self.act(self.linear1(x)))
538
+
539
+
540
+ def _yarn_inv_freq(inv_freq, rope_scale: float, n_pos: int,
541
+ alpha: float, beta: float):
542
+ """YaRN / NTK-by-parts: interpolate SLOW pairs, leave FAST pairs alone.
543
+
544
+ Plain PI divides every position by ``s``, so every relative distance in the
545
+ sequence is rescaled at once. Measured (EXP-C), that is much worse zero-shot
546
+ than not extending at all: -12.8 / -25.3 / -24.1% against naive at s=2.
547
+
548
+ YaRN's argument is that the two ends of the ladder want opposite treatment.
549
+ A pair that completes many rotations across the context is carrying local,
550
+ high-resolution distance information and should be left EXTRAPOLATING. A
551
+ pair that has barely turned is carrying absolute-ish position and is the one
552
+ that actually goes out of range, so it should be INTERPOLATED.
553
+
554
+ The ramp runs on ``r_i``, the number of full rotations pair ``i`` completes
555
+ across ``n_pos`` positions::
556
+
557
+ r_i = n_pos * inv_freq_i / (2 * pi)
558
+
559
+ r_i <= alpha -> fully interpolated (inv_freq / s)
560
+ r_i >= beta -> untouched (inv_freq)
561
+ between -> linear blend
562
+
563
+ **alpha/beta must be set for THIS axis, not copied from the LLM defaults.**
564
+ YaRN's published 1/32 assume thousands of tokens. Here the whole axis is 128
565
+ positions and r spans ~0.002 to ~20.4, so with beta=32:
566
+
567
+ * 21 of 32 pairs sit at or below alpha and are FULLY interpolated,
568
+ * the remaining 11 are only partially ramped,
569
+ * and NO pair ever reaches full extrapolation β€” the fastest tops out at
570
+ gamma ~ 0.63.
571
+
572
+ That is not identical to plain PI, but it leans heavily toward it, and plain
573
+ PI is the method EXP-C measured failing. The defaults below put the ramp
574
+ where this ladder actually lives.
575
+ """
576
+ r = n_pos * inv_freq / (2.0 * math.pi)
577
+ if beta <= alpha:
578
+ raise ValueError(f"yarn beta({beta}) must exceed alpha({alpha})")
579
+ gamma = ((r - alpha) / (beta - alpha)).clamp(0.0, 1.0) # 1 = extrapolate
580
+ return gamma * inv_freq + (1.0 - gamma) * (inv_freq / rope_scale)
581
+
582
+
583
+ def _xpos(q, k, inv_freq, zeta, scale_base: float = 512.0, rope_scale: float = 1.0,
584
+ *, yarn: bool = False, yarn_alpha: float = 0.5, yarn_beta: float = 8.0,
585
+ attn_temp: float = 1.0, partial_k: int = 0):
586
+ """xPos = RoPE rotation + a per-dimension decay.
587
+
588
+ ``rope_scale`` divides the position before the rotation (position
589
+ interpolation). Deployed, PI uses s > 1 to compress an over-long axis back
590
+ into the trained range. TRAINED, the interesting direction is s < 1, which
591
+ SPREADS positions across more of the frequency ladder.
592
+
593
+ The motivation is that the ladder is badly matched to this axis. With
594
+ head_dim=64, base=10000 and a 4096-step context at patch_size=32, the time
595
+ axis is only 128 positions: the fastest pair sweeps 20 cycles while the
596
+ slowest sweeps 1.0 degree end-to-end, and **19 of 32 pairs never complete
597
+ half a rotation**, so they carry no within-context positional information.
598
+ Under the W=2048 production window (64 positions) it is 21 of 32.
599
+
600
+ s = 1/2 doubles every rate, activating 3 more pairs while keeping the
601
+ fastest at 2 rad/position β€” clear of the aliasing wall at s < 1/pi ~ 0.318.
602
+
603
+ The DECAY term is a SEPARATE mechanism from the rotation β€” attention falloff
604
+ with distance β€” and ``scale_base`` is its width. It is also the part of xPos
605
+ that the original paper credits for extrapolation, and this project never
606
+ tuned it: the whole rope family (EXP-B base, EXP-C scale) swept rotation and
607
+ left decay at its default.
608
+
609
+ ``scale_base=512`` is inherited from a setting with sequences several times
610
+ longer than ours. Against 128 positions the exponent ``(t - T//2)/512`` only
611
+ spans +-0.125, so the decay operates in a heavily compressed corner of its
612
+ range. Lowering it widens that range. NOTE this is arithmetic plus reasoning,
613
+ NOT a published result β€” I could find no literature tuning scale_base as a
614
+ function of sequence length, so it is a hypothesis with a cheap test.
615
+ """
616
+ T = q.shape[-2]
617
+ t = torch.arange(T, device=q.device, dtype=inv_freq.dtype)
618
+ if yarn:
619
+ eff = _yarn_inv_freq(inv_freq, rope_scale, T, yarn_alpha, yarn_beta)
620
+ freqs = torch.outer(t, eff)
621
+ else:
622
+ freqs = torch.outer(t / rope_scale, inv_freq)
623
+ if partial_k:
624
+ # Rotate only the fastest `partial_k` pairs; zero the rest so cos=1,
625
+ # sin=0 and those dims pass through unrotated. Cheaper and clearer than
626
+ # slicing the tensors, and it keeps every downstream shape identical.
627
+ if not 0 < partial_k <= freqs.shape[-1]:
628
+ raise ValueError(
629
+ f"rope_partial_k={partial_k} outside 1..{freqs.shape[-1]}")
630
+ freqs = freqs.clone()
631
+ freqs[:, partial_k:] = 0.0
632
+ cos = freqs.cos().repeat_interleave(2, dim=-1)
633
+ sin = freqs.sin().repeat_interleave(2, dim=-1)
634
+ power = ((t - T // 2) / scale_base)[:, None]
635
+ scale = (zeta[None, :] ** power).repeat_interleave(2, dim=-1)
636
+
637
+ def rotate(x):
638
+ x1 = x[..., 0::2]
639
+ x2 = x[..., 1::2]
640
+ return torch.stack((-x2, x1), dim=-1).flatten(-2)
641
+
642
+ qo = (q * cos + rotate(q) * sin) * scale
643
+ ko = (k * cos + rotate(k) * sin) / scale
644
+ if attn_temp != 1.0:
645
+ # YaRN's second half: a longer context spreads softmax mass thinner, so
646
+ # it sharpens the logits by a constant. Folded into q because the logits
647
+ # are qΒ·k β€” equivalent, and it keeps the fused attention kernel.
648
+ qo = qo * attn_temp
649
+ return qo, ko
650
+
651
+
652
+ def _soft_cap(x: torch.Tensor, cap: float = 15.0) -> torch.Tensor:
653
+ """xLSTM gate soft-cap: cap * tanh(x / cap)."""
654
+ return cap * torch.tanh(x / cap)
655
+
656
+
657
+ class _MultiHeadNorm(nn.Module):
658
+ """Per-head LayerNorm, weight only (TiRex MultiHeadLayerNorm, eps 1e-6)."""
659
+
660
+ def __init__(self, num_heads: int, head_dim: int, eps: float = 1e-6):
661
+ super().__init__()
662
+ self.eps = eps
663
+ self.weight = nn.Parameter(torch.ones(num_heads, head_dim))
664
+
665
+ def forward(self, x: torch.Tensor) -> torch.Tensor: # (N, H, T, Dh)
666
+ mu = x.mean(dim=-1, keepdim=True)
667
+ var = x.var(dim=-1, keepdim=True, unbiased=False)
668
+ return (x - mu) / torch.sqrt(var + self.eps) * self.weight[None, :, None, :]
669
+
670
+
671
+ def _mlstm_scan(q, k, v, i_pre, f_pre, eps: float = 1e-6):
672
+ """Stabilized parallel mLSTM β€” the exact native_stablef math.
673
+
674
+ ``q, k, v``: ``(N, H, T, Dh)``; ``i_pre, f_pre``: ``(N, H, T)`` soft-capped
675
+ gate preactivations. The decay matrix is built as the cumsum DIFFERENCE
676
+ ``Fc[t] - Fc[s] + i[s]`` rather than the kernel's repeat/tril/cumsum β€”
677
+ identical values (diagonal reduces to ``i[t]``), and with the +-15 soft cap
678
+ the cancellation is bounded by ~15*T, well inside float32. At T = 128 the
679
+ quadratic form costs a few MB and needs no chunking.
680
+ """
681
+ N, H, T, Dh = q.shape
682
+ logf = F.logsigmoid(f_pre) # (N, H, T)
683
+ fc = logf.cumsum(dim=-1)
684
+ D = fc[..., :, None] - fc[..., None, :] + i_pre[..., None, :]
685
+ tril = torch.ones(T, T, dtype=torch.bool, device=q.device).tril()
686
+ D = D.masked_fill(~tril, float("-inf"))
687
+ m = D.max(dim=-1, keepdim=True).values # (N, H, T, 1)
688
+ Dm = torch.exp(D - m) # diag finite => m finite
689
+ S = (q @ k.transpose(-2, -1)) * (Dh ** -0.5)
690
+ Ct = S * Dm
691
+ n = torch.maximum(Ct.sum(dim=-1, keepdim=True).abs(), torch.exp(-m))
692
+ return (Ct / (n + eps)) @ v
693
+
694
+
695
+ def _mamba_scan(q, k, v, dt, A_log, skip):
696
+ """Mamba-2 SSD, dual (decay-masked attention) form β€” Dao & Gu 2024, eq. 5.
697
+
698
+ ``q``: C (readout), ``k``: B (write key), ``v``: x (values), all
699
+ ``(N, H, T, Dh)`` with d_state = head_dim; ``dt``: ``(N, H, T)`` softplus'd
700
+ step sizes; ``A_log``: ``(H,)`` log of the positive decay rate; ``skip``:
701
+ ``(H,)`` the D residual. The recurrence h_t = exp(-dt_t*A) h_{t-1} +
702
+ dt_t B_t x_t^T, y_t = C_t h_t + D x_t collapses at our T (~130) to one
703
+ masked quadratic form, exactly the shape of _mlstm_scan's β€” with two
704
+ simplifications the math hands us: log-decay is <= 0 everywhere so
705
+ exp(D) <= 1 and no row-max stabilizer is needed, and there is no
706
+ normalizer n (SSD is not softmax-normalized; magnitude lives in B/C/dt).
707
+ The official Triton kernels only pay at multi-thousand-token sequences;
708
+ at 2 chunks of 64 this matmul form IS the efficient implementation.
709
+ """
710
+ N, H, T, Dh = q.shape
711
+ loga = -A_log.exp()[None, :, None] * dt # (N,H,T) <= 0
712
+ fc = loga.cumsum(dim=-1)
713
+ D = fc[..., :, None] - fc[..., None, :] # decay j+1..i
714
+ tril = torch.ones(T, T, dtype=torch.bool, device=q.device).tril()
715
+ Dm = torch.exp(D.masked_fill(~tril, float("-inf")))
716
+ S = (q @ k.transpose(-2, -1)) * Dm
717
+ xbar = v * dt[..., None] # Ξ”-discretized
718
+ return S @ xbar + skip[None, :, None, None] * v
719
+
720
+
721
+ def _slstm_scan_impl(x_gates, R, h0=None, eps: float = 1e-6):
722
+ """Stabilized sLSTM (TiRex's mixer β€” the state-tracking xLSTM cell).
723
+
724
+ ``x_gates``: ``(4, N, T, H, Dh)`` input-side gate preactivations in order
725
+ (i, f, z, o); ``R``: ``(4, H, Dh, Dh)`` per-head block-diagonal recurrent
726
+ weights applied to h_{t-1} β€” the NON-DIAGONAL recurrence that no parallel
727
+ form can express, which is the whole point of this cell. Sequential over T
728
+ by necessity; at T = 128 that is 128 small batched einsums.
729
+
730
+ Paper math (Beck et al. 2024), sigmoid-forget variant in log space:
731
+ m_t = max(logsigmoid(f~) + m_{t-1}, i~)
732
+ i' = exp(i~ - m_t); f' = exp(logsigmoid(f~) + m_{t-1} - m_t)
733
+ c_t = f' c_{t-1} + i' tanh(z~); n_t = f' n_{t-1} + i'
734
+ h_t = sigmoid(o~) * c_t / (n_t + eps)
735
+ """
736
+ _, N, T, H, Dh = x_gates.shape
737
+ dev, dt = x_gates.device, x_gates.dtype
738
+ c = torch.zeros(N, H, Dh, device=dev, dtype=dt)
739
+ n = torch.zeros(N, H, Dh, device=dev, dtype=dt)
740
+ m = torch.full((N, H, Dh), -1e9, device=dev, dtype=dt)
741
+ h = torch.zeros(N, H, Dh, device=dev, dtype=dt) if h0 is None else h0
742
+ out = torch.empty(N, T, H, Dh, device=dev, dtype=dt)
743
+ for t in range(T):
744
+ rec = torch.einsum("nhd,ghde->gnhe", h, R) # (4, N, H, Dh)
745
+ i_pre = x_gates[0, :, t] + rec[0]
746
+ f_pre = x_gates[1, :, t] + rec[1]
747
+ z = torch.tanh(x_gates[2, :, t] + rec[2])
748
+ o = torch.sigmoid(x_gates[3, :, t] + rec[3])
749
+ logf = F.logsigmoid(f_pre)
750
+ m_new = torch.maximum(logf + m, i_pre)
751
+ i_s = torch.exp(i_pre - m_new)
752
+ f_s = torch.exp(logf + m - m_new)
753
+ c = f_s * c + i_s * z
754
+ n = f_s * n + i_s
755
+ m = m_new
756
+ h = o * c / (n + eps)
757
+ out[:, t] = h
758
+ return out.permute(0, 2, 1, 3) # (N, H, T, Dh)
759
+
760
+
761
+ # The naive loop is KERNEL-LAUNCH bound, not FLOP bound: 128 steps x ~12 tiny
762
+ # ops per time block measured 132K tok/s on an H-class card (13x under the
763
+ # mLSTM cell). torch.compile fuses the pointwise chain and shrinks the launch
764
+ # count several-fold; compiled lazily and per-process, with a hard fallback to
765
+ # the eager loop when the box lacks Triton/dev headers (same degradation
766
+ # policy as flex_attention above). dynamic=False: the mixed channel mode
767
+ # yields a small fixed set of batch shapes, each compiled once.
768
+ _SLSTM_SCAN_FN = None
769
+
770
+
771
+ def _slstm_scan(x_gates, R, h0=None, eps: float = 1e-6):
772
+ global _SLSTM_SCAN_FN
773
+ if _SLSTM_SCAN_FN is None:
774
+ try:
775
+ # dynamic=False compiles once per shape β€” right for training (a
776
+ # small fixed shape set) but a recompile STORM for the GIFT eval,
777
+ # which sweeps ~97 config shapes (measured: 2h+ eval instead of
778
+ # ~25 min, all of it gcc). Eval harnesses set
779
+ # CASCADE_SLSTM_DYNAMIC=1 to compile shape-polymorphic instead.
780
+ _dyn = os.environ.get("CASCADE_SLSTM_DYNAMIC", "") == "1"
781
+ _SLSTM_SCAN_FN = torch.compile(_slstm_scan_impl, dynamic=_dyn)
782
+ except Exception:
783
+ _SLSTM_SCAN_FN = _slstm_scan_impl
784
+ if _SLSTM_SCAN_FN is not _slstm_scan_impl:
785
+ try:
786
+ return _SLSTM_SCAN_FN(x_gates, R, h0, eps)
787
+ except Exception:
788
+ _SLSTM_SCAN_FN = _slstm_scan_impl
789
+ return _slstm_scan_impl(x_gates, R, h0, eps)
790
+
791
+
792
+ class _Block(nn.Module):
793
+ """Pre-norm MHA + GELU MLP, over either the time or the variate axis.
794
+
795
+ ``axis="time"``: causal over the patch axis with xPos positions β€” except for
796
+ rows flagged bidirectional (future-known covariates), and except for a
797
+ bounded window when ``time_window > 0``.
798
+ ``axis="variate"``: full attention over the variate axis (no positions β€”
799
+ variates are unordered), optionally under an asymmetric role mask.
800
+ """
801
+
802
+ def __init__(self, cfg: CascadeModelConfig, axis: str, block_idx: int = 0,
803
+ mixer: str | None = None):
804
+ super().__init__()
805
+ self.cfg = cfg
806
+ self.axis = axis
807
+ inner = cfg.num_heads * cfg.head_dim
808
+ if mixer is None:
809
+ req = str(getattr(cfg, "time_mixer", "attention"))
810
+ mixer = req if req in ("mlstm", "slstm", "mamba") else "attention"
811
+ self.mixer = mixer if axis == "time" else "attention"
812
+ self.norm1 = nn.LayerNorm(cfg.d_model, eps=1e-4, elementwise_affine=False)
813
+ if self.mixer != "slstm":
814
+ self.qkv = nn.Linear(cfg.d_model, 3 * inner, bias=True)
815
+ self.proj = nn.Linear(inner, cfg.d_model, bias=True)
816
+ self.norm2 = nn.LayerNorm(cfg.d_model, eps=1e-4, elementwise_affine=False)
817
+ hidden = cfg.ffn_hidden
818
+ if cfg.ffn_swiglu:
819
+ self.mlp = _SwiGLU(cfg.d_model, hidden)
820
+ else:
821
+ self.mlp = nn.Sequential(
822
+ nn.Linear(cfg.d_model, hidden, bias=False),
823
+ nn.GELU(),
824
+ nn.Linear(hidden, cfg.d_model, bias=False),
825
+ )
826
+ if self.mixer == "slstm":
827
+ # TiRex's mixer: 4 gates (i,f,z,o), per-dim, input side from the
828
+ # normed token + per-head block-diagonal recurrence on h_{t-1}.
829
+ # No qkv β€” the cell IS the mixing. Inits set in reset_gate_biases.
830
+ self.gates_x = nn.Linear(cfg.d_model, 4 * inner, bias=True)
831
+ self.rec = nn.Parameter(torch.zeros(4, cfg.num_heads, cfg.head_dim,
832
+ cfg.head_dim))
833
+ self.mh_norm = _MultiHeadNorm(cfg.num_heads, cfg.head_dim)
834
+ elif self.mixer == "mlstm":
835
+ # Gate heads follow xLSTM-large: i and f are per-head scalars from
836
+ # the normed input; o is elementwise over the inner dim. per_dim_scale
837
+ # and the rope buffers are attention-specific and deliberately NOT
838
+ # created here, so attention-mode state_dicts stay byte-identical.
839
+ self.gates_if = nn.Linear(cfg.d_model, 2 * cfg.num_heads, bias=True)
840
+ self.ogate = nn.Linear(cfg.d_model, inner, bias=True)
841
+ self.mh_norm = _MultiHeadNorm(cfg.num_heads, cfg.head_dim)
842
+ elif self.mixer == "mamba":
843
+ # Mamba-2 head: qkv doubles as (C, B, x); per-head step size dt,
844
+ # per-head decay rate A (stored in log), per-head D skip, SiLU
845
+ # z-gate on the inner dim (reuses the ogate module name so the
846
+ # trainer's no-decay match covers its bias too). Inits land in
847
+ # reset_gate_biases.
848
+ self.mamba_dt = nn.Linear(cfg.d_model, cfg.num_heads, bias=True)
849
+ self.mamba_A_log = nn.Parameter(torch.zeros(cfg.num_heads))
850
+ self.mamba_skip = nn.Parameter(torch.ones(cfg.num_heads))
851
+ self.ogate = nn.Linear(cfg.d_model, inner, bias=True)
852
+ self.mh_norm = _MultiHeadNorm(cfg.num_heads, cfg.head_dim)
853
+ else:
854
+ self.per_dim_scale = nn.Parameter(torch.zeros(cfg.head_dim))
855
+ if axis == "time" and self.mixer == "attention":
856
+ half = cfg.head_dim // 2
857
+ idx = torch.arange(half).float() / max(1, half)
858
+ base_freq = 1.0 / (cfg.rope_base**idx)
859
+ if cfg.rope_learnable:
860
+ # log space: keeps frequencies positive under any update and
861
+ # makes gradient steps multiplicative, which is the right metric
862
+ # for a ladder spanning four orders of magnitude. Initialised at
863
+ # the stock ladder, so step 0 is exactly stock.
864
+ self.log_inv_freq = nn.Parameter(base_freq.log())
865
+ self.register_buffer("inv_freq", base_freq, persistent=False)
866
+ else:
867
+ self.register_buffer("inv_freq", base_freq, persistent=False)
868
+ self.register_buffer("zeta", (idx + 0.4) / 1.4, persistent=False)
869
+
870
+ S = max(2.0, cfg.context_length / cfg.patch_size)
871
+ ratio2 = S / math.log(S)
872
+ af2 = 2.0 * cfg.residual_mult**2 / (ratio2 + 1.0)
873
+ aa2 = ratio2 * af2
874
+ L = 2.0 * cfg.num_layers
875
+ i = block_idx
876
+ tau2_attn = aa2 / (L / 2.0 + i * aa2 + i * af2)
877
+ tau2_mlp = af2 / (L / 2.0 + (i + 1) * aa2 + i * af2)
878
+ self.attn_a = math.sqrt(tau2_attn / (tau2_attn + 1.0))
879
+ self.attn_b = math.sqrt(1.0 / (tau2_attn + 1.0))
880
+ self.mlp_a = math.sqrt(tau2_mlp / (tau2_mlp + 1.0))
881
+ self.mlp_b = math.sqrt(1.0 / (tau2_mlp + 1.0))
882
+
883
+ def reset_gate_biases(self) -> None:
884
+ """xLSTM-7B gate init, applied AFTER the model-wide bias zeroing.
885
+
886
+ Forget bias linspace(3, 6) per head starts the memory near-preserving
887
+ (logsigmoid(3..6) ~ -0.05..-0.002); input bias -10 starts writes
888
+ near-off. Both are inside the +-15 soft cap. Without this, exp input
889
+ gates at bias 0 make every position write at full strength from step 0.
890
+ """
891
+ H, Dh = self.cfg.num_heads, self.cfg.head_dim
892
+ inner = H * Dh
893
+ if self.mixer == "mlstm":
894
+ with torch.no_grad():
895
+ self.gates_if.bias[:H].fill_(-10.0)
896
+ self.gates_if.bias[H:].copy_(torch.linspace(3.0, 6.0, H))
897
+ elif self.mixer == "slstm":
898
+ # xlstm "small_init" convention: forget bias linspace(3,6) per dim,
899
+ # input bias -10 (writes start near-off), z/o biases zero,
900
+ # recurrent kernel zeros (their default) β€” the cell starts as a
901
+ # feedforward gate and learns its recurrence.
902
+ with torch.no_grad():
903
+ self.gates_x.bias[:inner].fill_(-10.0)
904
+ self.gates_x.bias[inner:2 * inner].copy_(
905
+ torch.linspace(3.0, 6.0, Dh).repeat(H))
906
+ self.gates_x.bias[2 * inner:].zero_()
907
+ elif self.mixer == "mamba":
908
+ # Mamba-2 inits, deterministic variants of the paper's draws:
909
+ # A = linspace(1,16) per head (their U[1,16]); dt_bias = inverse
910
+ # softplus of a log-spaced dt in [1e-3, 1e-1] so heads start with
911
+ # a spread of timescales spanning ~10 to ~1000 steps of memory.
912
+ with torch.no_grad():
913
+ A0 = torch.linspace(1.0, 16.0, H)
914
+ self.mamba_A_log.copy_(A0.log())
915
+ dt0 = torch.logspace(math.log10(1e-3), math.log10(1e-1), H)
916
+ self.mamba_dt.bias.copy_(torch.log(torch.expm1(dt0)))
917
+
918
+ def _mix_slstm(self, x, h, *, bidirectional_rows=None):
919
+ """TiRex-style sLSTM time mixing inside the host residual scaffold.
920
+
921
+ Same contract as _mix_mlstm: rope/window masks do not apply (position
922
+ and memory live in the recurrence); future-known covariate rows get a
923
+ time-reversed second pass, averaged.
924
+ """
925
+ N, T, _ = x.shape
926
+ H, Dh = self.cfg.num_heads, self.cfg.head_dim
927
+ g = self.gates_x(h).view(N, T, 4, H, Dh).permute(2, 0, 1, 3, 4)
928
+ out = _slstm_scan(g, self.rec) # (N, H, T, Dh)
929
+ if bidirectional_rows is not None and bool(bidirectional_rows.any()):
930
+ bid = bidirectional_rows
931
+ rev = _slstm_scan(g[:, bid].flip(2), self.rec).flip(2)
932
+ out = out.clone()
933
+ out[bid] = 0.5 * (out[bid] + rev)
934
+ mixed = self.mh_norm(out).transpose(1, 2).reshape(N, T, H * Dh)
935
+ x = self.attn_b * x + self.attn_a * self.proj(mixed)
936
+ return self.mlp_b * x + self.mlp_a * self.mlp(self.norm2(x))
937
+
938
+ def _mix_mamba(self, x, h, *, bidirectional_rows=None):
939
+ """Mamba-2 time mixing inside the host residual scaffold.
940
+
941
+ Same contract as the other recurrent mixers: rope/window masks do not
942
+ apply (position lives in the decay), and future-known covariate rows
943
+ get a time-reversed second pass, averaged.
944
+ """
945
+ N, T, _ = x.shape
946
+ H, Dh = self.cfg.num_heads, self.cfg.head_dim
947
+ qkv = self.qkv(h).view(N, T, 3, H, Dh)
948
+ q, k, v = (t.transpose(1, 2) for t in qkv.unbind(dim=2)) # (N,H,T,Dh)
949
+ dt = F.softplus(self.mamba_dt(h)).transpose(1, 2) # (N,H,T)
950
+ out = _mamba_scan(q, k, v, dt, self.mamba_A_log, self.mamba_skip)
951
+ if bidirectional_rows is not None and bool(bidirectional_rows.any()):
952
+ bid = bidirectional_rows
953
+ rev = _mamba_scan(
954
+ q[bid].flip(2), k[bid].flip(2), v[bid].flip(2),
955
+ dt[bid].flip(2), self.mamba_A_log, self.mamba_skip,
956
+ ).flip(2)
957
+ out = out.clone()
958
+ out[bid] = 0.5 * (out[bid] + rev)
959
+ mixed = self.mh_norm(out).transpose(1, 2).reshape(N, T, H * Dh)
960
+ mixed = mixed * F.silu(self.ogate(h))
961
+ x = self.attn_b * x + self.attn_a * self.proj(mixed)
962
+ return self.mlp_b * x + self.mlp_a * self.mlp(self.norm2(x))
963
+
964
+ def _mix_mlstm(self, x, h, *, bidirectional_rows=None):
965
+ """TiRex-style mLSTM time mixing inside the host residual scaffold.
966
+
967
+ ``h`` is the pre-normed input. Ignores rope and window masks (position
968
+ and locality live in the recurrence); bidirectional rows (future-known
969
+ covariates) get a time-reversed second pass, averaged.
970
+ """
971
+ N, T, _ = x.shape
972
+ H, Dh = self.cfg.num_heads, self.cfg.head_dim
973
+ qkv = self.qkv(h).view(N, T, 3, H, Dh)
974
+ q, k, v = (t.transpose(1, 2) for t in qkv.unbind(dim=2)) # (N,H,T,Dh)
975
+ g = _soft_cap(self.gates_if(h)) # (N,T,2H)
976
+ i_pre = g[..., :H].transpose(1, 2) # (N,H,T)
977
+ f_pre = g[..., H:].transpose(1, 2)
978
+ out = _mlstm_scan(q, k, v, i_pre, f_pre)
979
+ if bidirectional_rows is not None and bool(bidirectional_rows.any()):
980
+ bid = bidirectional_rows
981
+ rev = _mlstm_scan(
982
+ q[bid].flip(2), k[bid].flip(2), v[bid].flip(2),
983
+ i_pre[bid].flip(2), f_pre[bid].flip(2),
984
+ ).flip(2)
985
+ out = out.clone()
986
+ out[bid] = 0.5 * (out[bid] + rev)
987
+ mixed = self.mh_norm(out).transpose(1, 2).reshape(N, T, H * Dh)
988
+ mixed = mixed * torch.sigmoid(self.ogate(h))
989
+ x = self.attn_b * x + self.attn_a * self.proj(mixed)
990
+ return self.mlp_b * x + self.mlp_a * self.mlp(self.norm2(x))
991
+
992
+ def _attend(self, q, k, v, *, causal: bool, attn_mask=None, block_mask=None):
993
+ if block_mask is not None:
994
+ # scale must match the SDPA path exactly β€” this model uses 1/d, not
995
+ # the conventional 1/sqrt(d), and a mismatch here would look like a
996
+ # subtle quality regression rather than a bug.
997
+ try:
998
+ return _flex_fn()(q, k, v, block_mask=block_mask,
999
+ scale=1.0 / self.cfg.head_dim)
1000
+ except Exception:
1001
+ # Compilation can fail for reasons that have nothing to do with
1002
+ # this model β€” Triton builds a small C extension and needs the
1003
+ # Python dev headers, which a slim image may not carry. The two
1004
+ # paths are numerically identical (verified to ~3e-7 relative),
1005
+ # so degrade to sdpa rather than kill a training run hours in.
1006
+ global _FLEX_FN
1007
+ _FLEX_FN = _FLEX_UNAVAILABLE
1008
+ attn_mask = _additive_from_block(block_mask, q)
1009
+ return F.scaled_dot_product_attention(
1010
+ q, k, v,
1011
+ is_causal=(causal and attn_mask is None),
1012
+ attn_mask=attn_mask,
1013
+ scale=1.0 / self.cfg.head_dim,
1014
+ )
1015
+
1016
+ def forward(self, x, *, bidirectional_rows=None, attn_mask=None,
1017
+ attn_mask_bidir=None, block_mask=None, block_mask_bidir=None):
1018
+ """``x`` is ``(N, T, d)``.
1019
+
1020
+ ``bidirectional_rows`` (time axis only) is an ``(N,)`` bool selecting
1021
+ rows that may attend forward β€” future-known covariates. Rather than
1022
+ materialise a ``(V, T, T)`` mask, the batch is SPLIT by type and the two
1023
+ halves run as separate calls, which keeps both on the fast kernel path.
1024
+ ``attn_mask`` is an additive ``(T, T)`` applied to every row.
1025
+ """
1026
+ N, T, _ = x.shape
1027
+ h = self.norm1(x)
1028
+ if self.mixer == "slstm":
1029
+ return self._mix_slstm(x, h, bidirectional_rows=bidirectional_rows)
1030
+ if self.mixer == "mlstm":
1031
+ return self._mix_mlstm(x, h, bidirectional_rows=bidirectional_rows)
1032
+ if self.mixer == "mamba":
1033
+ return self._mix_mamba(x, h, bidirectional_rows=bidirectional_rows)
1034
+ qkv = self.qkv(h).view(N, T, 3, self.cfg.num_heads, self.cfg.head_dim)
1035
+ q, k, v = qkv.unbind(dim=2)
1036
+ q, k, v = (t.transpose(1, 2) for t in (q, k, v))
1037
+ if self.axis == "time" and self.cfg.use_rope:
1038
+ if self.cfg.rope_learnable:
1039
+ # Nyquist guard. A rotation above pi radians PER POSITION
1040
+ # aliases: adjacent positions become indistinguishable and the
1041
+ # pair emits noise rather than position. Nothing in the loss
1042
+ # prevents the optimiser walking there, and the failure is
1043
+ # silent β€” the model would just get worse for a reason no
1044
+ # metric names. Clamped in log space, where the parameter lives.
1045
+ inv_freq = self.log_inv_freq.clamp(max=math.log(math.pi)).exp()
1046
+ else:
1047
+ inv_freq = self.inv_freq
1048
+ s = self.cfg.rope_scale
1049
+ j = self.cfg.rope_scale_jitter
1050
+ if j and self.training:
1051
+ # Log-uniform in [1/j, j] so shrink and stretch are symmetric β€”
1052
+ # uniform in s would bias every draw toward compression. One draw
1053
+ # per forward, not per row: within a batch the positional metric
1054
+ # must be consistent or attention compares incompatible spacings.
1055
+ u = torch.rand((), device=q.device).item()
1056
+ s = s * float(math.exp((2.0 * u - 1.0) * math.log(j)))
1057
+ q, k = _xpos(q, k, inv_freq, self.zeta,
1058
+ scale_base=self.cfg.xpos_scale_base,
1059
+ rope_scale=s,
1060
+ yarn=self.cfg.yarn, yarn_alpha=self.cfg.yarn_alpha,
1061
+ yarn_beta=self.cfg.yarn_beta,
1062
+ attn_temp=self.cfg.attn_temp,
1063
+ partial_k=self.cfg.rope_partial_k)
1064
+ q = q * (F.softplus(self.per_dim_scale) / math.log(2.0))
1065
+
1066
+ causal = self.axis == "time"
1067
+ # Bidirectional rows need their OWN mask. `_attend` sets
1068
+ # is_causal=(causal and attn_mask is None), so once a window mask is
1069
+ # supplied, causality comes from the MASK alone β€” and window_mask() is
1070
+ # built causal. Feeding the causal band to the bidirectional half
1071
+ # therefore makes future-known covariates causal, silently: no error, no
1072
+ # metric, just the Β§2 capability quietly gone. Verified by probe β€” a
1073
+ # future-cov row's dependence on a future position drops from 3.8e-2 to
1074
+ # exactly 0 the moment a window is enabled.
1075
+ bmask = attn_mask_bidir if attn_mask_bidir is not None else (
1076
+ None if attn_mask is None else attn_mask
1077
+ )
1078
+ # A block mask supersedes the additive one: it encodes the SAME
1079
+ # predicate, causality included, so passing both would be redundant and
1080
+ # passing the additive one alongside would force the slow path anyway.
1081
+ bb = block_mask_bidir if block_mask_bidir is not None else block_mask
1082
+ am = None if block_mask is not None else attn_mask
1083
+ ab = None if bb is not None else bmask
1084
+ if bidirectional_rows is None or not causal:
1085
+ attn = self._attend(q, k, v, causal=causal, attn_mask=am,
1086
+ block_mask=block_mask)
1087
+ elif bool(bidirectional_rows.all()):
1088
+ attn = self._attend(q, k, v, causal=False, attn_mask=ab, block_mask=bb)
1089
+ elif not bool(bidirectional_rows.any()):
1090
+ attn = self._attend(q, k, v, causal=True, attn_mask=am,
1091
+ block_mask=block_mask)
1092
+ else:
1093
+ bid = bidirectional_rows
1094
+ attn = torch.empty_like(q)
1095
+ attn[~bid] = self._attend(
1096
+ q[~bid], k[~bid], v[~bid], causal=True, attn_mask=am,
1097
+ block_mask=block_mask,
1098
+ )
1099
+ # Future-known covariates: bidirectional along time. Safe only
1100
+ # because variate_mask() forbids their queries from reading target
1101
+ # keys β€” otherwise this is the leak.
1102
+ attn[bid] = self._attend(
1103
+ q[bid], k[bid], v[bid], causal=False, attn_mask=ab, block_mask=bb,
1104
+ )
1105
+
1106
+ attn = attn.transpose(1, 2).reshape(N, T, self.cfg.num_heads * self.cfg.head_dim)
1107
+ x = self.attn_b * x + self.attn_a * self.proj(attn)
1108
+ x = self.mlp_b * x + self.mlp_a * self.mlp(self.norm2(x))
1109
+ return x
1110
+
1111
+
1112
+ class CascadeModel(nn.Module):
1113
+ """Patch transformer with CPM, alternating time/variate attention, and the
1114
+ Β§2/Β§3 role machinery. Predicts each position's NEXT patch as quantiles."""
1115
+
1116
+ def __init__(self, cfg: CascadeModelConfig):
1117
+ super().__init__()
1118
+ self.cfg = cfg
1119
+ if cfg.embed_skip_mlp > 0:
1120
+ # Toto-2.0 patch_proj: skip(64->d) + linear2(act(linear1(64->h)))
1121
+ self.patch_embed = _MLPHead(cfg.patch_size * 2,
1122
+ cfg.embed_skip_mlp, cfg.d_model)
1123
+ self.embed_mlp = nn.Identity()
1124
+ else:
1125
+ self.patch_embed = nn.Linear(cfg.patch_size * 2, cfg.d_model)
1126
+ self.embed_mlp = _ResidualMLP(cfg.d_model, cfg.ffn_hidden)
1127
+ # Β§2: learned 3-way role embedding, added AFTER the residual-MLP patch
1128
+ # projection so it colours the token the transformer sees, not the raw
1129
+ # patch. Zero-init β‡’ enabling roles starts as an exact no-op.
1130
+ self.role_embed = nn.Embedding(N_ROLES, cfg.d_model) if cfg.use_variate_roles else None
1131
+ # Zero-init: at step 0 a masked patch's token is the origin, close to
1132
+ # what the linear embed's bias-only output would be β€” trains freely.
1133
+ self.mask_token = (nn.Parameter(torch.zeros(cfg.d_model))
1134
+ if cfg.embed_mask_token else None)
1135
+ _plan = cfg.time_mixer_plan()
1136
+ self.blocks = nn.ModuleList(
1137
+ _Block(cfg, axis=cfg.layer_axis(i), block_idx=i, mixer=_plan[i])
1138
+ for i in range(cfg.num_layers)
1139
+ )
1140
+ self.norm = nn.LayerNorm(cfg.d_model, eps=1e-4, elementwise_affine=False)
1141
+ self.out_mlp = (nn.Identity() if cfg.no_out_mlp
1142
+ else _ResidualMLP(cfg.d_model, cfg.ffn_hidden))
1143
+ if cfg.head_mlp_hidden > 0:
1144
+ self.head = _MLPHead(cfg.d_model, cfg.head_mlp_hidden,
1145
+ cfg.patch_size * cfg.num_quantiles)
1146
+ else:
1147
+ self.head = nn.Linear(cfg.d_model, cfg.patch_size * cfg.num_quantiles)
1148
+ self.apply(self._init_weights)
1149
+ if self.role_embed is not None:
1150
+ nn.init.zeros_(self.role_embed.weight)
1151
+ if cfg.head_mlp_hidden > 0:
1152
+ # AFTER the global init: the zero-init contract in _MLPHead's
1153
+ # docstring only holds if nothing re-randomises linear2.
1154
+ nn.init.zeros_(self.head.linear2.weight)
1155
+ nn.init.zeros_(self.head.linear2.bias)
1156
+ for blk in self.blocks:
1157
+ blk.reset_gate_biases() # no-op on attention blocks
1158
+
1159
+ def _init_weights(self, m: nn.Module) -> None:
1160
+ if isinstance(m, nn.Linear):
1161
+ fan_in = m.weight.shape[1]
1162
+ nn.init.normal_(m.weight, mean=0.0, std=1.0 / math.sqrt(fan_in))
1163
+ if m.bias is not None:
1164
+ nn.init.zeros_(m.bias)
1165
+ elif isinstance(m, nn.Embedding):
1166
+ nn.init.normal_(m.weight, mean=0.0, std=0.02)
1167
+
1168
+ def forward(
1169
+ self,
1170
+ patches: torch.Tensor,
1171
+ mask: torch.Tensor | None = None,
1172
+ *,
1173
+ variate_types: torch.Tensor | None = None,
1174
+ group_ids: torch.Tensor | None = None,
1175
+ ) -> torch.Tensor:
1176
+ """``patches``: ``(B, P, ps)`` or ``(B, C, P, ps)``. ``mask``: binary,
1177
+ 1 = unobserved, patch-level or per-entry. ``variate_types``: ``(C,)`` in
1178
+ {0 target, 1 past-cov, 2 future-known-cov}. Returns
1179
+ ``(B, [C,] P, ps, num_q)``."""
1180
+ squeeze_variates = patches.dim() == 3
1181
+ if squeeze_variates:
1182
+ patches = patches[:, None]
1183
+ if mask is not None:
1184
+ mask = mask[:, None]
1185
+ B, C, P, ps = patches.shape
1186
+ if mask is None:
1187
+ mask = torch.zeros_like(patches)
1188
+ else:
1189
+ if mask.dim() == 3:
1190
+ mask = mask[..., None].expand(B, C, P, ps)
1191
+ mask = mask.to(patches.dtype)
1192
+ x = torch.cat([patches * (1.0 - mask), mask], dim=-1)
1193
+ x = self.embed_mlp(self.patch_embed(x)) # (B, C, P, d)
1194
+ if self.mask_token is not None:
1195
+ # Patch-level replacement only when EVERY entry is missing β€”
1196
+ # partially observed patches keep the embed path (it still sees
1197
+ # real values there).
1198
+ full = mask.mean(dim=-1, keepdim=True) >= 1.0 - 1e-6
1199
+ x = torch.where(full, self.mask_token.to(x.dtype).view(1, 1, 1, -1), x)
1200
+
1201
+ roles_on = self.cfg.use_variate_roles and variate_types is not None
1202
+ if roles_on:
1203
+ vt = variate_types.to(x.device).long().reshape(-1)
1204
+ if vt.numel() != C:
1205
+ raise ValueError(f"variate_types has {vt.numel()} entries; expected C={C}")
1206
+ x = x + self.role_embed(vt).view(1, C, 1, -1)
1207
+ # Row b*C+c has the type of channel c β€” matches the reshape below.
1208
+ bidir_rows = (vt == ROLE_FUTURE_COV).repeat(B)
1209
+ vmask = variate_mask(vt, group_ids)
1210
+ else:
1211
+ bidir_rows = None
1212
+ vmask = None
1213
+
1214
+ W = int(self.cfg.time_window)
1215
+ S = int(getattr(self.cfg, "attn_sinks", 0))
1216
+ tmask = (window_mask(P, W, causal=True, sinks=S, device=x.device)
1217
+ if W > 0 else None)
1218
+ # The SYMMETRIC band, for future-known covariate rows only: they are
1219
+ # bounded by the same window but may look forward within it. Built only
1220
+ # when such rows exist, so the univariate path allocates nothing.
1221
+ tmask_bidir = (
1222
+ window_mask(P, W, causal=False, sinks=S, device=x.device)
1223
+ if W > 0 and bidir_rows is not None and bool(bidir_rows.any())
1224
+ else None
1225
+ )
1226
+
1227
+ # flex_attention only earns its keep when a mask is needed at all: with
1228
+ # W=0 plain SDPA already takes the fused causal path and is the fastest
1229
+ # option, so this never engages there.
1230
+ bmask_t = bmask_b = None
1231
+ if W > 0 and str(getattr(self.cfg, "attn_impl", "sdpa")) == "flex":
1232
+ try:
1233
+ bmask_t = flex_block_mask(P, W, causal=True, sinks=S,
1234
+ device=x.device)
1235
+ if tmask_bidir is not None:
1236
+ bmask_b = flex_block_mask(P, W, causal=False, sinks=S,
1237
+ device=x.device)
1238
+ except Exception:
1239
+ # torch < 2.5, or no compatible backend. Fall back rather than
1240
+ # fail: the sdpa path is numerically identical, only slower.
1241
+ bmask_t = bmask_b = None
1242
+
1243
+ for blk in self.blocks:
1244
+ if blk.axis == "time":
1245
+ x = blk(
1246
+ x.reshape(B * C, P, -1),
1247
+ bidirectional_rows=bidir_rows, attn_mask=tmask,
1248
+ attn_mask_bidir=tmask_bidir,
1249
+ block_mask=bmask_t, block_mask_bidir=bmask_b,
1250
+ ).view(B, C, P, -1)
1251
+ else:
1252
+ x = (
1253
+ blk(x.transpose(1, 2).reshape(B * P, C, -1), attn_mask=vmask)
1254
+ .view(B, P, C, -1)
1255
+ .transpose(1, 2)
1256
+ )
1257
+ x = self.out_mlp(self.norm(x))
1258
+ out = self.head(x).view(B, C, P, ps, self.cfg.num_quantiles)
1259
+ return out[:, 0] if squeeze_variates else out
1260
+
1261
+
1262
+ # ── losses ───────────────────────────────────────────────────────────────────
1263
+
1264
+
1265
+ def pinball_loss(pred_q, target, levels) -> torch.Tensor:
1266
+ """Mean pinball loss. ``pred_q`` ``(..., num_q)``, ``target`` ``(...)``."""
1267
+ q = torch.tensor(levels, device=pred_q.device, dtype=pred_q.dtype)
1268
+ err = target.unsqueeze(-1) - pred_q
1269
+ return torch.maximum(q * err, (q - 1.0) * err).mean()
1270
+
1271
+
1272
+ def pinball_dense(
1273
+ pred_q: torch.Tensor,
1274
+ target: torch.Tensor,
1275
+ levels,
1276
+ *,
1277
+ horizon_mask: torch.Tensor,
1278
+ obs_mask: torch.Tensor | None = None,
1279
+ lam: float = 0.0,
1280
+ ) -> torch.Tensor:
1281
+ """Β§4 denser supervision: pinball on the CPM-masked region plus ``lam`` Γ—
1282
+ pinball on the observed region.
1283
+
1284
+ ``pred_q`` is ``(..., num_q)``, ``target`` and both masks broadcast to
1285
+ ``pred_q.shape[:-1]``. Each term is normalised by its own mask weight, so
1286
+ ``lam`` is a clean relative weight rather than something that drifts with
1287
+ how much CPM happened to mask this batch.
1288
+
1289
+ ``lam = 0`` reduces exactly to masked-region-only training (upstream). The
1290
+ hazard to keep in view: supervising the observed region is next-patch
1291
+ prediction on visible context, which is a SHORTER-horizon task than the one
1292
+ CPM exists to train, and the long-horizon gap versus classical baselines is
1293
+ Toto's stated top open problem. Read this sweep split by term length; the
1294
+ aggregate will hide the trade.
1295
+ """
1296
+ q = torch.tensor(levels, device=pred_q.device, dtype=pred_q.dtype)
1297
+ err = target.unsqueeze(-1) - pred_q
1298
+ loss = torch.maximum(q * err, (q - 1.0) * err) # (..., num_q)
1299
+ hm = horizon_mask.to(loss.dtype).unsqueeze(-1)
1300
+ h = (loss * hm).sum() / hm.sum().clamp(min=1.0)
1301
+ if lam == 0.0 or obs_mask is None:
1302
+ return h
1303
+ om = obs_mask.to(loss.dtype).unsqueeze(-1)
1304
+ o = (loss * om).sum() / om.sum().clamp(min=1.0)
1305
+ return h + lam * o
weights.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b0d17dbf670c83daaa477b2510cdaf89d5c0f2e744bed857ff69bf79be1f9ca3
3
+ size 70777960