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 5 of 10 · 500/page · 4600 rows next →
# azlogK
2002 8 22.000 2.754755
2003 8 22.050 2.757464
2004 8 22.100 2.763080
2005 8 22.150 2.768438
2006 8 22.200 2.771006
2007 8 22.250 2.770071
2008 8 22.300 2.766826
2009 8 22.350 2.763509
2010 8 22.400 2.762110
2011 8 22.450 2.763344
2012 8 22.500 2.766401
2013 8 22.550 2.769546
2014 8 22.600 2.771139
2015 8 22.650 2.770492
2016 8 22.700 2.768149
2017 8 22.750 2.765527
2018 8 22.800 2.764120
2019 8 22.850 2.764702
2020 8 22.900 2.766929
2021 8 22.950 2.769568
2022 8 23.000 2.771184
2023 8 23.050 2.770914
2024 8 23.100 2.768914
2025 8 23.150 2.766279
2026 8 23.200 2.764464
2027 8 23.250 2.764495
2028 8 23.300 2.766369
2029 8 23.350 2.769018
2030 8 23.400 2.770870
2031 8 23.450 2.770710
2032 8 23.500 2.768389
2033 8 23.550 2.764998
2034 8 23.600 2.762361
2035 8 23.650 2.762047
2036 8 23.700 2.764386
2037 8 23.750 2.768119
2038 8 23.800 2.770955
2039 8 23.850 2.770807
2040 8 23.900 2.767041
2041 8 23.950 2.761079
2042 8 24.000 2.755928
2043 8 24.050 2.754630
2044 8 24.100 2.758318
2045 8 24.150 2.765068
2046 8 24.200 2.770483
2047 8 24.250 2.769868
2048 8 24.300 2.760921
2049 8 24.350 2.745732
2050 8 24.400 2.730950
2051 8 24.450 2.725175
2052 8 24.500 2.733658
2053 8 24.550 2.752996
2054 8 24.600 2.769740
2055 8 24.650 2.763586
2056 8 24.700 2.711630
2057 8 24.750 2.590142
2058 8 24.800 2.372826
2059 8 24.850 2.025624
2060 8 24.900 1.498602
2061 8 24.950 0.735636
2062 8 25.000 -0.021473
2063 8 25.050 0.353433
2064 8 25.100 1.198270
2065 8 25.150 1.823882
2066 8 25.200 2.242196
2067 8 25.250 2.510990
2068 8 25.300 2.670176
2069 8 25.350 2.748649
2070 8 25.400 2.771033
2071 8 25.450 2.760909
2072 8 25.500 2.740450
2073 8 25.550 2.726730
2074 8 25.600 2.727382
2075 8 25.650 2.739916
2076 8 25.700 2.756064
2077 8 25.750 2.767790
2078 8 25.800 2.771208
2079 8 25.850 2.767334
2080 8 25.900 2.760517
2081 8 25.950 2.755661
2082 8 26.000 2.755612
2083 8 26.050 2.759979
2084 8 26.100 2.765944
2085 8 26.150 2.770258
2086 8 26.200 2.771086
2087 8 26.250 2.768754
2088 8 26.300 2.765252
2089 8 26.350 2.762925
2090 8 26.400 2.763123
2091 8 26.450 2.765557
2092 8 26.500 2.768679
2093 8 26.550 2.770733
2094 8 26.600 2.770784
2095 8 26.650 2.769152
2096 8 26.700 2.767095
2097 8 26.750 2.765986
2098 8 26.800 2.766492
2099 8 26.850 2.768236
2100 8 26.900 2.770107
2101 8 26.950 2.770986
2102 8 27.000 2.770415
2103 8 27.050 2.768831
2104 8 27.100 2.767264
2105 8 27.150 2.766699
2106 8 27.200 2.767490
2107 8 27.250 2.769176
2108 8 27.300 2.770789
2109 8 27.350 2.771450
2110 8 27.400 2.770873
2111 8 27.450 2.769494
2112 8 27.500 2.768176
2113 8 27.550 2.767676
2114 8 27.600 2.768194
2115 8 27.650 2.769291
2116 8 27.700 2.770200
2117 8 27.750 2.770327
2118 8 27.800 2.769620
2119 8 27.850 2.768592
2120 8 27.900 2.767980
2121 8 27.950 2.768257
2122 8 28.000 2.769311
2123 8 28.050 2.770494
2124 8 28.100 2.771025
2125 8 28.150 2.770487
2126 8 28.200 2.769112
2127 8 28.250 2.767670
2128 8 28.300 2.767010
2129 8 28.350 2.767520
2130 8 28.400 2.768856
2131 8 28.450 2.770127
2132 8 28.500 2.770438
2133 8 28.550 2.769463
2134 8 28.600 2.767697
2135 8 28.650 2.766195
2136 8 28.700 2.765936
2137 8 28.750 2.767167
2138 8 28.800 2.769162
2139 8 28.850 2.770598
2140 8 28.900 2.770347
2141 8 28.950 2.768224
2142 8 29.000 2.765216
2143 8 29.050 2.763001
2144 8 29.100 2.762946
2145 8 29.150 2.765160
2146 8 29.200 2.768245
2147 8 29.250 2.770007
2148 8 29.300 2.768768
2149 8 29.350 2.764524
2150 8 29.400 2.759253
2151 8 29.450 2.755999
2152 8 29.500 2.757034
2153 8 29.550 2.762085
2154 8 29.600 2.767916
2155 8 29.650 2.769786
2156 8 29.700 2.764112
2157 8 29.750 2.751013
2158 8 29.800 2.735440
2159 8 29.850 2.725735
2160 8 29.900 2.729070
2161 8 29.950 2.745502
2162 8 30.000 2.764731
2163 8 30.050 2.767949
2164 8 30.100 2.732344
2165 8 30.150 2.634031
2166 8 30.200 2.447470
2167 8 30.250 2.141284
2168 8 30.300 1.670635
2169 8 30.350 0.974991
2170 8 30.400 0.128854
2171 8 30.450 0.132819
2172 8 30.500 0.978175
2173 8 30.550 1.670677
2174 8 30.600 2.138980
2175 8 30.650 2.443785
2176 8 30.700 2.629947
2177 8 30.750 2.728837
2178 8 30.800 2.765827
2179 8 30.850 2.764340
2180 8 30.900 2.746420
2181 8 30.950 2.730107
2182 8 31.000 2.725491
2183 8 31.050 2.733147
2184 8 31.100 2.747026
2185 8 31.150 2.759703
2186 8 31.200 2.766443
2187 8 31.250 2.766528
2188 8 31.300 2.762358
2189 8 31.350 2.757489
2190 8 31.400 2.754691
2191 8 31.450 2.754916
2192 8 31.500 2.757451
2193 8 31.550 2.760832
2194 8 31.600 2.763749
2195 8 31.650 2.765449
2196 8 31.700 2.765638
2197 8 31.750 2.764272
2198 8 31.800 2.761540
2199 8 31.850 2.758084
2200 8 31.900 2.755152
2201 8 31.950 2.754295
2202 8 32.000 2.756504
2203 8 32.050 2.761211
2204 8 32.100 2.765923
2205 8 32.150 2.767043
2206 8 32.200 2.761715
2207 8 32.250 2.749894
2208 8 32.300 2.735556
2209 8 32.350 2.725888
2210 8 32.400 2.727700
2211 8 32.450 2.742131
2212 8 32.500 2.760984
2213 8 32.550 2.767463
2214 8 32.600 2.739985
2215 8 32.650 2.655316
2216 8 32.700 2.488680
2217 8 32.750 2.210406
2218 8 32.800 1.779054
2219 8 32.850 1.135457
2220 8 32.900 0.285158
2221 8 32.950 0.011854
2222 8 33.000 0.806899
2223 8 33.050 1.551367
2224 8 33.100 2.061715
2225 8 33.150 2.396468
2226 8 33.200 2.604115
2227 8 33.250 2.717994
2228 8 33.300 2.764341
2229 8 33.350 2.767181
2230 8 33.400 2.749642
2231 8 33.450 2.731658
2232 8 33.500 2.725501
2233 8 33.550 2.733071
2234 8 33.600 2.748157
2235 8 33.650 2.762187
2236 8 33.700 2.769302
2237 8 33.750 2.768444
2238 8 33.800 2.762671
2239 8 33.850 2.756807
2240 8 33.900 2.754666
2241 8 33.950 2.757213
2242 8 34.000 2.762570
2243 8 34.050 2.767602
2244 8 34.100 2.769887
2245 8 34.150 2.768904
2246 8 34.200 2.766009
2247 8 34.250 2.763410
2248 8 34.300 2.762808
2249 8 34.350 2.764474
2250 8 34.400 2.767268
2251 8 34.450 2.769478
2252 8 34.500 2.769894
2253 8 34.550 2.768469
2254 8 34.600 2.766253
2255 8 34.650 2.764706
2256 8 34.700 2.764817
2257 8 34.750 2.766547
2258 8 34.800 2.768915
2259 8 34.850 2.770633
2260 8 34.900 2.770865
2261 8 34.950 2.769671
2262 8 35.000 2.767904
2263 8 35.050 2.766661
2264 8 35.100 2.766614
2265 8 35.150 2.767636
2266 8 35.200 2.768931
2267 8 35.250 2.769571
2268 8 35.300 2.769096
2269 8 35.350 2.767803
2270 8 35.400 2.766561
2271 8 35.450 2.766255
2272 8 35.500 2.767209
2273 8 35.550 2.768934
2274 8 35.600 2.770400
2275 8 35.650 2.770648
2276 8 35.700 2.769392
2277 8 35.750 2.767238
2278 8 35.800 2.765368
2279 8 35.850 2.764847
2280 8 35.900 2.765947
2281 8 35.950 2.767923
2282 8 36.000 2.769421
2283 8 36.050 2.769298
2284 8 36.100 2.767369
2285 8 36.150 2.764623
2286 8 36.200 2.762730
2287 8 36.250 2.763036
2288 8 36.300 2.765609
2289 8 36.350 2.768992
2290 8 36.400 2.770907
2291 8 36.450 2.769566
2292 8 36.500 2.764867
2293 8 36.550 2.758770
2294 8 36.600 2.754484
2295 8 36.650 2.754657
2296 8 36.700 2.759488
2297 8 36.750 2.766069
2298 8 36.800 2.769612
2299 8 36.850 2.766014
2300 8 36.900 2.754502
2301 8 36.950 2.739063
2302 8 37.000 2.727559
2303 8 37.050 2.727794
2304 8 37.100 2.741677
2305 8 37.150 2.761181
2306 8 37.200 2.769157
2307 8 37.250 2.743548
2308 8 37.300 2.660839
2309 8 37.350 2.496244
2310 8 37.400 2.220332
2311 8 37.450 1.792136
2312 8 37.500 1.152915
2313 8 37.550 0.303276
2314 8 37.600 0.001982
2315 8 37.650 0.787295
2316 8 37.700 1.536160
2317 8 37.750 2.050446
2318 8 37.800 2.388164
2319 8 37.850 2.598233
2320 8 37.900 2.714235
2321 8 37.950 2.762464
2322 8 38.000 2.766836
2323 8 38.050 2.750256
2324 8 38.100 2.732468
2325 8 38.150 2.725771
2326 8 38.200 2.732398
2327 8 38.250 2.746622
2328 8 38.300 2.760269
2329 8 38.350 2.767630
2330 8 38.400 2.767512
2331 8 38.450 2.762608
2332 8 38.500 2.757275
2333 8 38.550 2.754998
2334 8 38.600 2.756762
2335 8 38.650 2.761083
2336 8 38.700 2.765397
2337 8 38.750 2.767706
2338 8 38.800 2.767520
2339 8 38.850 2.765754
2340 8 38.900 2.763898
2341 8 38.950 2.763048
2342 8 39.000 2.763393
2343 8 39.050 2.764370
2344 8 39.100 2.765250
2345 8 39.150 2.765673
2346 8 39.200 2.765777
2347 8 39.250 2.765907
2348 8 39.300 2.766199
2349 8 39.350 2.766393
2350 8 39.400 2.766051
2351 8 39.450 2.765005
2352 8 39.500 2.763664
2353 8 39.550 2.762889
2354 8 39.600 2.763412
2355 8 39.650 2.765179
2356 8 39.700 2.767118
2357 8 39.750 2.767632
2358 8 39.800 2.765601
2359 8 39.850 2.761328
2360 8 39.900 2.756743
2361 8 39.950 2.754534
2362 8 40.000 2.756455
2363 8 40.050 2.761795
2364 8 40.100 2.767157
2365 8 40.150 2.768004
2366 8 40.200 2.761253
2367 8 40.250 2.747653
2368 8 40.300 2.732660
2369 8 40.350 2.724632
2370 8 40.400 2.730004
2371 8 40.450 2.747508
2372 8 40.500 2.765570
2373 8 40.550 2.764698
2374 8 40.600 2.721948
2375 8 40.650 2.613438
2376 8 40.700 2.413306
2377 8 40.750 2.089115
2378 8 40.800 1.594007
2379 8 40.850 0.868723
2380 8 40.900 0.050605
2381 8 40.950 0.222783
2382 8 41.000 1.073100
2383 8 41.050 1.735031
2384 8 41.100 2.180922
2385 8 41.150 2.470319
2386 8 41.200 2.645624
2387 8 41.250 2.736765
2388 8 41.300 2.768314
2389 8 41.350 2.763239
2390 8 41.400 2.743340
2391 8 41.450 2.726515
2392 8 41.500 2.722661
2393 8 41.550 2.731959
2394 8 41.600 2.747705
2395 8 41.650 2.761675
2396 8 41.700 2.768433
2397 8 41.750 2.766993
2398 8 41.800 2.760228
2399 8 41.850 2.752929
2400 8 41.900 2.749364
2401 8 41.950 2.751334
2402 8 42.000 2.757576
2403 8 42.050 2.764720
2404 8 42.100 2.769116
2405 8 42.150 2.768546
2406 8 42.200 2.763185
2407 8 42.250 2.755560
2408 8 42.300 2.749492
2409 8 42.350 2.748298
2410 8 42.400 2.752944
2411 8 42.450 2.761202
2412 8 42.500 2.768429
2413 8 42.550 2.769690
2414 8 42.600 2.762260
2415 8 42.650 2.747523
2416 8 42.700 2.731401
2417 8 42.750 2.722422
2418 8 42.800 2.727123
2419 8 42.850 2.744632
2420 8 42.900 2.764171
2421 8 42.950 2.767198
2422 8 43.000 2.731625
2423 8 43.050 2.634369
2424 8 43.100 2.450619
2425 8 43.150 2.149773
2426 8 43.200 1.688063
2427 8 43.250 1.005556
2428 8 43.300 0.159240
2429 8 43.350 0.101609
2430 8 43.400 0.938601
2431 8 43.450 1.643280
2432 8 43.500 2.122024
2433 8 43.550 2.434615
2434 8 43.600 2.626275
2435 8 43.650 2.728518
2436 8 43.700 2.766813
2437 8 43.750 2.764949
2438 8 43.800 2.745831
2439 8 43.850 2.728712
2440 8 43.900 2.724583
2441 8 43.950 2.733939
2442 8 44.000 2.749710
2443 8 44.050 2.763257
2444 8 44.100 2.769215
2445 8 44.150 2.767210
2446 8 44.200 2.760866
2447 8 44.250 2.755244
2448 8 44.300 2.753989
2449 8 44.350 2.757598
2450 8 44.400 2.763687
2451 8 44.450 2.768815
2452 8 44.500 2.770547
2453 8 44.550 2.768602
2454 8 44.600 2.764703
2455 8 44.650 2.761405
2456 8 44.700 2.760615
2457 8 44.750 2.762610
2458 8 44.800 2.766086
2459 8 44.850 2.769092
2460 8 44.900 2.770190
2461 8 44.950 2.769168
2462 8 45.000 2.766997
2463 8 45.050 2.765140
2464 8 45.100 2.764666
2465 8 45.150 2.765675
2466 8 45.200 2.767353
2467 8 45.250 2.768572
2468 8 45.300 2.768613
2469 8 45.350 2.767584
2470 8 45.400 2.766308
2471 8 45.450 2.765777
2472 8 45.500 2.766513
2473 8 45.550 2.768222
2474 8 45.600 2.769960
2475 8 45.650 2.770703
2476 8 45.700 2.769951
2477 8 45.750 2.768040
2478 8 45.800 2.765965
2479 8 45.850 2.764828
2480 8 45.900 2.765198
2481 8 45.950 2.766784
2482 8 46.000 2.768603
2483 8 46.050 2.769560
2484 8 46.100 2.769074
2485 8 46.150 2.767412
2486 8 46.200 2.765530
2487 8 46.250 2.764507
2488 8 46.300 2.764886
2489 8 46.350 2.766329
2490 8 46.400 2.767804
2491 8 46.450 2.768217
2492 8 46.500 2.767112
2493 8 46.550 2.765013
2494 8 46.600 2.763179
2495 8 46.650 2.762853
2496 8 46.700 2.764412
2497 8 46.750 2.766959
2498 8 46.800 2.768708
2499 8 46.850 2.767984
2500 8 46.900 2.764332
2501 8 46.950 2.759069

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