|
1 | 1 | # Capability Matrix — groupby_regression |
2 | 2 |
|
3 | | -**Generated:** 2026-02-16 08:00 UTC |
4 | | -**Phase:** 13.9.GB — GroupByRegressionEvaluator + Unified Metadata |
| 3 | +**Generated:** 2026-03-13 09:07 UTC |
| 4 | +**Phase:** Phase 13.11.GB |
5 | 5 | **Generator:** `scripts/generate_capability_matrix.py` |
6 | 6 |
|
7 | 7 | ## Summary |
8 | 8 |
|
9 | 9 | | Status | Count | % | |
10 | 10 | |--------|------:|--:| |
11 | | -| ✅ Verified | 34 | 30.4% | |
12 | | -| ☑️ Smoke-only | 77 | 68.8% | |
| 11 | +| ✅ Verified | 43 | 32.3% | |
| 12 | +| ☑️ Smoke-only | 89 | 66.9% | |
13 | 13 | | 🧨 Broken | 0 | 0.0% | |
14 | 14 | | ⚠️ Partial | 0 | 0.0% | |
15 | | -| 📋 Planned | 1 | 0.9% | |
16 | | -| **Total** | **112** | | |
| 15 | +| 📋 Planned | 1 | 0.8% | |
| 16 | +| **Total** | **133** | | |
17 | 17 |
|
18 | 18 | ## Test Layer Distribution (excluding verbose duplicates) |
19 | 19 |
|
20 | 20 | | Layer | Count | |
21 | 21 | |-------|------:| |
22 | | -| invariance | 88 | |
23 | | -| integration | 12 | |
24 | | -| performance | 6 | |
25 | | -| smoke | 211 | |
26 | | -| validation | 24 | |
27 | | -| **Total unique** | **341** | |
| 22 | +| invariance | 98 | |
| 23 | +| integration | 16 | |
| 24 | +| performance | 5 | |
| 25 | +| smoke | 265 | |
| 26 | +| validation | 28 | |
| 27 | +| **Total unique** | **412** | |
| 28 | + |
| 29 | +⚠️ **UNCLASSIFIED tests: 27** — defaulted to smoke (fail-closed rule §3.5) |
28 | 30 |
|
29 | 31 | ## groupby_regression |
30 | 32 |
|
|
49 | 51 |
|
50 | 52 | | Status | Feature | Tests | Inv/Int | Bench | Tag | |
51 | 53 | |--------|---------|------:|--------:|-------|-----| |
52 | | -| ✅ | **EVAL.boundary** — Boundary handling (clamp/nan/extrapolate) | 7 | 7 | | | |
53 | | -| ☑️ | **EVAL.construction** — Evaluator construction from dfGB | 7 | 0 | | | |
54 | | -| ✅ | **EVAL.export_roundtrip** — JSON export/import roundtrip | 6 | 6 | | | |
55 | | -| ✅ | **EVAL.ivar_weighting** — Inverse-variance weighted interpolation | 7 | 7 | | | |
56 | | -| ☑️ | **EVAL.metadata_construction** — Evaluator construction from metadata | 7 | 0 | | | |
57 | | -| ✅ | **EVAL.multi_target** — Multi-target evaluation | 3 | 3 | | | |
58 | | -| ✅ | **EVAL.multilinear** — Multilinear interpolation | 8 | 8 | | | |
59 | | -| ✅ | **EVAL.nearest** — Nearest-neighbor evaluation | 7 | 6 | | | |
60 | | -| ✅ | **EVAL.sparse_grid** — Sparse grid handling (invalid bins) | 6 | 6 | | | |
61 | | -| ✅ | **EVAL.sw_integration** — SW output integration | 2 | 2 | | | |
| 54 | +| ✅ | **EVAL.boundary** — Boundary handling invariance | 5 | 5 | | | |
| 55 | +| ✅ | **EVAL.construction** — Evaluator construction from dfGB | 16 | 2 | | | |
| 56 | +| ✅ | **EVAL.export_roundtrip** — Export/import roundtrip invariance | 6 | 6 | | | |
| 57 | +| ✅ | **EVAL.ivar_weighting** — Inverse-variance weighting invariance | 7 | 7 | | | |
| 58 | +| ☑️ | **EVAL.metadata_construction** — Evaluator construction from metadata dict | 7 | 0 | | | |
| 59 | +| ✅ | **EVAL.multi_target** — Multi-target evaluation invariance | 3 | 3 | | | |
| 60 | +| ✅ | **EVAL.multilinear** — Multilinear interpolation invariance | 16 | 16 | | | |
| 61 | +| ✅ | **EVAL.nearest** — Nearest-neighbor evaluation invariance | 4 | 4 | | | |
| 62 | +| ✅ | **EVAL.sparse_grid** — Sparse grid handling invariance | 4 | 4 | | | |
| 63 | +| ✅ | **EVAL.sw_integration** — Sliding window integration | 2 | 2 | | | |
| 64 | +| ✅ | **NLFIT.evaluator_option_a** — Evaluator Option A: interpolate params → evaluate model | 8 | 1 | | SCIPY | |
| 65 | +| ✅ | **NLFIT.evaluator_option_b** — Evaluator Option B: evaluate at corners → interpolate function values | 7 | 4 | | SCIPY | |
| 66 | +| ☑️ | **NLFIT.evaluator_params** — Evaluator parameter extraction | 1 | 0 | | SCIPY | |
62 | 67 |
|
63 | 68 | ## groupby_regression_kernels |
64 | 69 |
|
|
77 | 82 | | ☑️ | **KERNEL.status_codes** — Status code encoding/decoding | 4 | 0 | | | |
78 | 83 | | ☑️ | **KERNEL.streaming_memory** — Streaming RSS stability | 2 | 0 | ✓ | NUMBA | |
79 | 84 |
|
| 85 | +## groupby_regression_models |
| 86 | + |
| 87 | +| Status | Feature | Tests | Inv/Int | Bench | Tag | |
| 88 | +|--------|---------|------:|--------:|-------|-----| |
| 89 | +| ✅ | **NLFIT.gaussian_plus_line** — Gaussian + linear background model | 2 | 2 | | SCIPY | |
| 90 | +| ☑️ | **NLFIT.model_registry** — Named model registry | 5 | 0 | | | |
| 91 | +| ☑️ | **NLFIT.p0_estimation** — Automatic initial parameter estimation | 2 | 0 | | SCIPY | |
| 92 | + |
| 93 | +## groupby_regression_nonlinear |
| 94 | + |
| 95 | +| Status | Feature | Tests | Inv/Int | Bench | Tag | |
| 96 | +|--------|---------|------:|--------:|-------|-----| |
| 97 | +| ☑️ | **NLFIT.callable_dispatch** — Custom callable fit dispatch | 5 | 0 | | | |
| 98 | +| ✅ | **NLFIT.cross_engine_polynomial** — Polynomial cross-engine invariance | 1 | 1 | | SCIPY | |
| 99 | +| ✅ | **NLFIT.gaussian_peak_recovery** — Gaussian peak parameter recovery | 1 | 1 | | SCIPY | |
| 100 | +| ✅ | **NLFIT.multi_target_independence** — Multi-target independence invariance | 1 | 1 | | | |
| 101 | +| ☑️ | **NLFIT.named_model_dispatch** — Named model fit dispatch via scipy.optimize.curve_fit | 3 | 0 | | SCIPY | |
| 102 | +| ✅ | **NLFIT.polynomial_exact** — Polynomial exact coefficient recovery | 1 | 1 | | SCIPY | |
| 103 | +| ☑️ | **NLFIT.sw_reuse** — Sliding window infrastructure reuse | 2 | 0 | | | |
| 104 | +| ✅ | **NLFIT.weights_sigma** — Weights→sigma mapping invariance | 1 | 1 | | SCIPY | |
| 105 | + |
80 | 106 | ## groupby_regression_optimized |
81 | 107 |
|
82 | 108 | | Status | Feature | Tests | Inv/Int | Bench | Tag | |
|
139 | 165 |
|
140 | 166 | | Status | Feature | Tests | Inv/Int | Bench | Tag | |
141 | 167 | |--------|---------|------:|--------:|-------|-----| |
| 168 | +| ☑️ | **SW.agg_columns** — Sliding window agg_columns (COG) | 8 | 0 | | | |
142 | 169 | | ☑️ | **SW.aggregation** — Sliding window aggregation | 1 | 0 | | | |
143 | 170 | | ✅ | **SW.backend_auto** — Backend auto-dispatch | 2 | 1 | | | |
144 | 171 | | ☑️ | **SW.basic** — Sliding window basic 3D | 1 | 0 | | | |
145 | 172 | | ☑️ | **SW.bin_helpers** — Internal bin helpers | 2 | 0 | | | |
146 | 173 | | ☑️ | **SW.boundary** — Boundary truncation | 3 | 0 | | | |
147 | 174 | | ☑️ | **SW.empty_window** — Empty window handling | 1 | 0 | | | |
| 175 | +| ☑️ | **SW.fit_intercept_false** — fit_intercept=False column handling | 2 | 0 | | | |
148 | 176 | | ✅ | **SW.invariance** — Sliding window invariance tests | 8 | 8 | | | |
| 177 | +| ☑️ | **SW.lean_output** — Lean default output (no fit_column stats) | 2 | 0 | | | |
149 | 178 | | ✅ | **SW.linear_fit** — Sliding window linear fit | 1 | 1 | | | |
150 | 179 | | ☑️ | **SW.metadata** — Sliding window metadata | 1 | 0 | | | |
151 | 180 | | ☑️ | **SW.min_stat** — Minimum entries enforcement | 1 | 0 | | | |
152 | 181 | | ✅ | **SW.multi_predictor** — Sliding window multi-predictor | 2 | 1 | | | |
153 | 182 | | ☑️ | **SW.multi_target** — Sliding window multi-target | 1 | 0 | | | |
154 | 183 | | ☑️ | **SW.omitted_dims** — Omitted window dims default to 0 | 1 | 0 | | | |
155 | | -| ✅ | **SW.parallel** — Parallel sliding window (split-column) | 8 | 3 | ✓ | NUMBA | |
| 184 | +| ✅ | **SW.parallel** — Parallel sliding window (split-column) | 8 | 1 | ✓ | NUMBA | |
| 185 | +| ☑️ | **SW.parallel_agg** — Parallel sliding window with agg_columns | 2 | 0 | | | |
| 186 | +| ☑️ | **SW.parallel_fit_intercept** — Parallel fit_intercept=False | 1 | 0 | | | |
| 187 | +| ☑️ | **SW.parallel_safety** — Parallel total-failure safety | 1 | 0 | | | |
156 | 188 | | ☑️ | **SW.return_metadata** — Sliding window return_metadata | 1 | 0 | | | |
157 | 189 | | ☑️ | **SW.selection** — Sliding window selection mask | 1 | 0 | | | |
158 | 190 | | ☑️ | **SW.smoke_gate** — Realistic smoke normalised residuals | 1 | 0 | | | |
|
161 | 193 | | ✅ | **SW.v5_dominance** — V5 algorithm dominance across all backends | 2 | 2 | ✓ | NUMBA | |
162 | 194 | | ☑️ | **SW.validation** — Sliding window input validation | 5 | 0 | | | |
163 | 195 | | 📋 | **SW.weighted** — Sliding window weighted fits (WLS) | 0 | 0 | | PLANNED | |
| 196 | +| ☑️ | **SW.wls_weights** — WLS weights in sliding window | 5 | 0 | | | |
164 | 197 |
|
165 | 198 | ## synthetic_tpc_distortion |
166 | 199 |
|
|
190 | 223 | | V5.performance | bench_v5.py::timing [MONITOR] | 📊 MONITOR | |
191 | 224 | | XVAL.robust_v4_parity | bench_comparison.py::compute_agreement() [MONITOR] | 📊 MONITOR | |
192 | 225 |
|
| 226 | +## ⚠️ UNCLASSIFIED Tests (fail-closed → smoke) |
| 227 | + |
| 228 | +- `test_agg_columns.py::test_agg_columns_basic` |
| 229 | +- `test_agg_columns.py::test_agg_columns_matches_manual` |
| 230 | +- `test_agg_columns.py::test_agg_columns_median_optional` |
| 231 | +- `test_agg_columns.py::test_agg_columns_none_backward_compat` |
| 232 | +- `test_agg_columns.py::test_agg_columns_restores_fit_stats` |
| 233 | +- `test_agg_columns.py::test_agg_columns_restores_fit_stats` |
| 234 | +- `test_agg_columns.py::test_agg_columns_v5_matches_zerocopy` |
| 235 | +- `test_agg_columns.py::test_agg_columns_with_kernel_weights` |
| 236 | +- `test_agg_columns.py::test_default_no_fit_stats` |
| 237 | +- `test_agg_columns.py::test_default_no_fit_stats` |
| 238 | +- `test_parallel_sliding_window.py::TestParallelAggColumns::test_parallel_agg_matches_serial` |
| 239 | +- `test_parallel_sliding_window.py::TestParallelAggColumns::test_parallel_with_agg_columns` |
| 240 | +- `test_parallel_sliding_window.py::TestParallelErrorHandling::test_missing_split_column_raises` |
| 241 | +- `test_parallel_sliding_window.py::TestParallelErrorHandling::test_on_error_nan_continues` |
| 242 | +- `test_parallel_sliding_window.py::TestParallelFitIntercept::test_parallel_fit_intercept_false` |
| 243 | +- `test_parallel_sliding_window.py::TestParallelMissingUnits::test_missing_sectors` |
| 244 | +- `test_parallel_sliding_window.py::TestParallelPerformance::test_parallel_faster` |
| 245 | +- `test_parallel_sliding_window.py::TestParallelSafety::test_parallel_total_failure_raises` |
| 246 | +- `test_parallel_sliding_window.py::TestParallelSchema::test_output_has_split_columns` |
| 247 | +- `test_parallel_sliding_window.py::TestParallelSingleWorker::test_single_vs_multi_worker` |
| 248 | +- `test_wls_weights.py::test_fit_intercept_false_no_intercept_columns` |
| 249 | +- `test_wls_weights.py::test_fit_intercept_false_slope_correct` |
| 250 | +- `test_wls_weights.py::test_wls_all_paths_match` |
| 251 | +- `test_wls_weights.py::test_wls_changes_coefficients` |
| 252 | +- `test_wls_weights.py::test_wls_positive_intercept_ms` |
| 253 | +- `test_wls_weights.py::test_wls_recovers_known_slope` |
| 254 | +- `test_wls_weights.py::test_wls_uniform_weights_equals_ols` |
| 255 | + |
193 | 256 | --- |
194 | 257 |
|
195 | | -*Two-tier verification per Phase 13.9.GB v02 proposal.* |
| 258 | +*Two-tier verification per Phase 13.11.GB v02 proposal.* |
196 | 259 | *✅ = invariance/integration test exists. ☑️ = smoke tests only — does not catch numerical regressions.* |
197 | 260 | *Verbose SW duplicates (1 files) deduplicated per §3.6.* |
0 commit comments