nx_uv_gram_actual_gate_t280.nx source
↩ module page · 39 lines · 4495 B
1import "nx_uv_gram_solver_candidate_t280.nx"
2import "nx_gate_verdict.nx"
3func ucp_budget(s:*u8)->i64{
4 var i:i64=0;var v:i64=0
5 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}
6 if v<1{return 0-1};return v
7}
8
9func ug_time(clock:*i64)->i64{sys_clock_gettime_mono(clock);return clock[0]*1000000+clock[1]/1000}
10func ug_float_areas(s:*UvGramSolve)->i64{
11 var t:i64=0;var zero:i64=0;var pos:i64=0;var neg:i64=0;var tiny:f64=0.0;var largest:f64=0.0
12 while t<s.nt{let a:i64=s.corners[t*3];let b:i64=s.corners[t*3+1];let c:i64=s.corners[t*3+2];let area:f64=(s.x[b]-s.x[a])*(s.x[s.n+c]-s.x[s.n+a])-(s.x[s.n+b]-s.x[s.n+a])*(s.x[c]-s.x[a]);if area==0.0{zero=zero+1};if area>0.0{pos=pos+1};if area<0.0{neg=neg+1};var mag:f64=area;if mag<0.0{mag=0.0-mag};if mag>largest{largest=mag};if mag>0.0{if tiny==0.0{tiny=mag};if mag<tiny{tiny=mag}};t=t+1}
13 gv_puts("GRAM rawAreas chart=");gv_num(s.c);gv_puts(" exactZero=");gv_num(zero);gv_puts(" positive=");gv_num(pos);gv_puts(" negative=");gv_num(neg);gv_puts(" minPositiveRawF64Bits=");let bits:*i64=(&tiny) as *i64;gv_num(bits[0]);gv_puts(" maxRawF64Bits=");let largebits:*i64=(&largest) as *i64;gv_num(largebits[0]);gv_puts("\n");return zero
14}
15func ug_work_areas(m:*i64,c:i64)->i64{
16 var p:i64=m[m[UV_O_CSTART]+c];let end:i64=m[m[UV_O_CSTART]+c+1];var zero:i64=0;var neg:i64=0;var pos:i64=0
17 while p<end{let t:i64=m[m[UV_O_CORDER]+p];let a:i64=uv_corner_class(m,t,0);let b:i64=uv_corner_class(m,t,1);let cc:i64=uv_corner_class(m,t,2);let u:i64=m[UV_O_WU];let v:i64=m[UV_O_WV];let area:i64=(m[u+b]-m[u+a])*(m[v+cc]-m[v+a])-(m[v+b]-m[v+a])*(m[u+cc]-m[u+a]);if area==0{zero=zero+1};if area>0{pos=pos+1};if area<0{neg=neg+1};p=p+1}
18 gv_puts("GRAM workAreas chart=");gv_num(c);gv_puts(" zero=");gv_num(zero);gv_puts(" positive=");gv_num(pos);gv_puts(" negative=");gv_num(neg);gv_puts("\n");return zero
19}
20func main(argc:i64,argv:*i64)->i64{
21 if argc!=5{return 2};let budget:i64=ucp_budget(argv[4] as *u8);if budget<1{return 3}
22 let lens:*i64=sys_mmap_try(16) as *i64;let clock:*i64=sys_mmap_try(16) as *i64
23 let src:*u8=sys_read_file(argv[1] as *u8,lens);if src==(0 as *u8){return 4};let bytes:i64=lens[0]
24 let m:*i64=ncp_model_nxa(src,bytes);if m==(0 as *i64){return 5}
25 let seams:*u8=sys_read_file(argv[2] as *u8,lens);if seams==(0 as *u8){return 6};if lens[0]%8!=0{return 6}
26 if ncp_seams(m,seams as *i64,lens[0]/8)!=UV_OK{return 7};if uv_chart_build(m)!=UV_OK{return 8}
27 var c:i64=0;var all:i64=UV_OK
28 while c<uv_chart_count(m){
29 let start:i64=ug_time(clock);let s:*UvGramSolve=uls_begin(m,c,0.00000001);if s==(0 as *UvGramSolve){return 9};let setup:i64=ug_time(clock)-start
30 var rc:i64=s.result;let solving:i64=ug_time(clock);if rc==UV_E_NOTRUN{rc=uls_step(s,budget)};let elapsed:i64=ug_time(clock)-solving
31 gv_puts("GRAM actual chart=");gv_num(c);gv_puts(" triangles=");gv_num(s.nt);gv_puts(" iterations=");gv_num(s.iterations);gv_puts(" matvecs=");gv_num(s.matvecs);gv_puts(" setupUs=");gv_num(setup);gv_puts(" solveUs=");gv_num(elapsed);gv_puts(" residualSquaredRatioTimes1e12=");if s.rhsNorm2>0.0{gv_num(__f64_to_i64(s.trueNorm2/s.rhsNorm2*1000000000000.0))}else{gv_num(0-1)};gv_puts(" result=");gv_num(rc);gv_puts("\n")
32 if rc==UV_OK{ug_float_areas(s);rc=uls_export(s);ug_work_areas(m,c)};if rc!=UV_OK{all=rc};uls_free(s);c=c+1
33 }
34 if all==UV_OK{all=uvi_atlas(m);if all==UV_OK{m[UV_H_STAGE]=UV_ST_SOLVED;m[UV_H_ERR]=UV_OK;all=uv_distortion(m)};if all==UV_OK{all=uv_overlap_check(m)}}
35 gv_puts("GRAM final stage=");gv_num(uv_stage(m));gv_puts(" result=");gv_num(all);gv_puts(" flipped=");gv_num(uv_flipped(m));gv_puts(" uvDegenerate=");gv_num(uv_uvdegen(m));gv_puts(" angleMean=");gv_num(uv_angle_mean(m));gv_puts(" angleMax=");gv_num(uv_angle_max(m));gv_puts("\n")
36 let packet:*u8=ncp_emit(m,src,bytes,all,lens);if packet==(0 as *u8){return 10};if uv_stage(m)>=UV_ST_SOLVED{let rows:*i64=packet as *i64;var t:i64=0;while t<m[UV_H_NT]{var k:i64=0;while k<3{let o:i64=NCP_HEADER+(t*3+k)*NCP_ROW;rows[o+5]=uv_corner_u(m,t,k);rows[o+6]=uv_corner_v(m,t,k);k=k+1};t=t+1}};let fd:i64=sys_openat_exclusive(argv[3] as *u8,MODE_0600);if fd<0{return 11}
37 var written:i64=0;while written<lens[0]{let k:i64=sys_write(fd,((packet as i64)+written) as *u8,lens[0]-written);if k<=0{return 12};written=written+k};sys_close(fd);sys_munmap_direct(packet,lens[0]);ncp_model_free(m);sys_munmap_direct(lens as *u8,16);sys_munmap_direct(clock as *u8,16)
38 if all!=UV_OK{return 13};return 0
39}