code wiki / _hdl_build / nx_partanalyze_gate.nx

nx_partanalyze_gate.nx source

↩ module page · 99 lines · 4993 B

1// nx_partanalyze_gate.nx -- benchmark the end-to-end underbuilt-part analysis (cadtwin R8-geometric). A 2-part 2// mesh (a THIN plate + a THICK block) -> segment -> per-part thickness -> the plate flagged UNDERBUILT, the 3// block OK. DATA-DRIVEN threshold flips the verdict (neg-control). Deterministic. This is "identify underbuilt 4// parts" working end-to-end (segment + measure + flag). expect_exit: 0 license_tier: ORIGINAL 5import "nx_partanalyze.nx" 6 7func pg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 8func pg_putn(v: i64) -> i64 { 9 let bb: *u8 = sys_mmap(28) 10 var m: i64 = v 11 if m < 0 { pg_puts("-" as *u8); m = 0 - m } 12 let t: *u8 = sys_mmap(28) 13 var k: i64 = 0 14 if m == 0 { t[0] = 48 as u8; k = 1 } 15 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var i: i64 = 0 17 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 18 sys_write(1, bb, k) 19 return 0 20} 21func pg_tooth(name: *u8, pass: i64, fails: *i64) -> i64 { 22 pg_puts(" " as *u8); pg_puts(name); pg_puts(" -> " as *u8) 23 if pass == 1 { pg_puts("PASS\n" as *u8); return 0 } 24 pg_puts("FAIL\n" as *u8) 25 fails[0] = fails[0] + 1 26 return 0 27} 28 29func main() -> i64 { 30 pg_puts("=== nx_partanalyze_gate -- END-TO-END underbuilt-part detection (segment + thickness + flag) ===\n" as *u8) 31 let fails: *i64 = sys_mmap(8) as *i64 32 fails[0] = 0 33 34 // 2-part mesh: THIN plate (part 0, thickness 600) + THICK block (part 1, thickness 4000), spatially separate 35 let mesh: i64 = sys_mmap(m3_bytes()) as i64 36 m3_init(mesh) 37 m3_box(mesh, 0, 0, 0, 4000, 4000, 300) // plate: thin in z (2*300=600) 38 m3_box(mesh, 14000, 0, 0, 2000, 2000, 2000) // block: thick (2*2000=4000), far away 39 let labels: *i64 = sys_mmap(4096) as *i64 40 let seg_thick: *i64 = sys_mmap(512) as *i64 41 let seg_flag: *i64 = sys_mmap(512) as *i64 42 let outk: *i64 = sys_mmap(8) as *i64 43 44 // analyze with threshold 1000 (between plate 600 and block 4000). connectivity seg (thresh -300). 45 let nu: i64 = pa_analyze(mesh, 0 - 300, 1000, labels, seg_thick, seg_flag, outk) 46 let k: i64 = outk[0] 47 pg_puts(" parts=" as *u8); pg_putn(k) 48 pg_puts(" part0(plate) minwall=" as *u8); pg_putn(seg_thick[0]); pg_puts(" flag=" as *u8); pg_putn(seg_flag[0]) 49 pg_puts(" part1(block) minwall=" as *u8); pg_putn(seg_thick[1]); pg_puts(" flag=" as *u8); pg_putn(seg_flag[1]) 50 pg_puts(" underbuilt=" as *u8); pg_putn(nu); pg_puts("\n" as *u8) 51 52 var t1: i64 = 0 53 if k == 2 { t1 = 1 } 54 let ig1: i64 = pg_tooth("T1 segments into 2 parts" as *u8, t1, fails) 55 56 var t2: i64 = 0 57 var dp: i64 = seg_thick[0] - 600 58 if dp < 0 { dp = 0 - dp } 59 if dp < 8 { if seg_flag[0] == 1 { t2 = 1 } } 60 let ig2: i64 = pg_tooth("T2 thin plate: minwall ~600 + flagged UNDERBUILT" as *u8, t2, fails) 61 62 var t3: i64 = 0 63 var db: i64 = seg_thick[1] - 4000 64 if db < 0 { db = 0 - db } 65 if db < 16 { if seg_flag[1] == 0 { t3 = 1 } } 66 let ig3: i64 = pg_tooth("T3 thick block: minwall ~4000 + verdict OK" as *u8, t3, fails) 67 68 var t4: i64 = 0 69 if nu == 1 { t4 = 1 } 70 let ig4: i64 = pg_tooth("T4 exactly 1 underbuilt part (the plate)" as *u8, t4, fails) 71 72 // NEG-CONTROL: lower threshold to 400 (below plate 600) -> nothing underbuilt (data-driven verdict) 73 let nu2: i64 = pa_analyze(mesh, 0 - 300, 400, labels, seg_thick, seg_flag, outk) 74 pg_puts(" @thresh=400: underbuilt=" as *u8); pg_putn(nu2); pg_puts(" (expect 0)\n" as *u8) 75 var t5: i64 = 0 76 if nu2 == 0 { t5 = 1 } 77 let ig5: i64 = pg_tooth("T5 data-driven: threshold below plate -> 0 underbuilt" as *u8, t5, fails) 78 79 // determinism 80 let labels2: *i64 = sys_mmap(4096) as *i64 81 let st2: *i64 = sys_mmap(512) as *i64 82 let sf2: *i64 = sys_mmap(512) as *i64 83 let ok2: *i64 = sys_mmap(8) as *i64 84 let nu3: i64 = pa_analyze(mesh, 0 - 300, 1000, labels2, st2, sf2, ok2) 85 var t6: i64 = 0 86 if nu3 == 1 { if st2[0] == seg_thick[0] { t6 = 1 } } 87 // seg_thick was overwritten by the 400-run; recompute a clean compare 88 let nu4: i64 = pa_analyze(mesh, 0 - 300, 1000, labels, seg_thick, seg_flag, outk) 89 if nu4 == nu3 { if st2[0] == seg_thick[0] { if st2[1] == seg_thick[1] { t6 = 1 } } } 90 let ig6: i64 = pg_tooth("T6 deterministic" as *u8, t6, fails) 91 92 pg_puts("\nTHIS IS THE FLIP-ANALYSIS GEOMETRIC HALF: scan a car -> nx_meshseg3d parts -> nx_meshthick per-part wall\n" as *u8) 93 pg_puts("-> flag underbuilt (data-driven threshold). DATA HALF = nx_underbuilt_board (NHTSA complaints/recalls per\n" as *u8) 94 pg_puts("component). Together: 'which parts are thin AND known to fail on this model' = the flipper's report.\n" as *u8) 95 pg_puts("\nfails=" as *u8); pg_putn(fails[0]); pg_puts("\n" as *u8) 96 if fails[0] == 0 { pg_puts("verdict=GREEN -- end-to-end underbuilt-part detection 6/6 (segment+thickness+flag composed)\n" as *u8); return 0 } 97 pg_puts("RED\n" as *u8) 98 return 1 99}