code wiki / (root) / nx_uv_gram_actual_gate_t280.nx

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}