Changeset 2278 for research


Ignore:
Timestamp:
Apr 16, 2008, 12:09:44 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Reactivate full ED analysis (raster FS, raster JaJuNi?, serpentine Ostromoukhov and serpentine optimum) as mode 5.
  • Add a script to perform mode 5 on a directory's contents.
Location:
research/2008-displacement
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • research/2008-displacement/main.c

    r2277 r2278  
    512512
    513513static void study(float const *src, float const *dest,
    514                   float sigma, float precision)
     514                  float sigma, float precision, float fdx, float fdy)
    515515{
    516516#   define Z 3
    517     float mat[NN][NN];
     517    float mat[NN][NN], mat2[NN][NN];
    518518    float *tmp, *tmp2;
    519     float e, e0, best = 1., fx = -1., fy = -1., step = 2., bfx = 0., bfy = 0.;
     519    float e, e0, e1;
     520    float best = 1., fx = -1., fy = -1., step = 2., bfx = 0., bfy = 0.;
    520521    int dx, dy;
    521522
    522523    makegauss(mat, sigma, 0., 0.);
    523524    tmp = gauss(src, mat);
     525
    524526    tmp2 = gauss(dest, mat);
    525 
    526527    e0 = dist(tmp, tmp2, 1.);
     528    free(tmp2);
     529
     530    makegauss(mat2, sigma, fdx, fdy);
     531    tmp2 = gauss(dest, mat2);
     532    e1 = dist(tmp, tmp2, 1.);
    527533    free(tmp2);
    528534
     
    551557    free(tmp);
    552558
    553     printf("E = %g E_min = %g dx = %g dy = %g\n",
    554            1000 * e0, 1000 * best, fx, fy);
     559    printf("E = %g E_fast = %g E_min = %g dx = %g dy = %g\n",
     560           1000. * e0, 1000. * e1, 1000. * best, fx, fy);
    555561    fflush(stdout);
    556562}
     
    576582    fprintf(stderr, " -3 <src>           quick (a,b,c,d) ED kernel analysis on src\n");
    577583    fprintf(stderr, " -4 <src>           exhaustive (a,b,c,d) ED kernel analysis on src\n");
     584    fprintf(stderr, " -5 <src>           exhaustive displacement study on src\n");
    578585}
    579586
     
    601608        return 2;
    602609
     610    printf("### mode %i on `%s' ###\n", mode, argv[2]);
     611
    603612    switch(mode)
    604613    {
    605614        case 1:
    606615        {
    607             float *dest = ed(src, false, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
    608             study(src, dest, 1.2, 0.001);
     616            float *dest = ed(src, false, 7, 0,
     617                                0, 3, 5, 1, 0,
     618                                0, 0, 0, 0, 0);
     619            study(src, dest, 1.2, 0.001, .16, .28);
    609620            free(dest);
    610621            free(src);
     
    625636            {
    626637                tmp = merge(src, src2, (float)i / 100.);
    627                 dest = ed(tmp, false, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
    628                 study(tmp, dest, 1.2, 0.001);
     638                dest = ed(tmp, false, 7, 0,
     639                             0, 3, 5, 1, 0,
     640                             0, 0, 0, 0, 0);
     641                study(tmp, dest, 1.2, 0.001, .16, .28);
    629642                free(dest);
    630643                free(tmp);
     
    638651        case 4:
    639652        {
    640             float mat0[NN][NN];
     653            float mat[NN][NN];
    641654            float *dest, *tmp, *tmp2;
    642655            int a, b, c, d, e;
    643656
    644             makegauss(mat0, 1.2, 0, 0);
    645             for(a = 0; a <= 16; a++)
    646             for(b = 0; b <= 16; b++)
    647             for(c = 0; c <= 16; c++)
    648             for(d = 0; d <= 16; d++)
    649             for(e = 0; e <= 16; e++)
    650             {
    651                 if(a + b + c + d + e != 16)
     657#define TOTAL 16
     658            makegauss(mat, 1.2, 0, 0);
     659            for(a = 0; a <= TOTAL; a++)
     660            for(b = 0; b <= TOTAL; b++)
     661            for(c = 0; c <= TOTAL; c++)
     662            for(d = 0; d <= TOTAL; d++)
     663            for(e = 0; e <= TOTAL; e++)
     664            {
     665                if(a + b + c + d + e != TOTAL)
    652666                    continue;
    653667
     
    657671#define SHUFFLE(p,q,n) \
    658672    if(p+q) { int tmp = p+q; p = (p+n) % (tmp+1); q = tmp-p; }
    659                 SHUFFLE(c2, d2, 7); SHUFFLE(b2, d2, 5);
    660                 SHUFFLE(a2, d2, 3); SHUFFLE(b2, c2, 2);
    661                 SHUFFLE(a2, e2, 3); SHUFFLE(b2, e2, 2);
    662                 SHUFFLE(a2, c2, 4); SHUFFLE(a2, b2, 6);
    663                 SHUFFLE(c2, e2, 9); SHUFFLE(d2, e2, 7);
    664                 SHUFFLE(a2, d2, 9); SHUFFLE(a2, b2, 7);
     673                SHUFFLE(c2, d2, 777); SHUFFLE(b2, d2, 555);
     674                SHUFFLE(a2, d2, 333); SHUFFLE(b2, c2, 222);
     675                SHUFFLE(a2, e2, 333); SHUFFLE(b2, e2, 222);
     676                SHUFFLE(a2, c2, 444); SHUFFLE(a2, b2, 666);
     677                SHUFFLE(c2, e2, 999); SHUFFLE(d2, e2, 777);
     678                SHUFFLE(a2, d2, 999); SHUFFLE(a2, b2, 777);
    665679
    666680#if 0
     
    674688                printf("K = %d,%d,%d,%d ", a2, c2, d2, e2);
    675689
    676                 dest = ed(src, false, a2, 0, b2, c2, d2, e2, 0, 0, 0, 0, 0, 0);
    677                 if(mode == 3)
    678                 {
    679                     tmp = gauss(src, mat0);
    680                     tmp2 = gauss(dest, mat0);
     690                dest = ed(src, false, a2, 0,
     691                          b2, c2, d2, e2, 0,
     692                           0,  0,  0,  0, 0);
     693                if(mode == 4)
     694                {
     695                    study(src, dest, 1.2, 0.001, 0., 0.);
     696                }
     697                else
     698                {
     699                    tmp = gauss(src, mat);
     700                    tmp2 = gauss(dest, mat);
    681701                    printf("E = %.5g\n", 1000. * dist(tmp, tmp2, 1.));
    682702                    free(tmp);
    683703                    free(tmp2);
    684704                }
    685                 else
    686                     study(src, dest, 1.2, 0.001);
    687705                fflush(stdout);
    688706                free(dest);
     
    690708
    691709            free(src);
     710        }
     711        break;
     712
     713        case 5:
     714        {
     715            float *dest;
     716
     717            dest = ed(src, false, 7, 0,
     718                         0, 3, 5, 1, 0,
     719                         0, 0, 0, 0, 0);
     720            study(src, dest, 1.2, 0.001, .16, .28);
     721            free(dest);
     722
     723            dest = ed(src, false, 7, 5,
     724                         3, 5, 7, 5, 3,
     725                         1, 3, 5, 3, 1);
     726            study(src, dest, 1.2, 0.001, .26, .76);
     727            free(dest);
     728
     729            dest = ostromoukhov(src);
     730            study(src, dest, 1.2, 0.001, .0, .19);
     731            free(dest);
     732
     733            dest = ed(src, true, 2911, 0,
     734                  0, 1373, 3457, 2258, 0,
     735                  0,    0,    0,    0, 0);
     736            study(src, dest, 1.2, 0.001, .0, .34);
    692737        }
    693738        break;
     
    768813
    769814#if 0
    770     printf("%s: ", argv[1]);
    771     makegauss(mat0, 1.2, 0, 0);
    772     tmp = gauss(src, mat0);
    773 
    774     dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
    775     tmp2 = gauss(dest, mat0);
    776     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    777     free(tmp2);
    778     makegauss(mat, 1.2, 0.16, 0.28);
    779     tmp2 = gauss(dest, mat);
    780     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    781     free(tmp2);
    782     free(dest);
    783 
    784     dest = ed(src, false, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1);
    785     tmp2 = gauss(dest, mat0);
    786     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    787     free(tmp2);
    788     makegauss(mat, 1.2, 0.26, 0.76);
    789     tmp2 = gauss(dest, mat);
    790     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    791     free(tmp2);
    792     free(dest);
    793 
    794     dest = ostromoukhov(src);
    795     tmp2 = gauss(dest, mat0);
    796     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    797     free(tmp2);
    798     makegauss(mat, 1.2, 0.0, 0.19);
    799     tmp2 = gauss(dest, mat);
    800     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    801     free(tmp2);
    802     free(dest);
    803 
    804     dest = ed(src, true, 2911, 0, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0);
    805     tmp2 = gauss(dest, mat0);
    806     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    807     free(tmp2);
    808     makegauss(mat, 1.2, 0.0, 0.34);
    809     tmp2 = gauss(dest, mat);
    810     printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    811     free(tmp2);
    812     free(dest);
    813 
    814     printf("\n");
    815 #endif
    816 
    817 #if 0
    818815    printf("%s\n", argv[1]);
    819816
Note: See TracChangeset for help on using the changeset viewer.