code wiki / _hdl_build / _eval_triangle_authored.nx
_eval_triangle_authored.nx source
↩ module page · 134 lines · 6040 B
1// AUTHORED BY THE NISHI BUILDER (nx_module_author_data eval-triangle template) -- ELDERMIG EVAL rung 1.
2// Triangulation: M(math) + V(local model) + O(operator flag) -> pattern verdicts; append-only Nishi log.
3// argv: [1]=lanes file (default knowledge/status/eval_lanes.log) [2]=good-threshold permil (default 700)
4// [3]=triangle log (default knowledge/status/eval_triangle.log)
5import "nx_syscalls.nx"
6func _ev_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
7func _ev_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
8func _ev_atoi(s: *u8) -> i64 { var v: i64=0; var i: i64=0; while s[i]!=(0 as u8) { let c: i64=s[i]; if c<48 { return v } if c>57 { return v } v=v*10+(c-48); i=i+1 } return v }
9func _ev_eol(buf: *u8, p: i64, L: i64) -> i64 { var e: i64=p; while e<L { if buf[e]==(10 as u8) { return e } e=e+1 } return L }
10// find pat inside [p,e); return index after pat or 0-1
11func _ev_find(buf: *u8, p: i64, e: i64, pat: *u8) -> i64 {
12 var pl: i64=0
13 while pat[pl]!=(0 as u8) { pl=pl+1 }
14 var i: i64=p
15 while i+pl<=e {
16 var j: i64=0
17 var hit: i64=1
18 while j<pl { if buf[i+j]!=pat[j] { hit=0; j=pl } j=j+1 }
19 if hit==1 { return i+pl }
20 i=i+1
21 }
22 return 0-1
23}
24// id equality: ids[off..] (0-term) vs buf[p..p+n)
25func _ev_ideq(ids: *u8, off: i64, buf: *u8, p: i64, n: i64) -> i64 {
26 var i: i64=0
27 while i<n { if ids[off+i]!=buf[p+i] { return 0 } if ids[off+i]==(0 as u8) { return 0 } i=i+1 }
28 if ids[off+n]==(0 as u8) { return 1 }
29 return 0
30}
31func main(argc: i64, argv: *i64) -> i64 {
32 var lanes: *u8 = "knowledge/status/eval_lanes.log" as *u8
33 var thr: i64 = 700
34 var logp: *u8 = "knowledge/status/eval_triangle.log" as *u8
35 if argc>=2 { lanes = argv[1] as *u8 }
36 if argc>=3 { thr = _ev_atoi(argv[2] as *u8) }
37 if argc>=4 { logp = argv[3] as *u8 }
38 let lenp: *i64 = sys_mmap(8) as *i64
39 let buf: *u8 = sys_read_file(lanes, lenp)
40 let L: i64 = lenp[0]
41 if L < 5 { _ev_w(1, "TRI-GATE FAIL lanes-unreadable\n" as *u8); sys_exit(1); return 1 }
42 let ids: *u8 = sys_mmap(262144)
43 let ioff: *i64 = sys_mmap(65536) as *i64
44 let ms: *i64 = sys_mmap(65536) as *i64
45 let vs: *i64 = sys_mmap(65536) as *i64
46 let os: *i64 = sys_mmap(65536) as *i64
47 var cnt: i64=0
48 var ipos: i64=0
49 var p: i64=0
50 while p < L {
51 let e: i64 = _ev_eol(buf, p, L)
52 let ip: i64 = _ev_find(buf, p, e, "img=" as *u8)
53 let lp2: i64 = _ev_find(buf, p, e, "lane=" as *u8)
54 let sp: i64 = _ev_find(buf, p, e, "score=" as *u8)
55 if ip>=0 { if lp2>=0 { if sp>=0 {
56 var ie: i64 = ip
57 var going: i64 = 1
58 while going==1 { if ie>=e { going=0 } if going==1 { let c: i64=buf[ie]; if c==32 { going=0 } if c!=32 { ie=ie+1 } } }
59 let iln: i64 = ie - ip
60 var k: i64 = 0-1
61 var s2: i64 = 0
62 while s2<cnt { if _ev_ideq(ids, ioff[s2], buf, ip, iln)==1 { k=s2; s2=cnt } s2=s2+1 }
63 if k<0 {
64 k=cnt
65 ioff[k]=ipos
66 var ci: i64=0
67 while ci<iln { ids[ipos+ci]=buf[ip+ci]; ci=ci+1 }
68 ids[ipos+iln]=0
69 ipos=ipos+iln+1
70 ms[k]=0-1; vs[k]=0-1; os[k]=0-1
71 cnt=cnt+1
72 }
73 let sc: i64 = _ev_atoi((buf as i64 + sp) as *u8)
74 let lc: i64 = buf[lp2]
75 if lc==77 { ms[k]=sc }
76 if lc==86 { vs[k]=sc }
77 if lc==79 { os[k]=sc }
78 } } }
79 p = e + 1
80 }
81 let logfd: i64 = sys_openat_append(logp, 0x1a4)
82 var ngood: i64=0; var nbad: i64=0; var nover: i64=0; var nsm: i64=0; var nsme: i64=0; var ninc: i64=0
83 var t: i64=0
84 while t<cnt {
85 var verd: *u8 = "TRI-INCOMPLETE" as *u8
86 let m: i64=ms[t]; let v: i64=vs[t]; let o: i64=os[t]
87 var have: i64=1
88 if m<0 { have=0 } if v<0 { have=0 } if o<0 { have=0 }
89 if have==0 { ninc=ninc+1 }
90 if have==1 {
91 var mg: i64=0; if m>=thr { mg=1 }
92 var vg: i64=0; if v>=thr { vg=1 }
93 var og: i64=0; if o>=thr { og=1 }
94 let g: i64 = mg+vg+og
95 if g==3 { verd="TRI-GOOD" as *u8; ngood=ngood+1 }
96 if g==0 { verd="TRI-BAD" as *u8; nbad=nbad+1 }
97 if g>0 { if g<3 {
98 if mg==vg { verd="TRI-OPERATOR-OVERRIDE" as *u8; nover=nover+1 }
99 if mg!=vg { if og==mg { verd="TRI-SPLIT-MODEL" as *u8; nsm=nsm+1 } if og==vg { verd="TRI-SPLIT-MEASURED" as *u8; nsme=nsme+1 } }
100 } }
101 }
102 var fdi: i64=1
103 while fdi>=0 {
104 var ofd: i64=1
105 if fdi==0 { ofd=logfd }
106 _ev_w(ofd, "TRIANGLE img=" as *u8)
107 _ev_w(ofd, (ids as i64 + ioff[t]) as *u8)
108 _ev_w(ofd, " m=" as *u8); _ev_wn(ofd, m)
109 _ev_w(ofd, " v=" as *u8); _ev_wn(ofd, v)
110 _ev_w(ofd, " o=" as *u8); _ev_wn(ofd, o)
111 _ev_w(ofd, " verdict=" as *u8); _ev_w(ofd, verd); _ev_w(ofd, "\n" as *u8)
112 fdi=fdi-1
113 }
114 t=t+1
115 }
116 var fdj: i64=1
117 while fdj>=0 {
118 var ofd2: i64=1
119 if fdj==0 { ofd2=logfd }
120 _ev_w(ofd2, "TRI-SUMMARY total=" as *u8); _ev_wn(ofd2, cnt)
121 _ev_w(ofd2, " good=" as *u8); _ev_wn(ofd2, ngood)
122 _ev_w(ofd2, " bad=" as *u8); _ev_wn(ofd2, nbad)
123 _ev_w(ofd2, " override=" as *u8); _ev_wn(ofd2, nover)
124 _ev_w(ofd2, " split-model=" as *u8); _ev_wn(ofd2, nsm)
125 _ev_w(ofd2, " split-measured=" as *u8); _ev_wn(ofd2, nsme)
126 _ev_w(ofd2, " incomplete=" as *u8); _ev_wn(ofd2, ninc)
127 _ev_w(ofd2, " thr=" as *u8); _ev_wn(ofd2, thr)
128 _ev_w(ofd2, "\n" as *u8)
129 fdj=fdj-1
130 }
131 sys_close(logfd)
132 sys_exit(0)
133 return 0
134}