code wiki / (root) / nx_lbp_batch.nx

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}