Current task: —

E-022-spectral-measure.py

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

E-022-spectral-measure.csv — 153.1 KB, updated 08-19-2026

← prev page 5 of 8 · 500/page · 3815 rows next →
# akz_kw_k
2002 10 285 89.726179847734 5.0554058632e-02
2003 10 286 90.039531840772 5.0557495450e-02
2004 10 287 90.356306717829 5.0719594259e-02
2005 10 288 90.671891761585 5.0144517303e-02
2006 10 289 90.986609131269 5.0294703369e-02
2007 10 290 91.301644667744 5.1412565573e-02
2008 10 291 91.618981387185 5.0659397759e-02
2009 10 292 91.936710425359 5.0874255312e-02
2010 10 293 92.266158887943 5.7215211631e-02
2011 10 294 92.495860878811 1.0402033018e+00
2012 10 295 92.865157203278 5.1762873510e-02
2013 10 296 93.185456586225 5.0899422825e-02
2014 10 297 93.503265250606 5.0759626145e-02
2015 10 298 93.823623370365 5.1191090697e-02
2016 10 299 94.143610063534 5.1971225077e-02
2017 10 300 94.508402117377 9.5145003219e-02
2018 10 301 94.660203334394 9.9953139374e-01
2019 10 302 95.063125536918 5.3002719021e-02
2020 10 303 95.394064580680 5.3466142737e-02
2021 10 304 95.786329305451 2.0408473510e-01
2022 10 305 95.887488269617 8.8856282173e-01
2023 10 306 96.301357728167 5.2649851111e-02
2024 10 307 96.625778222069 5.1249803809e-02
2025 10 308 96.943945435872 5.0525910388e-02
2026 10 309 97.261711154783 5.0775984560e-02
2027 10 310 97.574457581145 5.1108744314e-02
2028 10 311 97.892578547734 5.0359316004e-02
2029 10 312 98.208078142249 5.0494375399e-02
2030 10 313 98.523709199695 5.1357493107e-02
2031 10 314 98.831529665795 1.0505827723e+00
2032 10 315 99.152160846684 4.9987267652e-02
2033 10 316 99.468389842089 5.0712429732e-02
2034 10 317 99.785178934520 5.0843364189e-02
2035 10 318 100.097021257959 5.0999209848e-02
2036 10 319 100.413296512625 5.2116443449e-02
2037 10 320 100.729510169972 5.0486417925e-02
2038 10 321 101.049295219696 5.1879403150e-02
2039 10 322 101.319867717199 1.0472690455e+00
2040 10 323 101.669646751093 5.0839518354e-02
2041 10 324 101.986872458425 5.0985708503e-02
2042 10 325 102.304015399053 5.0492179462e-02
2043 10 326 102.619819342076 5.0662714415e-02
2044 10 327 102.939266590104 5.1287549963e-02
2045 10 328 103.261268600263 5.4188951274e-02
2046 10 329 103.667135304765 3.3388770062e-01
2047 10 330 103.749850818835 7.5720792310e-01
2048 10 331 104.166086544990 5.3190823561e-02
2049 10 332 104.487492105732 5.2391052098e-02
2050 10 333 104.807626536975 5.0902408919e-02
2051 10 334 105.124865087958 5.0430123566e-02
2052 10 335 105.446401664831 1.0508552865e+00
2053 10 336 105.760666604858 5.1532351536e-02
2054 10 337 106.075031927886 5.1328288752e-02
2055 10 338 106.395247324989 5.1281314130e-02
2056 10 339 106.719337203122 5.4402686085e-02
2057 10 340 107.131950209034 5.6324621699e-01
2058 10 341 107.207929023761 5.2821943092e-01
2059 10 342 107.621559866937 5.2883448576e-02
2060 10 343 107.944739110138 5.1058715145e-02
2061 10 344 108.262054189994 5.2690019919e-02
2062 10 345 108.580480019098 5.0553048060e-02
2063 10 346 108.897352897318 5.1185830687e-02
2064 10 347 109.213426881467 5.0113352916e-02
2065 10 348 109.529590693713 5.0765208860e-02
2066 10 349 109.847469810113 5.0945240659e-02
2067 10 350 110.162931870633 5.2762370071e-02
2068 10 351 110.482779381918 5.1899188013e-02
2069 10 352 110.817388480093 6.2879992855e-02
2070 10 353 111.034370012260 1.0361881354e+00
2071 10 354 111.422477049486 5.4270205507e-02
2072 10 355 111.842705273296 6.3897393135e-01
2073 10 356 111.920613361374 4.5334343268e-01
2074 10 357 112.333650471419 5.3066980292e-02
2075 10 358 112.658843936433 5.1870493676e-02
2076 10 359 112.973813727184 5.2021928684e-02
2077 10 360 113.293991783314 5.1756016311e-02
2078 10 361 113.613150337467 5.0896056668e-02
2079 10 362 113.933455581385 5.2042923658e-02
2080 10 363 114.315231812591 1.0341995114e+00
2081 10 364 114.527229301305 6.3646929458e-02
2082 10 365 114.858781508007 5.2314279243e-02
2083 10 366 115.180991581344 5.0886907636e-02
2084 10 367 115.502080773254 5.2770729507e-02
2085 10 368 115.819946963801 5.3892741929e-02
2086 10 369 116.218777772936 1.0095598831e+00
2087 10 370 116.381546280390 8.4502233848e-02
2088 10 371 116.739904417207 5.4730733727e-02
2089 10 372 117.061041488113 5.1962435987e-02
2090 10 373 117.379900895759 5.0464148850e-02
2091 10 374 117.698449078417 5.1517449063e-02
2092 10 375 118.019952946295 5.3922987649e-02
2093 10 376 118.342020684927 5.3711053771e-02
2094 10 377 118.758598555752 6.2935873009e-01
2095 10 378 118.835618536502 4.6195200873e-01
2096 10 379 119.248256824087 5.3152164999e-02
2097 10 380 119.567347736715 5.4306426326e-02
2098 10 381 119.889912457940 5.1750834134e-02
2099 10 382 120.208394632358 5.0970478434e-02
2100 10 383 120.528093287015 5.1364878561e-02
2101 10 384 120.850599551174 5.1876011563e-02
2102 10 385 121.198832273919 7.5136433893e-02
2103 10 386 121.377032547057 1.0195808481e+00
2104 10 387 121.771920285589 5.5211812227e-02
2105 10 388 122.091604325535 5.1741754603e-02
2106 10 389 122.412278114260 5.2771535118e-02
2107 10 390 122.755611944166 6.6875439832e-02
2108 10 391 122.952301669510 1.0328029812e+00
2109 10 392 123.336654423692 5.2137830382e-02
2110 10 393 123.663236016215 5.3023561944e-02
2111 10 394 123.974104560765 5.2865548732e-02
2112 10 395 124.258428088163 1.0486066812e+00
2113 10 396 124.601744876871 5.2135591101e-02
2114 10 397 124.920352051157 5.0276809084e-02
2115 10 398 125.237075552585 5.1364050212e-02
2116 10 399 125.553999733950 5.0250548416e-02
2117 10 400 125.872921333382 5.2500830432e-02
2118 10 401 126.177329199567 5.3046251733e-02
2119 10 402 126.501765415170 5.1664468285e-02
2120 10 403 126.809303390716 5.3763687744e-02
2121 10 404 127.134019613100 5.2053205211e-02
2122 10 405 127.512060379416 1.0369958174e+00
2123 10 406 127.727518865454 6.0492986701e-02
2124 10 407 128.057889494281 5.5760808424e-02
2125 10 408 128.381629948045 5.1839019791e-02
2126 10 409 128.699168048336 5.1014724438e-02
2127 10 410 129.018668153634 5.1788232757e-02
2128 10 411 129.349789013748 5.7427188938e-02
2129 10 412 129.582883454396 1.0434708069e+00
2130 10 413 129.945806852925 5.3494632490e-02
2131 10 414 130.271656436350 5.1550957177e-02
2132 10 415 130.595111687777 5.3727465392e-02
2133 10 416 130.974416853607 1.3111922259e-01
2134 10 417 131.099664613164 9.6223817533e-01
2135 10 418 131.508300985164 5.2831306975e-02
2136 10 419 131.836142701917 5.6392328851e-02
2137 10 420 132.147885138455 5.1495773057e-02
2138 10 421 132.468312855552 5.1317949773e-02
2139 10 422 132.789493285362 5.2829958863e-02
2140 10 423 133.100954082381 5.5159571533e-02
2141 10 424 133.491714696141 1.0265738303e+00
2142 10 425 133.683791251965 6.9381764425e-02
2143 10 426 134.030943594212 5.2772008000e-02
2144 10 427 134.357750259641 5.8838672414e-02
2145 10 428 134.749616211967 1.0209961874e+00
2146 10 429 134.933284545778 7.9036757952e-02
2147 10 430 135.274618649508 5.3803089556e-02
2148 10 431 135.597812401258 5.1216465576e-02
2149 10 432 135.916522558601 5.1881082880e-02
2150 10 433 136.231959819433 5.0783067226e-02
2151 10 434 136.548074210695 5.0817625541e-02
2152 10 435 136.869084017787 5.6306094659e-02
2153 10 436 137.178350737867 5.1168637070e-02
2154 10 437 137.494791208319 5.0522368299e-02
2155 10 438 137.808350253237 5.1671037999e-02
2156 10 439 138.116436606230 1.0508501393e+00
2157 10 440 138.443437657187 5.2092918805e-02
2158 10 441 138.748805668347 5.6144085760e-02
2159 10 442 139.067644794033 5.0891453591e-02
2160 10 443 139.385669181834 5.1929759824e-02
2161 10 444 139.734671467606 1.0498708651e+00
2162 10 445 140.005424461426 5.8354988158e-02
2163 10 446 140.332450498885 5.1581803722e-02
2164 10 447 140.657083050540 5.3232950366e-02
2165 10 448 141.063314643991 3.2288284105e-01
2166 10 449 141.147617938136 7.6975745000e-01
2167 10 450 141.565423863748 5.4943017421e-02
2168 10 451 141.874928364834 5.6317170733e-02
2169 10 452 142.201665045314 5.2014057252e-02
2170 10 453 142.523386862855 5.2107019031e-02
2171 10 454 142.833468964818 5.8835902585e-02
2172 10 455 143.113719642297 1.0494596593e+00
2173 10 456 143.464249829187 5.0944428700e-02
2174 10 457 143.779081945227 5.1064727949e-02
2175 10 458 144.096972260055 5.1314581319e-02
2176 10 459 144.419699944573 5.8191106699e-02
2177 10 460 144.725844616856 5.2804350452e-02
2178 10 461 145.045954752345 5.0328442978e-02
2179 10 462 145.366218320638 5.6633749520e-02
2180 10 463 145.667850747872 5.3197393943e-02
2181 10 464 146.000323076937 1.0525503245e+00
2182 10 465 146.308081174359 5.3092887793e-02
2183 10 466 146.611918874570 5.7842021089e-02
2184 10 467 146.938578442123 5.3342848680e-02
2185 10 468 147.332156981066 1.8279110035e-01
2186 10 469 147.438393479631 9.1152055004e-01
2187 10 470 147.849862362434 5.3149917221e-02
2188 10 471 148.173935726984 5.2030276350e-02
2189 10 472 148.491628539824 5.0564044978e-02
2190 10 473 148.811062772237 5.2509810065e-02
2191 10 474 149.125614086114 5.2155415026e-02
2192 10 475 149.434589982105 6.0015854488e-02
2193 10 476 149.763188309625 5.2783424909e-02
2194 10 477 150.055178882346 1.0529746842e+00
2195 10 478 150.379998462715 5.7467864728e-02
2196 10 479 150.731792539772 6.7387023331e-02
2197 10 480 150.930915159288 1.0314167859e+00
2198 10 481 151.317980217695 5.3579860047e-02
2199 10 482 151.625717085525 6.0071455732e-02
2200 10 483 151.954502724699 5.2978535712e-02
2201 10 484 152.277356972962 5.2730064614e-02
2202 10 485 152.611326386726 6.0394854554e-02
2203 10 486 153.006575034962 8.8028084585e-01
2204 10 487 153.107372640756 2.1509342556e-01
2205 10 488 153.501597851891 5.3068615921e-02
2206 10 489 153.826423967612 5.3270633726e-02
2207 10 490 154.144005095706 5.2714573368e-02
2208 10 491 154.467286774912 6.3321648042e-02
2209 10 492 154.780208704950 5.2038457706e-02
2210 10 493 155.101618131341 5.1370018535e-02
2211 10 494 155.427422501897 6.0189860196e-02
2212 10 495 155.727255511031 5.3813855833e-02
2213 10 496 156.107921189624 1.0381421726e+00
2214 10 497 156.321727792954 6.1024740434e-02
2215 10 498 156.656941311695 5.2536932702e-02
2216 10 499 156.977700464799 5.1595592893e-02
2217 10 500 157.300556920559 5.3887292596e-02
2218 10 501 157.597647478316 1.0621073135e+00
2219 10 502 157.922816954464 5.2104338908e-02
2220 10 503 158.238240679507 5.2286425762e-02
2221 10 504 158.558871840189 5.3094190851e-02
2222 10 505 158.850312986050 1.0609956436e+00
2223 10 506 159.180444915157 5.4010878613e-02
2224 10 507 159.500444603833 5.0914736385e-02
2225 10 508 159.817635032272 5.1865548610e-02
2226 10 509 160.135121019543 5.1070201532e-02
2227 10 510 160.452896038997 5.3184792693e-02
2228 10 511 160.792555967152 6.3930086744e-02
2229 10 512 161.176948003852 9.6961154705e-01
2230 10 513 161.307382762660 1.2694408851e-01
2231 10 514 161.696302338730 6.8349489237e-02
2232 10 515 162.005327754887 5.2905143825e-02
2233 10 516 162.327031069707 5.2958282694e-02
2234 10 517 162.646171916509 6.8727146360e-02
2235 10 518 163.025880821688 1.0358984916e+00
2236 10 519 163.241205840438 6.2780370385e-02
2237 10 520 163.575292887155 5.1714458059e-02
2238 10 521 163.896680746742 5.2737685883e-02
2239 10 522 164.220548451212 6.7419520775e-02
2240 10 523 164.530149340844 5.4056651635e-02
2241 10 524 164.846979740640 5.2244483405e-02
2242 10 525 165.167119507523 5.2247399240e-02
2243 10 526 165.533617878711 1.0446200843e+00
2244 10 527 165.780981441639 5.6855018421e-02
2245 10 528 166.120187116595 6.2176989329e-02
2246 10 529 166.406290540368 5.8823740893e-02
2247 10 530 166.744066774452 5.4839540483e-02
2248 10 531 167.162203574255 8.0233341711e-01
2249 10 532 167.250759731556 2.9355432479e-01
2250 10 533 167.659181619446 5.4599111838e-02
2251 10 534 167.985062695886 5.4187692053e-02
2252 10 535 168.290013816882 6.8668170557e-02
2253 10 536 168.641994379596 6.1790516776e-02
2254 10 537 169.002799492239 2.1625534747e-01
2255 10 538 169.112537090194 8.8906610548e-01
2256 10 539 169.536528517289 5.5186116354e-02
2257 10 540 169.908842913924 1.0461915094e+00
2258 10 541 170.162949674155 5.7456004242e-02
2259 10 542 170.466584203598 7.0101384286e-02
2260 10 543 170.799146628458 5.3578550999e-02
2261 10 544 171.122035174445 5.2309544138e-02
2262 10 545 171.437023385938 5.3826594239e-02
2263 10 546 171.759188882832 5.3019365230e-02
2264 10 547 172.050186674464 6.8931365104e-02
2265 10 548 172.381447691286 5.2715496812e-02
2266 10 549 172.702052236650 5.2644872284e-02
2267 10 550 173.027926848228 5.4183233129e-02
2268 10 551 173.404222991680 1.0502168664e+00
2269 10 552 173.605160680376 7.0830034952e-02
2270 10 553 173.949751224133 5.4605386257e-02
2271 10 554 174.295096963682 7.7140014523e-02
2272 10 555 174.677214155019 2.4297170240e-01
2273 10 556 174.773952364756 8.5291289592e-01
2274 10 557 175.186215247837 5.5281154155e-02
2275 10 558 175.514702462350 5.3110967669e-02
2276 10 559 175.834087521675 5.2504399050e-02
2277 10 560 176.154592511879 5.2413571213e-02
2278 10 561 176.442941756527 1.0536652932e+00
2279 10 562 176.803269824120 6.6266905026e-02
2280 10 563 177.079607800051 5.9761983336e-02
2281 10 564 177.408511611495 5.3379684605e-02
2282 10 565 177.726751538393 5.4351842517e-02
2283 10 566 178.064619205882 6.5614991764e-02
2284 10 567 178.374733781269 1.0579083011e+00
2285 10 568 178.659141379918 5.5253876576e-02
2286 10 569 178.992501783829 5.7327213399e-02
2287 10 570 179.264747069845 6.9584474748e-02
2288 10 571 179.605831368356 5.3222208250e-02
2289 10 572 179.916651704065 1.0546626845e+00
2290 10 573 180.238668429897 5.1561855159e-02
2291 10 574 180.551821174720 5.2647894838e-02
2292 10 575 180.871335431451 8.1308309975e-02
2293 10 576 181.190173953098 5.3507852164e-02
2294 10 577 181.489662118809 7.7924462365e-02
2295 10 578 181.820642271996 5.6738820756e-02
2296 10 579 182.202146673550 1.0364531152e+00
2297 10 580 182.414620571800 6.3170263398e-02
2298 10 581 182.753884782023 5.4976342870e-02
2299 10 582 183.067272681777 5.3147692127e-02
2300 10 583 183.382762324224 5.2965335860e-02
2301 10 584 183.706035208050 5.2542436399e-02
2302 10 585 184.014979704215 8.3138499729e-02
2303 10 586 184.350716684054 5.5501555355e-02
2304 10 587 184.690230858520 7.3843764791e-02
2305 10 588 184.881285134439 1.0267206064e+00
2306 10 589 185.294140705878 7.0805029341e-02
2307 10 590 185.596267245694 1.0618010959e+00
2308 10 591 185.882872148498 5.6219413778e-02
2309 10 592 186.210886144028 5.5216915099e-02
2310 10 593 186.556792008193 7.8161657320e-02
2311 10 594 186.828219199210 6.0223115640e-02
2312 10 595 187.224049147685 1.0366641261e+00
2313 10 596 187.435142720456 6.4028962445e-02
2314 10 597 187.775533799182 5.3399989901e-02
2315 10 598 188.094646662366 5.2983442515e-02
2316 10 599 188.408160937938 8.9026807874e-02
2317 10 600 188.729010275717 5.4069948695e-02
2318 10 601 189.052094443089 5.3483635896e-02
2319 10 602 189.412751145883 1.0465310358e+00
2320 10 603 189.674895915157 9.0404126621e-02
2321 10 604 189.985978619148 5.6976876845e-02
2322 10 605 190.309096211569 5.4495892614e-02
2323 10 606 190.651495337339 7.8862861804e-02
2324 10 607 190.917057559209 6.2254286487e-02
2325 10 608 191.246135621751 5.4801458729e-02
2326 10 609 191.576461110447 5.5598944730e-02
2327 10 610 191.994249650562 6.6760016052e-01
2328 10 611 192.083127732559 4.6464833125e-01
2329 10 612 192.478492567400 6.0010635221e-02
2330 10 613 192.809287727074 5.5491128213e-02
2331 10 614 193.082043115769 1.0494150092e+00
2332 10 615 193.433995911530 5.7054238698e-02
2333 10 616 193.757536756056 5.5882369693e-02
2334 10 617 194.075685741597 5.5238065359e-02
2335 10 618 194.404901304189 9.0598900253e-02
2336 10 619 194.705853535100 5.5098649589e-02
2337 10 620 195.039654913221 6.1336841597e-02
2338 10 621 195.269633012386 1.0420487469e+00
2339 10 622 195.644307138488 5.5212716941e-02
2340 10 623 195.983081577063 6.0475363887e-02
2341 10 624 196.246336902546 8.9242548300e-02
2342 10 625 196.603173371871 6.0794172322e-02
2343 10 626 196.881353306186 1.0731879797e+00
2344 10 627 197.186081407598 6.7880426506e-02
2345 10 628 197.540570517811 5.9198923197e-02
2346 10 629 197.932311199697 2.3389732374e-01
2347 10 630 198.032816611834 9.0941307272e-01
2348 10 631 198.450193119836 5.6663859231e-02
2349 10 632 198.773296242512 5.7151519331e-02
2350 10 633 199.093600908631 5.1920922929e-02
2351 10 634 199.414622882594 5.5313228900e-02
2352 10 635 199.732818785669 5.5572724428e-02
2353 10 636 200.078733754058 8.0550882638e-02
2354 10 637 200.320442776243 7.3844366803e-02
2355 10 638 200.673138980517 5.5442629784e-02
2356 10 639 201.024006951218 8.7478478441e-02
2357 10 640 201.264711696851 1.0673543942e+00
2358 10 641 201.609822497531 5.6912498437e-02
2359 10 642 201.928638389522 5.6222141613e-02
2360 10 643 202.261861190323 5.8007982290e-02
2361 10 644 202.497620667503 1.0484816437e+00
2362 10 645 202.867940723449 5.4329623834e-02
2363 10 646 203.214971739485 1.0370279719e-01
2364 10 647 203.489834908296 5.9133814575e-02
2365 10 648 203.822521467256 5.6535451310e-02
2366 10 649 204.186715225694 1.0489123556e+00
2367 10 650 204.468800336147 7.7304599684e-02
2368 10 651 204.709446954061 8.6708640964e-02
2369 10 652 205.060647562308 5.5958152700e-02
2370 10 653 205.394001675771 1.0544908151e+00
2371 10 654 205.702794435045 5.4787681703e-02
2372 10 655 206.029786595287 5.9141500008e-02
2373 10 656 206.295113092627 1.0659432377e-01
2374 10 657 206.638173540893 5.5243638123e-02
2375 10 658 206.961946868961 5.5889725579e-02
2376 10 659 207.283341294328 5.4031829190e-02
2377 10 660 207.631905034902 1.0852703833e-01
2378 10 661 207.905846581542 1.0583926687e+00
2379 10 662 208.234873609486 6.0570082085e-02
2380 10 663 208.499206709308 1.1120331043e-01
2381 10 664 208.853766856101 5.8038579317e-02
2382 10 665 209.173092099394 5.7882342330e-02
2383 10 666 209.569431331459 1.0297328031e+00
2384 10 667 209.788355733325 1.0254353400e-01
2385 10 668 210.040394424501 8.9710496071e-02
2386 10 669 210.401341790479 5.6790944117e-02
2387 10 670 210.723644178516 5.4249973668e-02
2388 10 671 211.047847331863 5.7763875558e-02
2389 10 672 211.354868089021 5.5613748805e-02
2390 10 673 211.689898961779 1.0549314490e+00
2391 10 674 211.991927369604 5.6504189544e-02
2392 10 675 212.311611082975 5.5906606211e-02
2393 10 676 212.652119594822 6.5945971251e-02
2394 10 677 212.908869737557 1.1691529446e-01
2395 10 678 213.335858250394 1.0728427169e+00
2396 10 679 213.500808656406 1.0131000635e-01
2397 10 680 213.858438646359 5.7265770798e-02
2398 10 681 214.181840791918 5.7812449512e-02
2399 10 682 214.544807800174 1.0522138587e+00
2400 10 683 214.827573778615 6.1544251805e-02
2401 10 684 215.090534026747 1.2179018539e-01
2402 10 685 215.447532345997 5.7541569943e-02
2403 10 686 215.776053398295 6.0179493575e-02
2404 10 687 216.162669825720 1.0256067778e+00
2405 10 688 216.349790754384 1.6001566572e-01
2406 10 689 216.697371025311 5.6781216063e-02
2407 10 690 217.020928330801 5.6586354139e-02
2408 10 691 217.344274281319 5.6677573975e-02
2409 10 692 217.698032521619 9.6050509985e-02
2410 10 693 217.916341327396 9.4248810798e-02
2411 10 694 218.274942752055 5.7277545671e-02
2412 10 695 218.608784931889 6.1685454705e-02
2413 10 696 219.041316144699 7.9418589595e-01
2414 10 697 219.147291291746 3.3010138677e-01
2415 10 698 219.460022904816 1.1443298549e-01
2416 10 699 219.813737228830 5.9559724491e-02
2417 10 700 220.150273186188 6.2942399318e-02
2418 10 701 220.482070764191 6.4063049184e-02
2419 10 702 220.720503040287 1.1311201446e+00
2420 10 703 221.086466837732 5.6747442069e-02
2421 10 704 221.429891555348 1.0591322218e+00
2422 10 705 221.726387789282 5.7309429431e-02
2423 10 706 222.044567491685 5.7265974857e-02
2424 10 707 222.359534530958 6.1667434166e-02
2425 10 708 222.692728283335 5.8073081759e-02
2426 10 709 223.033994109352 7.6061139485e-02
2427 10 710 223.251725710892 1.2170044328e-01
2428 10 711 223.623924682665 6.0188940257e-02
2429 10 712 224.004992396161 1.1057452189e+00
2430 10 713 224.196736064775 9.6996026445e-02
2431 10 714 224.564025936879 5.9832560097e-02
2432 10 715 224.969313959330 9.6611986112e-01
2433 10 716 225.099920366080 1.4387289049e-01
2434 10 717 225.465962889836 1.5633508066e-01
2435 10 718 225.800430141387 6.4246799394e-02
2436 10 719 226.126421402811 5.5921153735e-02
2437 10 720 226.463514933579 1.5646483560e-01
2438 10 721 226.759671893374 5.7846071454e-02
2439 10 722 227.066211121227 5.9900352081e-02
2440 10 723 227.419565324501 1.0579162487e+00
2441 10 724 227.700843455093 5.7244570071e-02
2442 10 725 228.025074838976 6.0322594648e-02
2443 10 726 228.333851765006 1.6507543482e-01
2444 10 727 228.650805701729 5.8851483361e-02
2445 10 728 228.977363209351 6.2742207285e-02
2446 10 729 229.333826313396 1.0518929708e+00
2447 10 730 229.587553882219 6.0800744830e-02
2448 10 731 229.913850433342 5.9371627156e-02
2449 10 732 230.281502098888 9.8188126675e-02
2450 10 733 230.484217797966 1.2704039999e-01
2451 10 734 230.854296418268 6.2766210289e-02
2452 10 735 231.243550087780 1.0353311139e+00
2453 10 736 231.449995105665 7.9037167582e-02
2454 10 737 231.852545609386 1.4248847114e-01
2455 10 738 231.994612589524 1.0863556650e+00
2456 10 739 232.399300895639 6.0872281374e-02
2457 10 740 232.731027186061 1.7958915103e-01
2458 10 741 233.033310542957 6.0210042518e-02
2459 10 742 233.355353276309 5.8488441612e-02
2460 10 743 233.692232893905 1.0576915559e+00
2461 10 744 233.983839548851 5.9975998342e-02
2462 10 745 234.309109730440 5.8188541377e-02
2463 10 746 234.633859326377 6.1069410709e-02
2464 10 747 234.907588152582 1.8586216209e-01
2465 10 748 235.250008356619 6.0400016344e-02
2466 10 749 235.580911152264 6.1909138911e-02
2467 10 750 235.923533243363 8.6931906807e-02
2468 10 751 236.127837484130 1.5956435507e-01
2469 10 752 236.522641056729 1.0585725147e+00
2470 10 753 236.844872260440 1.9337835652e-01
2471 10 754 237.130497939868 6.2515167929e-02
2472 10 755 237.442684776689 6.0520115620e-02
2473 10 756 237.769187745413 1.0583233617e+00
2474 10 757 238.080580646684 6.7334603608e-02
2475 10 758 238.400625089043 5.9635731840e-02
2476 10 759 238.717383998955 5.7412828058e-02
2477 10 760 239.040863001390 6.1882018635e-02
2478 10 761 239.417361742100 1.8989347529e-01
2479 10 762 239.561687573677 1.0712696723e+00
2480 10 763 239.957979583628 6.0185198987e-02
2481 10 764 240.286272371767 6.6362110494e-02
2482 10 765 240.607710901900 6.5207733890e-02
2483 10 766 241.024571733795 8.0705781934e-01
2484 10 767 241.111781204460 4.5030844238e-01
2485 10 768 241.515383368719 6.2200029764e-02
2486 10 769 241.847846171649 6.1685366068e-02
2487 10 770 242.160196905178 6.0722816966e-02
2488 10 771 242.465530081312 2.2107616946e-01
2489 10 772 242.821927617509 1.0588726602e+00
2490 10 773 243.122081934848 6.6919176749e-02
2491 10 774 243.385367984814 2.1155884495e-01
2492 10 775 243.738263134135 6.6540319342e-02
2493 10 776 244.070088224098 1.0628340505e+00
2494 10 777 244.371692864080 6.3335550567e-02
2495 10 778 244.732574577335 9.8660304961e-02
2496 10 779 244.923800791522 1.8577241884e-01
2497 10 780 245.298607668351 6.2236274249e-02
2498 10 781 245.615736103361 6.6635890187e-02
2499 10 782 245.948597720732 6.5318169130e-02
2500 10 783 246.262907955878 6.0267066894e-02
2501 10 784 246.589090478350 6.6469614955e-02

E-022-spectral-measure.json — 4.3 KB, updated 08-19-2026

JSON sidecar (click to expand)
{
  "experiment": "E-022",
  "task": "2.10 (D-035 D2): spectral-measure convergence",
  "script": "research/numerics/scripts/E-022-spectral-measure.py",
  "parameters": {
    "a_list": [
      4.0,
      6.0,
      8.0,
      10.0,
      12.0
    ],
    "h": 0.01,
    "lam": -1.0,
    "z_max": 300.0,
    "z_metric": 280.0,
    "sigma_bump": 8.0,
    "n_grid": 40000
  },
  "checks": {
    "V0_schur_vs_solve_v": true,
    "V1_weights_positive": true,
    "V2_refinement": true,
    "V3_lattice_and_z1law": true
  },
  "key_values": {
    "4": {
      "n_zeros": 381,
      "z1": 1.1260734006983593,
      "z1_times_a": 4.504293602793437,
      "lattice_expected": 381.9718634205488,
      "mass_total_Zmetric": 184.02432245308052,
      "O1_cumulative_Linf": 0.030472775278319375,
      "O1_cumulative_L2": 0.015369322417422383,
      "O2_logw_slope": 0.004773175983096674,
      "O2_logw_R2": 0.17155831473911887,
      "O2_logw_std_resid": 0.8476672146023767,
      "O3_weak_metric": 0.010527875427328966,
      "O5_mass_near_gamma": 1.6069393990772483,
      "O5_mass_near_random": 1.239913792291073,
      "O5_ratio": 1.2960089718076262,
      "elapsed_s": 2.9
    },
    "6": {
      "n_zeros": 572,
      "z1": 0.7499016225074712,
      "z1_times_a": 4.499409735044827,
      "lattice_expected": 572.9577951308232,
      "mass_total_Zmetric": 184.01489106241632,
      "O1_cumulative_Linf": 0.02723380344436621,
      "O1_cumulative_L2": 0.015298102993183555,
      "O2_logw_slope": 0.004573680792971365,
      "O2_logw_R2": 0.13177706690264612,
      "O2_logw_std_resid": 0.9483241546589634,
      "O3_weak_metric": 0.010569164981132785,
      "O5_mass_near_gamma": 1.6173747450375149,
      "O5_mass_near_random": 1.257329769139859,
      "O5_ratio": 1.2863568371120038,
      "elapsed_s": 4.8
    },
    "8": {
      "n_zeros": 763,
      "z1": 0.5621012628096893,
      "z1_times_a": 4.4968101024775144,
      "lattice_expected": 763.9437268410976,
      "mass_total_Zmetric": 184.13312237431055,
      "O1_cumulative_Linf": 0.027258094320286474,
      "O1_cumulative_L2": 0.015486596743652112,
      "O2_logw_slope": 0.004185396789595135,
      "O2_logw_R2": 0.10532818940743971,
      "O2_logw_std_resid": 0.986518773772079,
      "O3_weak_metric": 0.010568959142405882,
      "O5_mass_near_gamma": 1.6196075350475192,
      "O5_mass_near_random": 1.2561234028070363,
      "O5_ratio": 1.2893697636937673,
      "elapsed_s": 8.2
    },
    "10": {
      "n_zeros": 954,
      "z1": 0.44959701245436284,
      "z1_times_a": 4.4959701245436285,
      "lattice_expected": 954.9296585513721,
      "mass_total_Zmetric": 184.1239991524169,
      "O1_cumulative_Linf": 0.024844169503423608,
      "O1_cumulative_L2": 0.015446208652370818,
      "O2_logw_slope": 0.0038097364559334847,
      "O2_logw_R2": 0.08653440341105123,
      "O2_logw_std_resid": 1.0006504172097648,
      "O3_weak_metric": 0.010581710686957842,
      "O5_mass_near_gamma": 1.6290317856739722,
      "O5_mass_near_random": 1.2562149964535079,
      "O5_ratio": 1.2967778527345915,
      "elapsed_s": 13.4
    },
    "12": {
      "n_zeros": 1145,
      "z1": 0.3746087478472408,
      "z1_times_a": 4.495304974166889,
      "lattice_expected": 1145.9155902616465,
      "mass_total_Zmetric": 184.10483484645468,
      "O1_cumulative_Linf": 0.028584131798192303,
      "O1_cumulative_L2": 0.015417413187446537,
      "O2_logw_slope": 0.003682406300531162,
      "O2_logw_R2": 0.08233450272296328,
      "O2_logw_std_resid": 0.9935774298804366,
      "O3_weak_metric": 0.010592268896428007,
      "O5_mass_near_gamma": 1.6165573705799765,
      "O5_mass_near_random": 1.2532365071394718,
      "O5_ratio": 1.2899060643148588,
      "elapsed_s": 20.9
    },
    "O4_trend": {
      "a": [
        4.0,
        6.0,
        8.0,
        10.0,
        12.0
      ],
      "d_a": [
        0.010527875427328966,
        0.010569164981132785,
        0.010568959142405882,
        0.010581710686957842,
        0.010592268896428007
      ],
      "monotone_decreasing": false
    },
    "V0_max_dev": 3.560323900663321e-14,
    "V2_rel": 0.0011243096862693027
  },
  "elapsed_seconds": 743.1,
  "timestamp_utc": "2026-08-19T17:19:38.162052+00:00"
}

Source code

Python script (click to expand)
"""E-022 — task 2.10 (D-035 deliverable D2): spectral-measure
convergence of Suzuki's D_{a,pi} toward the gamma-target measure.

For each a in {4,6,8,10,12} (theta=pi, all zeros real, E-016 F1):
  - locate zeros z_k of W(a,pi;z) on (0, Z_MAX] (E-016/E-019 route:
    grid sign-changes of g(z) = z Im V+ - Re V+ + brentq);
  - compute the Clark/de Branges spectral weights
        w_k = 1 / K_a(z_k, z_k),
    K_a(z,z) = Re(b_z^H v),  v solves the BORDERED (mean-zero, L^2_0)
    Galerkin system  T v + mu e = b_z,  e.v = 0,
    T = Q - lam M (lam = -1),  b_z = h sinc^2(zh/2pi) e^{-i z x}
    (exact hat-basis quadrature), via Schur reduction on shared
    u1 = T^{-1} e: v = T^{-1}(b_z - mu e), mu = (e.u0)/(e.u1).
    Toeplitz solves (scipy solve_toeplitz); V0 validates the Schur
    solve against E16.solve_v (bordered dense) for b[+1].

Target measure: unit atoms at the Riemann zeros gamma_k (mpmath
zetazero, dps 30, float64 sufficient for statistics).

Observables:
  O1. normalized cumulative mass M_a(x)/M_a(Z') vs N_gamma(x)/N(Z'),
      Z' = 280 (Linfty + L2 discrepancy).
  O2. weight profile: linear fit log w_k vs z_k (slope, spread R^2).
  O3. weak metric: Gaussian bumps f_j (30 log-spaced centers in
      [15,250], sigma=8): d_a = max_j |mu~_a(f_j) - nu~(f_j)|,
      normalized by total mass in (0, Z'].
  O4. d_a vs a  -> convergence-rate estimate (headline).
  O5. gamma-concentration: mean mu_a-mass within +/-1 of each gamma
      vs within +/-1 of random points (does the WEIGHT carry gamma
      information even though positions don't lock? — E-019 B2 found
      chance-level POSITION proximity).

Checks:
  V0. Schur-Toeplitz bordered solve vs E16.solve_v (b[+1]): < 1e-8.
  V1. all weights > 0.
  V2. refinement a=4, h=0.005: weight rel dev on first 50 zeros < 5e-3.
  V3. z1*a in [4.3, 4.7] (stiff law, E-019) and count = maximal
      lattice (a*Z_MAX/pi +/- 2) at every a.
  V4. total mass M_a(Z') recorded vs a (scaling documented).

Outputs: research/numerics/data/E-022-spectral-measure.csv (+ .json)
LONG RUN: detached + log file (per STATE.md protocol).
"""
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
import scipy.optimize

REPO = Path(__file__).resolve().parents[3]
DATA = REPO / "research" / "numerics" / "data"
CSV = DATA / "E-022-spectral-measure.csv"
JSON = DATA / "E-022-spectral-measure.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_MAIN = E16.H_MAIN          # 0.01
LAM = E16.LAM_SHIFT          # -1.0
A_LIST = [4.0, 6.0, 8.0, 10.0, 12.0]
Z_MAX = 300.0
Z_METRIC = 280.0
N_GRID = 40000
SIGMA_BUMP = 8.0
mp.mp.dps = 40

XN, XW = E16.XN, E16.XW
hat_FT = E16.hat_FT


def collect_t_points(a, h):
    """Copy of E-019's collector (E-016 S_full/quad segment structure)."""
    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 locate_zeros(cp, x, h, z_max=Z_MAX, n_grid=N_GRID):
    zg = np.linspace(1e-3, z_max, n_grid)
    Vpr, _ = E16.V_and_dV(zg, cp, x, h)
    g = zg * Vpr.imag - Vpr.real

    def g_direct(zz):
        V = hat_FT(np.array([zz]), h)[0] * complex(
            np.exp(1j * zz * x) @ cp)
        return zz * V.imag - V.real

    idx = np.flatnonzero(np.sign(g[:-1]) * np.sign(g[1:]) < 0)
    zeros = []
    for i in idx:
        try:
            zeros.append(scipy.optimize.brentq(g_direct, zg[i], zg[i + 1],
                                               xtol=1e-13, rtol=1e-13))
        except ValueError:
            pass
    return np.array(zeros)


class ToeplitzBordered:
    """Schur-reduced bordered solve for T = toeplitz(tc), constraint
    e.v = 0 (e = ones):  v = u0 - mu u1, mu = sum(u0)/sum(u1)."""

    def __init__(self, tc):
        self.tc = tc
        n = len(tc)
        self.u1 = scipy.linalg.solve_toeplitz((tc, tc), np.ones(n))
        self.s1 = float(self.u1.sum())

    def solve(self, b):
        u0 = scipy.linalg.solve_toeplitz((self.tc, self.tc), b)
        return u0 - (u0.sum() / self.s1) * self.u1


def weights_for(a, h, zeros, x):
    """K_k and w_k for the given zero list (build(a,h) cached)."""
    _, _, Q, M, _b = E16.build(a, h)
    n = Q.shape[0]
    mc = np.zeros(n)
    mc[0] = 2 * h / 3
    if n > 1:
        mc[1] = h / 6
    tc = Q[:, 0] - LAM * mc
    solver = ToeplitzBordered(tc)
    Ks = np.empty(len(zeros))
    for i, z in enumerate(zeros):
        bz = hat_FT(np.array([z]), h)[0] * np.exp(-1j * z * x)
        v = solver.solve(bz)
        Ks[i] = float(np.real(np.conj(bz) @ v))
    return Ks


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

    # ---- backend v2 (e^24) ------------------------------------------
    print("collecting quadrature t-points ...", flush=True)
    tq = np.concatenate([collect_t_points(a, H_MAIN) for a in A_LIST]
                        + [collect_t_points(4.0, 0.005)])
    print(f"  {tq.size} points; building/loading backend ...", flush=True)
    CACHE = DATA / "E-022-backend-cache.npz"
    be = PrimeBackendV2(tq)
    if CACHE.exists() and "--force" not in sys.argv:
        be.load_cache(CACHE)
        print("  backend loaded from cache", flush=True)
    else:
        be.build(verbose=True)
        be.save_cache(CACHE)
    E16._BUILD.clear()
    E16.prime_sum_vec = be.prime_sum

    # ---- gamma target ------------------------------------------------
    print("target: first 200 Riemann zeros (zetazero) ...", flush=True)
    mp.mp.dps = 30
    gam = np.array([float(mp.zetazero(k).imag) for k in range(1, 201)])
    gam = gam[gam <= Z_METRIC]

    # ---- main sweep --------------------------------------------------
    rows = []
    report = {"per_a": {}}
    v0_max = 0.0
    v1_ok = True
    v3_ok = True
    zc = np.linspace(10.0, Z_METRIC, 800)
    centers = np.geomspace(15.0, 250.0, 30)

    for a in A_LIST:
        ta = time.time()
        x, h, Q, M, b = E16.build(a, H_MAIN)
        n = len(x)
        # V0: Schur-Toeplitz vs E16.solve_v on b[+1]
        mc = np.zeros(n)
        mc[0] = 2 * h / 3
        mc[1] = h / 6
        tc = Q[:, 0] - LAM * mc
        solver = ToeplitzBordered(tc)
        cp_ref, _T = E16.solve_v(Q, M, b[+1.0], LAM, n)
        cp_schur = solver.solve(b[+1.0])
        dev = float(np.max(np.abs(cp_ref - cp_schur))
                    / max(1.0, float(np.max(np.abs(cp_ref)))))
        v0_max = max(v0_max, dev)

        cp, _ = E16.solve_v(Q, M, b[+1.0], LAM, n)
        cm, _ = E16.solve_v(Q, M, b[-1.0], LAM, n)
        zeros = locate_zeros(cp, x, h)

        Ks = weights_for(a, H_MAIN, zeros, x)
        ws = 1.0 / Ks
        if np.any(Ks <= 0):
            v1_ok = False

        z1 = float(zeros[0])
        lat = a * Z_MAX / np.pi
        if not (4.3 < z1 * a < 4.7) or abs(len(zeros) - lat) > 2:
            v3_ok = False

        # --- metrics (zeros in (0, Z_METRIC])
        zm = zeros[zeros <= Z_METRIC]
        wm = ws[zeros <= Z_METRIC]
        Mtot = float(wm.sum())
        # O1: cumulative shape vs unit-weight gamma measure
        Ma = np.array([wm[zm <= t].sum() for t in zc]) / Mtot
        Ng = np.array([np.sum(gam <= t) for t in zc]) / len(gam)
        o1_linf = float(np.max(np.abs(Ma - Ng)))
        o1_l2 = float(np.sqrt(np.mean((Ma - Ng) ** 2)))
        # O2: weight profile
        A_ = np.vstack([zm, np.ones_like(zm)]).T
        slope, intercept = np.linalg.lstsq(A_, np.log(wm), rcond=None)[0]
        pred = slope * zm + intercept
        ss_res = float(np.sum((np.log(wm) - pred) ** 2))
        ss_tot = float(np.sum((np.log(wm) - np.log(wm).mean()) ** 2))
        r2 = 1.0 - ss_res / max(ss_tot, 1e-300)
        # O3: Gaussian-bump weak metric
        def bump(z, c):
            return np.exp(-0.5 * ((z - c) / SIGMA_BUMP) ** 2)
        mu_f = np.array([np.dot(wm, bump(zm, c)) for c in centers]) / Mtot
        nu_f = np.array([bump(gam, c).sum() for c in centers]) / len(gam)
        o3 = float(np.max(np.abs(mu_f - nu_f)))
        # O5: gamma-concentration of mass
        mass_near_g = float(np.mean([wm[np.abs(zm - g) <= 1.0].sum()
                                     for g in gam]))
        rng = np.random.default_rng(7)
        rpts = rng.uniform(15.0, 250.0, len(gam))
        mass_near_r = float(np.mean([wm[np.abs(zm - r) <= 1.0].sum()
                                     for r in rpts]))

        for k, (zz, ww) in enumerate(zip(zeros, ws), 1):
            rows.append((a, k, zz, ww))
        report["per_a"][f"{a:g}"] = {
            "n_zeros": int(len(zeros)), "z1": z1, "z1_times_a": z1 * a,
            "lattice_expected": lat,
            "mass_total_Zmetric": Mtot,
            "O1_cumulative_Linf": o1_linf, "O1_cumulative_L2": o1_l2,
            "O2_logw_slope": float(slope), "O2_logw_R2": r2,
            "O2_logw_std_resid": float(np.sqrt(ss_res / max(len(zm) - 2, 1))),
            "O3_weak_metric": o3,
            "O5_mass_near_gamma": mass_near_g,
            "O5_mass_near_random": mass_near_r,
            "O5_ratio": mass_near_g / max(mass_near_r, 1e-300),
            "elapsed_s": round(time.time() - ta, 1),
        }
        print(f"a={a:g}: {len(zeros)} zeros, z1a={z1 * a:.3f}, "
              f"mass={Mtot:.3e}, O3={o3:.4f}, "
              f"O5={mass_near_g:.3e}/{mass_near_r:.3e} "
              f"({report['per_a'][f'{a:g}']['elapsed_s']}s)", flush=True)

    # ---- V2: refinement at a=4, h=0.005 ------------------------------
    print("V2: refinement a=4 h=0.005 (first 50 zeros) ...", flush=True)
    x5, h5, Q5, M5, b5 = E16.build(4.0, 0.005)
    cp5, _ = E16.solve_v(Q5, M5, b5[+1.0], LAM, len(x5))
    zeros5 = locate_zeros(cp5, x5, h5)
    K5 = weights_for(4.0, 0.005, zeros5[:50], x5)
    x01, _, _, _, _ = E16.build(4.0, H_MAIN)
    K4 = weights_for(4.0, H_MAIN, zeros5[:50], x01)  # same z's, h=0.01
    v2_rel = float(np.max(np.abs(K5 - K4) / np.abs(K5)))
    print(f"  V2 max rel dev K(h=0.005) vs K(h=0.01): {v2_rel:.2e}",
          flush=True)

    # ---- O4: convergence trend --------------------------------------
    avals = np.array(A_LIST)
    dvals = np.array([report["per_a"][f"{a:g}"]["O3_weak_metric"]
                      for a in A_LIST])
    o4 = {"a": list(avals), "d_a": list(dvals),
          "monotone_decreasing": bool(np.all(np.diff(dvals) < 0))}

    checks = {
        "V0_schur_vs_solve_v": bool(v0_max < 1e-8),
        "V1_weights_positive": bool(v1_ok),
        "V2_refinement": bool(v2_rel < 5e-3),
        "V3_lattice_and_z1law": bool(v3_ok),
    }
    print("checks:", checks, flush=True)

    import csv as csvmod
    with open(CSV, "w", newline="") as f:
        w = csvmod.writer(f)
        w.writerow(["a", "k", "z_k", "w_k"])
        for a, k, zz, ww in rows:
            w.writerow([f"{a:g}", k, f"{zz:.12f}", f"{ww:.10e}"])

    meta = {
        "experiment": "E-022",
        "task": "2.10 (D-035 D2): spectral-measure convergence",
        "script": "research/numerics/scripts/E-022-spectral-measure.py",
        "parameters": {"a_list": A_LIST, "h": H_MAIN, "lam": LAM,
                       "z_max": Z_MAX, "z_metric": Z_METRIC,
                       "sigma_bump": SIGMA_BUMP, "n_grid": N_GRID},
        "checks": checks,
        "key_values": {**report["per_a"], "O4_trend": o4,
                       "V0_max_dev": v0_max, "V2_rel": v2_rel},
        "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())