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 3 of 8 · 500/page · 3815 rows next →
# akz_kw_k
1002 8 48 19.054052705394 6.2596884846e-02
1003 8 49 19.447327650352 6.2587635909e-02
1004 8 50 19.840586200845 6.2593511165e-02
1005 8 51 20.233834659117 6.2579305236e-02
1006 8 52 20.626999956094 6.2576294983e-02
1007 8 53 21.021929982375 1.0625751252e+00
1008 8 54 21.413379192045 6.2585167915e-02
1009 8 55 21.806605196763 6.2584455883e-02
1010 8 56 22.199854564813 6.2599154111e-02
1011 8 57 22.593178721387 6.2596135670e-02
1012 8 58 22.986474895238 6.2604794950e-02
1013 8 59 23.379959440874 6.2642000370e-02
1014 8 60 23.773626634547 6.2679602066e-02
1015 8 61 24.167825459647 6.2824121922e-02
1016 8 62 24.563791020491 6.3377260116e-02
1017 8 63 25.007017111562 1.0572681037e+00
1018 8 64 25.332035355310 6.5339734664e-02
1019 8 65 25.732041614218 6.3011237184e-02
1020 8 66 26.126916370552 6.2747527183e-02
1021 8 67 26.520885249811 6.2677826757e-02
1022 8 68 26.914560718215 6.2630513639e-02
1023 8 69 27.307907209836 6.2601071215e-02
1024 8 70 27.701404922723 6.2648454155e-02
1025 8 71 28.094883999469 6.2598286405e-02
1026 8 72 28.488261529262 6.2631859212e-02
1027 8 73 28.881737108795 6.2619924326e-02
1028 8 74 29.275271303835 6.2674259619e-02
1029 8 75 29.669327169314 6.2750807732e-02
1030 8 76 30.064180332164 6.3113352823e-02
1031 8 77 30.426702931982 1.0614780054e+00
1032 8 78 30.847280356490 6.2974074116e-02
1033 8 79 31.242365290016 6.2858198500e-02
1034 8 80 31.637542432314 6.2965985355e-02
1035 8 81 32.034029923409 6.3320097188e-02
1036 8 82 32.435170415826 6.4775361407e-02
1037 8 83 32.924033308354 1.0204237950e+00
1038 8 84 33.139560787619 9.6481577369e-02
1039 8 85 33.578532278912 6.4484761084e-02
1040 8 86 33.978847870379 6.3281791933e-02
1041 8 87 34.375149644541 6.2922868836e-02
1042 8 88 34.769971810293 6.2819455932e-02
1043 8 89 35.164670975202 6.2785413800e-02
1044 8 90 35.558783392727 6.2709473181e-02
1045 8 91 35.952978453023 6.2784975428e-02
1046 8 92 36.347213472833 6.2735970951e-02
1047 8 93 36.741929808717 6.2971020101e-02
1048 8 94 37.138700809303 6.3478265078e-02
1049 8 95 37.582337775999 1.0573721200e+00
1050 8 96 37.908124692978 6.5478037893e-02
1051 8 97 38.309035850700 6.3155103342e-02
1052 8 98 38.704830844772 6.2930271112e-02
1053 8 99 39.100229468860 6.2960173229e-02
1054 8 100 39.496007394651 6.3054053079e-02
1055 8 101 39.893227545987 6.3463944965e-02
1056 8 102 40.295341246279 6.4965706997e-02
1057 8 103 40.753133327020 1.2698302354e-01
1058 8 104 40.933604105434 9.8869521638e-01
1059 8 105 41.434084857715 6.5171179220e-02
1060 8 106 41.837115029853 6.3634955857e-02
1061 8 107 42.235930647968 6.3436184258e-02
1062 8 108 42.634865200888 6.3769447551e-02
1063 8 109 43.046702763802 7.1136390314e-02
1064 8 110 43.333157533234 1.0496086941e+00
1065 8 111 43.796569843312 6.4103067656e-02
1066 8 112 44.195504296740 6.3198179503e-02
1067 8 113 44.591650593012 6.2952094391e-02
1068 8 114 44.986469990303 6.2811662275e-02
1069 8 115 45.381010741167 6.2865727930e-02
1070 8 116 45.776045991693 6.2856297485e-02
1071 8 117 46.170790292533 6.2876098466e-02
1072 8 118 46.565952533201 6.3018270819e-02
1073 8 119 46.962951025400 6.3433888218e-02
1074 8 120 47.364296650292 6.4625025411e-02
1075 8 121 47.806405570582 1.0034252313e-01
1076 8 122 48.016763145100 1.0166048404e+00
1077 8 123 48.508383701347 6.4982303767e-02
1078 8 124 48.911643920430 6.3827333114e-02
1079 8 125 49.312513212663 6.4181587360e-02
1080 8 126 49.768820015155 1.0540179958e+00
1081 8 127 50.074642565005 6.8003676740e-02
1082 8 128 50.481154084026 6.3507225634e-02
1083 8 129 50.878214306606 6.3038808238e-02
1084 8 130 51.274382447929 6.3169406828e-02
1085 8 131 51.670631017830 6.3099951531e-02
1086 8 132 52.067741571324 6.3412699810e-02
1087 8 133 52.469461682930 6.4931544515e-02
1088 8 134 52.959223798007 1.0202395008e+00
1089 8 135 53.174654120363 9.6893493751e-02
1090 8 136 53.614381604351 6.4676022001e-02
1091 8 137 54.015293574020 6.3302061251e-02
1092 8 138 54.411822804944 6.3092633640e-02
1093 8 139 54.807599776747 6.3040470136e-02
1094 8 140 55.203197759492 6.2972100615e-02
1095 8 141 55.599012218060 6.3095104667e-02
1096 8 142 55.996234391161 6.3729517442e-02
1097 8 143 56.442245466259 1.0570256664e+00
1098 8 144 56.765788535223 6.5963695373e-02
1099 8 145 57.168380533985 6.3307471811e-02
1100 8 146 57.565205460219 6.3201831815e-02
1101 8 147 57.962577290985 6.3339591869e-02
1102 8 148 58.360749845442 6.3796220593e-02
1103 8 149 58.766213592356 6.5808823125e-02
1104 8 150 59.270827580799 3.7270302119e-01
1105 8 151 59.383286327413 7.4167975321e-01
1106 8 152 59.902541820647 6.6400657314e-02
1107 8 153 60.315608202828 6.6057736752e-02
1108 8 154 60.817754198149 9.9821006957e-01
1109 8 155 61.007672709266 1.1855726554e-01
1110 8 156 61.462565563796 6.5160804576e-02
1111 8 157 61.865428619059 6.3652357822e-02
1112 8 158 62.262874684872 6.3136852996e-02
1113 8 159 62.659382057669 6.3138375411e-02
1114 8 160 63.055037337562 6.2845370587e-02
1115 8 161 63.450036811232 6.3004836994e-02
1116 8 162 63.845844050702 6.3176260346e-02
1117 8 163 64.241824944627 6.3472459328e-02
1118 8 164 64.641633817161 6.4220046093e-02
1119 8 165 65.106334234345 1.0493343632e+00
1120 8 166 65.391308845968 7.1485158560e-02
1121 8 167 65.803967853494 6.4200935950e-02
1122 8 168 66.204282626306 6.3564207962e-02
1123 8 169 66.604359910809 6.4398169603e-02
1124 8 170 67.073232171626 1.0478336406e+00
1125 8 171 67.351975945826 7.2774896853e-02
1126 8 172 67.767017636739 6.4200836416e-02
1127 8 173 68.167204263160 6.3748568339e-02
1128 8 174 68.566837128674 6.3929787685e-02
1129 8 175 68.972228007715 6.5865444819e-02
1130 8 176 69.479357548299 4.3201412391e-01
1131 8 177 69.587375259263 6.8175488213e-01
1132 8 178 70.102863946244 6.5670080995e-02
1133 8 179 70.507386048304 6.3663555682e-02
1134 8 180 70.904275725476 6.3458100974e-02
1135 8 181 71.301420062623 6.3252697843e-02
1136 8 182 71.696419109994 6.3100282323e-02
1137 8 183 72.068509211082 1.0623677633e+00
1138 8 184 72.484132305709 6.3333157666e-02
1139 8 185 72.878704009366 6.2816709640e-02
1140 8 186 73.272383884225 6.2792345250e-02
1141 8 187 73.666869547719 6.2826269550e-02
1142 8 188 74.061103795636 6.2997589028e-02
1143 8 189 74.456692661479 6.3150011373e-02
1144 8 190 74.851110851966 6.3069031694e-02
1145 8 191 75.249391951075 6.3918352101e-02
1146 8 192 75.700185539622 1.0556057698e+00
1147 8 193 76.014549539882 6.7055366589e-02
1148 8 194 76.419034652377 6.4006371853e-02
1149 8 195 76.823397614313 6.6237887434e-02
1150 8 196 77.148835133295 1.0574889475e+00
1151 8 197 77.594813167804 6.4112578311e-02
1152 8 198 77.994819352997 6.3638889516e-02
1153 8 199 78.393850754253 6.3735204247e-02
1154 8 200 78.798596172350 6.6046255449e-02
1155 8 201 79.312039039100 8.7453544204e-01
1156 8 202 79.443141730310 2.3985795420e-01
1157 8 203 79.932571898674 6.5875488680e-02
1158 8 204 80.337691655371 6.4148970432e-02
1159 8 205 80.735375383224 6.3370342405e-02
1160 8 206 81.133021738478 6.3643657151e-02
1161 8 207 81.529022161499 6.3462053818e-02
1162 8 208 81.928549911382 6.3923750125e-02
1163 8 209 82.333438812201 6.5635523315e-02
1164 8 210 82.838301493077 4.0054081051e-01
1165 8 211 82.948819385464 7.1415511038e-01
1166 8 212 83.465792365165 6.6032506266e-02
1167 8 213 83.871814155017 6.4408894399e-02
1168 8 214 84.272778879511 6.4662113493e-02
1169 8 215 84.730476412623 1.0543538974e+00
1170 8 216 85.036555172919 6.7900598840e-02
1171 8 217 85.442867689678 6.3689657035e-02
1172 8 218 85.840891211487 6.3458655998e-02
1173 8 219 86.237246499083 6.3148397522e-02
1174 8 220 86.631240542079 6.3492876098e-02
1175 8 221 87.028370153630 6.3222337768e-02
1176 8 222 87.425271704634 1.0633975792e+00
1177 8 223 87.822266925782 6.4571987907e-02
1178 8 224 88.226356410331 6.6204895936e-02
1179 8 225 88.727726978064 3.4123603288e-01
1180 8 226 88.842621709442 7.7283052459e-01
1181 8 227 89.357530551970 6.5743214910e-02
1182 8 228 89.762746409563 6.4358290519e-02
1183 8 229 90.159782085420 6.3408831135e-02
1184 8 230 90.555339541170 6.3191091149e-02
1185 8 231 90.951492082127 6.3187827349e-02
1186 8 232 91.345807415791 6.3990658591e-02
1187 8 233 91.742526944776 6.3323208507e-02
1188 8 234 92.141265920860 6.4083305900e-02
1189 8 235 92.494403895501 1.0613421404e+00
1190 8 236 92.922617998443 6.3897497724e-02
1191 8 237 93.321201578344 6.3704839606e-02
1192 8 238 93.720995575928 6.3798937415e-02
1193 8 239 94.123813885484 6.5771273514e-02
1194 8 240 94.633267852930 9.6330737745e-01
1195 8 241 94.798693669252 1.5448192998e-01
1196 8 242 95.278429466689 6.8360004896e-02
1197 8 243 95.785755249704 3.3418307947e-01
1198 8 244 95.904033783929 7.8223043057e-01
1199 8 245 96.422418393579 6.5957777946e-02
1200 8 246 96.827753183720 6.4096997223e-02
1201 8 247 97.228470876135 6.3806616436e-02
1202 8 248 97.621824764113 6.3747897289e-02
1203 8 249 98.020075162526 6.3352498004e-02
1204 8 250 98.416978461961 6.4080527317e-02
1205 8 251 98.829888718743 1.0630951801e+00
1206 8 252 99.203669145434 6.3036004358e-02
1207 8 253 99.599573155855 6.3441848229e-02
1208 8 254 99.995524038835 6.4778720023e-02
1209 8 255 100.394852117531 6.5539287787e-02
1210 8 256 100.798100555563 6.5358073888e-02
1211 8 257 101.301696443968 9.7813044251e-01
1212 8 258 101.474926063920 1.3786606313e-01
1213 8 259 101.939307225748 6.5972474049e-02
1214 8 260 102.344713610864 6.4275650424e-02
1215 8 261 102.746070340383 6.4179869708e-02
1216 8 262 103.153361309862 6.7653252178e-02
1217 8 263 103.661775478866 4.6075481564e-01
1218 8 264 103.769228070972 6.5368961596e-01
1219 8 265 104.286158786431 6.7365621953e-02
1220 8 266 104.689376878503 6.4486550542e-02
1221 8 267 105.090740966313 6.4186458920e-02
1222 8 268 105.448935692572 1.0617238622e+00
1223 8 269 105.878800521435 6.5308258503e-02
1224 8 270 106.277397835452 6.3852888393e-02
1225 8 271 106.680379019591 6.6685269121e-02
1226 8 272 107.159598757479 1.0350414165e+00
1227 8 273 107.402111444036 8.4306472054e-02
1228 8 274 107.829988388038 6.4672918254e-02
1229 8 275 108.230656578129 6.5554823700e-02
1230 8 276 108.627757827245 6.3255283242e-02
1231 8 277 109.021992460594 6.3519676181e-02
1232 8 278 109.419430182658 6.3256828079e-02
1233 8 279 109.815384093612 6.3506693612e-02
1234 8 280 110.208195407375 6.5297789224e-02
1235 8 281 110.607329972136 6.4865693101e-02
1236 8 282 111.027616774177 1.0627607327e+00
1237 8 283 111.396979592582 6.5356692132e-02
1238 8 284 111.867696948333 1.0467440173e+00
1239 8 285 112.142066841864 7.4730890392e-02
1240 8 286 112.560098873323 6.4871669924e-02
1241 8 287 112.957668575108 6.5447687920e-02
1242 8 288 113.359148223332 6.4970583007e-02
1243 8 289 113.766863435950 6.6339938987e-02
1244 8 290 114.284988938244 7.5764501514e-01
1245 8 291 114.400263072358 3.5836515023e-01
1246 8 292 114.898808969671 6.7115427708e-02
1247 8 293 115.310167454952 6.5085120681e-02
1248 8 294 115.714125194406 6.8601972747e-02
1249 8 295 116.213662559282 1.0071753956e+00
1250 8 296 116.413406697885 1.1067470279e-01
1251 8 297 116.860099576331 6.7760712198e-02
1252 8 298 117.263213374121 6.4033423968e-02
1253 8 299 117.664119521993 6.4173858833e-02
1254 8 300 118.062319116499 6.6634851616e-02
1255 8 301 118.463221810170 6.6393471601e-02
1256 8 302 118.794589015065 1.0583496542e+00
1257 8 303 119.240744372433 6.4858022067e-02
1258 8 304 119.632474466406 6.6174060863e-02
1259 8 305 120.032629476624 6.4385096739e-02
1260 8 306 120.433745171859 6.4322769242e-02
1261 8 307 120.839662169129 6.5984796277e-02
1262 8 308 121.349835821619 9.3714076546e-01
1263 8 309 121.502961938554 1.7965019650e-01
1264 8 310 121.977364783593 6.8837694257e-02
1265 8 311 122.393931966434 6.8064199875e-02
1266 8 312 122.915581376931 8.1411878425e-01
1267 8 313 123.037190240338 3.0585072190e-01
1268 8 314 123.541257506229 6.7254066929e-02
1269 8 315 123.950292003690 7.2154402312e-02
1270 8 316 124.262059335349 1.0544342486e+00
1271 8 317 124.718361574861 6.5132725821e-02
1272 8 318 125.121788313408 6.4136514021e-02
1273 8 319 125.517800848384 6.3213148384e-02
1274 8 320 125.918692675772 6.7109337491e-02
1275 8 321 126.304153913634 6.3623333116e-02
1276 8 322 126.701556753855 6.7947270439e-02
1277 8 323 127.098338939724 6.3572595095e-02
1278 8 324 127.515245276088 1.0635772637e+00
1279 8 325 127.891544222977 6.6815534357e-02
1280 8 326 128.280264339182 6.4714547110e-02
1281 8 327 128.677580960175 6.4162857669e-02
1282 8 328 129.079957962000 6.5569371453e-02
1283 8 329 129.568368038394 1.0270862973e+00
1284 8 330 129.792675726599 9.7005341243e-02
1285 8 331 130.231122959600 6.5113118805e-02
1286 8 332 130.633685530913 6.5623609007e-02
1287 8 333 131.083648196809 1.0582112400e+00
1288 8 334 131.409471611175 6.6635486793e-02
1289 8 335 131.817949208836 6.9056405358e-02
1290 8 336 132.208523874642 6.4190075883e-02
1291 8 337 132.608948768140 6.4541068866e-02
1292 8 338 133.008840874739 7.0218319587e-02
1293 8 339 133.489572823053 1.0412041722e+00
1294 8 340 133.750936656158 8.0800571425e-02
1295 8 341 134.189827236985 7.1212570984e-02
1296 8 342 134.694749661627 5.0085811169e-01
1297 8 343 134.805782828942 6.2068008360e-01
1298 8 344 135.313048592826 6.8407667527e-02
1299 8 345 135.722768381631 6.4778673067e-02
1300 8 346 136.119886932855 6.4509738367e-02
1301 8 347 136.518012324506 6.3710296855e-02
1302 8 348 136.915119281587 6.9711573745e-02
1303 8 349 137.309794357762 6.3575149450e-02
1304 8 350 137.706969658079 6.4715481315e-02
1305 8 351 138.115157674377 1.0636187283e+00
1306 8 352 138.502928798010 6.7535900608e-02
1307 8 353 138.884624015929 6.6614403824e-02
1308 8 354 139.288450157853 6.5060906149e-02
1309 8 355 139.732883001620 1.0609963606e+00
1310 8 356 140.057083822316 7.1678874692e-02
1311 8 357 140.471431083161 6.5878776745e-02
1312 8 358 140.911835706153 9.5033883143e-02
1313 8 359 141.134640937949 1.0248601503e+00
1314 8 360 141.630371488416 7.0913105758e-02
1315 8 361 142.020252584752 6.6265987025e-02
1316 8 362 142.425237277640 6.5466429113e-02
1317 8 363 142.833861453971 8.1003271248e-02
1318 8 364 143.118424108567 1.0492490135e+00
1319 8 365 143.589304593505 6.5484713812e-02
1320 8 366 143.990167883020 6.4264525968e-02
1321 8 367 144.393764072566 7.0883608836e-02
1322 8 368 144.776669804510 6.5412075619e-02
1323 8 369 145.181243083129 6.5088057547e-02
1324 8 370 145.564997064443 7.0954054942e-02
1325 8 371 145.998808206572 1.0643582497e+00
1326 8 372 146.368300246904 7.0225980176e-02
1327 8 373 146.753729729153 6.8683784596e-02
1328 8 374 147.188963799908 8.4868331379e-02
1329 8 375 147.432050271079 1.0366495458e+00
1330 8 376 147.914271222400 6.5838308742e-02
1331 8 377 148.316751737060 6.4861125909e-02
1332 8 378 148.721382788934 6.5288803439e-02
1333 8 379 149.120756612081 6.7392930415e-02
1334 8 380 149.510416251356 7.3382778748e-02
1335 8 381 150.033244827865 9.4489556148e-01
1336 8 382 150.195443417690 1.8463463544e-01
1337 8 383 150.716984825601 1.0386281691e-01
1338 8 384 150.937282450059 1.0204717240e+00
1339 8 385 151.443784870175 7.4042885316e-02
1340 8 386 151.831931692032 6.6911743095e-02
1341 8 387 152.233682285043 6.5178742682e-02
1342 8 388 152.640001877111 7.3220038557e-02
1343 8 389 153.024506695161 1.0648678034e+00
1344 8 390 153.419555829940 6.4323158120e-02
1345 8 391 153.818929334396 6.5830003303e-02
1346 8 392 154.215784982844 6.6617705184e-02
1347 8 393 154.593022251498 7.3642060768e-02
1348 8 394 155.000707150588 6.4338246938e-02
1349 8 395 155.409386855520 7.3910976261e-02
1350 8 396 155.795994103412 6.9423573760e-02
1351 8 397 156.117185151766 1.0592868870e+00
1352 8 398 156.573603567805 6.6002109904e-02
1353 8 399 156.980677346866 6.6606957953e-02
1354 8 400 157.453470638243 1.6590939197e-01
1355 8 401 157.615764308464 9.6682257837e-01
1356 8 402 158.125445548317 6.8716214308e-02
1357 8 403 158.543249392815 7.1500749854e-02
1358 8 404 158.854348797504 1.0674562223e+00
1359 8 405 159.304294152657 6.6567136337e-02
1360 8 406 159.709694843665 6.5045995971e-02
1361 8 407 160.108289537501 6.4468117654e-02
1362 8 408 160.507236064335 6.6098744178e-02
1363 8 409 160.922342043614 9.1598554600e-02
1364 8 410 161.196612429772 1.0453938217e+00
1365 8 411 161.685444303045 8.1398890450e-02
1366 8 412 162.077715003815 6.7158393970e-02
1367 8 413 162.499724243114 7.8462495321e-02
1368 8 414 162.989521764408 7.1309973405e-01
1369 8 415 163.104895927625 4.0810585714e-01
1370 8 416 163.615383893735 6.7345299617e-02
1371 8 417 164.030877960181 7.1205160096e-02
1372 8 418 164.400236758353 7.5337040921e-02
1373 8 419 164.808556175063 6.6600761868e-02
1374 8 420 165.216641698341 6.7929375067e-02
1375 8 421 165.541237977314 1.0589412207e+00
1376 8 422 165.996802574503 6.9549291157e-02
1377 8 423 166.363183090996 7.7295127361e-02
1378 8 424 166.776737936871 6.5637558207e-02
1379 8 425 167.183963414729 1.0663562846e+00
1380 8 426 167.571497733312 6.4679446907e-02
1381 8 427 167.970040712411 6.7682742438e-02
1382 8 428 168.338286258699 7.7989897518e-02
1383 8 429 168.762063852006 8.4105740573e-02
1384 8 430 169.097357473179 1.0637213716e+00
1385 8 431 169.534022395361 6.5503723487e-02
1386 8 432 169.913225947864 1.0649160976e+00
1387 8 433 170.340056082121 8.2451754920e-02
1388 8 434 170.712592036578 6.7234707554e-02
1389 8 435 171.113218462408 6.5242241666e-02
1390 8 436 171.505405874597 6.6426071422e-02
1391 8 437 171.919382685955 8.2214222794e-02
1392 8 438 172.291499859274 6.6679248936e-02
1393 8 439 172.692854045964 6.5728986137e-02
1394 8 440 173.104788189705 7.2286571893e-02
1395 8 441 173.414912603120 1.0772750265e+00
1396 8 442 173.866350634972 6.7940368859e-02
1397 8 443 174.287846194908 8.9486451209e-02
1398 8 444 174.746345542293 1.0450824220e+00
1399 8 445 175.014710053013 8.1865061468e-02
1400 8 446 175.440921686219 6.7279138645e-02
1401 8 447 175.850705625433 6.8527892224e-02
1402 8 448 176.358928730632 3.5306562422e-01
1403 8 449 176.477115011191 7.6903477276e-01
1404 8 450 176.975722621670 9.0277580424e-02
1405 8 451 177.401939248459 6.8743802426e-02
1406 8 452 177.814109937203 7.1007339932e-02
1407 8 453 178.315866196590 5.7243164021e-01
1408 8 454 178.433574951675 5.7040697592e-01
1409 8 455 178.973527531297 7.8142518297e-02
1410 8 456 179.338212893773 8.1703462060e-02
1411 8 457 179.881732904977 7.8525454840e-01
1412 8 458 180.002377824215 3.3789914675e-01
1413 8 459 180.509684055752 6.9883545875e-02
1414 8 460 180.906413151545 9.5413711630e-02
1415 8 461 181.343068137417 8.5747057922e-02
1416 8 462 181.705937345466 7.5523180403e-02
1417 8 463 182.197491262580 1.0365684576e+00
1418 8 464 182.441644219084 8.7681689773e-02
1419 8 465 182.873270795589 6.9985124611e-02
1420 8 466 183.276188340417 6.7199776537e-02
1421 8 467 183.679867855361 6.6055905637e-02
1422 8 468 184.049332865892 9.3558065084e-02
1423 8 469 184.467359290082 6.9537298792e-02
1424 8 470 184.874226686467 1.0665970037e+00
1425 8 471 185.289855475988 8.6331547760e-02
1426 8 472 185.601229088732 1.0737775371e+00
1427 8 473 186.040264037026 6.8587242404e-02
1428 8 474 186.458977012822 7.9771537295e-02
1429 8 475 186.792512844533 8.2289935282e-02
1430 8 476 187.228287470008 1.0669191010e+00
1431 8 477 187.614557075485 6.5398543410e-02
1432 8 478 188.013771845915 6.6638666381e-02
1433 8 479 188.410539433172 1.0336650894e-01
1434 8 480 188.819776572793 6.9611765028e-02
1435 8 481 189.335358693313 3.9849508504e-01
1436 8 482 189.460889637317 7.4230867761e-01
1437 8 483 189.923360862882 8.2205766868e-02
1438 8 484 190.346779421792 6.8988415096e-02
1439 8 485 190.744889162169 1.0388324618e-01
1440 8 486 191.147734683973 6.8840304580e-02
1441 8 487 191.555332152334 6.8145559793e-02
1442 8 488 192.021290968787 1.0696483949e+00
1443 8 489 192.287522932039 9.6261625289e-02
1444 8 490 192.713929127951 6.9834198733e-02
1445 8 491 193.082126422244 1.0652404149e+00
1446 8 492 193.509563976550 7.0440398902e-02
1447 8 493 193.913338843158 7.0740482414e-02
1448 8 494 194.341143524298 9.9223849613e-02
1449 8 495 194.699579613100 7.5178887083e-02
1450 8 496 195.230267143478 7.8308536284e-01
1451 8 497 195.352718857569 3.4067183973e-01
1452 8 498 195.867684516560 7.2713357040e-02
1453 8 499 196.241970307421 1.1150075795e-01
1454 8 500 196.774422882852 3.0396365419e-01
1455 8 501 196.914415871995 8.6248591229e-01
1456 8 502 197.426161915731 7.4659834017e-02
1457 8 503 197.939187079110 4.2707481063e-01
1458 8 504 198.054939524797 7.4265847280e-01
1459 8 505 198.579044415750 7.2492331798e-02
1460 8 506 198.979554513122 6.7705545884e-02
1461 8 507 199.388875159786 6.8870851367e-02
1462 8 508 199.785871332684 6.8736861668e-02
1463 8 509 200.185700355094 1.1881549198e-01
1464 8 510 200.587834668883 6.7614716259e-02
1465 8 511 201.028581036816 1.1767189165e-01
1466 8 512 201.271178989963 1.0611834048e+00
1467 8 513 201.745051627123 7.2289992371e-02
1468 8 514 202.149839557950 6.8261491040e-02
1469 8 515 202.497167190019 1.0684137455e+00
1470 8 516 202.944546508795 6.9761068824e-02
1471 8 517 203.303311157305 1.1951555537e-01
1472 8 518 203.731205276553 6.9993220957e-02
1473 8 519 204.185113287837 1.0618651808e+00
1474 8 520 204.543812955400 1.2164620151e-01
1475 8 521 204.897873148362 7.5223014330e-02
1476 8 522 205.386419978099 1.0482932666e+00
1477 8 523 205.660094884933 8.3572843636e-02
1478 8 524 206.119442216601 1.0271119738e-01
1479 8 525 206.431343548587 9.0371784551e-02
1480 8 526 206.863503409611 7.0524135600e-02
1481 8 527 207.271482218102 6.9850210111e-02
1482 8 528 207.706429173629 1.8058106213e-01
1483 8 529 207.920741180305 1.0058237781e+00
1484 8 530 208.435877256832 1.3459299554e-01
1485 8 531 208.826846317733 7.1935579984e-02
1486 8 532 209.225830706552 7.1754404175e-02
1487 8 533 209.579755897785 1.0684677705e+00
1488 8 534 209.972063065145 1.3157861528e-01
1489 8 535 210.403988456000 6.9574595513e-02
1490 8 536 210.805688006309 6.8094065951e-02
1491 8 537 211.205289755340 7.4936469733e-02
1492 8 538 211.683071162553 1.0504082573e+00
1493 8 539 211.959530318607 8.3072842554e-02
1494 8 540 212.382486647993 7.0979776191e-02
1495 8 541 212.819657593566 1.4222348773e-01
1496 8 542 213.304581975063 7.8535024062e-01
1497 8 543 213.425509453659 4.1531201179e-01
1498 8 544 213.943010823917 7.6609863353e-02
1499 8 545 214.451773212894 3.1209365981e-01
1500 8 546 214.580410816489 8.1490254679e-01
1501 8 547 215.076572687609 1.4598564069e-01

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