Commit 75beec7
Codex CI R8 P1: cluster-aware sparse density gate + sparse+cluster regressions
Two related P1s on R8 (both about the sparse+cluster interaction).
P1 (Performance) — density gate is now cluster-aware
The R6 density gate counted ALL spatial in-range pairs before the
cluster mask was applied, but the actual CSR matrix stores only
within-cluster pairs (the inner row-loop drops cross-cluster
neighbors before populating row/col/data lists). On large clustered
panels — exactly the use case sparse+cluster is supposed to win —
spatial density could be ~100% while within-cluster density is tiny,
and we'd spuriously fall back to dense O(n²) work.
Fix: when the unrefined spatial density exceeds the threshold AND
`cluster_codes is not None`, refine by counting only within-cluster
in-range pairs (per-cluster kd-trees, summed). The refinement runs
only when needed (the gate is already cleared if spatial density is
below threshold), so the per-cluster sub-tree builds are amortized.
Stores the projected coordinates as `tree_coords` once on the
haversine branch (was `xyz` locally before; renaming makes the
per-cluster build symmetric across metrics).
P1 (Documentation/Tests) — sparse+cluster regression coverage
Sparse coverage previously exercised unclustered dense-vs-sparse
parity; cluster coverage previously exercised dense/estimator
behavior — but the combined sparse+cluster path was load-bearing
and untested. Adds three regressions:
- test_sparse_with_cluster_matches_dense: cross-sectional 600-row
panel, 8 clusters, dense vs forced-sparse parity at atol=1e-10.
- test_sparse_with_cluster_panel_matches_dense: 3-period block-
decomposed panel, 200 units, 5 time-invariant clusters, dense
vs forced-sparse parity at atol=1e-10.
- test_sparse_density_gate_cluster_aware: tight spatial cluster
(100% global density) + 50 small clusters → within-cluster
density << 30%. Locks the refinement contract: NO density
warning, sparse path executes, result matches dense.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 04a5fa1 commit 75beec7
2 files changed
Lines changed: 160 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
457 | 457 | | |
458 | 458 | | |
459 | 459 | | |
| 460 | + | |
460 | 461 | | |
461 | 462 | | |
462 | 463 | | |
463 | 464 | | |
464 | 465 | | |
| 466 | + | |
465 | 467 | | |
466 | 468 | | |
467 | 469 | | |
| |||
475 | 477 | | |
476 | 478 | | |
477 | 479 | | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
478 | 499 | | |
479 | 500 | | |
480 | 501 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3125 | 3125 | | |
3126 | 3126 | | |
3127 | 3127 | | |
| 3128 | + | |
| 3129 | + | |
| 3130 | + | |
| 3131 | + | |
| 3132 | + | |
| 3133 | + | |
| 3134 | + | |
| 3135 | + | |
| 3136 | + | |
| 3137 | + | |
| 3138 | + | |
| 3139 | + | |
| 3140 | + | |
| 3141 | + | |
| 3142 | + | |
| 3143 | + | |
| 3144 | + | |
| 3145 | + | |
| 3146 | + | |
| 3147 | + | |
| 3148 | + | |
| 3149 | + | |
| 3150 | + | |
| 3151 | + | |
| 3152 | + | |
| 3153 | + | |
| 3154 | + | |
| 3155 | + | |
| 3156 | + | |
| 3157 | + | |
| 3158 | + | |
| 3159 | + | |
| 3160 | + | |
| 3161 | + | |
| 3162 | + | |
| 3163 | + | |
| 3164 | + | |
| 3165 | + | |
| 3166 | + | |
| 3167 | + | |
| 3168 | + | |
| 3169 | + | |
| 3170 | + | |
| 3171 | + | |
| 3172 | + | |
| 3173 | + | |
| 3174 | + | |
| 3175 | + | |
| 3176 | + | |
| 3177 | + | |
| 3178 | + | |
| 3179 | + | |
| 3180 | + | |
| 3181 | + | |
| 3182 | + | |
| 3183 | + | |
| 3184 | + | |
| 3185 | + | |
| 3186 | + | |
| 3187 | + | |
| 3188 | + | |
| 3189 | + | |
| 3190 | + | |
| 3191 | + | |
| 3192 | + | |
| 3193 | + | |
| 3194 | + | |
| 3195 | + | |
| 3196 | + | |
| 3197 | + | |
| 3198 | + | |
| 3199 | + | |
| 3200 | + | |
| 3201 | + | |
| 3202 | + | |
| 3203 | + | |
| 3204 | + | |
| 3205 | + | |
| 3206 | + | |
| 3207 | + | |
| 3208 | + | |
| 3209 | + | |
| 3210 | + | |
| 3211 | + | |
| 3212 | + | |
| 3213 | + | |
| 3214 | + | |
| 3215 | + | |
| 3216 | + | |
| 3217 | + | |
| 3218 | + | |
| 3219 | + | |
| 3220 | + | |
| 3221 | + | |
| 3222 | + | |
| 3223 | + | |
| 3224 | + | |
| 3225 | + | |
| 3226 | + | |
| 3227 | + | |
| 3228 | + | |
| 3229 | + | |
| 3230 | + | |
| 3231 | + | |
| 3232 | + | |
| 3233 | + | |
| 3234 | + | |
| 3235 | + | |
| 3236 | + | |
| 3237 | + | |
| 3238 | + | |
| 3239 | + | |
| 3240 | + | |
| 3241 | + | |
| 3242 | + | |
| 3243 | + | |
| 3244 | + | |
| 3245 | + | |
| 3246 | + | |
| 3247 | + | |
| 3248 | + | |
| 3249 | + | |
| 3250 | + | |
| 3251 | + | |
| 3252 | + | |
| 3253 | + | |
| 3254 | + | |
| 3255 | + | |
| 3256 | + | |
| 3257 | + | |
| 3258 | + | |
| 3259 | + | |
| 3260 | + | |
| 3261 | + | |
| 3262 | + | |
| 3263 | + | |
| 3264 | + | |
| 3265 | + | |
| 3266 | + | |
3128 | 3267 | | |
3129 | 3268 | | |
3130 | 3269 | | |
| |||
0 commit comments