示例#1
0
文件: gug.c 项目: danfis/boruvka
static void elNew(el_t *ns, size_t len, bor_list_t *head)
{
    size_t i;
    bor_real_t x, y;

    borListInit(head);

    for (i = 0; i < len; i++){
        x = borRand(&r, -10., 10.);
        y = borRand(&r, -10., 10.);

        borVec2Set(&ns[i].v, x, y);
        borGUGElInit(&ns[i].c, (const bor_vec_t *)&ns[i].v);

        borListAppend(head, &ns[i].list);
    }
}
示例#2
0
static void checkCorrect3(int ID, size_t num)
{
    el_t *els, *el;
    int *ids;
    bor_pairheap_t *heap;
    bor_pairheap_node_t *n;
    size_t i;
    FILE *fout1, *fout2;
    char fn[300];
    bor_rand_t r;

    borRandInit(&r);

    sprintf(fn, "regressions/tmp.TSPairHeap.rand-%d.out", ID);
    fout1 = fopen(fn, "w");
    sprintf(fn, "regressions/TSPairHeap.rand-%d.out", ID);
    fout2 = fopen(fn, "w");

    els = randomEls(num);
    ids = BOR_ALLOC_ARR(int, num);

    heap = borPairHeapNew(ltEl, NULL);
    for (i = 0; i < num; i++){
        borPairHeapAdd(heap, &els[i].node);
    }

    for (i = 0; i < num; i += 10){
        els[i].val += borRand(&r, 1, 100);
        borPairHeapUpdate(heap, &els[i].node);
    }

    i = 0;
    while (!borPairHeapEmpty(heap)){
        n = borPairHeapExtractMin(heap);
        el = bor_container_of(n, el_t, node);
        fprintf(fout1, "%d\n", el->val);

        el = bor_container_of(n, el_t, node);
        ids[i] = el->id;
        i++;
    }

    qsort(els, num, sizeof(el_t), cmpIncEl);
    for (i = 0; i < num; i++){
        fprintf(fout2, "%d\n", els[i].val);
    }


    borPairHeapDel(heap);
    free(els);
    free(ids);

    fclose(fout1);
    fclose(fout2);
}
示例#3
0
文件: test-nn.c 项目: danfis/boruvka
static el_t *elsNew(size_t len)
{
    size_t i;
    bor_real_t x, y;
    el_t *ns;

    ns = BOR_ALLOC_ARR(el_t, arr_len);
    for (i = 0; i < len; i++){
        x = borRand(&r, -15., 15.);
        y = borRand(&r, -20., 20.);

        borVec2Set(&ns[i].v, x, y);
        borNNElInit(linear, &ns[i].linear, (const bor_vec_t *)&ns[i].v);
        borNNElInit(gug, &ns[i].gug, (const bor_vec_t *)&ns[i].v);
        borNNElInit(vp, &ns[i].vp, (const bor_vec_t *)&ns[i].v);

        borNNAdd(linear, &ns[i].linear);
        borNNAdd(gug, &ns[i].gug);
        borNNAdd(vp, &ns[i].vp);
    }

    return ns;
}
示例#4
0
文件: gug.c 项目: danfis/boruvka
static void el6New(el6_t *ns, size_t len, bor_list_t *head)
{
    size_t i, j;

    borListInit(head);

    for (i = 0; i < len; i++){
        for (j = 0; j < 6; j++){
            borVecSet(ns[i].v, j, borRand(&r, -10., 10.));
        }

        borGUGElInit(&ns[i].c, ns[i].v);

        borListAppend(head, &ns[i].list);
    }
}
示例#5
0
static el_t *randomEls(size_t num)
{
    bor_rand_t r;
    bor_real_t val;
    el_t *els;
    size_t i;

    borRandInit(&r);

    els = BOR_ALLOC_ARR(el_t, num);
    for (i = 0; i < num; i++){
        val = borRand(&r, -500., 500.);
        els[i].val = val;
        els[i].id = i;
    }

    return els;
}
示例#6
0
文件: test-nn.c 项目: danfis/boruvka
static void testCorrect(void)
{
    bor_nn_params_t params;
    bor_real_t range[4] = { -15., 15., -18., 17. };
    el_t *ns, *near[3];
    bor_nn_el_t *el_linear[50], *el_gug[50], *el_vp[50];
    int i, j, k;
    int len_linear, len_gug, len_vp;
    int incorrect;
    bor_vec2_t v;


    borNNParamsInit(&params);
    borNNParamsSetDim(&params, 2);
    params.gug.num_cells = 0;
    params.gug.max_dens = 1;
    params.gug.expand_rate = 2.;
    params.gug.aabb = range;

    params.type = BOR_NN_LINEAR;
    linear = borNNNew(&params);
    params.type = BOR_NN_GUG;
    gug    = borNNNew(&params);
    params.type = BOR_NN_VPTREE;
    vp     = borNNNew(&params);

    ns = elsNew(arr_len);

    for (k = 0; k < nearest_len; k++){
        incorrect = 0;

        for (i=0; i < loops; i++){
            fprintf(stderr, "[%d] %08d / %08d\r", (int)k, (int)i, (int)loops);
            borVec2Set(&v, borRand(&r, -10., 10.), borRand(&r, -10, 10));

            len_linear = borNNNearest(linear, (const bor_vec_t *)&v, k + 1, el_linear);
            len_gug    = borNNNearest(gug, (const bor_vec_t *)&v, k + 1, el_gug);
            len_vp     = borNNNearest(vp, (const bor_vec_t *)&v, k + 1, el_vp);

            if (len_linear != len_gug
                    || len_linear != len_vp
                    || len_vp != len_gug
                    || len_linear != k + 1){
                incorrect = 1;
            }

            for (j = 0; j < k + 1; j++){
                near[0] = bor_container_of(el_linear[j], el_t, linear);
                near[1] = bor_container_of(el_gug[j], el_t, gug);
                near[2] = bor_container_of(el_vp[j], el_t, vp);
                if (near[0] != near[1]
                        || near[0] != near[2]
                        || near[1] != near[2]){
                    incorrect = 1;
                }
            }
        }

        if (incorrect){
            fprintf(stderr, "[%d] %08d / %08d FAIL\n", (int)k, (int)i, (int)loops);
        }else{
            fprintf(stderr, "[%d] %08d / %08d OK\n", (int)k, (int)i, (int)loops);
        }
    }

    BOR_FREE(ns);
    borNNDel(linear);
    borNNDel(gug);
    borNNDel(vp);
}
示例#7
0
文件: test-nn.c 项目: danfis/boruvka
static void bench(void)
{
    bor_nn_params_t params;
    bor_real_t range[4] = { -15., 15., -18., 17. };
    el_t *ns, *near;
    bor_nn_el_t *el[50];
    int i, j, k;
    bor_vec2_t v;
    int devnull;
    bor_timer_t timer;

    devnull = open("/dev/null", O_WRONLY);
    if (devnull < 0){
        perror("Error: ");
        return;
    }


    borNNParamsInit(&params);
    borNNParamsSetDim(&params, 2);
    params.gug.num_cells = 0;
    params.gug.max_dens = 1;
    params.gug.expand_rate = 2.;
    params.gug.aabb = range;

    params.type = BOR_NN_LINEAR;
    linear = borNNNew(&params);
    params.type = BOR_NN_GUG;
    gug    = borNNNew(&params);
    params.type = BOR_NN_VPTREE;
    vp     = borNNNew(&params);

    ns = elsNew(arr_len);

    for (k = 0; k < nearest_len; k++){
        borTimerStart(&timer);
        for (i=0; i < loops; i++){
            //fprintf(stderr, "[%d] %08d / %08d\r", (int)k, (int)i, (int)loops);
            borVec2Set(&v, borRand(&r, -10., 10.), borRand(&r, -10, 10));

            borNNNearest(linear, (const bor_vec_t *)&v, k + 1, el);
            for (j = 0; j < k + 1; j++){
                near = bor_container_of(el[j], el_t, linear);
                write(devnull, &near->v, 1);
            }
        }
        borTimerStop(&timer);
        borTimerPrintElapsed(&timer, stderr, " - [%d] - linear -                \n", k);


        borTimerStart(&timer);
        for (i=0; i < loops; i++){
            //fprintf(stderr, "[%d] %08d / %08d\r", (int)k, (int)i, (int)loops);
            borVec2Set(&v, borRand(&r, -10., 10.), borRand(&r, -10, 10));

            borNNNearest(gug, (const bor_vec_t *)&v, k + 1, el);
            for (j = 0; j < k + 1; j++){
                near = bor_container_of(el[j], el_t, gug);
                write(devnull, &near->v, 1);
            }
        }
        borTimerStop(&timer);
        borTimerPrintElapsed(&timer, stderr, " - [%d] - gug -                \n", k);


        borTimerStart(&timer);
        for (i=0; i < loops; i++){
            //fprintf(stderr, "[%d] %08d / %08d\r", (int)k, (int)i, (int)loops);
            borVec2Set(&v, borRand(&r, -10., 10.), borRand(&r, -10, 10));

            borNNNearest(vp, (const bor_vec_t *)&v, k + 1, el);
            for (j = 0; j < k + 1; j++){
                near = bor_container_of(el[j], el_t, vp);
                write(devnull, &near->v, 1);
            }
        }
        borTimerStop(&timer);
        borTimerPrintElapsed(&timer, stderr, " - [%d] - vptree -                \n", k);
    }

    BOR_FREE(ns);
    borNNDel(linear);
    borNNDel(gug);
    borNNDel(vp);

    close(devnull);
}