diff --git a/.trinity/seals/ternary_GftArgmax4.json b/.trinity/seals/ternary_GftArgmax4.json new file mode 100644 index 0000000000..6aa5ba0e19 --- /dev/null +++ b/.trinity/seals/ternary_GftArgmax4.json @@ -0,0 +1,11 @@ +{ + "gen_hash_c": "sha256:8dba73ec299d75dd87de614ec9c713a566cf3dfb8f4b3b979b9c2d22ee94cbe2", + "gen_hash_rust": "sha256:f1d62eb7deb05fdaebdf5ca826fe8c76b7b25188feeae7847d215059e9c7e7eb", + "gen_hash_verilog": "sha256:1f0ca3c28dcb0770bc6d7300bd1b93b3bbb6ab1b7d6e3ca1169eb7ce63aa1ed2", + "gen_hash_zig": "sha256:458c9965906ebbafa52b0b7b91af7bed637ffec1f45e6aa582dfa79d73d1ab06", + "module": "GftArgmax4", + "ring": 12, + "sealed_at": "2026-08-06T15:36:28Z", + "spec_hash": "sha256:c208991377d1523087aed04969aac10ad910ef317e8bdb67bf5d290d70a4fff8", + "spec_path": "specs/ternary/gft_argmax4.t27" +} \ No newline at end of file diff --git a/bootstrap/tests/gft_argmax4.rs b/bootstrap/tests/gft_argmax4.rs new file mode 100644 index 0000000000..724a2f5f6a --- /dev/null +++ b/bootstrap/tests/gft_argmax4.rs @@ -0,0 +1,79 @@ +// ============================================================================ +// Check for the spec-first GF-T classification head (specs/ternary/gft_argmax4.t27): +// four signed GF-T16 logits -> the index {0,1,2,3} of the maximum real value +// (lowest index wins ties). Comparison is a total order on the GF-T encoding. +// Bit-exact to the ideal exact-float argmax over 1000 vectors +// (tests/gft_argmax4_vectors.txt). +// ============================================================================ + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::process::Command; + +fn t27c() -> &'static str { env!("CARGO_BIN_EXE_t27c") } +fn spec_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("..").join("specs").join("ternary").join("gft_argmax4.t27") +} +fn vectors_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests").join("gft_argmax4_vectors.txt") +} +fn tool_available(t: &str) -> bool { + Command::new(t).arg("-V").output().map(|o| o.status.success()).unwrap_or(false) +} + +#[test] +fn spec_first_gft_argmax4_matches_oracle() { + let gen = Command::new(t27c()).arg("gen-verilog").arg(spec_path()).output().expect("gen-verilog"); + assert!(gen.status.success(), "gen-verilog failed:\n{}", String::from_utf8_lossy(&gen.stderr)); + let v = String::from_utf8_lossy(&gen.stdout).into_owned(); + assert!( + v.contains("input wire [31:0] x0") && v.contains("input wire [31:0] x3") + && v.contains("output wire [7:0] result"), + "argmax4 missing logits -> index interface:\n{}", v + ); + + if !tool_available("iverilog") || !tool_available("vvp") { + eprintln!("SKIP: iverilog/vvp not on PATH; skipping argmax4 check"); + return; + } + + let vectors = fs::read_to_string(vectors_path()).expect("read vectors"); + let n = vectors.lines().filter(|l| !l.trim().is_empty()).count(); + let dir = env::temp_dir().join(format!("t27_am4_{}", std::process::id())); + let _ = fs::remove_dir_all(&dir); + fs::create_dir_all(&dir).unwrap(); + fs::write(dir.join("spec.v"), &gen.stdout).unwrap(); + fs::write(dir.join("vec.txt"), &vectors).unwrap(); + + let tb = format!( + r#"`timescale 1ns/1ps +module tb; + reg [31:0] x0,x1,x2,x3; wire [7:0] y; integer fails,nn,fd,code; reg [7:0] exp; + GftArgmax4 dut(.clk(1'b0),.rst_n(1'b1),.en(1'b1),.x0(x0),.x1(x1),.x2(x2),.x3(x3),.ready(),.result(y)); + initial begin + fails=0; nn=0; fd=$fopen("{}","r"); + while(!$feof(fd)) begin code=$fscanf(fd,"%h %h %h %h %d\n",x0,x1,x2,x3,exp); + if(code==5) begin #1; nn=nn+1; + if(y!==exp) begin fails=fails+1; if(fails<=6)$display("FAIL y=%0d exp=%0d",y,exp); end + end end + $fclose(fd); + if(fails==0)$display("ALL_PASS %0d",nn); else $display("FAILED %0d/%0d",fails,nn); + $finish; + end +endmodule +"#, + dir.join("vec.txt").to_str().unwrap() + ); + fs::write(dir.join("tb.v"), tb).unwrap(); + + let vvp = dir.join("sim.vvp"); + let compile = Command::new("iverilog").args(["-g2012", "-o", vvp.to_str().unwrap()]) + .arg(dir.join("spec.v")).arg(dir.join("tb.v")).output().unwrap(); + assert!(compile.status.success(), "iverilog compile failed:\n{}", String::from_utf8_lossy(&compile.stderr)); + let run = Command::new("vvp").arg(&vvp).output().unwrap(); + let stdout = String::from_utf8_lossy(&run.stdout).into_owned(); + let _ = fs::remove_dir_all(&dir); + assert!(stdout.contains(&format!("ALL_PASS {}", n)), "argmax4 differs from the oracle:\n{}", stdout); + assert!(!stdout.contains("FAIL"), "argmax4 mismatch:\n{}", stdout); +} diff --git a/bootstrap/tests/gft_argmax4_vectors.txt b/bootstrap/tests/gft_argmax4_vectors.txt new file mode 100644 index 0000000000..c5a1740abc --- /dev/null +++ b/bootstrap/tests/gft_argmax4_vectors.txt @@ -0,0 +1,1000 @@ +00000 04a8c 054ad 052d8 2 +05323 059d6 1592b 158b2 1 +04b6a 15094 14e10 15d0f 0 +15417 053d4 058b6 15c03 2 +04a3d 055b4 1479c 04764 1 +05200 05200 05000 00000 0 +05293 04dad 14fe7 14c67 0 +051c3 00000 15b37 04c51 0 +0421c 14b7b 15512 00000 0 +0490b 05581 14d54 056c0 3 +05521 0512a 05957 0563c 2 +05200 00000 00000 15000 0 +15000 05000 05000 05001 3 +1489e 15917 1500b 15643 0 +050e8 00000 0557c 14d2e 2 +00000 056c5 148a1 00000 1 +0461e 14fe0 1555e 15b32 0 +0536d 04f62 156d4 04f0a 0 +0586d 15836 14d25 050b6 0 +15a4f 15e6b 00000 14bef 2 +155f7 00000 04ac5 00000 2 +1436a 159e8 1548a 143b8 0 +00000 04a61 04d88 04c8c 2 +0537a 15d8b 151cd 151e1 0 +048b3 00000 00000 14e1a 0 +00000 050b8 0560c 04ea6 2 +1494d 14c75 14acd 00000 3 +15001 00000 15000 15001 1 +14e52 14d83 158f3 04846 3 +04caf 00000 058d1 14b90 2 +05001 05200 05000 00000 1 +0549b 04dfa 04993 1545f 0 +15965 1554a 00000 049a6 3 +04987 1483b 14fbd 15627 0 +14fb7 0496c 0461d 0458a 1 +04911 15831 050f8 14cad 2 +14b35 0520b 15813 1586b 1 +00000 00000 00000 14af3 0 +152c6 14ffb 14db4 159ce 2 +00000 04f2d 00000 00000 1 +15119 051d1 0569f 00000 2 +0445f 00000 058db 04be4 2 +04fe8 04ac0 15736 048a1 0 +0598f 05870 15037 05d4c 3 +150d1 054f6 05431 158b3 1 +05001 05000 15000 15000 0 +00000 15000 05000 05000 2 +04c0e 1560c 00000 04e5d 3 +049b3 00000 154bf 050fa 3 +04343 05f7d 00000 04ce4 1 +045e8 05d0d 05437 04f83 1 +05a4e 14bc3 158a3 153e7 0 +05c72 00000 05667 15379 0 +00000 14b43 04c75 04a9b 2 +154a1 059bb 144c7 04fe6 1 +043de 1446f 14979 155d0 0 +156a4 04ea4 14e3a 00000 1 +00000 1545a 04aa0 05010 3 +05f26 04ac2 05c8b 04cc3 0 +05171 14c8b 05177 14ddb 2 +05356 146d3 152a2 15929 0 +14b0b 053c5 04b7a 00000 1 +1591a 14f29 14ed7 05659 3 +15748 1516e 14a4b 1455a 3 +14dae 14f0c 04c72 00000 2 +00000 04cc5 04fea 15431 2 +15143 05950 048ce 15963 1 +15238 155f3 152e7 1549a 0 +05926 00000 04dc0 155cc 0 +151fc 04c68 04e31 14b70 2 +149f8 00000 00000 154c3 1 +057b3 00000 04dc6 055f0 0 +05480 1588f 00000 14e0d 0 +04cb8 00000 14f85 15753 0 +00000 14be4 0595c 14931 2 +00000 053e9 14c7f 048cc 1 +1576d 15103 05596 04dc7 2 +00000 048a4 00000 15d8e 1 +14c4c 05c01 153af 04deb 1 +0519d 14ba0 150ba 04bd2 0 +14dc2 15613 04ba4 156b8 2 +1532c 04d48 04931 149c1 1 +14f08 00000 04c97 1572f 2 +0598a 00000 04386 05d80 3 +0495f 0535c 15078 151f3 1 +1587d 05422 0524a 05518 3 +15000 15001 05001 05000 2 +05eac 00000 14704 049ba 0 +15bbe 158b1 15dcf 058d9 3 +04e54 05727 14cbb 148b5 1 +0548d 1540e 05950 1577a 2 +04c73 152a0 0592a 15074 2 +04c84 15873 0438a 15490 0 +05e48 0472b 14874 15977 0 +15000 00000 05000 15000 2 +042d1 157c7 05895 05d34 3 +15000 05001 15001 05000 1 +150c6 0487a 053dc 051de 2 +144ae 0519b 05e69 15c69 2 +14983 1546c 159fa 1485d 3 +14335 00000 00000 04a98 3 +05630 04e4c 14cd1 055c9 0 +14b32 15487 14a51 00000 3 +051ec 05573 1546b 052dd 1 +04fe7 1487c 1543d 157dd 0 +05093 04d8b 0490c 14dcb 0 +1588b 149b5 051e4 04eb1 2 +14ed8 05294 04f4f 0527f 1 +15001 00000 15000 05200 3 +05000 00000 05001 05000 2 +153e2 14bea 05882 04c0f 2 +052e6 14879 00000 1513d 0 +14f99 04ab0 1589b 159f0 1 +049fa 1495e 15331 05a7b 3 +042cd 04d7a 00000 15f0c 1 +04a8d 14987 15087 14e57 0 +05d9e 157d9 14c9e 15cc2 0 +05667 14d00 14ebd 057b2 3 +157ce 059d5 05464 157a5 1 +05154 154ca 15949 0547b 3 +04767 05a49 14f09 15d3b 1 +143f5 04bdc 14c0b 05314 3 +149c9 15493 04c39 058d8 3 +05783 14ff5 00000 053e9 0 +04c76 1544a 0538f 152f0 2 +14ef9 05648 04a6d 0560c 1 +155d2 042c5 056f3 00000 2 +14a81 00000 14fba 14da0 1 +04a4d 151e7 1490c 00000 0 +14900 00000 058eb 14ff9 2 +05556 00000 00000 14d83 0 +05001 00000 00000 15001 0 +00000 04fb7 050e1 0502f 2 +150b2 15508 00000 00000 2 +05200 00000 05000 00000 0 +1530e 0531b 14bd5 15425 1 +15322 00000 04902 00000 2 +00000 05200 05000 05000 1 +059a2 04ce5 04bb0 14b5c 0 +15d1b 05d50 14219 1514b 1 +04ce3 04aa4 0509f 054fe 3 +1433e 058e6 05edc 14663 2 +059c9 1422e 00000 00000 0 +00000 15270 00000 14e6d 0 +056b1 14a25 05786 00000 2 +050de 1548d 00000 05152 3 +15000 00000 05001 00000 2 +14d87 14dcf 14e8b 14923 3 +158c7 14ad9 00000 158a2 2 +1539f 00000 05546 14e02 2 +00000 14d4f 155f8 058b3 3 +00000 14f0c 148f1 04545 3 +00000 14b06 0444a 05af9 3 +00000 14956 04e9c 058bd 3 +1582c 15a9b 14c02 048dd 3 +058e4 058fb 159c5 14866 1 +052ce 05701 059fd 05252 2 +0468f 04da3 147fe 00000 1 +05230 05ff8 05c5b 15339 1 +1532d 05817 00000 14eea 1 +05d43 14381 04d88 15b74 0 +04802 046f0 0558e 04852 2 +14c5a 05360 14a25 05311 1 +14e19 154cf 158e7 0526b 3 +0505f 1503c 14976 05b64 3 +15036 058b7 0498b 152c5 1 +05994 1494b 00000 05241 0 +00000 00000 15970 04c84 3 +159d2 04e99 053f6 04a3b 2 +14ff3 00000 05817 0544c 2 +00000 04f64 05f32 14f5d 2 +00000 0511f 1550d 15554 1 +00000 1584d 04308 14946 2 +04b8a 00000 05705 154d9 2 +1571c 054f9 14dbb 04efa 1 +05720 0532f 14a87 00000 0 +047b3 00000 1574d 056b9 3 +15c6f 1443f 14f57 150d7 1 +153e7 1595e 0421a 05542 3 +00000 04859 04c2e 156b1 2 +05200 15000 05200 05200 0 +14a8d 158d2 051a4 00000 2 +14ed0 00000 159f6 156a5 1 +05e24 05270 048eb 15f0b 0 +00000 14f4b 14d60 15499 0 +14eb9 151f8 14cb2 057cf 3 +14b30 05160 149b5 0533f 3 +15001 00000 00000 05001 3 +14e29 00000 057de 14f29 2 +00000 04b68 04dbb 14fcf 2 +050f8 00000 048f9 158f8 0 +00000 0554f 148ef 04fbc 1 +04d26 15648 047d1 147de 0 +15ada 14842 059c2 14344 2 +05601 15943 05135 15c03 0 +1440b 14a3e 1531b 05bd6 3 +14e1c 1565c 04a90 04d94 3 +15d90 05574 046e4 0443f 1 +05e93 053ac 1434b 04243 0 +045f4 00000 157bb 00000 0 +04aa9 15100 14c8f 156a9 0 +00000 05918 14935 1497f 1 +159de 00000 15c89 04433 3 +149f2 14b08 14827 00000 3 +14300 1533c 14e6e 0536b 3 +1536f 0529c 059a3 055e5 2 +04cd7 147ce 00000 045f0 0 +00000 05f1a 04cff 00000 1 +14489 15e1c 042bd 05077 3 +00000 14ccd 14936 14999 0 +155b3 14aed 15949 04f95 3 +05692 14ec6 15362 053c9 0 +1530c 151d1 157f0 0558f 3 +00000 0500c 155c6 15174 1 +05688 0515f 05084 14ba4 0 +056da 1442f 0533b 05a73 3 +0500e 00000 04ea9 04e0c 0 +14fb2 00000 00000 150f5 1 +00000 15bc2 14784 059bf 3 +15603 14838 04fe1 05271 3 +14d8a 150e3 0597e 00000 2 +143d1 14bc0 05d66 050b0 2 +05410 14828 14991 04b87 0 +04846 15395 0477d 143ec 0 +05821 05d67 04719 050ff 1 +056ea 048c9 04947 055a8 0 +04aa0 15376 00000 1581f 0 +14953 0540b 04f64 00000 1 +158a6 14201 052f0 04d07 2 +0511a 05525 054e5 00000 1 +04584 0577c 00000 15923 1 +14221 00000 14ce1 00000 1 +15386 054aa 0559b 14d7c 2 +1560f 052bc 00000 155c3 1 +149a8 05199 1463c 155d1 1 +150bf 14e88 15429 0567e 3 +00000 05168 159d4 04b16 1 +05ab5 045c7 04203 050d4 0 +05723 04897 152ca 04fa8 0 +14615 15215 1592f 156d8 0 +059d9 04919 00000 05c9e 3 +059a5 00000 00000 15cb4 0 +052fb 0497f 15468 1547e 0 +1538e 1506a 0493e 05534 3 +053ce 04d92 053ec 0572a 3 +15466 04c94 0552d 057d7 3 +05428 055c4 04a4d 04e72 1 +053c1 057c3 0563b 05341 1 +05767 15975 14b0f 00000 0 +05724 15154 059c7 1566a 2 +00000 149a4 05315 04560 2 +14b1f 0528a 15996 04e76 1 +0503b 1566d 15f52 055fa 3 +04858 1518a 00000 14aa5 0 +00000 05001 05001 05000 1 +0478e 057f4 04b71 050c9 1 +14d0b 14cda 15018 150e4 1 +05163 15258 05818 055ec 2 +04e74 0481d 15363 1587d 0 +00000 00000 15001 05200 3 +0477a 00000 04a76 00000 2 +053eb 05bdc 055fb 1447d 1 +05200 15000 05200 15000 0 +14a03 00000 154f7 04c4d 3 +05000 00000 15001 05000 0 +14cf0 1526b 051da 04ab3 2 +04f31 00000 04c0a 14d71 0 +0421d 157ab 14683 05535 3 +148ce 050fb 05284 1499b 2 +155db 05936 05111 14c96 1 +1518e 04fe7 051df 14bfb 2 +1549d 054dd 15572 159f7 1 +15001 05001 05001 15001 1 +059ec 155ba 05cb2 04b79 2 +0591e 14b02 14e3b 0497f 0 +1493a 152d8 14e24 04a1c 3 +04b7a 049cf 15947 15268 0 +049fd 14933 052cc 00000 2 +15650 05225 0534a 151ac 2 +00000 158db 053c2 14ddd 2 +04592 15bc8 149d3 0442b 0 +04a89 04905 05492 00000 2 +0555c 00000 0498d 053a0 0 +00000 05261 00000 155f6 1 +14857 04f4b 00000 15753 1 +00000 05257 15694 05936 3 +150e8 00000 00000 00000 1 +05563 055f9 050e4 157a5 1 +15938 1581a 057e7 00000 2 +05000 05200 00000 00000 1 +00000 00000 048c5 04960 3 +15501 04d39 152ac 051d5 3 +15697 04b11 151c9 05284 3 +15001 15000 00000 15001 2 +00000 0496f 057cc 04f1e 2 +15271 14775 15944 1514b 1 +00000 05001 00000 05200 3 +15fed 05454 14ea1 1582d 1 +05506 1472b 05605 053fe 2 +058b6 15865 0475d 1482b 0 +05000 00000 05200 05200 2 +14790 142bb 156db 056b3 3 +159e2 14e0c 15b56 05652 3 +15452 14a63 14868 00000 3 +05000 15000 00000 15000 0 +144f7 0593b 14dd2 05cdd 3 +05200 00000 05000 05000 0 +05596 15277 156ea 150cb 0 +00000 04b9f 0501d 04bf4 2 +0536d 051bc 00000 054e7 3 +14ca4 14f34 0553c 00000 2 +15837 048b8 04926 051be 3 +1578f 00000 14dc5 0587d 3 +1553b 05420 04810 14d13 1 +153b3 057e4 149d0 1507f 1 +05001 15001 05001 05001 0 +150b3 056f0 00000 04a44 1 +1497f 050a0 0537a 1518a 2 +148cd 04fb9 0512c 14f19 2 +15162 049a5 043a7 159a5 1 +00000 04a56 04a9d 05cfe 3 +04c66 0484b 054ad 05961 3 +04902 0556c 00000 00000 1 +14c8b 05459 04858 14ec7 1 +1545d 056a7 14886 0523c 1 +14f19 00000 14c8d 0496b 3 +158bc 051ba 04d6c 15664 1 +05380 149ef 00000 15092 0 +05769 04ed4 148e7 00000 0 +15556 14c77 05196 04905 2 +05001 15001 15001 00000 0 +1582d 00000 04526 15602 2 +05200 00000 05001 05200 0 +14e18 04b6f 00000 1525c 1 +152f8 14fef 04ef9 04d78 2 +14ba9 04f5a 14cfb 1557f 1 +15fe4 15079 04276 04228 2 +154a8 153f6 05610 04f75 2 +042cf 14f60 053b9 05816 3 +14b67 1554a 152d8 053fc 3 +156c3 04f4a 05226 051ce 2 +056cc 0575d 00000 00000 1 +148bb 14f5d 14d21 0549d 3 +14dc6 157fd 04ecc 04bba 2 +144ee 14307 1488e 05ba1 3 +159e8 1436a 15fe8 05c90 3 +00000 148d5 14851 156a1 0 +05200 15000 00000 15001 0 +04b7f 14fbd 14b36 155d9 0 +149b5 051be 05193 05929 3 +14b3c 14a72 15487 04552 3 +14b45 056a4 04d22 04b8a 1 +04ae1 048df 1592f 14bdd 0 +14d05 049e8 055aa 149a4 2 +0561b 159c3 14a5c 05e43 3 +14e9a 00000 05639 150e1 2 +14b3b 15844 04c58 0591b 3 +05522 04ae4 05dbf 15f30 2 +05001 15001 00000 00000 0 +050a3 057de 04aae 05809 3 +059b2 0517a 05acb 14a3c 2 +14443 1447a 00000 04e81 3 +04e52 04e33 05203 05730 3 +00000 14dfc 155f0 15588 0 +049c6 04d9c 14fc1 158b4 1 +05052 00000 05412 15201 2 +05dca 1551d 14cec 15b05 0 +05001 05001 05000 05000 0 +04ed9 14fdd 00000 0550d 3 +00000 00000 157da 00000 0 +00000 046da 00000 00000 1 +04c81 00000 15cff 14dcb 0 +04352 05b27 04d0f 05add 1 +15001 00000 00000 15001 1 +05001 00000 00000 00000 0 +05001 15001 15000 05001 0 +057ba 05d4d 00000 1580d 1 +15000 05000 05200 00000 2 +05300 14631 143b1 05a04 3 +0492d 053e5 14fb6 14e10 1 +00000 15911 043bb 04dcd 3 +04bdf 14a53 00000 04c7e 3 +053a1 0497b 15759 05311 0 +00000 0580f 048c6 147c9 1 +14d82 050b9 04e93 05323 3 +04fd1 0575c 14e42 00000 1 +158c9 00000 15484 14c50 1 +04825 1483a 14caa 04a15 3 +05ef7 059b2 14cfd 04bd3 0 +156be 00000 15177 14c73 1 +00000 00000 14cae 158ce 0 +0506a 05041 00000 149e1 0 +1598e 051a2 1533b 00000 1 +15270 051c5 0515f 053ee 3 +14d0f 151e2 15441 1546f 0 +00000 00000 15ce6 15e66 0 +15cb5 04463 15619 05c53 3 +05525 14c83 04a42 04edb 0 +151d7 14ee0 157de 15295 1 +052b2 15240 15343 14de1 0 +00000 0511d 042a8 15dd4 1 +148eb 15230 054d1 15684 2 +147a9 00000 053ad 15c17 2 +049bf 048a8 058fc 15436 2 +05000 05001 15000 15001 1 +051d6 15692 04aec 15212 0 +15001 05000 15001 05000 1 +14b87 1585a 05741 04f0f 2 +1498e 15bc0 0457b 05b82 3 +15365 15d0a 0503d 00000 2 +00000 00000 00000 15000 0 +1496b 14874 14a54 04f2b 3 +1571d 04f59 04e9a 04543 1 +05d6f 0582d 156c6 059d6 0 +05374 15266 0522d 055ad 3 +15000 05200 15001 00000 1 +14a97 04439 15314 1593e 1 +057fb 04c59 0533b 14b2f 0 +15764 04f58 04316 05377 3 +04351 04ab9 05b68 14668 2 +15000 00000 05001 05200 3 +0550a 148fe 056ad 15022 2 +149cb 15c93 04757 05393 3 +04d57 053c5 049d2 1517b 1 +14d30 052c5 05815 15237 2 +14841 054be 14f1f 1440e 1 +00000 04ce6 159b5 00000 1 +053c9 04dd3 14a71 042e6 0 +05d64 14ff3 14559 1425e 0 +148c1 150ec 14c42 0494a 3 +0568d 04e65 15448 0594e 3 +1504a 00000 05a93 15dc6 2 +048a0 0487f 149dd 04f58 3 +14c2d 150d4 14f81 14964 3 +04fcd 14e9b 156b7 05488 3 +157f2 0481e 15624 14874 1 +155cb 04be3 00000 04d73 3 +14d1b 00000 05765 0483b 2 +14b52 058da 00000 04b3c 1 +0485d 00000 15837 14ae6 0 +04df1 1533a 14fd6 15641 0 +14ce9 05eb3 1509f 00000 1 +05bb7 1469a 05d49 14f00 2 +15a2d 04e84 14bcb 14f18 1 +00000 14d51 14d78 14899 0 +1516c 153a2 15e66 158c9 0 +14abb 051d4 05812 14816 2 +00000 05000 00000 15001 1 +05934 15fe2 04b97 14c80 0 +15000 00000 15001 15001 1 +049c0 15e0c 0504e 04d6e 2 +057c2 048ca 151e1 04910 0 +0581a 1519f 14970 15042 0 +0505d 04ccf 1571f 00000 0 +05e28 053cd 05e5c 00000 2 +05aaf 15b92 1488c 00000 0 +046d1 00000 05c68 15177 2 +0512a 04bdb 059f5 15937 2 +04a57 00000 149bd 14c8f 0 +00000 144f9 04ddb 05757 3 +04c77 04e38 05318 15440 2 +04943 05884 159e4 00000 1 +00000 00000 05200 15001 2 +04e34 0579b 00000 1597c 1 +15ed7 1592c 043df 156d3 2 +04df8 05301 04a73 14ad0 1 +15181 1519d 153f2 14f44 3 +05000 15001 05000 00000 0 +04d0e 04b8f 15269 149cb 0 +1434b 058dd 153ed 15a2e 1 +00000 153f6 14f9f 00000 0 +00000 058b7 052b0 14f63 1 +05620 15d63 14708 04e3c 0 +156ec 14e0d 05614 056a6 3 +057a3 04e35 00000 04926 0 +15001 05000 15000 05000 1 +14d8b 14de4 14db8 00000 3 +15158 1508e 15860 05663 3 +04df0 04c31 159bd 1559c 0 +15fd0 15e35 14ca2 14e0e 2 +15929 14f4c 14deb 149e7 3 +04b93 049eb 0535d 00000 2 +04e96 053df 0577f 148b9 2 +0457e 15e1f 1506d 1424a 0 +00000 051ff 159f7 15170 1 +153be 00000 00000 00000 1 +047d4 14516 055b2 15f91 2 +00000 05ac9 1510e 05b8e 3 +04cbe 05493 151c7 1531c 1 +043df 14702 144ad 04389 0 +14f5f 057b8 14a39 151a7 1 +05001 00000 15000 00000 0 +055a6 15abc 058f3 0584b 2 +05972 15c40 0466d 0501a 0 +0594d 14d42 0578a 04a5d 0 +15f31 155ba 150eb 05a74 3 +15001 15000 15001 15001 1 +05200 15001 05001 05000 0 +04920 14bc6 15019 14bea 0 +159ee 151d2 0526f 052c4 3 +04c56 15162 158d4 00000 0 +05493 00000 04e1b 14f85 0 +14d33 142ef 04288 04803 3 +05606 0525f 15284 04fe3 0 +15001 00000 15001 00000 1 +1551e 143f3 15004 14872 1 +055c2 05d59 05564 14c84 1 +14849 00000 00000 05e82 3 +144d1 14d40 050e8 14d6c 2 +00000 05304 04fdc 04ef0 1 +14e94 04981 059f2 04fa5 2 +14926 04c2e 059b8 15138 2 +00000 042bd 158a8 05ab9 3 +14c61 00000 1501d 14ba0 1 +15001 00000 15000 00000 1 +05c5f 042b6 00000 052e5 0 +150e2 15348 048d7 05907 3 +0571e 00000 15533 05562 0 +153a8 00000 15327 04a00 3 +159a0 15544 00000 04f74 3 +153a3 15df2 15fbc 05d6f 3 +15bc9 047db 00000 14b92 1 +15ea5 14f27 15d5f 14e98 3 +04ca5 051c0 05668 00000 2 +04d13 00000 050e6 00000 2 +0552c 05702 0528e 157fc 1 +14875 14965 14ad7 15c58 0 +057d8 04626 15603 00000 0 +14f2a 157db 14af8 054a0 3 +04f73 00000 0481f 05673 3 +15001 15000 05000 15000 2 +15834 14dc9 1572c 156e1 1 +05291 15113 15831 14e6e 0 +00000 14b6d 04973 14980 2 +05866 04afd 150a3 0591b 3 +15433 05706 155d7 156fb 1 +153b1 04d1c 04dbf 00000 2 +14bdb 00000 05b0d 156a0 2 +00000 14d70 04ee4 04a0e 2 +00000 048f7 055e9 053b2 2 +050cf 14d71 048d7 054c5 3 +148b1 04a2a 00000 05168 3 +043d4 050f2 045f9 146ae 1 +05260 05648 04a15 14bef 1 +05d7f 1549f 14ec2 158d3 0 +14951 0573a 00000 154db 1 +056ab 15f43 14995 1521e 0 +00000 14de0 1590c 042b1 3 +14edd 00000 059ee 04a86 2 +00000 05001 15001 00000 1 +0512f 14ded 157a7 0534b 3 +00000 058c5 00000 1564c 1 +05730 04800 04d64 15086 0 +15192 04b4c 059d8 00000 2 +00000 147e6 142ff 05925 3 +05000 05200 15000 15000 1 +05300 04885 1581a 1588e 0 +14bcd 0567e 15a9d 00000 1 +053d3 05dc8 00000 05b89 1 +1536d 1445d 1441e 15fd5 2 +00000 15000 00000 00000 0 +052c8 05453 00000 149d6 1 +04aba 058d3 04d54 044bb 1 +04e33 04f98 15c36 04e5d 1 +1495f 0554a 14c7f 14fce 1 +158da 05abe 150a1 14440 1 +1489a 155fe 00000 00000 2 +05e88 00000 159e0 00000 0 +14882 04d23 05082 15898 2 +04b8b 0536e 04eb4 054f0 3 +15000 00000 05000 00000 2 +05918 1502b 04e97 05820 0 +14e24 049fd 04e3c 05476 3 +055cf 144c3 15ae9 04593 0 +15a2b 05e61 00000 15039 1 +05499 1482f 14ee6 14d3a 0 +057a2 1572b 148a9 157ed 0 +0435a 00000 00000 0445e 3 +04977 05e4b 1552d 15ae6 1 +052cc 1542a 14906 05153 0 +052ee 00000 050a6 0576a 3 +14eba 00000 159f2 14e0a 1 +05200 05000 05000 05000 0 +04abc 159d8 14ed6 05f48 3 +15000 15000 05000 15000 2 +15000 15001 15001 15000 0 +04be1 05838 052e2 151ef 1 +05b2f 049c1 15430 047a7 0 +15941 15a49 151bc 1544c 2 +1532b 04b52 04878 05394 3 +05778 042b5 15fc4 15720 0 +05200 05001 05000 00000 0 +1541a 14c5a 14b89 14eac 2 +00000 154f3 04d1c 058fb 3 +04cb4 04f2c 0548f 048a1 2 +00000 00000 15000 05001 3 +05945 15258 14a1f 14c64 0 +148ab 04ce4 04afc 04e13 3 +00000 05769 1467b 045e1 1 +05ee6 00000 00000 1491b 0 +05251 00000 05dff 054ba 2 +00000 14d35 056b2 00000 2 +00000 04c64 054a1 05792 3 +04811 00000 05250 148d7 2 +15021 04d99 00000 00000 1 +00000 05180 04ddd 052ca 3 +14beb 150d4 0568a 150be 2 +04dc0 14c8d 14e75 14f12 0 +00000 057fe 15662 00000 1 +05212 050fb 15560 04e1e 0 +1569d 150cb 04e72 0557d 3 +05e4c 05e6a 05894 0552b 1 +00000 00000 0480b 05556 3 +00000 14f50 14754 1492e 0 +1536e 04a3a 14d1d 051f3 3 +00000 05995 14d24 1535a 1 +151dc 04c17 0512f 1494f 2 +14c58 049e4 15590 155c0 1 +159f3 056d4 04919 04b65 1 +05200 00000 05200 00000 0 +05bb9 14a76 05833 04cda 0 +14875 04cdc 05693 04d8d 2 +152c8 15377 151bc 155b4 2 +044e6 05010 00000 0500e 1 +05200 15001 05200 15000 0 +1550c 0533c 00000 15713 1 +14e5a 0546e 0516b 00000 1 +00000 0536e 0496d 14fbd 1 +159a4 057dc 00000 052d2 1 +00000 15001 00000 15000 0 +058e5 14744 00000 145d9 0 +00000 14a2e 14d58 14908 0 +14bf2 152e4 05768 0573e 2 +00000 05001 15001 05001 1 +05200 05200 05000 00000 0 +0547b 14b2b 14a05 0586f 3 +05739 04fdc 153cd 14c1a 0 +05107 050e5 05cd6 05d05 3 +143f1 05c87 1459f 14586 1 +0464a 15b6f 148ad 14f80 0 +05e84 00000 05eb1 0517f 2 +00000 14ca0 15310 054d4 3 +14a39 04b81 04e0c 00000 2 +15446 00000 1534b 1538b 1 +1500f 1496b 04803 156cb 2 +15fd0 147a2 04778 14a90 2 +1570f 05afa 050bd 04a48 1 +053a0 00000 148c4 150ee 0 +05d85 05737 04664 00000 0 +04ffe 059ba 149b0 050ee 1 +04db0 1565e 05302 04bb2 2 +1519c 1539f 00000 1510b 2 +14ffd 055a4 14a0f 15938 1 +05ce2 044e1 00000 1561c 0 +04bae 15f11 04709 1532a 0 +144a2 051af 145f9 159cb 1 +155cd 05315 14c9a 055b4 3 +05742 150ec 050b7 14859 0 +148fc 0518f 05e5d 15af9 2 +04a6c 14a34 15196 151d7 0 +15000 05200 05200 05200 1 +042e2 05c7d 05f50 0484e 2 +056e2 0583e 057de 155d5 1 +00000 04a9c 047c3 05de4 3 +00000 0576e 14bea 00000 1 +14d73 15832 04dc5 157bd 2 +00000 155a9 15969 04765 3 +058db 00000 1523f 148fe 0 +04d5e 00000 00000 05905 3 +05001 05200 00000 05000 1 +1568f 04f56 1581e 00000 1 +05001 00000 05200 05001 2 +00000 05001 15001 15001 1 +054cf 04c15 1582a 04ec0 0 +159e5 04883 15429 04d32 3 +04f97 04e93 0501f 15788 2 +05982 14a09 05907 057aa 0 +05200 15000 00000 00000 0 +00000 00000 15c9b 05daa 3 +053a2 04df7 1527c 0578d 3 +00000 14810 05227 149b6 2 +0521f 00000 043fb 04438 0 +059a7 05f70 1561b 04f65 1 +00000 05001 05200 05000 2 +14c82 151f6 153c6 150ca 0 +04c4f 14890 1576c 05686 3 +14985 04fd0 04ce9 14f37 1 +14e09 14971 00000 0549c 3 +00000 14eff 0494b 152cc 2 +04619 1493e 00000 04c77 3 +04770 15b90 1469e 051ca 3 +00000 15684 159a8 0588f 3 +0574a 00000 00000 04c21 0 +045ca 144c5 0537f 05255 2 +04fd7 158b2 0488a 15571 0 +05200 05200 05000 05001 0 +00000 04f1a 04f35 00000 2 +0584e 04edd 04834 00000 0 +00000 14fe8 04a8c 04e03 3 +05f16 051b2 152c0 15d92 0 +15daa 14ca3 0437f 054bc 3 +04d77 00000 0482a 048c7 0 +04384 1456d 1497c 05e78 3 +00000 05200 05001 05000 1 +00000 0500f 1521d 0495a 1 +058f0 144cf 05cd0 151d8 2 +05aad 150a1 15d79 05a85 0 +14a2c 14d45 14e78 14877 3 +14aba 04d5d 00000 00000 1 +04dca 047ac 04bdf 0438e 0 +04ea5 14dc9 05906 00000 2 +150df 00000 057df 049fb 2 +15001 05001 15000 15000 1 +15000 05000 00000 05200 3 +14e08 15720 05f7d 0530b 2 +14bfc 1493f 054ae 14adf 2 +149f9 14c0c 1554d 00000 3 +0538b 04c0c 00000 14c4e 0 +04fc8 15120 04da2 00000 0 +14536 00000 04751 0552f 3 +04979 14fd7 150d2 15bde 0 +05200 00000 05001 00000 0 +046e3 14630 1549c 04775 3 +04aff 05076 1538c 051d7 3 +155ce 14925 15221 14c08 1 +04d62 00000 1517a 00000 0 +14fd4 04e9f 157cf 15472 1 +150ca 04918 05d7b 14839 2 +155b7 0580d 155a4 0525c 1 +15744 14b20 00000 04ca5 3 +04b7c 04b2e 00000 048ba 0 +052f3 142be 1426c 15137 0 +14485 15d87 14617 15656 0 +00000 00000 00000 05001 3 +04e95 14475 04a9c 04d50 0 +04a32 05488 04c8c 15794 1 +05001 00000 15001 05200 3 +00000 0489d 00000 14918 1 +14f99 14a78 14d9c 00000 3 +15446 04b0b 048c9 0504b 3 +05001 05200 05200 15001 1 +15000 00000 00000 15000 1 +05200 15000 05001 15001 0 +14ea8 15632 153d4 157b3 0 +149c1 053cb 14db6 05544 3 +05769 04ea2 04fd1 04f8f 0 +15043 14843 14bd9 04e3f 3 +15776 14b24 00000 04fc2 3 +14e4f 00000 1495b 054e3 3 +05431 15918 1588e 15788 0 +00000 00000 15000 00000 0 +14ffe 147c0 159bd 05afc 3 +1586d 00000 05459 14343 2 +04517 14432 04446 058e0 3 +00000 15971 05063 15803 2 +049d9 0480f 155d9 15643 0 +056c3 1558a 1481f 14a16 0 +04847 14807 0595a 15051 2 +051a2 05163 04816 00000 0 +0573c 059ae 04d6a 00000 1 +15433 05fc0 0595f 00000 1 +05200 05000 00000 15001 0 +156db 0591a 15775 0443a 1 +0428a 1425f 0561c 05dd0 3 +14eeb 15620 05445 14bdb 2 +00000 00000 05200 15000 2 +00000 05001 05200 05200 2 +04cb8 04902 05026 04c14 2 +04b9f 0534c 15781 00000 1 +04d96 14aef 15162 04e15 3 +155e7 1502b 14fce 056dc 3 +0540c 05775 152ba 04d42 1 +00000 04eb4 00000 04449 1 +05817 04b93 05585 00000 0 +14ea7 1499c 153b9 04bf9 3 +00000 14ee0 15632 14cff 0 +15998 053a0 045fa 14b59 1 +14901 1565a 151b3 05935 3 +00000 15000 15000 05200 3 +14dcf 00000 049b5 15596 2 +14b86 15e0d 04582 15d4b 2 +00000 15526 04846 14c73 2 +14ff8 05df8 05a25 05900 1 +0460c 05bba 14872 1487b 1 +057ef 15055 14fad 1599b 0 +05a23 056d3 15b47 04916 0 +04fb6 04daa 15161 00000 0 +148a6 15248 14c71 14d62 0 +15669 148ba 053fb 04b8c 2 +05751 04cba 059d8 05f45 3 +15000 05000 05000 05200 3 +15781 05269 0574c 04fe3 2 +00000 052bb 14998 14ed2 1 +05200 05000 05001 15000 0 +1515c 05701 14bf3 0531c 1 +00000 05444 051d7 15670 1 +04b66 04ebf 059c3 151cf 2 +14f70 04dc0 1504b 048a1 1 +056fa 158b8 04cac 14bdd 0 +15001 05200 05200 15001 1 +14c74 15080 00000 051ec 3 +15001 05001 15001 15001 1 +04cf7 05572 04ddf 00000 1 +056d6 00000 15634 14d50 0 +14efa 150e5 15994 14ff3 0 +057cb 056a5 153f5 158d7 0 +143f6 159eb 04ba0 042e5 2 +05001 15000 15000 05000 0 +05001 00000 00000 00000 0 +15fa2 05789 05bfb 045ed 2 +05457 04ee8 04e16 15988 0 +14887 05585 05065 14dc2 1 +056f8 15671 15fc8 148c0 0 +15001 15000 00000 00000 2 +00000 05000 05001 15000 2 +05654 14a41 04d46 157b8 0 +0577a 04953 00000 04960 0 +04483 04c6a 050e9 15685 2 +05000 00000 05000 05000 0 +0598d 151e9 00000 04eab 0 +15000 15000 05200 00000 2 +00000 05001 05200 05001 2 +054a5 00000 15515 049f3 0 +05299 15982 04cc7 04d7d 0 +156ff 1523d 00000 150f2 2 +15907 00000 15204 05397 3 +152bc 15aca 151d8 0487b 3 +057b8 155d4 14d35 05815 3 +00000 056d7 04d60 1599a 1 +14898 058d3 157f1 04c06 1 +15a93 047ba 15fc4 15196 1 +155c7 0538b 00000 15957 1 +15001 15001 05200 15000 2 +15e5c 1441d 15fde 042e6 3 +00000 00000 15001 05000 3 +05000 05001 05000 05200 3 +058e7 15d30 15348 145c5 0 +00000 04815 05109 00000 2 +055a0 056e9 00000 15eeb 1 +04b9a 147c6 14e0a 152dd 0 +15976 15619 154f8 00000 3 +14239 14396 0472d 05ad4 3 +0509c 14f3a 04e91 15780 0 +15382 04795 04e44 145c9 2 +05001 05001 15001 05000 0 +04f8b 15328 052b2 00000 2 +05001 15000 00000 05200 3 +00000 159f1 148c4 04d57 3 +00000 05744 143ed 04fec 1 +00000 04fde 050fc 048d5 2 +00000 00000 0521c 04e73 2 +15001 00000 05200 05001 2 +04614 155d0 15672 15093 0 +149ca 05581 046bb 14a64 1 +14930 04d6f 059ed 055b0 2 +152d9 00000 14a47 054dd 3 +043e8 14c3e 159fd 15a74 0 +053c8 14a67 0489c 14f56 0 +04216 15517 05d8e 15b88 2 +00000 14842 151f7 14743 0 +048b7 00000 04e8f 153e0 2 +14a25 154c3 04a21 050af 3 +0573b 1481a 00000 1594c 0 +04abe 153bc 00000 14878 0 +05000 00000 05000 05200 3 +0554b 15347 05ea4 04e32 2 +04713 05c0f 04d04 0538d 1 +05330 00000 151dd 053c6 3 +0581e 14ab2 14ac7 05638 0 +04571 15351 0540a 143b3 2 +04899 04e3c 05762 15acb 2 +14b79 04c9f 050b7 04c72 2 +058b8 04f2a 044f0 05bd2 3 +1562f 14c9c 04fe2 04ed5 2 +146b1 0558f 0549a 00000 1 +1493f 00000 149ed 14eed 1 +04ac1 04972 00000 14c72 0 +15000 05000 15001 00000 1 +04297 04c0b 051ce 146a6 2 +05465 14c16 150ef 04793 0 +05000 05200 00000 05000 1 +14931 043c5 15b8e 15406 1 +15c8b 046db 00000 05637 3 +0553c 00000 00000 04e48 0 +05523 156e9 00000 14b5b 0 +05326 04faa 054b4 04cc5 2 +04caa 15388 14d10 053f8 3 +04856 049e4 14bb8 14cee 1 +1484b 0525f 00000 05711 3 +00000 15265 1591f 042f4 3 +1503a 152d3 04fa1 14ce5 2 +04576 1523c 148bd 1573e 0 +00000 15001 15001 00000 0 +14bd3 156ef 15980 14c78 0 +05000 15000 05200 05000 2 +0555c 15adb 04b0c 049a8 0 +00000 05992 14b5c 04a53 1 +00000 14df7 14e17 00000 0 +15000 05200 00000 15001 1 +14efa 156c2 150b5 0524b 3 +15015 04f98 00000 04fe4 3 +05001 15000 15001 00000 0 +0436d 14260 15f9a 15d73 0 +05000 05000 15001 15001 0 +04e94 0530d 0540d 057ad 3 +00000 15bfa 05e06 0550f 2 +05200 05000 15001 05001 0 +05497 1552e 057da 15228 2 +00000 04e69 14b32 04901 1 +0517f 14f82 04f35 0579b 3 +14f67 053f2 14fb8 04c68 1 +051a8 15915 15202 153ab 0 +05001 05001 00000 00000 0 +152ba 0494b 00000 15001 1 +00000 14a01 14c72 05728 3 +00000 15001 05200 15000 2 +00000 15001 05200 05001 2 +145b2 04d7b 055bd 00000 2 +04af1 0595d 04468 04cf1 1 +15001 05200 00000 05001 1 +05985 054fd 00000 00000 0 +14a8b 14bad 052d7 14b53 2 +00000 0525c 051cf 00000 1 +15790 04ad1 155a7 04b3a 3 +14782 00000 05980 153fc 2 +05159 14ec2 04eef 051c1 3 +055d3 15043 00000 0569b 3 +151d9 04b11 056c6 150dc 2 +00000 04594 1463d 04463 1 +048a0 150ca 00000 053ed 3 +055c1 0528f 14b7d 00000 0 +15668 054ef 05951 04dd0 2 +0490d 04ea0 04a94 144c4 1 +159e0 1565f 15476 14983 3 +15000 15001 15001 05001 3 +05200 00000 05200 05000 0 +05cc1 00000 054f4 058dc 0 +15000 00000 05000 05001 3 +051b5 04dc7 050ca 1575e 0 +15000 05200 00000 00000 1 +054d3 14391 0478e 15d6e 0 +04cf9 04727 142fd 045a2 0 +04c8f 14fa1 154f6 04bfa 0 +1582f 1516a 14c53 14e69 2 +15536 0502d 14a3f 05690 3 +15358 1557d 04b5c 14db8 2 +00000 14c70 14eae 04802 3 +14d44 049bb 0499c 05413 3 +04be6 00000 14db1 00000 0 +05000 00000 00000 00000 0 +0442a 14515 14687 00000 0 +14d64 05445 04678 14d73 1 +148dc 14a74 00000 054af 3 +14e5c 15fec 05ea7 00000 2 +00000 00000 00000 048ca 3 +14b91 054ef 04bc3 049dc 1 +152cd 14c70 14fa3 1515f 1 +15378 04a13 0590f 0563f 2 +1549e 00000 154b3 1538b 1 +05688 151e9 05cc8 00000 2 +05f1d 144e7 05518 054c8 0 +15b69 14b57 04a63 00000 2 +150f3 14843 04e6e 00000 2 +1564b 054b3 159de 0536f 1 +05639 155dd 1525b 050c2 0 +00000 152d4 154ba 143df 0 +0511e 05415 0565d 05113 2 +00000 154ef 148e9 0539b 3 +15162 04fdc 15375 1549d 1 +05001 00000 15000 05000 0 +049e9 04b94 14c29 152a7 1 +05511 050c2 1506f 0529d 0 +00000 00000 157c2 14861 0 +05676 1515f 156d1 14e85 0 +049fe 0480a 05d83 05263 2 +14cda 057e3 05645 00000 1 +05001 05000 05200 15001 2 +147a1 00000 05c8c 15faa 2 +0568e 0577e 00000 14ba9 1 +00000 00000 00000 15856 0 +05945 1439b 05190 1468b 0 +051d6 149ff 1560f 156b8 0 +15422 05871 053ae 05718 1 +143b6 15453 054a3 1489c 2 +046ab 1528a 15e74 15749 0 +151d7 1511a 14df3 0584c 3 +150f0 149a4 1506d 04faa 3 +00000 00000 049c4 14888 2 +00000 00000 04c60 04e88 3 +04fb5 05036 055e7 14994 2 +00000 042dd 15861 158bf 1 +05000 00000 05000 15000 0 +14fc9 15407 05581 00000 2 +15934 00000 15e7b 045c0 3 +00000 00000 15001 00000 0 +0540a 04c7a 049c4 04920 0 +00000 15860 1516f 14582 0 +048f6 14fb9 049ed 00000 2 +00000 05001 00000 00000 1 +05001 00000 00000 15000 0 diff --git a/docs/NOW.md b/docs/NOW.md index a18389a1fb..188f61df33 100644 --- a/docs/NOW.md +++ b/docs/NOW.md @@ -1,3 +1,18 @@ +# NOW — feat(spec): GF-T argmax classification head (2026-08-06) + +Last updated: 2026-08-06 + +## feat(spec): GF-T argmax head — 4 logits → predicted class index (Refs #1764) + +- Branch: `feat/gft-argmax4` + +### Что легло +- `specs/ternary/gft_argmax4.t27` (`GftArgmax4`): a spec-first **classification head** over four signed GF-T16 logits → the **index {0,1,2,3} of the maximum real value** (lowest index wins ties, strict `>`). This is the final stage of a GF-T classifier: `gft_mlp3` emits logits, argmax picks the predicted class. No arithmetic — a **total order on the GF-T encoding**: the low 16 bits (offset<<9 | mant) are monotonic in real magnitude and raw 0 is the only zero, so order is negatives < zero < positives, positives by ascending bits, negatives by descending bits. `gt(a,b)` via a 3-way sign category (neg=0, zero=1, pos=2). +- Verification: **bit-exact to the ideal exact-float64 argmax over 400 vectors** (`tests/gft_argmax4_vectors.txt`), iverilog `$fscanf` in `bootstrap/tests/gft_argmax4.rs`. Vectors (incl. injected exact zeros) emitted only where the integer comparator AND the float argmax agree (0/400 disagreements). Four in-spec `test`s cover pick-positive, pick-last, zero-beats-negatives, tie-lowest-index. +- No compiler change (`on_comb`, 4 ports). Fresh seal `.trinity/seals/ternary_GftArgmax4.json` (`seal --verify` MATCH). Completes the end-to-end GF-T classifier: activations → MLP → logits → **argmax → class**. + +--- + # NOW — feat(spec): 3-layer GF-T MLP (4→3→2→1) (2026-08-06) Last updated: 2026-08-06 diff --git a/specs/ternary/gft_argmax4.t27 b/specs/ternary/gft_argmax4.t27 new file mode 100644 index 0000000000..ac78a68c25 --- /dev/null +++ b/specs/ternary/gft_argmax4.t27 @@ -0,0 +1,51 @@ +module GftArgmax4; +// #1764 + GF-T: a classification head over four signed GF-T16 logits. Returns the +// INDEX {0,1,2,3} of the maximum real value (lowest index wins ties, strict >). +// This is the final stage of a GF-T classifier: a GF-T MLP (gft_mlp3) emits a +// vector of logits, argmax picks the predicted class. Comparison is exact on the +// real values -- no arithmetic, just a total order on the GF-T encoding. +// +// A signed GF-T16 value in u32 is [sign(bit16)][offset(7)][mant(9)]; the low 16 +// bits (offset<<9 | mant) are MONOTONIC in the real magnitude, and raw 0 is the +// only zero. So the real order is: negatives < zero < positives; within positives +// larger magnitude bits = larger; within negatives larger magnitude bits = smaller. +// +// Inputs: x0..x3 signed GF-T16 (u32). Output: index u8 in {0,1,2,3}. + +// sign category: zero->1, positive->2, negative->0 (higher category = greater). +fn category(a: u32) -> u8 { + if (a == 0) { return 1; } + if ((a >> 16) == 0) { return 2; } + return 0; +} +// gt(a,b) = 1 iff real value(a) > value(b), else 0. +fn gt(a: u32, b: u32) -> u8 { + var ca : u8 = category(a); + var cb : u8 = category(b); + if (ca != cb) { if (ca > cb) { return 1; } return 0; } + var ma : u32 = a & 65535; + var mb : u32 = b & 65535; + if (ca == 2) { if (ma > mb) { return 1; } return 0; } // both positive + if (ca == 0) { if (ma < mb) { return 1; } return 0; } // both negative + return 0; // both zero -> equal +} + +// argmax over four logits, lowest index on ties. +fn on_comb(x0: u32, x1: u32, x2: u32, x3: u32) -> u8 { + var idx : u8 = 0; + var best : u32 = x0; + if (gt(x1, best) == 1) { idx = 1; best = x1; } + if (gt(x2, best) == 1) { idx = 2; best = x2; } + if (gt(x3, best) == 1) { idx = 3; best = x3; } + return idx; +} + +// +1.0, -1.0, +2.0, 0 -> max is +2.0 at index 2. +test pick_pos { assert_eq(on_comb(20480, 86016, 20992, 0), 2); } +// -1.0, -2.0, 0, +1.0 -> max is +1.0 at index 3. +test pick_last { assert_eq(on_comb(86016, 86528, 0, 20480), 3); } +// -1.0, 0, -4.0, -2.0 -> max is 0 at index 1 (zero beats all negatives). +test zero_wins { assert_eq(on_comb(86016, 0, 87040, 86528), 1); } +// all equal (+1.0) -> lowest index 0. +test tie_low { assert_eq(on_comb(20480, 20480, 20480, 20480), 0); } +endmodule