code wiki / (root) / nx_uv_cached_solver_gate_t280.nx

nx_uv_cached_solver_gate_t280.nx source

↩ module page · 67 lines · 4524 B

1// nx_uv_cached_solver_gate_t280.nx -- Validates UV chart topology and cached solver consistency across multiple models. 2import "nx_uv_cached_solver_candidate_t280.nx" 3import "nx_gate_verdict.nx" 4import "nx_uv_chart_topology_candidate_t280.nx" 5func ucp_fixture(kind:i64)->*i64{ 6 var nv:i64=4;var nt:i64=2;if kind==1{nv=5;nt=4} 7 let m:*i64=ncp_model_new(nv,nt);if m==(0 as *i64){return m} 8 uv_set_vert(m,0,0,0,0);uv_set_vert(m,1,1000,0,0);uv_set_vert(m,2,1000,1000,0);uv_set_vert(m,3,0,1000,0) 9 if kind==0{uv_set_tri(m,0,0,1,2);uv_set_tri(m,1,0,2,3);uv_seam_set(m,0,2)} 10 if kind==1{uv_set_vert(m,4,500,500,1000);uv_set_tri(m,0,0,1,4);uv_set_tri(m,1,1,2,4);uv_set_tri(m,2,2,3,4);uv_set_tri(m,3,3,0,4)} 11 if uv_chart_build(m)!=UV_OK{ncp_model_free(m);return 0 as *i64};return m 12} 13func ucp_budget(s:*u8)->i64{ 14 var i:i64=0;var v:i64=0 15 while s[i]!=(0 as u8){let c:i64=(s[i] as i64)-48;if c<0{return 0-1};if c>9{return 0-1};if v>(NCP_MAX-c)/10{return 0-1};v=v*10+c;i=i+1} 16 if v<1{return 0-1};return v 17} 18func main(argc:i64,argv:*i64)->i64{ 19 let ctr:*i64=gv_ctr();var kind:i64=0 20 while kind<2{ 21 let a:*i64=ucp_fixture(kind);let b:*i64=ucp_fixture(kind);if a==(0 as *i64){return 3};if b==(0 as *i64){return 3} 22 let top:*i64=uct_measure(a);if top==(0 as *i64){return 3} 23 var c:i64=0 24 while c<uv_chart_count(a){ 25 gv_check_eq("fixture Euler characteristic",top[c*UCT_ROW+6],1,ctr) 26 gv_check_eq("fixture boundary component count",top[c*UCT_ROW+4],1,ctr) 27 gv_check_eq("fixture boundary vertex degree",top[c*UCT_ROW+5],0,ctr) 28 let baseline:i64=uvi_solve_chart(a,c) 29 let s:*UvCachedSolve=uvc_begin(b,c);if s==(0 as *UvCachedSolve){return 4} 30 var rc:i64=s.result 31 if rc==UV_E_NOTRUN{rc=uvc_step(s,1);while rc==UVC_YIELDED{rc=uvc_step(s,1)}} 32 gv_check_eq("cached result equals canonical",rc,baseline,ctr) 33 var mismatch:i64=0;var v:i64=0 34 while v<a[UV_H_NUV]{if a[a[UV_O_WU]+v]!=b[b[UV_O_WU]+v]{mismatch=mismatch+1};if a[a[UV_O_WV]+v]!=b[b[UV_O_WV]+v]{mismatch=mismatch+1};v=v+1} 35 gv_check_eq("all working UV integer coordinates equal",mismatch,0,ctr) 36 gv_check_eq("iteration count equals canonical",b[UV_H_ITERS],a[UV_H_ITERS],ctr) 37 gv_check_eq("last maximum step equals canonical",b[UV_H_MAXMOVE],a[UV_H_MAXMOVE],ctr) 38 gv_check_eq("singular updates equal canonical",b[UV_H_SING],a[UV_H_SING],ctr) 39 gv_check_eq("immutable cotangents computed once",s.cotangentCalls,s.triangles*3,ctr) 40 gv_check_eq("zero work budget refused",uvc_step(s,0),UV_E_ARGS,ctr) 41 uvc_free(s);c=c+1 42 } 43 sys_munmap_direct(top as *u8,uv_chart_count(a)*UCT_ROW*UV_I64);ncp_model_free(a);ncp_model_free(b);kind=kind+1 44 } 45 if argc==3{ 46 let budget:i64=ucp_budget(argv[2] as *u8);if budget<1{return 5} 47 let lens:*i64=sys_mmap_try(16) as *i64 48 let src:*u8=sys_read_file(argv[1] as *u8,lens);if src==(0 as *u8){return 6} 49 let m:*i64=ncp_model_nxa(src,lens[0]);if m==(0 as *i64){return 7} 50 if uv_chart_build(m)!=UV_OK{return 8} 51 let top:*i64=uct_measure(m);if top==(0 as *i64){return 8} 52 var c:i64=0 53 while c<uv_chart_count(m){ 54 gv_puts("UVTOPO chart=");gv_num(c);gv_puts(" V=");gv_num(top[c*UCT_ROW]);gv_puts(" E=");gv_num(top[c*UCT_ROW+1]);gv_puts(" F=");gv_num(top[c*UCT_ROW+2]);gv_puts(" boundaryEdges=");gv_num(top[c*UCT_ROW+3]);gv_puts(" boundaryComponents=");gv_num(top[c*UCT_ROW+4]);gv_puts(" irregularBoundaryVertices=");gv_num(top[c*UCT_ROW+5]);gv_puts(" chi=");gv_num(top[c*UCT_ROW+6]);gv_puts(" inferredGenus=");gv_num(top[c*UCT_ROW+7]);gv_puts("\n") 55 gv_puts("UVPROFILE begin chart=");gv_num(c);gv_puts("\n") 56 let s:*UvCachedSolve=uvc_begin(m,c);if s==(0 as *UvCachedSolve){return 9} 57 var rc:i64=s.result;if rc==UV_E_NOTRUN{rc=uvc_step(s,budget)} 58 gv_puts("UVPROFILE chart=");gv_num(c);gv_puts(" triangles=");gv_num(s.triangles);gv_puts(" uvClasses=");gv_num(s.n) 59 gv_puts(" budget=");gv_num(budget);gv_puts(" legacyCap=");gv_num(s.cap);gv_puts(" iterations=");gv_num(s.used);gv_puts(" maxStep=");gv_num(s.maxmove) 60 gv_puts(" pinsUs=");gv_num(s.pinsUs);gv_puts(" initialUs=");gv_num(s.initialUs);gv_puts(" weightsUs=");gv_num(s.weightsUs);gv_puts(" solveUs=");gv_num(s.solveUs) 61 gv_puts(" triangleVisits=");gv_num(s.triangleVisits);gv_puts(" cotangents=");gv_num(s.cotangentCalls);gv_puts(" result=");gv_num(rc);gv_puts("\n") 62 uvc_free(s);c=c+1 63 } 64 sys_munmap_direct(top as *u8,uv_chart_count(m)*UCT_ROW*UV_I64);ncp_model_free(m);sys_munmap_direct(lens as *u8,16) 65 } 66 return gv_verdict("UV-CACHED-T280",ctr,"Exact solver arithmetic on representative charts; profile yield is not UV convergence") 67}