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 6 of 8 · 500/page · 3815 rows next →
# akz_kw_k
2502 10 785 246.854982647258 2.3751672200e-01
2503 10 786 247.141260074982 1.0517851051e+00
2504 10 787 247.514982201679 6.5043967706e-02
2505 10 788 247.833968435548 7.1217792915e-02
2506 10 789 248.105336264139 1.0586628924e+00
2507 10 790 248.448342419767 2.4847677971e-01
2508 10 791 248.775668031707 6.4080231598e-02
2509 10 792 249.111466212722 6.7665047276e-02
2510 10 793 249.532774297661 6.4170226749e-01
2511 10 794 249.633825064566 5.0134147633e-01
2512 10 795 249.926951918337 2.1855920583e-01
2513 10 796 250.320040646869 6.6048314172e-02
2514 10 797 250.649095746752 6.2237146276e-02
2515 10 798 251.011623846214 1.0648805436e+00
2516 10 799 251.269727925297 6.7178232383e-02
2517 10 800 251.598233491401 6.5072981032e-02
2518 10 801 251.971320146950 2.5324988943e-01
2519 10 802 252.213247158370 7.4665802369e-02
2520 10 803 252.506149998492 2.7033528693e-01
2521 10 804 252.891408867797 9.1089375757e-02
2522 10 805 253.078238035459 1.0271220483e+00
2523 10 806 253.462214472814 6.5836908170e-02
2524 10 807 253.791352042303 6.7152961137e-02
2525 10 808 254.116843223347 7.0474438175e-02
2526 10 809 254.447566218782 2.7765237687e-01
2527 10 810 254.749739323806 6.4513432317e-02
2528 10 811 255.109837014194 1.0510454455e-01
2529 10 812 255.304342084535 1.2445883567e+00
2530 10 813 255.687285606508 6.6011622127e-02
2531 10 814 255.990599879437 6.9464691912e-02
2532 10 815 256.375744026184 1.0506244488e+00
2533 10 816 256.607203596065 7.2562129823e-02
2534 10 817 256.938277826191 7.5126050157e-02
2535 10 818 257.258512204257 6.4686512622e-02
2536 10 819 257.584783260031 6.5540908080e-02
2537 10 820 257.899935356574 6.6945564785e-02
2538 10 821 258.257066099444 2.9979411119e-01
2539 10 822 258.603012520595 1.0502763260e+00
2540 10 823 258.818954026484 8.4249969560e-02
2541 10 824 259.199527442417 1.1232313363e-01
2542 10 825 259.392759260198 2.6096466697e-01
2543 10 826 259.864364330102 1.0242137675e+00
2544 10 827 260.057705691878 1.1446711703e-01
2545 10 828 260.343405454223 3.1204131502e-01
2546 10 829 260.794014213701 1.0146640374e+00
2547 10 830 260.963342176680 1.0926251468e-01
2548 10 831 261.333327141931 7.5371976380e-02
2549 10 832 261.655788235662 6.8350086607e-02
2550 10 833 262.047407911492 2.3405232168e-01
2551 10 834 262.207949843376 1.5537397571e-01
2552 10 835 262.574350248829 7.4363576066e-02
2553 10 836 262.906591467261 6.7495449137e-02
2554 10 837 263.230516551779 6.8022166926e-02
2555 10 838 263.573899584777 1.3396897284e+00
2556 10 839 263.862682489663 7.3398798973e-02
2557 10 840 264.172334493103 7.2829769365e-02
2558 10 841 264.504656292575 6.9775039285e-02
2559 10 842 264.882720637564 1.6703519084e-01
2560 10 843 265.047840700899 2.5205960075e-01
2561 10 844 265.526949746893 7.5650384928e-01
2562 10 845 265.624913520259 3.6915179854e-01
2563 10 846 266.036274789237 7.0023877639e-02
2564 10 847 266.382351327551 8.2485468790e-02
2565 10 848 266.619234203187 1.0611343186e+00
2566 10 849 267.021440641062 3.7357447716e-01
2567 10 850 267.303451552976 6.8568544732e-02
2568 10 851 267.624487832537 7.3181457574e-02
2569 10 852 267.923174277270 1.0671198462e+00
2570 10 853 268.261582311244 7.4712495288e-02
2571 10 854 268.575378008777 3.8235351535e-01
2572 10 855 268.898167777249 6.5628462683e-02
2573 10 856 269.218210286993 7.1612492874e-02
2574 10 857 269.549323878880 7.0228794765e-02
2575 10 858 269.955598179040 9.8880738256e-01
2576 10 859 270.115757967174 1.6214167534e-01
2577 10 860 270.389399592021 3.7745295049e-01
2578 10 861 270.776465294215 7.9017937905e-02
2579 10 862 271.151424405568 3.9358290182e-01
2580 10 863 271.480795094453 1.0228650189e+00
2581 10 864 271.645095643234 1.2894144376e-01
2582 10 865 272.018129525786 7.4910536794e-02
2583 10 866 272.308827024598 4.1161459194e-01
2584 10 867 272.652304098674 7.7417811708e-02
2585 10 868 272.989716070344 7.8953994601e-02
2586 10 869 273.387972144929 3.2846545526e-01
2587 10 870 273.486600698054 7.9924198185e-01
2588 10 871 273.903047441318 8.1209400199e-02
2589 10 872 274.226440055741 7.7273513872e-02
2590 10 873 274.548278540918 7.3316742748e-02
2591 10 874 274.834882652852 4.4366333997e-01
2592 10 875 275.193845695900 7.6478268672e-02
2593 10 876 275.576642950532 1.0230635629e+00
2594 10 877 275.753270103775 1.1104892151e-01
2595 10 878 276.099153087217 8.1600817209e-02
2596 10 879 276.447482126222 1.4573555578e+00
2597 10 880 276.739278015791 7.4956967946e-02
2598 10 881 277.075068921044 7.1606856265e-02
2599 10 882 277.394428511551 8.2210793818e-02
2600 10 883 277.748028350691 1.1280844903e-01
2601 10 884 277.935725037851 4.3045734236e-01
2602 10 885 278.255262423664 1.0664573397e+00
2603 10 886 278.633368264191 7.7802447718e-02
2604 10 887 278.994312304539 4.7687385631e-01
2605 10 888 279.232379464901 1.0799119728e+00
2606 10 889 279.579372133303 8.0044105463e-02
2607 10 890 279.904491085534 8.2561082674e-02
2608 10 891 280.216976554825 7.8385507698e-02
2609 10 892 280.535138481442 7.9593751249e-02
2610 10 893 280.902890617517 1.3103995445e-01
2611 10 894 281.074819867762 4.3900190780e-01
2612 10 895 281.476164655914 7.9220745178e-02
2613 10 896 281.855296056327 1.8942648708e-01
2614 10 897 282.011094642969 4.0638652619e-01
2615 10 898 282.459519184865 1.0669876842e+00
2616 10 899 282.727615298865 9.8509702548e-02
2617 10 900 283.115096750321 2.6451581655e-01
2618 10 901 283.236081576645 8.8460383593e-01
2619 10 902 283.654316300049 5.3664352145e-01
2620 10 903 283.973357539600 9.0144845927e-02
2621 10 904 284.304151322347 7.8537642257e-02
2622 10 905 284.627560452005 1.0000254645e-01
2623 10 906 284.843577950178 1.0520974273e+00
2624 10 907 285.233711959852 8.1666028552e-02
2625 10 908 285.556554683553 8.4712250428e-02
2626 10 909 285.886235983495 8.1628183800e-02
2627 10 910 286.254930974199 5.6596458676e-01
2628 10 911 286.597496095637 4.4469742400e-01
2629 10 912 286.705415298755 7.1904624920e-01
2630 10 913 287.209239875919 3.3321143595e-01
2631 10 914 287.345087140096 3.2331688936e-01
2632 10 915 287.833519941735 3.6167946181e-01
2633 10 916 287.945322218437 8.0554368555e-01
2634 10 917 288.434956322527 5.4179995030e-01
2635 10 918 288.616360967076 1.3167868402e-01
2636 10 919 288.980544328969 8.1514349658e-02
2637 10 920 289.307144478852 9.2837913169e-02
2638 10 921 289.582664012957 1.0829080605e+00
2639 10 922 289.972674884068 6.1860961121e-01
2640 10 923 290.251730751259 8.0096497767e-02
2641 10 924 290.568573888641 1.0341567917e-01
2642 10 925 290.893316602945 7.6738310359e-02
2643 10 926 291.204661478702 9.6472904842e-02
2644 10 927 291.483328682134 6.4141796536e-01
2645 10 928 291.845573217871 1.0843620577e+00
2646 10 929 292.150460709462 7.9545277344e-02
2647 10 930 292.469500648832 8.4362758702e-02
2648 10 931 292.795544691669 9.2230161019e-02
2649 10 932 293.115193808582 9.4377129415e-02
2650 10 933 293.527641344909 8.1284121035e-01
2651 10 934 293.636597784610 3.4741526791e-01
2652 10 935 294.094171790105 6.6701075581e-01
2653 10 936 294.312749262015 1.0564525982e-01
2654 10 937 294.670634450524 6.9281223779e-01
2655 10 938 294.966171436200 1.1048731900e+00
2656 10 939 295.299359502993 8.5245212270e-02
2657 10 940 295.576448653489 1.0828907287e+00
2658 10 941 295.932634590979 8.6096205763e-02
2659 10 942 296.250901802452 8.5129960712e-02
2660 10 943 296.557735836004 9.5847950729e-02
2661 10 944 296.848979858469 7.2632938893e-01
2662 10 945 297.199844637145 9.5440534292e-02
2663 10 946 297.523136220031 9.0116353951e-02
2664 10 947 297.947532153137 8.2318562796e-01
2665 10 948 298.068938544568 3.5907608348e-01
2666 10 949 298.374933752024 7.5215999272e-01
2667 10 950 298.765797555411 9.5780564156e-02
2668 10 951 299.147934130288 1.8572536274e-01
2669 10 952 299.312862632890 6.8094578885e-01
2670 10 953 299.785774864598 5.7652544362e-01
2671 10 954 299.893578977078 5.9980370429e-01
2672 12 1 0.374608747847 4.3748745327e-02
2673 12 2 0.644042632274 4.2382697912e-02
2674 12 3 0.909060322368 4.2034850351e-02
2675 12 4 1.172677822045 4.1894906216e-02
2676 12 5 1.435669320594 4.1824962816e-02
2677 12 6 1.698326559281 4.1784743432e-02
2678 12 7 1.960784202772 4.1759846421e-02
2679 12 8 2.223113049677 4.1743009692e-02
2680 12 9 2.485353951324 4.1731560486e-02
2681 12 10 2.747533151723 4.1722873193e-02
2682 12 11 3.009664737578 4.1716576615e-02
2683 12 12 3.271763164243 4.1712137754e-02
2684 12 13 3.533834580718 4.1707708815e-02
2685 12 14 3.795884032171 4.1705302852e-02
2686 12 15 4.057916058788 4.1702561558e-02
2687 12 16 4.319939152828 4.1701173738e-02
2688 12 17 4.581946479720 4.1699155017e-02
2689 12 18 4.843946916554 4.1697503936e-02
2690 12 19 5.105937991687 4.1697608972e-02
2691 12 20 5.367928050010 4.1695316022e-02
2692 12 21 5.629908189278 4.1696782857e-02
2693 12 22 5.891887750330 4.1692815304e-02
2694 12 23 6.153861906712 4.1696549402e-02
2695 12 24 6.415836225632 4.1692880334e-02
2696 12 25 6.677806447083 4.1693830184e-02
2697 12 26 6.939776761951 4.1694510720e-02
2698 12 27 7.201746038101 4.1693529076e-02
2699 12 28 7.463718445462 4.1692849823e-02
2700 12 29 7.725684912524 4.1696012218e-02
2701 12 30 7.987662366552 4.1692677251e-02
2702 12 31 8.249633604576 4.1694972712e-02
2703 12 32 8.511611515849 4.1696292561e-02
2704 12 33 8.773591017360 4.1694712912e-02
2705 12 34 9.035587893566 4.1698153943e-02
2706 12 35 9.297564009935 4.1696912467e-02
2707 12 36 9.559572828602 4.1698390832e-02
2708 12 37 9.821576156358 4.1702593691e-02
2709 12 38 10.083604744331 4.1702679486e-02
2710 12 39 10.345630637141 4.1703875608e-02
2711 12 40 10.607685749253 4.1708491104e-02
2712 12 41 10.869744341282 4.1711640611e-02
2713 12 42 11.131843614200 4.1714143193e-02
2714 12 43 11.393976291723 4.1725146101e-02
2715 12 44 11.656140276745 4.1729025167e-02
2716 12 45 11.918383965104 4.1740078082e-02
2717 12 46 12.180692458724 4.1760936376e-02
2718 12 47 12.443130967623 4.1776525804e-02
2719 12 48 12.705756938015 4.1822633832e-02
2720 12 49 12.968719237013 4.1887487645e-02
2721 12 50 13.232253266408 4.2017947214e-02
2722 12 51 13.497145433915 4.2351817617e-02
2723 12 52 13.766225684089 4.3655379648e-02
2724 12 53 14.114518262658 7.1049721716e-01
2725 12 54 14.175518567242 3.6493754232e-01
2726 12 55 14.517237614771 4.3646783570e-02
2727 12 56 14.786283781695 4.2351215068e-02
2728 12 57 15.051213859441 4.2020883306e-02
2729 12 58 15.314711405697 4.1888366646e-02
2730 12 59 15.577721867572 4.1820965798e-02
2731 12 60 15.840331077420 4.1784451432e-02
2732 12 61 16.102815270808 4.1762952160e-02
2733 12 62 16.365144758351 4.1741804051e-02
2734 12 63 16.627385561237 4.1734671954e-02
2735 12 64 16.889607863410 4.1733193433e-02
2736 12 65 17.151770403612 4.1718196540e-02
2737 12 66 17.413914582411 4.1721362359e-02
2738 12 67 17.676026573261 4.1718656111e-02
2739 12 68 17.938144099186 4.1711652792e-02
2740 12 69 18.200252066456 4.1724049089e-02
2741 12 70 18.462396261046 4.1716315028e-02
2742 12 71 18.724480478520 4.1713301486e-02
2743 12 72 18.986666721223 4.1739031121e-02
2744 12 73 19.248854522131 4.1722789030e-02
2745 12 74 19.511075104343 4.1749943765e-02
2746 12 75 19.773518702413 4.1782635461e-02
2747 12 76 20.036085549946 4.1817127369e-02
2748 12 77 20.299247042271 4.1954307830e-02
2749 12 78 20.563766292130 4.2362418654e-02
2750 12 79 20.838175322966 4.7811705095e-02
2751 12 80 21.024860057283 1.0322349347e+00
2752 12 81 21.334958129061 4.2661872220e-02
2753 12 82 21.600380814519 4.2001383452e-02
2754 12 83 21.863639815802 4.1830089072e-02
2755 12 84 22.126314390216 4.1793787542e-02
2756 12 85 22.388734667750 4.1745801956e-02
2757 12 86 22.651015413980 4.1730946942e-02
2758 12 87 22.913125655281 4.1723104854e-02
2759 12 88 23.175307479805 4.1714387571e-02
2760 12 89 23.437382484678 4.1714568208e-02
2761 12 90 23.699440969233 4.1710870465e-02
2762 12 91 23.961554793754 4.1710263117e-02
2763 12 92 24.223580678621 4.1709016324e-02
2764 12 93 24.485613194481 4.1694904397e-02
2765 12 94 24.747630175021 4.1703196939e-02
2766 12 95 25.010805140443 1.0416920034e+00
2767 12 96 25.271631462885 4.1710094125e-02
2768 12 97 25.533629059787 4.1704754812e-02
2769 12 98 25.795662811188 4.1704911004e-02
2770 12 99 26.057696218870 4.1707607865e-02
2771 12 100 26.319739561395 4.1703990796e-02
2772 12 101 26.581782064214 4.1719535368e-02
2773 12 102 26.843859345122 4.1690780488e-02
2774 12 103 27.105930047150 4.1743866889e-02
2775 12 104 27.367963790885 4.1671375072e-02
2776 12 105 27.630093737068 4.1746637216e-02
2777 12 106 27.892154890654 4.1713280213e-02
2778 12 107 28.154446364698 4.1738759073e-02
2779 12 108 28.416718842966 4.1763721460e-02
2780 12 109 28.679078274248 4.1763701120e-02
2781 12 110 28.941534813883 4.1773085188e-02
2782 12 111 29.204277651898 4.1889851668e-02
2783 12 112 29.467504117934 4.1897607247e-02
2784 12 113 29.731603138646 4.2206429217e-02
2785 12 114 29.998568921055 4.3036846524e-02
2786 12 115 30.294268748306 6.8551429900e-02
2787 12 116 30.430182281321 1.0090839924e+00
2788 12 117 30.759344883819 4.3223621339e-02
2789 12 118 31.027025587376 4.2245883713e-02
2790 12 119 31.291424253822 4.1967760941e-02
2791 12 120 31.554880202003 4.1925672268e-02
2792 12 121 31.818294723665 4.1920155233e-02
2793 12 122 32.081636588309 4.1940789108e-02
2794 12 123 32.345710277037 4.2152347540e-02
2795 12 124 32.612295966452 4.2964414552e-02
2796 12 125 32.931328235494 1.0253111457e+00
2797 12 126 33.096724252044 5.3667860672e-02
2798 12 127 33.378998240218 4.2666862323e-02
2799 12 128 33.644829895329 4.2076913059e-02
2800 12 129 33.908444297297 4.1883295082e-02
2801 12 130 34.171260365918 4.1818653911e-02
2802 12 131 34.433971631349 4.1772138051e-02
2803 12 132 34.696300057501 4.1800420301e-02
2804 12 133 34.958706293152 4.1690470322e-02
2805 12 134 35.220912284504 4.1764712687e-02
2806 12 135 35.482925219131 4.1696793068e-02
2807 12 136 35.745155999410 4.1729771466e-02
2808 12 137 36.007257545989 4.1747364735e-02
2809 12 138 36.269211789287 4.1683124900e-02
2810 12 139 36.531516870725 4.1739930194e-02
2811 12 140 36.793471609041 4.1751475281e-02
2812 12 141 37.055638671387 4.1651761547e-02
2813 12 142 37.317655978625 4.1805169111e-02
2814 12 143 37.585920300675 1.0416116366e+00
2815 12 144 37.841616884955 4.1744172124e-02
2816 12 145 38.103561750901 4.1709717150e-02
2817 12 146 38.365997171373 4.1781707746e-02
2818 12 147 38.628175994808 4.1718892045e-02
2819 12 148 38.890286600933 4.1710231362e-02
2820 12 149 39.152461142482 4.1769520876e-02
2821 12 150 39.414831666346 4.1749999226e-02
2822 12 151 39.677303554067 4.1788387053e-02
2823 12 152 39.940000981750 4.1864172571e-02
2824 12 153 40.203418329849 4.2031006360e-02
2825 12 154 40.468641513867 4.2529446887e-02
2826 12 155 40.746992549534 5.0651395639e-02
2827 12 156 40.922021400810 1.0287690608e+00
2828 12 157 41.236951385404 4.2836236714e-02
2829 12 158 41.503015745468 4.2043215275e-02
2830 12 159 41.766433706512 4.1921948181e-02
2831 12 160 42.029408177762 4.1777468516e-02
2832 12 161 42.291874590825 4.1826320236e-02
2833 12 162 42.554187014961 4.1741933649e-02
2834 12 163 42.816851787302 4.1805976151e-02
2835 12 164 43.079269865539 4.1836276630e-02
2836 12 165 43.327617939906 1.0413239096e+00
2837 12 166 43.602203752804 4.1895789938e-02
2838 12 167 43.864642288410 4.1720471584e-02
2839 12 168 44.126930727303 4.1785575442e-02
2840 12 169 44.388898963754 4.1653986392e-02
2841 12 170 44.651086167867 4.1793907404e-02
2842 12 171 44.913158337908 4.1715701602e-02
2843 12 172 45.175495001847 4.1759160092e-02
2844 12 173 45.437362477099 4.1738800928e-02
2845 12 174 45.699909212188 4.1730275602e-02
2846 12 175 45.961991494152 4.1776718319e-02
2847 12 176 46.224210265088 4.1701278507e-02
2848 12 177 46.486354354784 4.1868825800e-02
2849 12 178 46.749352579772 4.1769645411e-02
2850 12 179 47.011720712154 4.1867097472e-02
2851 12 180 47.274961283391 4.1889775914e-02
2852 12 181 47.539439569698 4.2366927297e-02
2853 12 182 47.811153061519 4.6143449653e-02
2854 12 183 48.007628702365 1.0345847078e+00
2855 12 184 48.314425302385 4.2764265017e-02
2856 12 185 48.580178827982 4.2025498253e-02
2857 12 186 48.844947597536 4.2275289409e-02
2858 12 187 49.110521590043 4.2425953035e-02
2859 12 188 49.379609927796 4.3637862047e-02
2860 12 189 49.709867056189 1.9535319072e-01
2861 12 190 49.786493919539 8.8050162646e-01
2862 12 191 50.132655358709 4.3625780173e-02
2863 12 192 50.401773433004 4.2350103345e-02
2864 12 193 50.666868747870 4.2132576779e-02
2865 12 194 50.930684121631 4.1865830075e-02
2866 12 195 51.194139601824 4.1987346805e-02
2867 12 196 51.456670517681 4.1810738346e-02
2868 12 197 51.719665337178 4.1883683362e-02
2869 12 198 51.982744520375 4.1919352193e-02
2870 12 199 52.246398005900 4.1991651711e-02
2871 12 200 52.510878178031 4.2430945296e-02
2872 12 201 52.785249527020 4.7652605018e-02
2873 12 202 52.973105631713 1.0325605160e+00
2874 12 203 53.282714582725 4.2668756758e-02
2875 12 204 53.548260545931 4.2098839374e-02
2876 12 205 53.811701922306 4.1912614292e-02
2877 12 206 54.074709593228 4.1719864305e-02
2878 12 207 54.336754378689 4.1870429788e-02
2879 12 208 54.599563733885 4.1782777280e-02
2880 12 209 54.861504040157 4.1770670645e-02
2881 12 210 55.123782251504 4.1717670028e-02
2882 12 211 55.385733276956 4.1733890822e-02
2883 12 212 55.648299020281 4.1834821157e-02
2884 12 213 55.910455897613 4.1785990912e-02
2885 12 214 56.172734612233 4.1872740293e-02
2886 12 215 56.445777811123 1.0413787314e+00
2887 12 216 56.696004263944 4.1921780363e-02
2888 12 217 56.958116373796 4.1684580001e-02
2889 12 218 57.220661753840 4.1755760384e-02
2890 12 219 57.482750859563 4.1811279297e-02
2891 12 220 57.744967175305 4.1665163850e-02
2892 12 221 58.006952603022 4.1751630891e-02
2893 12 222 58.269067883137 4.1986598890e-02
2894 12 223 58.532034488557 4.1649933019e-02
2895 12 224 58.794076694647 4.1913716265e-02
2896 12 225 59.057593097964 4.2052955373e-02
2897 12 226 59.345823242896 1.0401316467e+00
2898 12 227 59.575723331416 4.2549163304e-02
2899 12 228 59.840423221897 4.2043813564e-02
2900 12 229 60.104191967469 4.2006191956e-02
2901 12 230 60.369106954428 4.2360000970e-02
2902 12 231 60.641269055549 4.6749464663e-02
2903 12 232 60.834361784995 1.0337885159e+00
2904 12 233 61.141844691037 4.2664224201e-02
2905 12 234 61.407048126679 4.2047645308e-02
2906 12 235 61.670251018883 4.1898717472e-02
2907 12 236 61.933074106523 4.1877892555e-02
2908 12 237 62.195402414738 4.1848385943e-02
2909 12 238 62.458237896682 4.1688869164e-02
2910 12 239 62.719951504803 4.1821453591e-02
2911 12 240 62.982301908866 4.1693608768e-02
2912 12 241 63.245023576147 4.1833655276e-02
2913 12 242 63.506883279247 4.1746134943e-02
2914 12 243 63.769762080383 4.1940627391e-02
2915 12 244 64.032087146302 4.1859989661e-02
2916 12 245 64.293759169385 4.1949890218e-02
2917 12 246 64.557288571074 4.1909497822e-02
2918 12 247 64.820802615835 4.2155652243e-02
2919 12 248 65.111161977390 1.0396114771e+00
2920 12 249 65.337396344794 4.2750482560e-02
2921 12 250 65.602741208121 4.2095676694e-02
2922 12 251 65.865944207016 4.2171892681e-02
2923 12 252 66.130096745408 4.1908504403e-02
2924 12 253 66.394546176958 4.2482912051e-02
2925 12 254 66.662046653645 4.3132044938e-02
2926 12 255 66.966487705684 8.2865336378e-02
2927 12 256 67.086281904859 9.9440190867e-01
2928 12 257 67.420746759172 4.3168865356e-02
2929 12 258 67.688514398493 4.2498298230e-02
2930 12 259 67.953618007626 4.2100588846e-02
2931 12 260 68.216575301971 4.1940546557e-02
2932 12 261 68.479288281872 4.1954959858e-02
2933 12 262 68.742331904163 4.1853061782e-02
2934 12 263 69.005099599018 4.1997287229e-02
2935 12 264 69.268011382310 4.2040531137e-02
2936 12 265 69.545724069099 1.0411628422e+00
2937 12 266 69.790611011428 4.1962703939e-02
2938 12 267 70.053778482866 4.1881480017e-02
2939 12 268 70.316587734587 4.1900123324e-02
2940 12 269 70.579892766833 4.1788995872e-02
2941 12 270 70.841211690470 4.2192476919e-02
2942 12 271 71.105424389437 4.2030505630e-02
2943 12 272 71.369912576061 4.2384816864e-02
2944 12 273 71.635737973317 4.3016551217e-02
2945 12 274 71.928739950203 6.3905848393e-02
2946 12 275 72.072019043543 1.0143294482e+00
2947 12 276 72.399428674980 4.3227198676e-02
2948 12 277 72.665425985507 4.2447847564e-02
2949 12 278 72.930988971286 4.2079066321e-02
2950 12 279 73.193686184779 4.1933683470e-02
2951 12 280 73.456998172959 4.1850629182e-02
2952 12 281 73.719687950883 4.1856980263e-02
2953 12 282 73.982808238178 4.2112290596e-02
2954 12 283 74.245810365327 4.1796604186e-02
2955 12 284 74.509466436944 4.2282937745e-02
2956 12 285 74.772576397595 4.2110165035e-02
2957 12 286 75.037622667893 4.2257402436e-02
2958 12 287 75.306770903626 4.3833962509e-02
2959 12 288 75.633261024810 1.6536537016e-01
2960 12 289 75.715945690084 9.1073928192e-01
2961 12 290 76.060706413697 4.3628259548e-02
2962 12 291 76.329540341303 4.2860284934e-02
2963 12 292 76.595802943679 4.2079670756e-02
2964 12 293 76.859418063555 4.2290577146e-02
2965 12 294 77.143855377501 1.0408561587e+00
2966 12 295 77.382371444417 4.2757144463e-02
2967 12 296 77.646040352991 4.2007040088e-02
2968 12 297 77.910258356404 4.2048353916e-02
2969 12 298 78.173240810904 4.2018640506e-02
2970 12 299 78.437165453883 4.2064406213e-02
2971 12 300 78.703191089694 4.2781375846e-02
2972 12 301 78.971842773449 4.3838568015e-02
2973 12 302 79.320256962558 7.8116293361e-01
2974 12 303 79.385544166531 2.9452219132e-01
2975 12 304 79.723979008461 4.3599073277e-02
2976 12 305 79.993086899726 4.2796437250e-02
2977 12 306 80.258619710967 4.1979960870e-02
2978 12 307 80.521018935142 4.2461807927e-02
2979 12 308 80.785417441175 4.1859496123e-02
2980 12 309 81.047621637860 4.1881005206e-02
2981 12 310 81.310224018488 4.2448096821e-02
2982 12 311 81.572992686526 4.1734126282e-02
2983 12 312 81.835839252496 4.1922324940e-02
2984 12 313 82.098553041249 4.1869664490e-02
2985 12 314 82.360591921071 4.1627658592e-02
2986 12 315 82.624756139284 4.2905584226e-02
2987 12 316 82.909303504481 1.0403969907e+00
2988 12 317 83.143614775630 4.2409971427e-02
2989 12 318 83.407673237860 4.1985884393e-02
2990 12 319 83.670211628343 4.2019277871e-02
2991 12 320 83.933080618283 4.2042082997e-02
2992 12 321 84.194243427047 4.2102658755e-02
2993 12 322 84.457447677794 4.2033961965e-02
2994 12 323 84.734853447875 1.0414512603e+00
2995 12 324 84.979790650468 4.1756337996e-02
2996 12 325 85.243574614541 4.2013970704e-02
2997 12 326 85.505731786499 4.1790766630e-02
2998 12 327 85.769197350903 4.2155107535e-02
2999 12 328 86.031828659600 4.1917643400e-02
3000 12 329 86.295032335203 4.1977855647e-02
3001 12 330 86.557752199231 4.2742936879e-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())