== kn-evaluator smoke test: clean-directory build + run ==
host toolchain: gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0; Python 3.12.3; normaliz 3.10.2
start (UTC): 2026-09-02T22:26:52Z

$ sh build.sh
built ckernel_k2.so

$ python3 k2_chart.py     # exact chart self-tests
n=4: diagonals=2 (expect 2), poly factors=1, identity worst=1.24e-50
n=5: diagonals=5 (expect 5), poly factors=3, identity worst=4.22e-50
n=6: diagonals=9 (expect 9), poly factors=6, identity worst=2.25e-50
n=7: diagonals=14 (expect 14), poly factors=10, identity worst=6.45e-50
triangulation counts: [(4, 2), (5, 5), (6, 14), (7, 42), (8, 132)]
k2_chart self-tests PASS

$ python3 k2_fan.py 5     # regenerate the n=5 fan from scratch (exact build + checks; uses normaliz)
n=5: cones=5 (Catalan=5) rays=5 (expect 5)  -> PASS
n=5: nonsimplicial cones=0, subcones=5, |det| range [1,1], unimodular: ALL
n=5: coverage {'exactly1': 20000, 'zero': 0, 'more': 0, 'n': 20000}
n=5: ray<->planar-channel bijection: PASS (exact)
n=5: c0 check [sym]: fan=20/9 vs phi3=20/9 -> EXACT PASS
n=5: c0 check [rand]: fan=605/841 vs phi3=605/841 -> EXACT PASS
n=5: fan saved -> /tmp/kn-evaluator-2-2026-09-02-r5/kn-evaluator/fan_k2_n5.json  (0.3s)


regenerated n=5 fan identical to shipped fan_k2_n5.json: True

$ python3 evaluate.py n=5 nq=20 prec=160 procs=4     # single-point usage
[k2-n5] n=20 prec=160 procs=4 subcones=5 wall=0.4s core_s=2 (5.24e+03 pts/s) value=0.3025142924409271507218290111615628735296e0
A_5 = 0.3025142924409271507218290111615628735296e0   (nq=20, prec=160 bits, alpha'=1, wall 0.4s, 2 core-s)

$ python3 smoke_check.py     # n=5 + n=7 certification pairs vs references
== n=5, symmetric point P[a,b] = -3/2 (scale 1/4) ==
[k2-smoke-n5] n=18 prec=128 procs=8 subcones=5 wall=0.4s core_s=2 (4.39e+03 pts/s) value=0.3025142924409271507203181537994297129675e0
[k2-smoke-n5] n=20 prec=160 procs=8 subcones=5 wall=0.2s core_s=1 (1.31e+04 pts/s) value=0.3025142924409271507218290111615628735296e0
  3F2 reference = 0.3025142924409271507218365
  [PASS] n=5 pair cert (18/128 v 20/160) >= 20 digits: 20.3 digits
  [PASS] n=5 engine vs exact 3F2 >= 20 digits: 22.6 digits
== n=7, symmetric point, hard (mu=1/4) ==
[k2-smoke-n7] 25/42 cones, 15s
[k2-smoke-n7] n=16 prec=160 procs=8 subcones=42 wall=21.8s core_s=174 (1.27e+05 pts/s) value=0.6696260198229292036955708258653035269743e-3
[k2-smoke-n7] 25/42 cones, 21s
[k2-smoke-n7] n=18 prec=192 procs=8 subcones=42 wall=33.6s core_s=269 (1.31e+05 pts/s) value=0.6696260198229376340693765954124746050051e-3
  [PASS] n=7 hard (mu=1/4) pair cert (16/160 v 18/192) >= 13.5 digits: 13.9 digits
  [PASS] n=7 hard (mu=1/4) matches README value to its printed digits: 14.5 digits vs 0.00066962601982294
== n=7, symmetric point, mild (mu=1/16) ==
[k2-smoke-n7] 25/42 cones, 16s
[k2-smoke-n7] n=16 prec=160 procs=8 subcones=42 wall=24.1s core_s=193 (1.14e+05 pts/s) value=0.8080434352443443806256836722674194770466e2
[k2-smoke-n7] 25/42 cones, 25s
[k2-smoke-n7] n=18 prec=192 procs=8 subcones=42 wall=35.7s core_s=286 (1.23e+05 pts/s) value=0.8080434352443443871727929180017769292895e2
  [PASS] n=7 mild (mu=1/16) pair cert (16/160 v 18/192) >= 13.5 digits: 17.1 digits
  [PASS] n=7 mild (mu=1/16) matches README value to its printed digits: 17.5 digits vs 80.804343524434439
== SMOKE PASS (6 pass / 0 fail, 118s) ==
smoke_check exit code: 0

end (UTC): 2026-09-02T22:28:52Z
