Current task: —

E-022b-valley-analysis.py

Experiments: E-022b · script updated 08-19-2026

E-022b-valley.csv — 87.2 KB, updated 08-19-2026

← prev page 7 of 10 · 500/page · 4600 rows next →
# azlogK
3002 10 26.000 2.993070
3003 10 26.050 2.989075
3004 10 26.100 2.986596
3005 10 26.150 2.987751
3006 10 26.200 2.991303
3007 10 26.250 2.994223
3008 10 26.300 2.994427
3009 10 26.350 2.992310
3010 10 26.400 2.990068
3011 10 26.450 2.989693
3012 10 26.500 2.991366
3013 10 26.550 2.993553
3014 10 26.600 2.994491
3015 10 26.650 2.993674
3016 10 26.700 2.992124
3017 10 26.750 2.991380
3018 10 26.800 2.992150
3019 10 26.850 2.993764
3020 10 26.900 2.994833
3021 10 26.950 2.994455
3022 10 27.000 2.992947
3023 10 27.050 2.991531
3024 10 27.100 2.991315
3025 10 27.150 2.992408
3026 10 27.200 2.993907
3027 10 27.250 2.994704
3028 10 27.300 2.994384
3029 10 27.350 2.993491
3030 10 27.400 2.992972
3031 10 27.450 2.993324
3032 10 27.500 2.994160
3033 10 27.550 2.994581
3034 10 27.600 2.994001
3035 10 27.650 2.992712
3036 10 27.700 2.991696
3037 10 27.750 2.991808
3038 10 27.800 2.993038
3039 10 27.850 2.994473
3040 10 27.900 2.995038
3041 10 27.950 2.994382
3042 10 28.000 2.993165
3043 10 28.050 2.992491
3044 10 28.100 2.992944
3045 10 28.150 2.994061
3046 10 28.200 2.994725
3047 10 28.250 2.994163
3048 10 28.300 2.992683
3049 10 28.350 2.991470
3050 10 28.400 2.991577
3051 10 28.450 2.992947
3052 10 28.500 2.994375
3053 10 28.550 2.994527
3054 10 28.600 2.993137
3055 10 28.650 2.991334
3056 10 28.700 2.990727
3057 10 28.750 2.991955
3058 10 28.800 2.994001
3059 10 28.850 2.994980
3060 10 28.900 2.993803
3061 10 28.950 2.991250
3062 10 29.000 2.989431
3063 10 29.050 2.989935
3064 10 29.100 2.992250
3065 10 29.150 2.994012
3066 10 29.200 2.993073
3067 10 29.250 2.989631
3068 10 29.300 2.986446
3069 10 29.350 2.986607
3070 10 29.400 2.990498
3071 10 29.450 2.994832
3072 10 29.500 2.995091
3073 10 29.550 2.989564
3074 10 29.600 2.981580
3075 10 29.650 2.977560
3076 10 29.700 2.981444
3077 10 29.750 2.990005
3078 10 29.800 2.994163
3079 10 29.850 2.986164
3080 10 29.900 2.967310
3081 10 29.950 2.950256
3082 10 30.000 2.951125
3083 10 30.050 2.972898
3084 10 30.100 2.994363
3085 10 30.150 2.975945
3086 10 30.200 2.871810
3087 10 30.250 2.632464
3088 10 30.300 2.192752
3089 10 30.350 1.442782
3090 10 30.400 0.291934
3091 10 30.450 0.297581
3092 10 30.500 1.447567
3093 10 30.550 2.195727
3094 10 30.600 2.634276
3095 10 30.650 2.872746
3096 10 30.700 2.976095
3097 10 30.750 2.993772
3098 10 30.800 2.971749
3099 10 30.850 2.949883
3100 10 30.900 2.949513
3101 10 30.950 2.967361
3102 10 31.000 2.986733
3103 10 31.050 2.994542
3104 10 31.100 2.989528
3105 10 31.150 2.980012
3106 10 31.200 2.975816
3107 10 31.250 2.980392
3108 10 31.300 2.989151
3109 10 31.350 2.994653
3110 10 31.400 2.993097
3111 10 31.450 2.986875
3112 10 31.500 2.982024
3113 10 31.550 2.982946
3114 10 31.600 2.988721
3115 10 31.650 2.994202
3116 10 31.700 2.994637
3117 10 31.750 2.989659
3118 10 31.800 2.983576
3119 10 31.850 2.981761
3120 10 31.900 2.985890
3121 10 31.950 2.992220
3122 10 32.000 2.994688
3123 10 32.050 2.990171
3124 10 32.100 2.981567
3125 10 32.150 2.976035
3126 10 32.200 2.978947
3127 10 32.250 2.988183
3128 10 32.300 2.994589
3129 10 32.350 2.989056
3130 10 32.400 2.970874
3131 10 32.450 2.951281
3132 10 32.500 2.947370
3133 10 32.550 2.966122
3134 10 32.600 2.990901
3135 10 32.650 2.984503
3136 10 32.700 2.901711
3137 10 32.750 2.694390
3138 10 32.800 2.302459
3139 10 32.850 1.628172
3140 10 32.900 0.538995
3141 10 32.950 0.088402
3142 10 33.000 1.242919
3143 10 33.050 2.073566
3144 10 33.100 2.564085
3145 10 33.150 2.836896
3146 10 33.200 2.963230
3147 10 33.250 2.994449
3148 10 33.300 2.977232
3149 10 33.350 2.953515
3150 10 33.400 2.948955
3151 10 33.450 2.964396
3152 10 33.500 2.984396
3153 10 33.550 2.994586
3154 10 33.600 2.991734
3155 10 33.650 2.982823
3156 10 33.700 2.977547
3157 10 33.750 2.980355
3158 10 33.800 2.988003
3159 10 33.850 2.993866
3160 10 33.900 2.994007
3161 10 33.950 2.989784
3162 10 34.000 2.985846
3163 10 34.050 2.985822
3164 10 34.100 2.989448
3165 10 34.150 2.993406
3166 10 34.200 2.994616
3167 10 34.250 2.992778
3168 10 34.300 2.990214
3169 10 34.350 2.989507
3170 10 34.400 2.991190
3171 10 34.450 2.993495
3172 10 34.500 2.994197
3173 10 34.550 2.992671
3174 10 34.600 2.990360
3175 10 34.650 2.989386
3176 10 34.700 2.990632
3177 10 34.750 2.993047
3178 10 34.800 2.994708
3179 10 34.850 2.994556
3180 10 34.900 2.993205
3181 10 34.950 2.992213
3182 10 35.000 2.992554
3183 10 35.050 2.993744
3184 10 35.100 2.994390
3185 10 35.150 2.993588
3186 10 35.200 2.991815
3187 10 35.250 2.990523
3188 10 35.300 2.990808
3189 10 35.350 2.992395
3190 10 35.400 2.993911
3191 10 35.450 2.994156
3192 10 35.500 2.993174
3193 10 35.550 2.992141
3194 10 35.600 2.992191
3195 10 35.650 2.993287
3196 10 35.700 2.994233
3197 10 35.750 2.993847
3198 10 35.800 2.992169
3199 10 35.850 2.990529
3200 10 35.900 2.990346
3201 10 35.950 2.991720
3202 10 36.000 2.993222
3203 10 36.050 2.993188
3204 10 36.100 2.991361
3205 10 36.150 2.989332
3206 10 36.200 2.989196
3207 10 36.250 2.991502
3208 10 36.300 2.994445
3209 10 36.350 2.995264
3210 10 36.400 2.992743
3211 10 36.450 2.988574
3212 10 36.500 2.986162
3213 10 36.550 2.987557
3214 10 36.600 2.991199
3215 10 36.650 2.992926
3216 10 36.700 2.989700
3217 10 36.750 2.982904
3218 10 36.800 2.978045
3219 10 36.850 2.980178
3220 10 36.900 2.988379
3221 10 36.950 2.994874
3222 10 37.000 2.990757
3223 10 37.050 2.974166
3224 10 37.100 2.954760
3225 10 37.150 2.949037
3226 10 37.200 2.965217
3227 10 37.250 2.988734
3228 10 37.300 2.983461
3229 10 37.350 2.903956
3230 10 37.400 2.701492
3231 10 37.450 2.315843
3232 10 37.500 1.650005
3233 10 37.550 0.568469
3234 10 37.600 0.070253
3235 10 37.650 1.221341
3236 10 37.700 2.060897
3237 10 37.750 2.556318
3238 10 37.800 2.831990
3239 10 37.850 2.960264
3240 10 37.900 2.992987
3241 10 37.950 2.976889
3242 10 38.000 2.953678
3243 10 38.050 2.948892
3244 10 38.100 2.963741
3245 10 38.150 2.983414
3246 10 38.200 2.993918
3247 10 38.250 2.991848
3248 10 38.300 2.983549
3249 10 38.350 2.978083
3250 10 38.400 2.979861
3251 10 38.450 2.986351
3252 10 38.500 2.991820
3253 10 38.550 2.992684
3254 10 38.600 2.989816
3255 10 38.650 2.986857
3256 10 38.700 2.986683
3257 10 38.750 2.989172
3258 10 38.800 2.991926
3259 10 38.850 2.992777
3260 10 38.900 2.991570
3261 10 38.950 2.989880
3262 10 39.000 2.989298
3263 10 39.050 2.990033
3264 10 39.100 2.991043
3265 10 39.150 2.991309
3266 10 39.200 2.990848
3267 10 39.250 2.990501
3268 10 39.300 2.990873
3269 10 39.350 2.991608
3270 10 39.400 2.991799
3271 10 39.450 2.991055
3272 10 39.500 2.990067
3273 10 39.550 2.989948
3274 10 39.600 2.990968
3275 10 39.650 2.992016
3276 10 39.700 2.991561
3277 10 39.750 2.989303
3278 10 39.800 2.986861
3279 10 39.850 2.986519
3280 10 39.900 2.988898
3281 10 39.950 2.991795
3282 10 40.000 2.991757
3283 10 40.050 2.987333
3284 10 40.100 2.981155
3285 10 40.150 2.978453
3286 10 40.200 2.982315
3287 10 40.250 2.989610
3288 10 40.300 2.992181
3289 10 40.350 2.983384
3290 10 40.400 2.965210
3291 10 40.450 2.950114
3292 10 40.500 2.952836
3293 10 40.550 2.974292
3294 10 40.600 2.991755
3295 10 40.650 2.965129
3296 10 40.700 2.848190
3297 10 40.750 2.589938
3298 10 40.800 2.121029
3299 10 40.850 1.323105
3300 10 40.900 0.159503
3301 10 40.950 0.446511
3302 10 41.000 1.564394
3303 10 41.050 2.265363
3304 10 41.100 2.672941
3305 10 41.150 2.889869
3306 10 41.200 2.978781
3307 10 41.250 2.989215
3308 10 41.300 2.967112
3309 10 41.350 2.949719
3310 10 41.400 2.953347
3311 10 41.450 2.971157
3312 10 41.500 2.987092
3313 10 41.550 2.991371
3314 10 41.600 2.985630
3315 10 41.650 2.978470
3316 10 41.700 2.977176
3317 10 41.750 2.982179
3318 10 41.800 2.988364
3319 10 41.850 2.990791
3320 10 41.900 2.988900
3321 10 41.950 2.986067
3322 10 42.000 2.985745
3323 10 42.050 2.988085
3324 10 42.100 2.990169
3325 10 42.150 2.989336
3326 10 42.200 2.986057
3327 10 42.250 2.983572
3328 10 42.300 2.984571
3329 10 42.350 2.988149
3330 10 42.400 2.990322
3331 10 42.450 2.987911
3332 10 42.500 2.982136
3333 10 42.550 2.978306
3334 10 42.600 2.981006
3335 10 42.650 2.988640
3336 10 42.700 2.993164
3337 10 42.750 2.986428
3338 10 42.800 2.968344
3339 10 42.850 2.950391
3340 10 42.900 2.948960
3341 10 42.950 2.968929
3342 10 43.000 2.991030
3343 10 43.050 2.976250
3344 10 43.100 2.878328
3345 10 43.150 2.647487
3346 10 43.200 2.219336
3347 10 43.250 1.486371
3348 10 43.300 0.343941
3349 10 43.350 0.248432
3350 10 43.400 1.406009
3351 10 43.450 2.170186
3352 10 43.500 2.618174
3353 10 43.550 2.862718
3354 10 43.600 2.970441
3355 10 43.650 2.991473
3356 10 43.700 2.971825
3357 10 43.750 2.951037
3358 10 43.800 2.950383
3359 10 43.850 2.967223
3360 10 43.900 2.985876
3361 10 43.950 2.993918
3362 10 44.000 2.989968
3363 10 44.050 2.981451
3364 10 44.100 2.977129
3365 10 44.150 2.980251
3366 10 44.200 2.987322
3367 10 44.250 2.992518
3368 10 44.300 2.992849
3369 10 44.350 2.989845
3370 10 44.400 2.987353
3371 10 44.450 2.987878
3372 10 44.500 2.990675
3373 10 44.550 2.992949
3374 10 44.600 2.992653
3375 10 44.650 2.990231
3376 10 44.700 2.988002
3377 10 44.750 2.987994
3378 10 44.800 2.990211
3379 10 44.850 2.992829
3380 10 44.900 2.993938
3381 10 44.950 2.993144
3382 10 45.000 2.991673
3383 10 45.050 2.991069
3384 10 45.100 2.991754
3385 10 45.150 2.992752
3386 10 45.200 2.992755
3387 10 45.250 2.991453
3388 10 45.300 2.989885
3389 10 45.350 2.989529
3390 10 45.400 2.990950
3391 10 45.450 2.993263
3392 10 45.500 2.994876
3393 10 45.550 2.994833
3394 10 45.600 2.993530
3395 10 45.650 2.992258
3396 10 45.700 2.991998
3397 10 45.750 2.992588
3398 10 45.800 2.992993
3399 10 45.850 2.992397
3400 10 45.900 2.991055
3401 10 45.950 2.990112
3402 10 46.000 2.990543
3403 10 46.050 2.992181
3404 10 46.100 2.993767
3405 10 46.150 2.994017
3406 10 46.200 2.992732
3407 10 46.250 2.990963
3408 10 46.300 2.990055
3409 10 46.350 2.990436
3410 10 46.400 2.991282
3411 10 46.450 2.991396
3412 10 46.500 2.990491
3413 10 46.550 2.989596
3414 10 46.600 2.990101
3415 10 46.650 2.992213
3416 10 46.700 2.994353
3417 10 46.750 2.994280
3418 10 46.800 2.991144
3419 10 46.850 2.986651
3420 10 46.900 2.984094
3421 10 46.950 2.985622
3422 10 47.000 2.990020
3423 10 47.050 2.993270
3424 10 47.100 2.991808
3425 10 47.150 2.985892
3426 10 47.200 2.980114
3427 10 47.250 2.979904
3428 10 47.300 2.986187
3429 10 47.350 2.993088
3430 10 47.400 2.991771
3431 10 47.450 2.977982
3432 10 47.500 2.957806
3433 10 47.550 2.946324
3434 10 47.600 2.955910
3435 10 47.650 2.980360
3436 10 47.700 2.990347
3437 10 47.750 2.943308
3438 10 47.800 2.792664
3439 10 47.850 2.484933
3440 10 47.900 1.941417
3441 10 47.950 1.027776
3442 10 48.000 -0.031353
3443 10 48.050 0.782808
3444 10 48.100 1.791296
3445 10 48.150 2.399231
3446 10 48.200 2.747276
3447 10 48.250 2.923413
3448 10 48.300 2.985021
3449 10 48.350 2.981067
3450 10 48.400 2.957226
3451 10 48.450 2.946621
3452 10 48.500 2.957670
3453 10 48.550 2.977520
3454 10 48.600 2.989880
3455 10 48.650 2.988881
3456 10 48.700 2.980485
3457 10 48.750 2.974816
3458 10 48.800 2.976675
3459 10 48.850 2.982277
3460 10 48.900 2.984608
3461 10 48.950 2.981097
3462 10 49.000 2.976114
3463 10 49.050 2.976206
3464 10 49.100 2.982422
3465 10 49.150 2.987726
3466 10 49.200 2.983051
3467 10 49.250 2.966844
3468 10 49.300 2.949823
3469 10 49.350 2.948545
3470 10 49.400 2.968182
3471 10 49.450 2.989054
3472 10 49.500 2.971169
3473 10 49.550 2.867260
3474 10 49.600 2.626464
3475 10 49.650 2.182411
3476 10 49.700 1.423697
3477 10 49.750 0.267596
3478 10 49.800 0.322260
3479 10 49.850 1.465672
3480 10 49.900 2.203491
3481 10 49.950 2.635491
3482 10 50.000 2.870349
3483 10 50.050 2.972706
3484 10 50.100 2.991560
3485 10 50.150 2.971653
3486 10 50.200 2.950981
3487 10 50.250 2.949853
3488 10 50.300 2.965937
3489 10 50.350 2.984436
3490 10 50.400 2.993219
3491 10 50.450 2.990258
3492 10 50.500 2.981992
3493 10 50.550 2.976813
3494 10 50.600 2.978676
3495 10 50.650 2.985192
3496 10 50.700 2.990926
3497 10 50.750 2.992202
3498 10 50.800 2.989483
3499 10 50.850 2.986268
3500 10 50.900 2.985897
3501 10 50.950 2.988879

E-022b-valley.json — 3.5 KB, updated 08-19-2026

JSON sidecar (click to expand)
{
  "experiment": "E-022b",
  "task": "2.10 analysis: K-diagonal valleys + mass concentration",
  "script": "research/numerics/scripts/E-022b-valley-analysis.py",
  "checks": {
    "V1_valleys_at_gamma": true,
    "V2_mass_concentrated": true,
    "V4_fit_quality": true
  },
  "key_values": {
    "4": {
      "valley_depth": 2.1593140478568413,
      "logK_at_gamma": -0.106956845297883,
      "logK_at_midpoints": 2.0523572025589583,
      "mass_frac_pm0.1": 0.6338714893637662,
      "uniform_expectation": 0.09000000000000001,
      "mass_ratio_vs_uniform": 7.043016548486291,
      "within_bin_meanlogw": {
        "z10-60_d0.0-0.1": 0.05321233524569066,
        "z10-60_d0.3-0.7": -1.7997896503200193,
        "z120-200_d0.0-0.1": 0.10247759965464488,
        "z120-200_d0.3-0.7": -1.7570525979064509
      },
      "elapsed_s": 2.9
    },
    "6": {
      "valley_depth": 2.5087271936533595,
      "logK_at_gamma": -0.04029578260580941,
      "logK_at_midpoints": 2.46843141104755,
      "mass_frac_pm0.1": 0.6986826134175042,
      "uniform_expectation": 0.09000000000000001,
      "mass_ratio_vs_uniform": 7.7631401490833785,
      "within_bin_meanlogw": {
        "z10-60_d0.0-0.1": -0.10145611105454076,
        "z10-60_d0.3-0.7": -2.4097253102207548,
        "z120-200_d0.0-0.1": 0.029192545882919238,
        "z120-200_d0.3-0.7": -2.314439077156247
      },
      "elapsed_s": 5.1
    },
    "8": {
      "valley_depth": 2.7352201581877043,
      "logK_at_gamma": 0.030554703235580436,
      "logK_at_midpoints": 2.7657748614232847,
      "mass_frac_pm0.1": 0.7251109123178877,
      "uniform_expectation": 0.09000000000000001,
      "mass_ratio_vs_uniform": 8.056787914643197,
      "within_bin_meanlogw": {
        "z10-60_d0.0-0.1": -0.1389960979715335,
        "z10-60_d0.3-0.7": -2.7392603482112916,
        "z120-200_d0.0-0.1": -0.20043183472111312,
        "z120-200_d0.3-0.7": -2.6451890375288283
      },
      "elapsed_s": 7.9
    },
    "10": {
      "valley_depth": 2.8706885758089333,
      "logK_at_gamma": 0.11948603922925684,
      "logK_at_midpoints": 2.9901746150381903,
      "mass_frac_pm0.1": 0.7251715332604941,
      "uniform_expectation": 0.09000000000000001,
      "mass_ratio_vs_uniform": 8.057461480672156,
      "within_bin_meanlogw": {
        "z10-60_d0.0-0.1": -0.07371951844373904,
        "z10-60_d0.3-0.7": -2.974563705268562,
        "z120-200_d0.0-0.1": -0.2233480705431757,
        "z120-200_d0.3-0.7": -2.8788847145178686
      },
      "elapsed_s": 11.4
    },
    "12": {
      "valley_depth": 2.9442229398281423,
      "logK_at_gamma": 0.22834844487190686,
      "logK_at_midpoints": 3.172571384700049,
      "mass_frac_pm0.1": 0.7241062961289328,
      "uniform_expectation": 0.09000000000000001,
      "mass_ratio_vs_uniform": 8.045625512543698,
      "within_bin_meanlogw": {
        "z10-60_d0.0-0.1": -0.1831905054381875,
        "z10-60_d0.3-0.7": -3.1605455546413452,
        "z120-200_d0.0-0.1": -0.35321115246295404,
        "z120-200_d0.3-0.7": -3.0663074224107776
      },
      "elapsed_s": 15.5
    },
    "V4_saturation_fit": {
      "Delta_inf": 3.3338697242432738,
      "c": 4.760242352939846,
      "max_resid": 0.03176880509994007
    },
    "valley_depths": {
      "4.0": 2.1593140478568413,
      "6.0": 2.5087271936533595,
      "8.0": 2.7352201581877043,
      "10.0": 2.8706885758089333,
      "12.0": 2.9442229398281423
    }
  },
  "elapsed_seconds": 59.7,
  "timestamp_utc": "2026-08-19T17:37:47.138364+00:00"
}

Source code

Python script (click to expand)
"""E-022b — task 2.10 analysis stage: reproducing-kernel valley structure
and gamma-mass concentration (post-hoc analysis of E-022).

E-022 found the coarse weak metric flat (O3) but a persistent mass
elevation near the true zeros. This script resolves the mechanism:

  K_a(z,z) := Re(b_z^H v), v the bordered (L^2_0) Galerkin solution of
  T_a v = e^{-izx} — the diagonal of the model-space reproducing kernel.

Measurements (a in {4,6,8,10,12}, theta=pi):
  V1. valley depth: Delta(a) = mean log K at gamma-gap midpoints minus
      mean log K at gammas, z-grid step 0.05 in [14,60).
  V2. mass concentration: fraction of the E-022 spectral mass within
      +/-0.1 of a true zero (vs uniform-lattice expectation).
  V3. artifact control: mean log w vs distance-to-nearest-gamma WITHIN
      z-bins (controls the gamma-density/weight-trend confound that
      naive O5 fails — shifted-gamma null test showed the raw O5
      elevation is mostly distributional).
  V4. saturation model: Delta(a) ~ Delta_inf - c/a fit.

Outputs: research/numerics/data/E-022b-valley.csv (+ .json)
"""
import importlib.util
import json
import sys
import time
from datetime import datetime, timezone
from pathlib import Path

import mpmath as mp
import numpy as np
import scipy.linalg

REPO = Path(__file__).resolve().parents[3]
DATA = REPO / "research" / "numerics" / "data"
CSV = DATA / "E-022b-valley.csv"
JSON = DATA / "E-022b-valley.json"

spec = importlib.util.spec_from_file_location(
    "E16", Path(__file__).with_name("E-016-herglotz-fine-structure.py"))
E16 = importlib.util.module_from_spec(spec)
spec.loader.exec_module(E16)                     # runs the e^20 sieve
sys.path.insert(0, str(Path(__file__).parent))
from prime_backend_v2 import PrimeBackendV2       # noqa: E402

H = E16.H_MAIN
LAM = E16.LAM_SHIFT
A_LIST = (4.0, 6.0, 8.0, 10.0, 12.0)
XN = E16.XN


def collect_t_points(a, h):
    n_elem = int(round(2 * a / h))
    pts = []

    def add_quad(lo, hi, peak):
        n_lo = int(np.ceil(np.exp(lo)))
        n_hi = int(np.floor(np.exp(hi)))
        if n_hi - n_lo > 64:
            for aa, bb in ((lo, peak), (peak, hi)):
                if bb - aa > 0:
                    mid, half = 0.5 * (aa + bb), 0.5 * (bb - aa)
                    pts.extend(mid + half * XN)
            return
        segs = sorted({lo, peak, hi} |
                      {float(np.log(n))
                       for n in range(max(n_lo, 2), n_hi + 1)
                       if lo < np.log(n) < hi})
        for p0, p1 in zip(segs, segs[1:]):
            if p1 - p0 > 0:
                mid, half = 0.5 * (p0 + p1), 0.5 * (p1 - p0)
                pts.extend(mid + half * XN)

    for k in range(n_elem):
        if k == 0:
            add_quad(0.0, h, 0.0)
        else:
            add_quad((k - 1) * h, (k + 1) * h, k * h)
    return np.array(pts)


def make_K1(a):
    x, h, Q, M, _b = E16.build(a, H)
    n = Q.shape[0]
    mc = np.zeros(n)
    mc[0] = 2 * h / 3
    mc[1] = h / 6
    tc = Q[:, 0] - LAM * mc
    u1 = scipy.linalg.solve_toeplitz((tc, tc), np.ones(n))
    s1 = u1.sum()

    def K1(z):
        bz = E16.hat_FT(np.array([z]), h)[0] * np.exp(-1j * z * x)
        u0 = scipy.linalg.solve_toeplitz((tc, tc), bz)
        v = u0 - (u0.sum() / s1) * u1
        return float(np.real(np.conj(bz) @ v))

    return K1


def main() -> int:
    if JSON.exists() and "--force" not in sys.argv:
        print(f"cached: {JSON} (use --force to recompute)")
        return 0
    t0 = time.time()

    tq = np.concatenate([collect_t_points(a, H) for a in A_LIST])
    be = PrimeBackendV2(tq)
    be.load_cache(DATA / "E-022-backend-cache.npz")
    E16._BUILD.clear()
    E16.prime_sum_vec = be.prime_sum

    mp.mp.dps = 30
    gam_all = np.array([float(mp.zetazero(k).imag)
                        for k in range(1, 201)])
    gam = gam_all[gam_all <= 280]

    # E-022 weights
    import csv as csvmod
    data = {}
    with open(DATA / "E-022-spectral-measure.csv") as f:
        for r in csvmod.DictReader(f):
            data.setdefault(float(r["a"]), []).append(
                (float(r["z_k"]), float(r["w_k"])))

    zgrid = np.arange(14.0, 60.0, 0.05)
    gsel = gam_all[(gam_all >= 14) & (gam_all < 60)]
    mids = (gsel[:-1] + gsel[1:]) / 2
    idxg = np.round((gsel - 14) / 0.05).astype(int)
    idxm = np.round((mids - 14) / 0.05).astype(int)

    per_a = {}
    grid_rows = []
    for a in A_LIST:
        ta = time.time()
        K1 = make_K1(a)
        lg = np.array([np.log(K1(z)) for z in zgrid])
        dip = float(lg[idxm].mean() - lg[idxg].mean())
        # mass fraction within +-0.1 of gamma (full window to 280)
        z = np.array([p[0] for p in data[a]])
        w = np.array([p[1] for p in data[a]])
        m = z <= 280
        zm, wm = z[m], w[m]
        idx = np.clip(np.searchsorted(gam, zm), 1, len(gam) - 1)
        d = np.minimum(np.abs(zm - gam[idx - 1]), np.abs(zm - gam[idx]))
        frac = float(wm[d <= 0.1].sum() / wm.sum())
        unif = float(0.2 * len(gam) / 280.0)
        # V3: within-z-bin mean log w by distance bin
        lw = np.log(wm)
        bins = {}
        for lo, hi in ((10, 60), (120, 200)):
            sel = (zm >= lo) & (zm < hi)
            for blo, bhi in ((0.0, 0.1), (0.3, 0.7)):
                s2 = sel & (d >= blo) & (d < bhi)
                if s2.sum() > 3:
                    bins[f"z{lo}-{hi}_d{blo}-{bhi}"] = float(lw[s2].mean())
        per_a[f"{a:g}"] = {
            "valley_depth": dip,
            "logK_at_gamma": float(lg[idxg].mean()),
            "logK_at_midpoints": float(lg[idxm].mean()),
            "mass_frac_pm0.1": frac,
            "uniform_expectation": unif,
            "mass_ratio_vs_uniform": frac / unif,
            "within_bin_meanlogw": bins,
            "elapsed_s": round(time.time() - ta, 1),
        }
        print(f"a={a:g}: dip={dip:.4f}, massfrac={frac:.4f} "
              f"({per_a[f'{a:g}']['elapsed_s']}s)", flush=True)
        for zz, ll in zip(zgrid, lg):
            grid_rows.append((a, zz, ll))

    # V4: saturation fit Delta(a) = Dinf - c/a
    av = np.array(A_LIST)
    dv = np.array([per_a[f"{a:g}"]["valley_depth"] for a in A_LIST])
    Afit = np.vstack([np.ones_like(av), -1.0 / av]).T
    Dinf, c = np.linalg.lstsq(Afit, dv, rcond=None)[0]
    resid = dv - (Dinf - c / av)
    print(f"V4: Delta_inf = {Dinf:.3f}, c = {c:.3f}, "
          f"max fit resid {np.abs(resid).max():.4f}", flush=True)

    checks = {
        "V1_valleys_at_gamma": bool(np.all(dv > 1.5)),
        "V2_mass_concentrated": bool(np.all(
            [per_a[f"{a:g}"]["mass_frac_pm0.1"] > 0.5 for a in A_LIST])),
        "V4_fit_quality": bool(np.abs(resid).max() < 0.1),
    }

    with open(CSV, "w", newline="") as f:
        wcsv = csvmod.writer(f)
        wcsv.writerow(["a", "z", "logK"])
        for a, zz, ll in grid_rows:
            wcsv.writerow([f"{a:g}", f"{zz:.3f}", f"{ll:.6f}"])

    meta = {
        "experiment": "E-022b",
        "task": "2.10 analysis: K-diagonal valleys + mass concentration",
        "script": "research/numerics/scripts/E-022b-valley-analysis.py",
        "checks": checks,
        "key_values": {**per_a,
                       "V4_saturation_fit": {"Delta_inf": float(Dinf),
                                             "c": float(c),
                                             "max_resid": float(
                                                 np.abs(resid).max())},
                       "valley_depths": dict(zip([str(a) for a in av],
                                                 dv.tolist()))},
        "elapsed_seconds": round(time.time() - t0, 1),
        "timestamp_utc": datetime.now(timezone.utc).isoformat(),
    }
    JSON.write_text(json.dumps(meta, indent=2))
    print(f"wrote {CSV.name}, {JSON.name}; elapsed "
          f"{meta['elapsed_seconds']}s", flush=True)
    return 0 if all(checks.values()) else 1


if __name__ == "__main__":
    sys.exit(main())