Changeset 2276 for research


Ignore:
Timestamp:
Apr 16, 2008, 12:09:33 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Various small optimisations that make us gain ~3% in speed. Not really worth it, but since it's also better style, I'm keeping them.
Location:
research/2008-displacement
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • research/2008-displacement/Makefile

    r2273 r2276  
    55
    66main: main.c
    7         $(CC) -Wall -O3 -funroll-loops -W -Wall $^ -o $@ $$(pkg-config --cflags --libs sdl) -lSDL_image -lm
     7        $(CC) -Wall -O3 -funroll-loops -ffast-math -W -Wall $^ -o $@ $$(pkg-config --cflags --libs sdl) -lSDL_image -lm
    88
    99paper.pdf: paper.tex fs-histo.tex
  • research/2008-displacement/main.c

    r2275 r2276  
    1616#define false 0
    1717
    18 int WIDTH, HEIGHT;
    19 
    20 static inline float get(float *src, int x, int y)
     18static int WIDTH, HEIGHT;
     19
     20static inline float get(float const *src, int x, int y)
    2121{
    2222    return src[y * WIDTH + x];
     
    3333}
    3434
    35 static float *copy(float *src)
     35static float *copy(float const *src)
    3636{
    3737    float *dest = malloc(WIDTH * HEIGHT * sizeof(float));
     
    6464}
    6565
    66 static float *gauss(float *src, float mat[NN][NN])
     66static float *gauss(float const *src, float mat[NN][NN])
    6767{
    6868    float *dest = new();
     
    8484}
    8585
    86 static float *fullgauss(float *src, float mat[NN][NN])
     86static float *fullgauss(float const *src, float mat[NN][NN])
    8787{
    8888    float *dest = new();
     
    106106}
    107107
    108 static float fulldist(float *p1, float *p2)
     108static float fulldist(float const *p1, const float *p2)
    109109{
    110110    float error = 0.;
     
    121121}
    122122
    123 static float dist(float *p1, float *p2)
     123static float dist(float const *p1, float const *p2, float max)
    124124{
    125125    float error = 0.;
    126126    int x, y;
    127127
     128    max *= (WIDTH - N) * (HEIGHT - N);
     129
    128130    for(y = N; y < HEIGHT - N; y++)
     131    {
    129132        for(x = N; x < WIDTH - N; x++)
    130133        {
     
    133136        }
    134137
     138        /* Experience shows that this is almost useless, because the
     139         * functions we manipulate are so small that the difference
     140         * only happens in the last 1% of the image... */
     141        if(error > max)
     142            break;
     143    }
     144
    135145    return error / ((WIDTH - N) * (HEIGHT - N));
    136146}
    137147
    138 static float *load(char *name)
     148static float *load(char const *name)
    139149{
    140150    SDL_Surface *tmp, *surface;
     
    169179}
    170180
    171 static void save(float *src, char *name)
     181static void save(float const *src, char const *name)
    172182{
    173183    SDL_Surface *surface;
     
    190200}
    191201
    192 static float *ostromoukhov(float *src)
     202static float *ostromoukhov(float const *src)
    193203{
    194204    static int const table[][3] =
     
    276286     h i j k l
    277287*/
    278 static float *ed(float *src, int serpentine,
     288static float *ed(float const *src, int serpentine,
    279289                 int a, int b, int c, int d, int e, int f,
    280290                 int g, int h, int i, int j, int k, int l)
     
    357367
    358368/* XXX */
    359 static float *dbs(float *src, float *orig, float sigma, float dx, float dy)
     369static float *dbs(float const *src, float const *orig,
     370                  float sigma, float dx, float dy)
    360371{
    361372    float mat[NN][NN];
     
    370381    tmp2 = fullgauss(dest, mat);
    371382
    372     error = dist(tmp, tmp2);
     383    error = dist(tmp, tmp2, 1.);
    373384
    374385    for(;;)
     
    498509}
    499510
    500 static void study(float *src, float *dest, float sigma, float precision)
     511static void study(float const *src, float const *dest,
     512                  float sigma, float precision)
    501513{
    502514#   define Z 3
    503515    float mat[NN][NN];
    504516    float *tmp, *tmp2;
    505     float e0, best = 0., fx = -1., fy = -1., step = 2.;
     517    float e, e0, best = 1., fx = -1., fy = -1., step = 2., bfx = 0., bfy = 0.;
    506518    int dx, dy;
    507519
     
    510522    tmp2 = gauss(dest, mat);
    511523
    512     e0 = dist(tmp, tmp2);
     524    e0 = dist(tmp, tmp2, 1.);
    513525    free(tmp2);
    514526
    515527    while(step > precision)
    516528    {
    517         float bfx = 0., bfy = 0., e;
    518 
    519         best = 9999.;
    520 
    521529        for(dy = 0; dy <= Z; dy++)
    522530            for(dx = 0; dx <= Z; dx++)
     
    524532                makegauss(mat, sigma, fx + step * dx / Z, fy + step * dy / Z);
    525533                tmp2 = gauss(dest, mat);
    526                 e = dist(tmp, tmp2);
     534                e = dist(tmp, tmp2, best);
    527535                free(tmp2);
    528536                if(e < best)
     
    546554}
    547555
    548 static float *merge(float *im1, float *im2, float t)
     556static float *merge(float const *im1, float const *im2, float t)
    549557{
    550558    float *dest = new();
     
    570578int main(int argc, char *argv[])
    571579{
    572     float mat0[NN][NN];
    573     float mat[NN][NN];
    574580    float *src;
    575     float sigma;
    576     int mode, dx, dy, i;
     581    int mode, i;
    577582
    578583    if(argc < 2)
     
    631636        case 4:
    632637        {
     638            float mat0[NN][NN];
    633639            float *dest, *tmp, *tmp2;
    634640            int a, b, c, d, e;
     
    671677                    tmp = gauss(src, mat0);
    672678                    tmp2 = gauss(dest, mat0);
    673                     printf("E = %.5g\n", 1000. * dist(tmp, tmp2));
     679                    printf("E = %.5g\n", 1000. * dist(tmp, tmp2, 1.));
    674680                    free(tmp);
    675681                    free(tmp2);
    676682                }
    677683                else
    678                     study(src, dest, 1.2, 0.01);
     684                    study(src, dest, 1.2, 0.001);
    679685                fflush(stdout);
    680686                free(dest);
     
    729735            makegauss(mat, 1.2, fx, fy);
    730736            tmp2 = gauss(dest, mat);
    731             printf("%g %g %g\n", fy, fx, 1000. * dist(tmp, tmp2));
     737            printf("%g %g %g\n", fy, fx, 1000. * dist(tmp, tmp2, 1.));
    732738            fflush(stdout);
    733739            free(tmp2);
     
    751757        tmp2 = gauss(dest, 0., 0.);
    752758        printf("%.5g: (%02d %02d %02d %02d)\n",
    753                1000. * dist(tmp, tmp2), a, b, c, d);
     759               1000. * dist(tmp, tmp2, 1.), a, b, c, d);
    754760        free(dest);
    755761        free(tmp2);
     
    766772    dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
    767773    tmp2 = gauss(dest, mat0);
    768     printf("%.5g ", 1000. * dist(tmp, tmp2));
     774    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    769775    free(tmp2);
    770776    makegauss(mat, 1.2, 0.16, 0.28);
    771777    tmp2 = gauss(dest, mat);
    772     printf("%.5g ", 1000. * dist(tmp, tmp2));
     778    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    773779    free(tmp2);
    774780    free(dest);
     
    776782    dest = ed(src, false, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1);
    777783    tmp2 = gauss(dest, mat0);
    778     printf("%.5g ", 1000. * dist(tmp, tmp2));
     784    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    779785    free(tmp2);
    780786    makegauss(mat, 1.2, 0.26, 0.76);
    781787    tmp2 = gauss(dest, mat);
    782     printf("%.5g ", 1000. * dist(tmp, tmp2));
     788    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    783789    free(tmp2);
    784790    free(dest);
     
    786792    dest = ostromoukhov(src);
    787793    tmp2 = gauss(dest, mat0);
    788     printf("%.5g ", 1000. * dist(tmp, tmp2));
     794    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    789795    free(tmp2);
    790796    makegauss(mat, 1.2, 0.0, 0.19);
    791797    tmp2 = gauss(dest, mat);
    792     printf("%.5g ", 1000. * dist(tmp, tmp2));
     798    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    793799    free(tmp2);
    794800    free(dest);
     
    796802    dest = ed(src, true, 2911, 0, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0);
    797803    tmp2 = gauss(dest, mat0);
    798     printf("%.5g ", 1000. * dist(tmp, tmp2));
     804    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    799805    free(tmp2);
    800806    makegauss(mat, 1.2, 0.0, 0.34);
    801807    tmp2 = gauss(dest, mat);
    802     printf("%.5g ", 1000. * dist(tmp, tmp2));
     808    printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
    803809    free(tmp2);
    804810    free(dest);
Note: See TracChangeset for help on using the changeset viewer.