X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=moebius2.git;a=blobdiff_plain;f=interpolate.c;h=f162fc040981b12f97864ec8169792db3b64cf3f;hp=9225b8f3ef5e6e241d83b5463cdb366ec0373a25;hb=701de0c6ae90ac6cd5282ed882ad91b11b098b2c;hpb=802d7ffd6900d7c17335caa957f1a3752d3f5ccb diff --git a/interpolate.c b/interpolate.c index 9225b8f..f162fc0 100644 --- a/interpolate.c +++ b/interpolate.c @@ -56,18 +56,18 @@ static void read_input(void) { int x,y, ox,oy, v,ov; for (oy=0; oy%2d", oy,y); for (ox=0; ox=X) { y= (Y-1)-y; x-=X; } + x= (ox - (oy>>1))*inc + (y>>1) + X*2; + while (x>=X) { y= (Y-1)-y; x-=X; } errno= 0; ov= (oy << oXBITS) | ox; v= (y << YSHIFT) | x; printf(" 0%02o->0x%02x", ov, v); if (fread(all.a[v], sizeof(double), D3, stdin) != D3) diee("\nread input"); - computed_count[v]= -1; + computed_count[v]= D3*2; } putchar('\n'); } @@ -173,43 +173,62 @@ static void interpolate_gsl_line (int startvertex, int direction /* edge number */, int nmax, const gsl_interp_type *aperiodic, const gsl_interp_type *periodic) { double xa[nmax], ya[D3][nmax]; + int vnew[nmax], xnew[nmax]; const gsl_interp_type *it; gsl_interp *interp; gsl_interp_accel *accel; - int i, k, nold, nnew; + int i, k, nold, nnew, x, skipped, realstart; Traverse traverse; -#define STARTV (traverse.v=startvertex, traverse.e=direction) -#define NEXTV (traverse_next(&traverse), printf("-%02x",traverse.v)) - printf("interpolate_line 0x%02x,%d nmax=%d ", startvertex,direction,nmax); - for (i=0, STARTV; - ; - ) { - assert(traverse.v>=0); - assert(i < nmax); - xa[i]= i; - K ya[k][i]= all.a[traverse.v][k]; - putchar('*'); - if (i && traverse.v==startvertex) { putchar('@'); break; } - i++; - NEXTV; - if (traverse.v<0) break; - NEXTV; + traverse.v=startvertex, traverse.e=direction; + skipped= 0; + while (!computed_count[traverse.v]) { + printf("-%02x~",traverse.v); + traverse_next(&traverse); + skipped++; + assert(skipped < nmax); } - if (traverse.v>=0) { - it= periodic; - nold= i+1; - nnew= i; - } else { - it= aperiodic; - nold= i; - nnew= i-1; + realstart= traverse.v; + + nold=0, nnew=0; + for (x=0; + ; + x++, traverse_next(&traverse)) { + printf("-%02x",traverse.v); + if (traverse.v<0) { + putchar('$'); + it= aperiodic; + assert(!skipped); + break; + } + if (computed_count[traverse.v]) { + assert(nold < nmax); + xa[nold]= x; + K ya[k][nold]= all.a[traverse.v][k]; + nold++; + putchar('*'); + } else { + assert(nnew < nmax); + xnew[nnew]= x; + vnew[nnew]= traverse.v; + nnew++; + putchar('#'); + } + if (x && traverse.v==realstart) { + putchar('@'); + it= periodic; + break; + } } - printf(" n=%d->%d loop=0x%02x", nold,nnew,traverse.v); + printf(" n=%d->%d", nold,nnew); + if (!nnew) { printf(" nothing\n"); return; } + + assert(nold); + printf(" x=%g..%g->%d..%d", xa[0],xa[nold-1], xnew[0],xnew[nnew-1]); K { printf("\n k=%d ", k); @@ -218,14 +237,12 @@ static void interpolate_gsl_line accel= gsl_interp_accel_alloc(); if(!accel) diee("gsl_interp_accel_alloc"); GA( gsl_interp_init(interp,xa,ya[k],nold) ); - for (i=0, STARTV; - i=0); NEXTV; assert(traverse.v>=0); - putchar('#'); - GA( gsl_interp_eval_e(interp,xa,ya[k], i+0.5, accel, - &all.a[traverse.v][k]) ); - note_computed(traverse.v, k); + for (i=0; i>1)&1), 0, oX*2+1, - aperiodic, periodic); - } for (x=0; x>1)&1), 0, X*2+1, + aperiodic, periodic); } } @@ -260,7 +277,7 @@ static void write_output(const char *fn) { printf(" %02x",v); c= computed_count[v]; if (c==D3) putchar('#'); - else if (c==-1) putchar('*'); + else if (c==D3*2) putchar('*'); else { printf("!%d",c); bad++; } } putchar('\n'); @@ -285,6 +302,8 @@ int main(int argc, const char **argv) { } if (!freopen(argv[2],"rb",stdin)) diee("open input"); + + mgraph_prepare(); characterise_input(); read_input();