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}