nx_uv_stretch_actual_t281.nx source
↩ module page · 38 lines · 4502 B
1import "nx_nxa_corner_checkpoint_candidate_t280.nx"
2import "nx_uv_stretch_candidate_t281.nx"
3import "nx_gate_verdict.nx"
4const UP_HEADER:i64=32
5const UP_ROW:i64=10
6const UP_TRIROW:i64=9
7func up_num(s:*u8)->i64{var n:i64=0;var i:i64=0;if s[0]==(0 as u8){return 0-1};while s[i]!=(0 as u8){let d:i64=(s[i] as i64)-48;if d<0{return 0-1};if d>9{return 0-1};if n>(NCP_MAX-d)/10{return 0-1};n=n*10+d;i=i+1};return n}
8func up_time(clock:*i64)->i64{sys_clock_gettime_mono(clock);return clock[0]*1000000+clock[1]/1000}
9func main(argc:i64,argv:*i64)->i64{
10 if argc!=9{return 2};let chart:i64=up_num(argv[4] as *u8);let budget:i64=up_num(argv[5] as *u8);let denominator:i64=up_num(argv[6] as *u8);if chart<0{return 2};if budget<1{return 2};if denominator<2{return 2}
11 let lens:*i64=sys_mmap_try(16) as *i64;let clock:*i64=sys_mmap_try(16) as *i64;if (lens as i64)<=0{return 3};if (clock as i64)<=0{return 3}
12 let src:*u8=sys_read_file(argv[1] as *u8,lens);if src==(0 as *u8){return 3};let bytes:i64=lens[0]
13 let checkpoint:*u8=sys_read_file(argv[2] as *u8,lens);if checkpoint==(0 as *u8){return 3}
14 let m:*i64=ncp_restore_topology(src,bytes,checkpoint,lens[0]);if m==(0 as *i64){return 4};if chart>=uv_chart_count(m){ncp_model_free(m);return 2}
15 let start:i64=up_time(clock);let s:*UvGramSolve=uls_begin(m,chart,1.0/__f64_from_i64(denominator));if s==(0 as *UvGramSolve){return 5};let setup:i64=up_time(clock)-start
16 var rc:i64=s.result;let begin:i64=up_time(clock);if rc==UV_E_NOTRUN{rc=uls_step(s,budget)};let elapsed:i64=up_time(clock)-begin
17 gv_puts("PRECISION chart=");gv_num(chart);gv_puts(" faces=");gv_num(s.nt);gv_puts(" iterations=");gv_num(s.iterations);gv_puts(" solveUs=");gv_num(elapsed);gv_puts(" result=");gv_num(rc);gv_puts("\n")
18 if rc!=UV_OK{uls_free(s);ncp_model_free(m);return 6}
19 let refine:*UvStretch=ust_begin(s);if refine==(0 as *UvStretch){return 12}
20 let sweeps:i64=up_num(argv[7] as *u8);let backtracks:i64=up_num(argv[8] as *u8);let rs:i64=up_time(clock)
21 let refined:i64=ust_step(refine,sweeps,backtracks,0 as *i64)
22 gv_puts("STRETCH result=");gv_num(refined);gv_puts(" sweeps=");gv_num(refine.sweeps);gv_puts(" accepted=");gv_num(refine.accepted);gv_puts(" rejected=");gv_num(refine.rejected);gv_puts(" evaluations=");gv_num(refine.evaluations);gv_puts(" us=");gv_num(up_time(clock)-rs)
23 var eb:f64=refine.initial;var ea:f64=refine.energy;let ebi:*i64=(&eb) as *i64;let eai:*i64=(&ea) as *i64;gv_puts(" initialF64Bits=");gv_num(ebi[0]);gv_puts(" finalF64Bits=");gv_num(eai[0]);gv_puts("\n")
24 if refined!=UV_OK{return 13};ust_restore_scale(refine);ust_free(refine)
25 let words:i64=UP_HEADER+s.n*UP_ROW+s.nt*UP_TRIROW;let p:*i64=sys_mmap_try(words*8) as *i64;if (p as i64)<=0{return 3}
26 p[0]=0x3151434e;p[1]=1;p[2]=UP_HEADER;p[3]=UP_ROW;p[4]=UP_TRIROW;p[5]=s.n;p[6]=s.nt;p[7]=chart;p[8]=bytes;p[9]=words;p[10]=rc;p[11]=s.iterations;p[12]=s.matvecs;p[13]=setup;p[14]=elapsed;p[15]=UV_PIN_SPAN;p[16]=UV_Q16;p[18]=m[UV_H_NV];p[19]=m[UV_H_NT];p[20]=s.storageBytes;p[21]=uv_words_used(m)*8;p[22]=uv_seam_count(m);p[23]=uv_chart_count(m);p[24]=denominator;p[25]=budget;p[26]=words*8
27 if sha256_digest_checked_native(src,bytes,((p as i64)+28*8) as *u8)!=0{return 7}
28 let raw:*i64=s.x as *i64;var i:i64=0;while i<s.n{
29 let o:i64=UP_HEADER+i*UP_ROW;let sv:i64=m[m[UV_O_UVSRC]+s.classes[i]];p[o]=sv;p[o+1]=uv_vx(m,sv);p[o+2]=uv_vy(m,sv);p[o+3]=uv_vz(m,sv);p[o+4]=raw[i];p[o+5]=raw[s.n+i];i=i+1
30 }
31 if uls_export(s)!=UV_OK{return 8};i=0;while i<s.n{let o:i64=UP_HEADER+i*UP_ROW;let cls:i64=s.classes[i];p[o+6]=m[m[UV_O_WU]+cls];p[o+7]=m[m[UV_O_WV]+cls];i=i+1}
32 if uvi_atlas(m)!=UV_OK{return 9};p[17]=uv_grid(m)
33 i=0;while i<s.n{let o:i64=UP_HEADER+i*UP_ROW;let cls:i64=s.classes[i];p[o+8]=m[m[UV_O_WU]+cls];p[o+9]=m[m[UV_O_WV]+cls];i=i+1}
34 let first:i64=m[m[UV_O_CSTART]+chart];var t:i64=0;while t<s.nt{let sourceTri:i64=m[m[UV_O_CORDER]+first+t];var k:i64=0;while k<3{let o:i64=UP_HEADER+s.n*UP_ROW+t*UP_TRIROW+k*3;p[o]=sourceTri;p[o+1]=k;p[o+2]=s.corners[t*3+k];k=k+1};t=t+1}
35 let fd:i64=sys_openat_exclusive(argv[3] as *u8,MODE_0600);if fd<0{return 10};var written:i64=0;while written<words*8{let n:i64=sys_write(fd,((p as i64)+written) as *u8,words*8-written);if n<=0{return 11};written=written+n};sys_close(fd)
36 gv_puts("PRECISION source indexed raw/work/atlas packet bytes=");gv_num(words*8);gv_puts(" grid=");gv_num(uv_grid(m));gv_puts("\n")
37 sys_munmap_direct(p as *u8,words*8);uls_free(s);ncp_model_free(m);sys_munmap_direct(lens as *u8,16);sys_munmap_direct(clock as *u8,16);return 0
38}