nx_uv_chart_reuse_gate_t280.nx source
↩ module page · 26 lines · 2631 B
1import "nx_uv_adaptive_prepare_candidate_t280.nx"
2import "nx_gate_verdict.nx"
3func ur_fixture()->*i64{
4 let m:*i64=ncp_model_new(6,2);uv_set_vert(m,0,0,0,0);uv_set_vert(m,1,1000,0,0);uv_set_vert(m,2,0,1000,0);uv_set_vert(m,3,2000,0,0);uv_set_vert(m,4,3000,0,0);uv_set_vert(m,5,2000,1000,0);uv_set_tri(m,0,0,1,2);uv_set_tri(m,1,3,4,5);uv_chart_build(m);return m
5}
6func main()->i64{
7 let ctr:*i64=gv_ctr();let old:*i64=ur_fixture();var next:*i64=ur_fixture()
8 var k:i64=0;while k<old[UV_H_NUV]{old[old[UV_O_WU]+k]=k*19;old[old[UV_O_WV]+k]=k*23;k=k+1};old[UV_H_STAGE]=UV_ST_SOLVED
9 let held:*i64=sys_mmap_try(old[UV_H_NUV]*2*8) as *i64;k=0;while k<old[UV_H_NUV]{held[k]=old[old[UV_O_WU]+k];held[old[UV_H_NUV]+k]=old[old[UV_O_WV]+k];k=k+1}
10 ua_measure_preserving_work(old);var badWork:i64=0;k=0;while k<old[UV_H_NUV]{if held[k]!=old[old[UV_O_WU]+k]{badWork=badWork+1};if held[old[UV_H_NUV]+k]!=old[old[UV_O_WV]+k]{badWork=badWork+1};k=k+1}
11 gv_check_eq("packing preserves original solver domain",badWork,0,ctr)
12 let cuv:*i64=sys_mmap_try(old[UV_H_NCORN]*2*8) as *i64;k=0;while k<old[UV_H_NCORN]*2{cuv[k]=old[old[UV_O_CUV]+k];k=k+1}
13 ua_measure_preserving_work(old);var packDrift:i64=0;k=0;while k<old[UV_H_NCORN]*2{if cuv[k]!=old[old[UV_O_CUV]+k]{packDrift=packDrift+1};k=k+1}
14 gv_check_eq("repeated packing exact corner identity",packDrift,0,ctr)
15 sys_munmap_direct(cuv as *u8,old[UV_H_NCORN]*2*8);sys_munmap_direct(held as *u8,old[UV_H_NUV]*2*8)
16 var ready:*i64=ua_reuse(old,next,0)
17 gv_check("reuse allocation succeeds",ready!=(0 as *i64),ctr);if ready==(0 as *i64){return 2}
18 gv_check_eq("changed chart never reused",ready[0],0,ctr);gv_check_eq("unchanged chart reused",ready[1],1,ctr)
19 var drift:i64=0;k=0;while k<3{let a:i64=uv_corner_class(old,1,k);let b:i64=uv_corner_class(next,1,k);if old[old[UV_O_WU]+a]!=next[next[UV_O_WU]+b]{drift=drift+1};if old[old[UV_O_WV]+a]!=next[next[UV_O_WV]+b]{drift=drift+1};k=k+1}
20 gv_check_eq("reused corner coordinates exact",drift,0,ctr);sys_munmap_direct(ready as *u8,uv_chart_count(next)*8);ncp_model_free(next)
21 next=ur_fixture();next[next[UV_O_VERT]+3*3]=2001;ready=ua_reuse(old,next,0)
22 gv_check_eq("changed geometry refuses reuse",ready[1],0,ctr);sys_munmap_direct(ready as *u8,uv_chart_count(next)*8);ncp_model_free(next)
23 next=ur_fixture();old[UV_H_STAGE]=UV_ST_CHARTS;ready=ua_reuse(old,next,0);gv_check_eq("uncomputed source refuses reuse",ready[1],0,ctr)
24 sys_munmap_direct(ready as *u8,uv_chart_count(next)*8);ncp_model_free(next);ncp_model_free(old)
25 return gv_verdict("UV-REUSE-T280",ctr,"Execution-local unchanged-chart reuse; policy and full UV acceptance remain separate")
26}