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); } }
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); }
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; }
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); } }
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; }
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(¶ms); borNNParamsSetDim(¶ms, 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(¶ms); params.type = BOR_NN_GUG; gug = borNNNew(¶ms); params.type = BOR_NN_VPTREE; vp = borNNNew(¶ms); 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); }
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(¶ms); borNNParamsSetDim(¶ms, 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(¶ms); params.type = BOR_NN_GUG; gug = borNNNew(¶ms); params.type = BOR_NN_VPTREE; vp = borNNNew(¶ms); 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); }