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 8 of 10 · 500/page · 4600 rows next →
# azlogK
3502 10 51.000 2.992744
3503 10 51.050 2.994277
3504 10 51.100 2.992108
3505 10 51.150 2.987714
3506 10 51.200 2.984243
3507 10 51.250 2.984101
3508 10 51.300 2.987134
3509 10 51.350 2.990860
3510 10 51.400 2.992519
3511 10 51.450 2.991231
3512 10 51.500 2.988598
3513 10 51.550 2.987304
3514 10 51.600 2.988762
3515 10 51.650 2.991773
3516 10 51.700 2.993462
3517 10 51.750 2.991788
3518 10 51.800 2.987541
3519 10 51.850 2.984038
3520 10 51.900 2.984441
3521 10 51.950 2.988740
3522 10 52.000 2.993231
3523 10 52.050 2.993386
3524 10 52.100 2.987874
3525 10 52.150 2.980394
3526 10 52.200 2.977244
3527 10 52.250 2.981684
3528 10 52.300 2.989788
3529 10 52.350 2.992444
3530 10 52.400 2.982727
3531 10 52.450 2.963213
3532 10 52.500 2.947414
3533 10 52.550 2.950822
3534 10 52.600 2.974177
3535 10 52.650 2.993978
3536 10 52.700 2.969666
3537 10 52.750 2.855274
3538 10 52.800 2.600684
3539 10 52.850 2.138188
3540 10 52.900 1.352273
3541 10 52.950 0.191121
3542 10 53.000 0.405254
3543 10 53.050 1.531246
3544 10 53.100 2.244609
3545 10 53.150 2.661331
3546 10 53.200 2.885373
3547 10 53.250 2.979368
3548 10 53.300 2.992104
3549 10 53.350 2.969056
3550 10 53.400 2.948603
3551 10 53.450 2.949765
3552 10 53.500 2.967744
3553 10 53.550 2.986102
3554 10 53.600 2.992950
3555 10 53.650 2.987892
3556 10 53.700 2.979149
3557 10 53.750 2.975706
3558 10 53.800 2.980372
3559 10 53.850 2.988849
3560 10 53.900 2.994622
3561 10 53.950 2.994456
3562 10 54.000 2.990167
3563 10 54.050 2.986270
3564 10 54.100 2.985938
3565 10 54.150 2.988636
3566 10 54.200 2.991232
3567 10 54.250 2.991144
3568 10 54.300 2.988602
3569 10 54.350 2.986252
3570 10 54.400 2.986668
3571 10 54.450 2.989967
3572 10 54.500 2.993646
3573 10 54.550 2.994729
3574 10 54.600 2.992267
3575 10 54.650 2.988151
3576 10 54.700 2.985605
3577 10 54.750 2.986542
3578 10 54.800 2.989999
3579 10 54.850 2.993019
3580 10 54.900 2.993188
3581 10 54.950 2.990639
3582 10 55.000 2.987889
3583 10 55.050 2.987610
3584 10 55.100 2.990167
3585 10 55.150 2.993151
3586 10 55.200 2.993460
3587 10 55.250 2.990164
3588 10 55.300 2.985652
3589 10 55.350 2.983883
3590 10 55.400 2.986841
3591 10 55.450 2.992259
3592 10 55.500 2.995052
3593 10 55.550 2.991548
3594 10 55.600 2.983089
3595 10 55.650 2.975843
3596 10 55.700 2.976058
3597 10 55.750 2.983907
3598 10 55.800 2.991842
3599 10 55.850 2.990013
3600 10 55.900 2.974833
3601 10 55.950 2.954400
3602 10 56.000 2.945346
3603 10 56.050 2.958792
3604 10 56.100 2.984373
3605 10 56.150 2.988716
3606 10 56.200 2.927341
3607 10 56.250 2.752736
3608 10 56.300 2.408861
3609 10 56.350 1.809545
3610 10 56.400 0.815081
3611 10 56.450 -0.039585
3612 10 56.500 0.992788
3613 10 56.550 1.919591
3614 10 56.600 2.472493
3615 10 56.650 2.786464
3616 10 56.700 2.941088
3617 10 56.750 2.990175
3618 10 56.800 2.980658
3619 10 56.850 2.955893
3620 10 56.900 2.946258
3621 10 56.950 2.958457
3622 10 57.000 2.979643
3623 10 57.050 2.993848
3624 10 57.100 2.994426
3625 10 57.150 2.985790
3626 10 57.200 2.977593
3627 10 57.250 2.976686
3628 10 57.300 2.982575
3629 10 57.350 2.989449
3630 10 57.400 2.991905
3631 10 57.450 2.989055
3632 10 57.500 2.984422
3633 10 57.550 2.982555
3634 10 57.600 2.985252
3635 10 57.650 2.990392
3636 10 57.700 2.994024
3637 10 57.750 2.993615
3638 10 57.800 2.989850
3639 10 57.850 2.985885
3640 10 57.900 2.984799
3641 10 57.950 2.987169
3642 10 58.000 2.990661
3643 10 58.050 2.991914
3644 10 58.100 2.989187
3645 10 58.150 2.983845
3646 10 58.200 2.979593
3647 10 58.250 2.979805
3648 10 58.300 2.984759
3649 10 58.350 2.991049
3650 10 58.400 2.993926
3651 10 58.450 2.990893
3652 10 58.500 2.983916
3653 10 58.550 2.978396
3654 10 58.600 2.978954
3655 10 58.650 2.984884
3656 10 58.700 2.989573
3657 10 58.750 2.985308
3658 10 58.800 2.970252
3659 10 58.850 2.952557
3660 10 58.900 2.946916
3661 10 58.950 2.961883
3662 10 59.000 2.986270
3663 10 59.050 2.988184
3664 10 59.100 2.925237
3665 10 59.150 2.751284
3666 10 59.200 2.410954
3667 10 59.250 1.818693
3668 10 59.300 0.834458
3669 10 59.350 -0.043694
3670 10 59.400 0.975456
3671 10 59.450 1.912938
3672 10 59.500 2.472307
3673 10 59.550 2.788950
3674 10 59.600 2.943031
3675 10 59.650 2.989229
3676 10 59.700 2.976421
3677 10 59.750 2.950589
3678 10 59.800 2.943049
3679 10 59.850 2.957892
3680 10 59.900 2.978382
3681 10 59.950 2.987377
3682 12 14.000 2.720692
3683 12 14.050 2.063612
3684 12 14.100 0.816017
3685 12 14.150 0.195998
3686 12 14.200 1.667207
3687 12 14.250 2.514760
3688 12 14.300 2.947872
3689 12 14.350 3.136153
3690 12 14.400 3.177500
3691 12 14.450 3.153484
3692 12 14.500 3.131875
3693 12 14.550 3.140799
3694 12 14.600 3.164328
3695 12 14.650 3.177027
3696 12 14.700 3.172667
3697 12 14.750 3.163494
3698 12 14.800 3.162629
3699 12 14.850 3.170271
3700 12 14.900 3.177020
3701 12 14.950 3.176608
3702 12 15.000 3.171857
3703 12 15.050 3.169577
3704 12 15.100 3.172247
3705 12 15.150 3.176155
3706 12 15.200 3.176905
3707 12 15.250 3.174548
3708 12 15.300 3.172725
3709 12 15.350 3.173877
3710 12 15.400 3.176571
3711 12 15.450 3.177741
3712 12 15.500 3.176455
3713 12 15.550 3.174673
3714 12 15.600 3.174583
3715 12 15.650 3.176064
3716 12 15.700 3.177180
3717 12 15.750 3.176731
3718 12 15.800 3.175559
3719 12 15.850 3.175296
3720 12 15.900 3.176314
3721 12 15.950 3.177402
3722 12 16.000 3.177358
3723 12 16.050 3.176396
3724 12 16.100 3.175751
3725 12 16.150 3.176147
3726 12 16.200 3.177022
3727 12 16.250 3.177347
3728 12 16.300 3.176871
3729 12 16.350 3.176311
3730 12 16.400 3.176381
3731 12 16.450 3.176947
3732 12 16.500 3.177283
3733 12 16.550 3.177009
3734 12 16.600 3.176528
3735 12 16.650 3.176478
3736 12 16.700 3.176944
3737 12 16.750 3.177376
3738 12 16.800 3.177270
3739 12 16.850 3.176759
3740 12 16.900 3.176432
3741 12 16.950 3.176639
3742 12 17.000 3.177121
3743 12 17.050 3.177351
3744 12 17.100 3.177143
3745 12 17.150 3.176825
3746 12 17.200 3.176811
3747 12 17.250 3.177112
3748 12 17.300 3.177346
3749 12 17.350 3.177210
3750 12 17.400 3.176833
3751 12 17.450 3.176628
3752 12 17.500 3.176807
3753 12 17.550 3.177139
3754 12 17.600 3.177227
3755 12 17.650 3.176975
3756 12 17.700 3.176701
3757 12 17.750 3.176767
3758 12 17.800 3.177136
3759 12 17.850 3.177406
3760 12 17.900 3.177268
3761 12 17.950 3.176885
3762 12 18.000 3.176700
3763 12 18.050 3.176900
3764 12 18.100 3.177178
3765 12 18.150 3.177100
3766 12 18.200 3.176680
3767 12 18.250 3.176417
3768 12 18.300 3.176709
3769 12 18.350 3.177304
3770 12 18.400 3.177523
3771 12 18.450 3.177047
3772 12 18.500 3.176349
3773 12 18.550 3.176189
3774 12 18.600 3.176720
3775 12 18.650 3.177284
3776 12 18.700 3.177202
3777 12 18.750 3.176620
3778 12 18.800 3.176330
3779 12 18.850 3.176734
3780 12 18.900 3.177252
3781 12 18.950 3.177013
3782 12 19.000 3.176036
3783 12 19.050 3.175383
3784 12 19.100 3.175918
3785 12 19.150 3.177131
3786 12 19.200 3.177596
3787 12 19.250 3.176676
3788 12 19.300 3.175389
3789 12 19.350 3.175250
3790 12 19.400 3.176353
3791 12 19.450 3.177154
3792 12 19.500 3.176398
3793 12 19.550 3.174859
3794 12 19.600 3.174530
3795 12 19.650 3.176013
3796 12 19.700 3.177408
3797 12 19.750 3.176497
3798 12 19.800 3.173744
3799 12 19.850 3.172205
3800 12 19.900 3.173873
3801 12 19.950 3.176752
3802 12 20.000 3.176850
3803 12 20.050 3.173231
3804 12 20.100 3.169877
3805 12 20.150 3.171195
3806 12 20.200 3.175821
3807 12 20.250 3.177090
3808 12 20.300 3.171043
3809 12 20.350 3.162796
3810 12 20.400 3.162216
3811 12 20.450 3.171079
3812 12 20.500 3.177380
3813 12 20.550 3.167328
3814 12 20.600 3.143907
3815 12 20.650 3.131142
3816 12 20.700 3.148979
3817 12 20.750 3.176141
3818 12 20.800 3.148399
3819 12 20.850 2.985073
3820 12 20.900 2.592271
3821 12 20.950 1.816014
3822 12 21.000 0.399378
3823 12 21.050 0.593288
3824 12 21.100 1.935950
3825 12 21.150 2.654024
3826 12 21.200 3.013476
3827 12 21.250 3.156465
3828 12 21.300 3.173905
3829 12 21.350 3.145258
3830 12 21.400 3.130887
3831 12 21.450 3.146345
3832 12 21.500 3.169318
3833 12 21.550 3.177474
3834 12 21.600 3.170134
3835 12 21.650 3.161711
3836 12 21.700 3.163167
3837 12 21.750 3.171620
3838 12 21.800 3.177202
3839 12 21.850 3.175451
3840 12 21.900 3.170704
3841 12 21.950 3.169472
3842 12 22.000 3.172851
3843 12 22.050 3.176428
3844 12 22.100 3.176360
3845 12 22.150 3.173600
3846 12 22.200 3.172025
3847 12 22.250 3.173586
3848 12 22.300 3.176345
3849 12 22.350 3.177236
3850 12 22.400 3.175685
3851 12 22.450 3.173935
3852 12 22.500 3.174163
3853 12 22.550 3.176011
3854 12 22.600 3.177263
3855 12 22.650 3.176544
3856 12 22.700 3.174792
3857 12 22.750 3.174017
3858 12 22.800 3.174987
3859 12 22.850 3.176488
3860 12 22.900 3.176861
3861 12 22.950 3.175895
3862 12 23.000 3.174946
3863 12 23.050 3.175271
3864 12 23.100 3.176526
3865 12 23.150 3.177173
3866 12 23.200 3.176303
3867 12 23.250 3.174768
3868 12 23.300 3.174277
3869 12 23.350 3.175400
3870 12 23.400 3.176795
3871 12 23.450 3.176691
3872 12 23.500 3.175009
3873 12 23.550 3.173618
3874 12 23.600 3.174210
3875 12 23.650 3.176145
3876 12 23.700 3.176989
3877 12 23.750 3.175412
3878 12 23.800 3.173044
3879 12 23.850 3.172786
3880 12 23.900 3.175126
3881 12 23.950 3.177028
3882 12 24.000 3.175350
3883 12 24.050 3.171078
3884 12 24.100 3.168955
3885 12 24.150 3.171877
3886 12 24.200 3.176377
3887 12 24.250 3.175784
3888 12 24.300 3.168509
3889 12 24.350 3.161741
3890 12 24.400 3.164166
3891 12 24.450 3.173755
3892 12 24.500 3.176615
3893 12 24.550 3.161946
3894 12 24.600 3.138466
3895 12 24.650 3.132303
3896 12 24.700 3.156115
3897 12 24.750 3.177160
3898 12 24.800 3.125736
3899 12 24.850 2.919854
3900 12 24.900 2.458624
3901 12 24.950 1.561172
3902 12 25.000 0.085895
3903 12 25.050 0.956112
3904 12 25.100 2.139755
3905 12 25.150 2.759665
3906 12 25.200 3.061271
3907 12 25.250 3.168583
3908 12 25.300 3.168689
3909 12 25.350 3.139129
3910 12 25.400 3.132107
3911 12 25.450 3.151933
3912 12 25.500 3.172660
3913 12 25.550 3.176342
3914 12 25.600 3.167484
3915 12 25.650 3.161382
3916 12 25.700 3.165551
3917 12 25.750 3.173898
3918 12 25.800 3.177102
3919 12 25.850 3.173635
3920 12 25.900 3.169593
3921 12 25.950 3.170314
3922 12 26.000 3.174497
3923 12 26.050 3.177045
3924 12 26.100 3.175675
3925 12 26.150 3.173017
3926 12 26.200 3.172729
3927 12 26.250 3.175044
3928 12 26.300 3.177036
3929 12 26.350 3.176573
3930 12 26.400 3.174705
3931 12 26.450 3.173958
3932 12 26.500 3.175126
3933 12 26.550 3.176577
3934 12 26.600 3.176598
3935 12 26.650 3.175506
3936 12 26.700 3.175018
3937 12 26.750 3.175947
3938 12 26.800 3.177239
3939 12 26.850 3.177417
3940 12 26.900 3.176407
3941 12 26.950 3.175481
3942 12 27.000 3.175570
3943 12 27.050 3.176188
3944 12 27.100 3.176254
3945 12 27.150 3.175606
3946 12 27.200 3.175213
3947 12 27.250 3.175890
3948 12 27.300 3.177200
3949 12 27.350 3.177953
3950 12 27.400 3.177593
3951 12 27.450 3.176737
3952 12 27.500 3.176300
3953 12 27.550 3.176392
3954 12 27.600 3.176383
3955 12 27.650 3.175899
3956 12 27.700 3.175375
3957 12 27.750 3.175471
3958 12 27.800 3.176172
3959 12 27.850 3.176810
3960 12 27.900 3.176922
3961 12 27.950 3.176767
3962 12 28.000 3.176843
3963 12 28.050 3.177108
3964 12 28.100 3.177024
3965 12 28.150 3.176393
3966 12 28.200 3.175779
3967 12 28.250 3.175848
3968 12 28.300 3.176434
3969 12 28.350 3.176649
3970 12 28.400 3.176030
3971 12 28.450 3.175240
3972 12 28.500 3.175307
3973 12 28.550 3.176254
3974 12 28.600 3.176929
3975 12 28.650 3.176413
3976 12 28.700 3.175261
3977 12 28.750 3.174910
3978 12 28.800 3.175850
3979 12 28.850 3.176887
3980 12 28.900 3.176611
3981 12 28.950 3.175269
3982 12 29.000 3.174542
3983 12 29.050 3.175300
3984 12 29.100 3.176210
3985 12 29.150 3.175331
3986 12 29.200 3.172910
3987 12 29.250 3.171653
3988 12 29.300 3.173512
3989 12 29.350 3.176725
3990 12 29.400 3.177344
3991 12 29.450 3.174048
3992 12 29.500 3.170375
3993 12 29.550 3.170835
3994 12 29.600 3.174770
3995 12 29.650 3.176084
3996 12 29.700 3.170576
3997 12 29.750 3.162543
3998 12 29.800 3.161441
3999 12 29.850 3.169713
4000 12 29.900 3.176360
4001 12 29.950 3.167580

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