nx_lbp_batch.nx source
↩ module page · 85 lines · 4562 B
1// nx_lbp_batch.nx -- SOVEREIGN face-descriptor RUNG 5: batch descriptor builder over the corpus. Walks the
2// gallery sidecar (galx_cid_paths.tsv: cid\tpath per line), FORKS ONE CHILD PER IMAGE (nx_png_decode mmaps
3// 64MiB/call with no munmap, so each decode must die to reclaim memory), each child: PNG -> luma gray ->
4// resize 128x128 -> 8x8 grid LBP descriptor, appends a fixed-size record {cid(72) + 16384 i64} to a store.
5// Times ITSELF natively (sys_clock_now_us) and reports us/img so we MEASURE sovereign decode+descriptor speed
6// against the insightface benchmark (244 ms/img CPU) instead of guessing. Targets N EXISTING images (skips
7// cleaned-up originals). arg1 = target count (default 60). Build/run: ./_offc/nx_sov_build_run.elf nx_lbp_batch
8// license_tier: ORIGINAL
9import "nx_syscalls.nx"
10import "nx_lbp_core.nx"
11import "nx_lbp_imgio.nx"
12const K_MAGIC_2048: i64 = 2048
13const K_MAGIC_131144: i64 = 131144
14const K_MAGIC_16384: i64 = 16384
15
16func bt_atoi(s: *u8) -> i64 { var v: i64=0; var i: i64=0; while s[i]!=(0 as u8) { if s[i]>=(48 as u8) { if s[i]<=(57 as u8) { v=v*10+((s[i] as i64)-48) } } i=i+1 } return v }
17func bt_exists(path: *u8) -> i64 { let fd: i64=sys_openat_rd(path); if fd<0 {return 0} sys_close(fd); return 1 }
18
19func main(argc: i64, argv: *i64) -> i64 {
20 var target: i64 = 60
21 if argc >= 2 { target = bt_atoi(argv[1] as *u8) }
22
23 // fresh store (truncate)
24 let fdt: i64 = sys_openat_wr("knowledge/status/galx_face_descr.bin" as *u8, 0x1a4)
25 if fdt < 0 { lp("BATCH FAIL: cannot create store\n" as *u8); sys_exit(1); return 1 }
26 sys_close(fdt)
27
28 let szp: *i64 = sys_mmap(16) as *i64
29 let lst: *u8 = sys_read_file("knowledge/status/galx_cid_paths.tsv" as *u8, szp)
30 let lsz: i64 = szp[0]
31 if (lst as i64) == 0 { lp("BATCH FAIL: no sidecar\n" as *u8); sys_exit(1); return 1 }
32
33 let st: *i64 = sys_mmap(16) as *i64
34 let cid: *u8 = sys_mmap(96)
35 let pathbuf: *u8 = sys_mmap(K_MAGIC_2048)
36 var ls: i64=0; var i: i64=0
37 var done: i64=0; var fail: i64=0; var skip: i64=0
38 let t0: i64 = sys_clock_now_us()
39
40 while i <= lsz {
41 var isnl: i64=0
42 if i==lsz { isnl=1 } else { if lst[i]==(10 as u8) { isnl=1 } }
43 if isnl==1 {
44 let llen: i64 = i - ls
45 if llen > 70 { if done < target {
46 var c: i64=0; while c<69 { cid[c]=lst[ls+c]; c=c+1 } cid[69]=0 as u8
47 if lst[ls+69]==(9 as u8) {
48 var po: i64=0; var p: i64=ls+70; while p<i { pathbuf[po]=lst[p]; po=po+1; p=p+1 } pathbuf[po]=0 as u8
49 if bt_exists(pathbuf)==0 { skip=skip+1 } else {
50 let pid: i64 = sys_fork()
51 if pid == 0 {
52 let rec: *u8 = sys_mmap(K_MAGIC_131144)
53 var cc: i64=0; while cc<69 { rec[cc]=cid[cc]; cc=cc+1 } rec[69]=0 as u8; rec[70]=0 as u8; rec[71]=0 as u8
54 let gray: *u8 = sys_mmap(128*128)
55 if load_gray_fixed(pathbuf, 128, 128, gray) != 0 { sys_exit(1) }
56 let descr: *i64 = ((rec as i64) + 72) as *i64
57 var z: i64=0; while z<K_MAGIC_16384 { descr[z]=0; z=z+1 }
58 lbp_grid_descr(gray, 128, 128, 8, descr)
59 let fd: i64 = sys_openat_append("knowledge/status/galx_face_descr.bin" as *u8, 0x1a4)
60 if fd<0 { sys_exit(2) }
61 sys_write(fd, rec, K_MAGIC_131144)
62 sys_close(fd)
63 sys_exit(0)
64 }
65 sys_wait4(pid, st, 0)
66 let ec: i64 = (st[0]>>8) & 0xff
67 if ec==0 { done=done+1 } else { fail=fail+1 }
68 if ((done+fail)%20)==0 { lp(" descr done=" as *u8); ln(done); lp(" fail=" as *u8); ln(fail); lp(" skip=" as *u8); ln(skip); lp("\n" as *u8) }
69 }
70 }
71 } }
72 ls = i + 1
73 }
74 i = i + 1
75 }
76
77 let t1: i64 = sys_clock_now_us()
78 let us: i64 = t1 - t0
79 lp("BATCH done=" as *u8); ln(done); lp(" fail=" as *u8); ln(fail); lp(" skip=" as *u8); ln(skip)
80 lp(" total_us=" as *u8); ln(us)
81 if done > 0 { lp(" us/img=" as *u8); ln(us/done); lp(" ms/img=" as *u8); ln(us/done/1000) }
82 lp(" store_bytes=" as *u8); ln(done*K_MAGIC_131144); lp("\n" as *u8)
83 lp("nx_lbp_batch RUNG5 done -> knowledge/status/galx_face_descr.bin\n" as *u8)
84 sys_exit(0); return 0
85}