28static int rcallsmax = 0;
31 struct kdnode *,
int,
int);
32static int kdtree_replace(
struct kdtree *,
struct kdnode *);
33static int kdtree_balance(
struct kdtree *,
struct kdnode *,
int);
34static int kdtree_first(
struct kdtrav *,
double *,
int *);
35static int kdtree_next(
struct kdtrav *,
double *,
int *);
39 if (a->
c[p] <
b->c[p])
41 if (a->
c[p] >
b->c[p])
51 for (i = 0; i <
t->ndims; i++) {
52 if (a->
c[i] !=
b->c[i]) {
75static void kdtree_free_node(
struct kdnode *n)
81static void kdtree_update_node(
struct kdtree *
t,
struct kdnode *n)
103 if (
ld >
rd + btol ||
rd >
ld + btol)
126 for (i = 0; i <
ndims - 1; i++)
127 t->nextdim[i] = i + 1;
128 t->nextdim[
ndims - 1] = 0;
148 if (
it->child[0] ==
NULL) {
151 kdtree_free_node(
it);
157 it->child[0] =
save->child[1];
182 nnew = kdtree_newnode(
t);
186 t->root = kdtree_insert2(
t,
t->root,
nnew, 1,
dc);
223 dir = cmp(&sn, n, n->
dim) > 0;
226 s[top].n = n->
child[dir];
236 if (s[top].n->
depth == 0) {
237 kdtree_free_node(s[top].n);
243 n->child[dir] =
NULL;
246 kdtree_update_node(
t, n);
255 kdtree_replace(
t, s[top].n);
262 kdtree_update_node(
t, n);
284 while (kdtree_balance(
t, n,
bmode))
292 s[top].n = n->
child[dir];
294 else if (n->
child[1] && n->
child[1]->balance) {
297 s[top].n = n->
child[dir];
304 kdtree_update_node(
t, n);
306 while (kdtree_balance(
t, n,
bmode))
311 kdtree_update_node(
t, s[top].n);
313 if (!
bmode2 && top == 0) {
349 G_debug(1,
"k-d tree optimization for %zd items, tree depth %d",
t->count,
362 while (kdtree_balance(
t, n->
child[0], level))
365 while (kdtree_balance(
t, n->
child[1], level))
375 s[top].n = n->
child[dir];
383 while (kdtree_balance(
t, n, level)) {
386 while (kdtree_balance(
t, n->
child[0], level))
388 while (kdtree_balance(
t, n->
child[1], level))
395 while (kdtree_balance(
t, n, level)) {
404 while (kdtree_balance(
t, n, level)) {
407 while (kdtree_balance(
t, n->
child[0], level))
409 while (kdtree_balance(
t, n->
child[1], level))
416 while (kdtree_balance(
t, n, level)) {
426 s[top].n = n->
child[dir];
446 while (kdtree_balance(
t, n, level)) {
449 while (kdtree_balance(
t, n->child[0], level))
451 while (kdtree_balance(
t, n->child[1], level))
454 ld = (!n->child[0] ? -1 : n->child[0]->depth);
455 rd = (!n->child[1] ? -1 : n->child[1]->depth);
458 while (kdtree_balance(
t, n, level)) {
485 s[top].n = n->child[dir];
493 ld = (!n->child[0] ? -1 : n->child[0]->depth);
494 rd = (!n->child[1] ? -1 : n->child[1]->depth);
499 G_debug(1,
"k-d tree optimization: %d times balanced, new depth %d",
nbal,
540 dir = cmp(&sn, n, n->
dim) > 0;
544 s[top].n = n->
child[dir];
566 while (i > 0 && d[i - 1] > dist) {
585 }
while (i-- && dist <=
maxdist);
589 while (i > 0 && d[i - 1] > dist) {
594 if (d[i] == dist &&
uid[i] == n->
uid)
614 s[top].n = n->
child[!dir];
617 dir = cmp(&sn, n, n->dim) > 0;
621 s[top].n = n->child[dir];
673 dir = cmp(&sn, n, n->
dim) > 0;
677 s[top].n = n->
child[dir];
698 if (
found + 1 >= k) {
704 while (i > 0 && d[i - 1] > dist) {
724 s[top].n = n->
child[!dir];
727 dir = cmp(&sn, n, n->dim) > 0;
731 s[top].n = n->child[dir];
782 dir = cmp(&sn, n, n->
dim) > 0;
786 s[top].n = n->
child[dir];
799 for (i = 0; i <
t->ndims; i++) {
800 if (n->
c[i] < sn.
c[i] || n->
c[i] > sn.
c[i +
t->ndims]) {
807 if (
found + 1 >= k) {
819 if (n->
c[(
int)n->
dim] >= sn.
c[(
int)n->
dim] &&
820 n->
c[(
int)n->
dim] <= sn.
c[(
int)n->
dim +
t->ndims]) {
823 s[top].n = n->
child[!dir];
826 dir = cmp(&sn, n, n->dim) > 0;
830 s[top].n = n->child[dir];
864 G_debug(1,
"k-d tree: empty tree");
866 G_debug(1,
"k-d tree: finished traversing");
901 if (!
r->child[0] && !
r->child[1])
915 ld = (!
or->child[0] ? -1 :
or->child[0]->depth);
916 rd = (!
or->child[1] ? -1 :
or->child[1]->depth);
947 if (n->dim !=
or->dim)
948 dir = cmp(
or, n, n->dim) > 0;
952 s[top].n = n->child[dir];
962 if ((cmp(
rn, n,
or->dim) > 0) ==
ordir) {
971 if (n->dim !=
or->dim &&
972 mindist >=
fabs(n->c[(
int)n->dim] - n->c[(
int)n->dim])) {
975 s[top].n = n->child[!dir];
979 if (n->dim !=
or->dim)
980 dir = cmp(
or, n, n->dim) > 0;
984 s[top].n = n->child[dir];
1000 dir = cmp(
or->child[1],
rn,
or->dim);
1004 for (i = 0; i <
t->ndims; i++)
1006 or->child[1]->c[i]);
1008 "Right child of old root is smaller than rn, dir is %d",
1013 dir = cmp(
or->child[0],
rn,
or->dim);
1017 for (i = 0; i <
t->ndims; i++)
1019 or->child[0]->c[i]);
1021 "Left child of old root is larger than rn, dir is %d",
1043 dir = cmp(
rn, n, n->dim);
1045 s[top].dir = dir > 0;
1047 s[top].n = n->child[dir > 0];
1073 ld = (!
or->child[0] ? -1 :
or->child[0]->depth);
1074 rd = (!
or->child[1] ? -1 :
or->child[1]->depth);
1093 if (n->child[dir] !=
rn) {
1096 kdtree_free_node(
rn);
1097 n->child[dir] =
NULL;
1100 kdtree_update_node(
t, n);
1111 if (cmp(n->child[0], n, n->dim) > 0)
1115 if (cmp(n->child[1], n, n->dim) < 1)
1121 kdtree_update_node(
t, n);
1139 ld = (!
r->child[0] ? -1 :
r->child[0]->depth);
1140 rd = (!
r->child[1] ? -1 :
r->child[1]->depth);
1145 kdtree_update_node(
t,
r);
1150 if (!
r->child[0] || !
r->child[1])
1153 ld = (!
r->child[0] ? -1 :
r->child[0]->depth);
1154 rd = (!
r->child[1] ? -1 :
r->child[1]->depth);
1155 if (
ld >
rd + btol) {
1158 else if (
rd >
ld + btol) {
1165 or = kdtree_newnode(
t);
1168 or->dim =
t->nextdim[
r->dim];
1170 if (!kdtree_replace(
t,
r))
1174 if (!cmp(
r,
or,
r->dim)) {
1175 G_warning(
"kdtree_balance: replacement failed");
1176 kdtree_free_node(
or);
1183 kdtree_insert2(
t,
r->child[!dir],
or,
bmode, 1);
1186 kdtree_update_node(
t,
r);
1189 G_debug(4,
"balancing had no effect");
1220 if (rcallsmax < rcalls)
1238 if (!cmpc(
nnew, n,
t) && (!
dc ||
nnew->uid == n->uid)) {
1240 G_debug(1,
"KD node exists already, nothing to do");
1241 kdtree_free_node(
nnew);
1250 dir = cmp(
nnew, n, n->dim) > 0;
1256 s[top].n = n->child[dir];
1264 n->child[dir] =
nnew;
1265 nnew->dim =
t->nextdim[n->dim];
1277 kdtree_update_node(
t, n);
1284 if (cmp(n->child[0], n, n->dim) > 0)
1285 G_warning(
"Insert2: Left child is larger");
1288 if (cmp(n->child[1], n, n->dim) < 1)
1289 G_warning(
"Insert2: Right child is not larger");
1309 while (kdtree_balance(
t, n,
bmode))
1314 if (n->child[0] && n->child[0]->balance) {
1317 s[top].n = n->child[dir];
1319 else if (n->child[1] && n->child[1]->balance) {
1322 s[top].n = n->child[dir];
1330 while (kdtree_balance(
t, n,
bmode))
1335 kdtree_update_node(
t, s[top].n);
1337 if (!
bmode2 && top == 0) {
1361 while (
trav->curr_node->child[0] !=
NULL) {
1363 trav->curr_node =
trav->curr_node->child[0];
1377 if (
trav->curr_node->child[1] !=
NULL) {
1380 trav->curr_node =
trav->curr_node->child[1];
1383 while (
trav->curr_node->child[0] !=
NULL) {
1385 trav->curr_node =
trav->curr_node->child[0];
1393 if (
trav->top == 0) {
1397 last =
trav->curr_node;
1399 }
while (last ==
trav->curr_node->child[1]);
void G_free(void *)
Free allocated memory.
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
void G_warning(const char *,...) __attribute__((format(printf
void G_message(const char *,...) __attribute__((format(printf
int G_debug(int, const char *,...) __attribute__((format(printf
void kdtree_optimize(struct kdtree *t, int level)
int kdtree_rnn(struct kdtree *t, double *c, int **puid, int *skip)
struct kdtree * kdtree_create(char ndims, int *btol)
int kdtree_traverse(struct kdtrav *trav, double *c, int *uid)
void kdtree_clear(struct kdtree *t)
int kdtree_insert(struct kdtree *t, double *c, int uid, int dc)
int kdtree_knn(struct kdtree *t, double *c, int *uid, double *d, int k, int *skip)
void kdtree_destroy(struct kdtree *t)
int kdtree_dnn(struct kdtree *t, double *c, int **puid, double **pd, double maxdist, int *skip)
int kdtree_init_trav(struct kdtrav *trav, struct kdtree *tree)
int kdtree_remove(struct kdtree *t, double *c, int uid)
Dynamic balanced k-d tree implementation.