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 9 of 10 · 500/page · 4600 rows next →
# azlogK
4002 12 30.000 3.145037
4003 12 30.050 3.131404
4004 12 30.100 3.147447
4005 12 30.150 3.174893
4006 12 30.200 3.151820
4007 12 30.250 2.998322
4008 12 30.300 2.621922
4009 12 30.350 1.874341
4010 12 30.400 0.491399
4011 12 30.450 0.499651
4012 12 30.500 1.879553
4013 12 30.550 2.624615
4014 12 30.600 2.999321
4015 12 30.650 3.151521
4016 12 30.700 3.173819
4017 12 30.750 3.146401
4018 12 30.800 3.131007
4019 12 30.850 3.145130
4020 12 30.900 3.167553
4021 12 30.950 3.175965
4022 12 31.000 3.169301
4023 12 31.050 3.161424
4024 12 31.100 3.162740
4025 12 31.150 3.170383
4026 12 31.200 3.175302
4027 12 31.250 3.173911
4028 12 31.300 3.170361
4029 12 31.350 3.169759
4030 12 31.400 3.172101
4031 12 31.450 3.173778
4032 12 31.500 3.173064
4033 12 31.550 3.171892
4034 12 31.600 3.172460
4035 12 31.650 3.174008
4036 12 31.700 3.174208
4037 12 31.750 3.172754
4038 12 31.800 3.171831
4039 12 31.850 3.172769
4040 12 31.900 3.173803
4041 12 31.950 3.172542
4042 12 32.000 3.169917
4043 12 32.050 3.169652
4044 12 32.100 3.172946
4045 12 32.150 3.175467
4046 12 32.200 3.172084
4047 12 32.250 3.164440
4048 12 32.300 3.161118
4049 12 32.350 3.167257
4050 12 32.400 3.175075
4051 12 32.450 3.170082
4052 12 32.500 3.149192
4053 12 32.550 3.131197
4054 12 32.600 3.140634
4055 12 32.650 3.169730
4056 12 32.700 3.163739
4057 12 32.750 3.044362
4058 12 32.800 2.722992
4059 12 32.850 2.069277
4060 12 32.900 0.826807
4061 12 32.950 0.186703
4062 12 33.000 1.659061
4063 12 33.050 2.509913
4064 12 33.100 2.944626
4065 12 33.150 3.133812
4066 12 33.200 3.175814
4067 12 33.250 3.152386
4068 12 33.300 3.131271
4069 12 33.350 3.140486
4070 12 33.400 3.164147
4071 12 33.450 3.176968
4072 12 33.500 3.172737
4073 12 33.550 3.163499
4074 12 33.600 3.162178
4075 12 33.650 3.169109
4076 12 33.700 3.175362
4077 12 33.750 3.175071
4078 12 33.800 3.170993
4079 12 33.850 3.169393
4080 12 33.900 3.172189
4081 12 33.950 3.175641
4082 12 34.000 3.175843
4083 12 34.050 3.173332
4084 12 34.100 3.171769
4085 12 34.150 3.173215
4086 12 34.200 3.175960
4087 12 34.250 3.177084
4088 12 34.300 3.175985
4089 12 34.350 3.174621
4090 12 34.400 3.174758
4091 12 34.450 3.175883
4092 12 34.500 3.176216
4093 12 34.550 3.175126
4094 12 34.600 3.173841
4095 12 34.650 3.173801
4096 12 34.700 3.174948
4097 12 34.750 3.176039
4098 12 34.800 3.176325
4099 12 34.850 3.176305
4100 12 34.900 3.176733
4101 12 34.950 3.177409
4102 12 35.000 3.177426
4103 12 35.050 3.176479
4104 12 35.100 3.175403
4105 12 35.150 3.175151
4106 12 35.200 3.175572
4107 12 35.250 3.175659
4108 12 35.300 3.174974
4109 12 35.350 3.174363
4110 12 35.400 3.174918
4111 12 35.450 3.176461
4112 12 35.500 3.177567
4113 12 35.550 3.177222
4114 12 35.600 3.176040
4115 12 35.650 3.175488
4116 12 35.700 3.176024
4117 12 35.750 3.176550
4118 12 35.800 3.175925
4119 12 35.850 3.174590
4120 12 35.900 3.174101
4121 12 35.950 3.175050
4122 12 36.000 3.176080
4123 12 36.050 3.175515
4124 12 36.100 3.173678
4125 12 36.150 3.172826
4126 12 36.200 3.174424
4127 12 36.250 3.177033
4128 12 36.300 3.177760
4129 12 36.350 3.175768
4130 12 36.400 3.173494
4131 12 36.450 3.173704
4132 12 36.500 3.175732
4133 12 36.550 3.175950
4134 12 36.600 3.172462
4135 12 36.650 3.168280
4136 12 36.700 3.168322
4137 12 36.750 3.172906
4138 12 36.800 3.176106
4139 12 36.850 3.172452
4140 12 36.900 3.164634
4141 12 36.950 3.162155
4142 12 37.000 3.169682
4143 12 37.050 3.178125
4144 12 37.100 3.172365
4145 12 37.150 3.149824
4146 12 37.200 3.130298
4147 12 37.250 3.139090
4148 12 37.300 3.168618
4149 12 37.350 3.164127
4150 12 37.400 3.047601
4151 12 37.450 2.731289
4152 12 37.500 2.086993
4153 12 37.550 0.861567
4154 12 37.600 0.156624
4155 12 37.650 1.632096
4156 12 37.700 2.496311
4157 12 37.750 2.938872
4158 12 37.800 3.132728
4159 12 37.850 3.176666
4160 12 37.900 3.152729
4161 12 37.950 3.130028
4162 12 38.000 3.138509
4163 12 38.050 3.162814
4164 12 38.100 3.176757
4165 12 38.150 3.173278
4166 12 38.200 3.164298
4167 12 38.250 3.162949
4168 12 38.300 3.169535
4169 12 38.350 3.174975
4170 12 38.400 3.173715
4171 12 38.450 3.169310
4172 12 38.500 3.168467
4173 12 38.550 3.172468
4174 12 38.600 3.176423
4175 12 38.650 3.176066
4176 12 38.700 3.172776
4177 12 38.750 3.171239
4178 12 38.800 3.173421
4179 12 38.850 3.176484
4180 12 38.900 3.176790
4181 12 38.950 3.174391
4182 12 39.000 3.172542
4183 12 39.050 3.173354
4184 12 39.100 3.175309
4185 12 39.150 3.175634
4186 12 39.200 3.174078
4187 12 39.250 3.173096
4188 12 39.300 3.174379
4189 12 39.350 3.176435
4190 12 39.400 3.176536
4191 12 39.450 3.174429
4192 12 39.500 3.172836
4193 12 39.550 3.173908
4194 12 39.600 3.176196
4195 12 39.650 3.176380
4196 12 39.700 3.173702
4197 12 39.750 3.171287
4198 12 39.800 3.172236
4199 12 39.850 3.175253
4200 12 39.900 3.175898
4201 12 39.950 3.172420
4202 12 40.000 3.168692
4203 12 40.050 3.169716
4204 12 40.100 3.174489
4205 12 40.150 3.176019
4206 12 40.200 3.169961
4207 12 40.250 3.161653
4208 12 40.300 3.161456
4209 12 40.350 3.170945
4210 12 40.400 3.177219
4211 12 40.450 3.166137
4212 12 40.500 3.141705
4213 12 40.550 3.129409
4214 12 40.600 3.148655
4215 12 40.650 3.175076
4216 12 40.700 3.141714
4217 12 40.750 2.966652
4218 12 40.800 2.553984
4219 12 40.850 1.742690
4220 12 40.900 0.294585
4221 12 40.950 0.701160
4222 12 41.000 1.995723
4223 12 41.050 2.682863
4224 12 41.100 3.025125
4225 12 41.150 3.158421
4226 12 41.200 3.171603
4227 12 41.250 3.142618
4228 12 41.300 3.129511
4229 12 41.350 3.145871
4230 12 41.400 3.169129
4231 12 41.450 3.177359
4232 12 41.500 3.169737
4233 12 41.550 3.160345
4234 12 41.600 3.160595
4235 12 41.650 3.168600
4236 12 41.700 3.174709
4237 12 41.750 3.173526
4238 12 41.800 3.168513
4239 12 41.850 3.166684
4240 12 41.900 3.170538
4241 12 41.950 3.175910
4242 12 42.000 3.177203
4243 12 42.050 3.173421
4244 12 42.100 3.168874
4245 12 42.150 3.168371
4246 12 42.200 3.172009
4247 12 42.250 3.175149
4248 12 42.300 3.173639
4249 12 42.350 3.168612
4250 12 42.400 3.165677
4251 12 42.450 3.168717
4252 12 42.500 3.174750
4253 12 42.550 3.176470
4254 12 42.600 3.170541
4255 12 42.650 3.162629
4256 12 42.700 3.162238
4257 12 42.750 3.170631
4258 12 42.800 3.176138
4259 12 42.850 3.165650
4260 12 42.900 3.142011
4261 12 42.950 3.128445
4262 12 43.000 3.145468
4263 12 43.050 3.174708
4264 12 43.100 3.154956
4265 12 43.150 3.007570
4266 12 43.200 2.642121
4267 12 43.250 1.915272
4268 12 43.300 0.562154
4269 12 43.350 0.426723
4270 12 43.400 1.832239
4271 12 43.450 2.599781
4272 12 43.500 2.987645
4273 12 43.550 3.147623
4274 12 43.600 3.173236
4275 12 43.650 3.145582
4276 12 43.700 3.128967
4277 12 43.750 3.143488
4278 12 43.800 3.167777
4279 12 43.850 3.177550
4280 12 43.900 3.170627
4281 12 43.950 3.161675
4282 12 44.000 3.162655
4283 12 44.050 3.170877
4284 12 44.100 3.175882
4285 12 44.150 3.173130
4286 12 44.200 3.167878
4287 12 44.250 3.167512
4288 12 44.300 3.172731
4289 12 44.350 3.177774
4290 12 44.400 3.177950
4291 12 44.450 3.174547
4292 12 44.500 3.172242
4293 12 44.550 3.173207
4294 12 44.600 3.175158
4295 12 44.650 3.175036
4296 12 44.700 3.173002
4297 12 44.750 3.171900
4298 12 44.800 3.173415
4299 12 44.850 3.176002
4300 12 44.900 3.177008
4301 12 44.950 3.175960
4302 12 45.000 3.174855
4303 12 45.050 3.175365
4304 12 45.100 3.176674
4305 12 45.150 3.176656
4306 12 45.200 3.174718
4307 12 45.250 3.172656
4308 12 45.300 3.172523
4309 12 45.350 3.174240
4310 12 45.400 3.175920
4311 12 45.450 3.176312
4312 12 45.500 3.176134
4313 12 45.550 3.176729
4314 12 45.600 3.177950
4315 12 45.650 3.178186
4316 12 45.700 3.176524
4317 12 45.750 3.174223
4318 12 45.800 3.173437
4319 12 45.850 3.174647
4320 12 45.900 3.176041
4321 12 45.950 3.175747
4322 12 46.000 3.174174
4323 12 46.050 3.173525
4324 12 46.100 3.175030
4325 12 46.150 3.177287
4326 12 46.200 3.177854
4327 12 46.250 3.176103
4328 12 46.300 3.173848
4329 12 46.350 3.173047
4330 12 46.400 3.173531
4331 12 46.450 3.173675
4332 12 46.500 3.173027
4333 12 46.550 3.173204
4334 12 46.600 3.175575
4335 12 46.650 3.178654
4336 12 46.700 3.179074
4337 12 46.750 3.175523
4338 12 46.800 3.170939
4339 12 46.850 3.169726
4340 12 46.900 3.172601
4341 12 46.950 3.175433
4342 12 47.000 3.174146
4343 12 47.050 3.169990
4344 12 47.100 3.168517
4345 12 47.150 3.172561
4346 12 47.200 3.177588
4347 12 47.250 3.176332
4348 12 47.300 3.168070
4349 12 47.350 3.161327
4350 12 47.400 3.164585
4351 12 47.450 3.173870
4352 12 47.500 3.174150
4353 12 47.550 3.156375
4354 12 47.600 3.132815
4355 12 47.650 3.130741
4356 12 47.700 3.158029
4357 12 47.750 3.175233
4358 12 47.800 3.109961
4359 12 47.850 2.879792
4360 12 47.900 2.379791
4361 12 47.950 1.413898
4362 12 48.000 -0.010812
4363 12 48.050 1.126859
4364 12 48.100 2.230070
4365 12 48.150 2.805370
4366 12 48.200 3.080029
4367 12 48.250 3.170118
4368 12 48.300 3.161478
4369 12 48.350 3.131705
4370 12 48.400 3.129676
4371 12 48.450 3.153552
4372 12 48.500 3.174239
4373 12 48.550 3.175442
4374 12 48.600 3.165221
4375 12 48.650 3.160440
4376 12 48.700 3.166141
4377 12 48.750 3.172564
4378 12 48.800 3.170424
4379 12 48.850 3.162857
4380 12 48.900 3.160566
4381 12 48.950 3.167246
4382 12 49.000 3.174210
4383 12 49.050 3.171663
4384 12 49.100 3.161828
4385 12 49.150 3.157314
4386 12 49.200 3.164744
4387 12 49.250 3.173416
4388 12 49.300 3.166562
4389 12 49.350 3.143744
4390 12 49.400 3.128591
4391 12 49.450 3.144196
4392 12 49.500 3.172396
4393 12 49.550 3.149097
4394 12 49.600 2.992623
4395 12 49.650 2.609625
4396 12 49.700 1.850291
4397 12 49.750 0.454896
4398 12 49.800 0.531723
4399 12 49.850 1.894624
4400 12 49.900 2.629196
4401 12 49.950 2.999484
4402 12 50.000 3.150612
4403 12 50.050 3.173408
4404 12 50.100 3.146217
4405 12 50.150 3.129914
4406 12 50.200 3.143194
4407 12 50.250 3.166270
4408 12 50.300 3.176337
4409 12 50.350 3.170573
4410 12 50.400 3.161963
4411 12 50.450 3.162076
4412 12 50.500 3.169645
4413 12 50.550 3.175321
4414 12 50.600 3.173709
4415 12 50.650 3.168298
4416 12 50.700 3.166169
4417 12 50.750 3.169834
4418 12 50.800 3.175262
4419 12 50.850 3.177267
4420 12 50.900 3.175120
4421 12 50.950 3.172507
4422 12 51.000 3.172827
4423 12 51.050 3.175380
4424 12 51.100 3.176546
4425 12 51.150 3.174141
4426 12 51.200 3.169928
4427 12 51.250 3.167762
4428 12 51.300 3.169511
4429 12 51.350 3.173212
4430 12 51.400 3.175403
4431 12 51.450 3.174812
4432 12 51.500 3.173348
4433 12 51.550 3.173496
4434 12 51.600 3.175201
4435 12 51.650 3.175957
4436 12 51.700 3.174073
4437 12 51.750 3.171155
4438 12 51.800 3.170559
4439 12 51.850 3.173212
4440 12 51.900 3.175905
4441 12 51.950 3.174795
4442 12 52.000 3.170377
4443 12 52.050 3.167771
4444 12 52.100 3.170862
4445 12 52.150 3.176584
4446 12 52.200 3.177246
4447 12 52.250 3.169540
4448 12 52.300 3.160098
4449 12 52.350 3.159549
4450 12 52.400 3.168945
4451 12 52.450 3.175187
4452 12 52.500 3.164512
4453 12 52.550 3.141074
4454 12 52.600 3.129724
4455 12 52.650 3.149245
4456 12 52.700 3.175961
4457 12 52.750 3.144445
4458 12 52.800 2.974063
4459 12 52.850 2.570379
4460 12 52.900 1.776105
4461 12 52.950 0.343549
4462 12 53.000 0.647809
4463 12 53.050 1.965284
4464 12 53.100 2.667501
4465 12 53.150 3.018376
4466 12 53.200 3.156690
4467 12 53.250 3.172312
4468 12 53.300 3.143897
4469 12 53.350 3.130309
4470 12 53.400 3.145697
4471 12 53.450 3.167712
4472 12 53.500 3.174923
4473 12 53.550 3.167374
4474 12 53.600 3.159463
4475 12 53.650 3.161524
4476 12 53.700 3.170108
4477 12 53.750 3.175355
4478 12 53.800 3.173291
4479 12 53.850 3.168815
4480 12 53.900 3.168675
4481 12 53.950 3.173640
4482 12 54.000 3.178501
4483 12 54.050 3.178557
4484 12 54.100 3.174364
4485 12 54.150 3.170291
4486 12 54.200 3.169545
4487 12 54.250 3.171378
4488 12 54.300 3.172991
4489 12 54.350 3.173093
4490 12 54.400 3.172900
4491 12 54.450 3.174003
4492 12 54.500 3.176031
4493 12 54.550 3.176903
4494 12 54.600 3.175247
4495 12 54.650 3.172144
4496 12 54.700 3.170262
4497 12 54.750 3.171197
4498 12 54.800 3.173834
4499 12 54.850 3.175513
4500 12 54.900 3.174828
4501 12 54.950 3.173069

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())