提交 37951c04 编写于 作者: P Paul Ripke 提交者: Julien Schueller

Prefix builtin rb_tree symbols with nlopt to avoid colliding with libc symbols.

Collision was seen on NetBSD, ref:
http://mail-index.netbsd.org/tech-pkg/2020/10/11/msg023893.html
上级 c2689c01
...@@ -185,14 +185,14 @@ static nlopt_result divide_rect(double *rdiv, params *p) ...@@ -185,14 +185,14 @@ static nlopt_result divide_rect(double *rdiv, params *p)
} }
} }
sort_fv(n, fv, isort); sort_fv(n, fv, isort);
if (!(node = rb_tree_find(&p->rtree, rdiv))) if (!(node = nlopt_rb_tree_find(&p->rtree, rdiv)))
return NLOPT_FAILURE; return NLOPT_FAILURE;
for (i = 0; i < nlongest; ++i) { for (i = 0; i < nlongest; ++i) {
int k; int k;
w[isort[i]] *= THIRD; w[isort[i]] *= THIRD;
rdiv[0] = rect_diameter(n, w, p); rdiv[0] = rect_diameter(n, w, p);
rdiv[2] = p->age++; rdiv[2] = p->age++;
node = rb_tree_resort(&p->rtree, node); node = nlopt_rb_tree_resort(&p->rtree, node);
for (k = 0; k <= 1; ++k) { for (k = 0; k <= 1; ++k) {
double *rnew; double *rnew;
ALLOC_RECT(rnew, L); ALLOC_RECT(rnew, L);
...@@ -200,7 +200,7 @@ static nlopt_result divide_rect(double *rdiv, params *p) ...@@ -200,7 +200,7 @@ static nlopt_result divide_rect(double *rdiv, params *p)
rnew[3 + isort[i]] += w[isort[i]] * (2*k-1); rnew[3 + isort[i]] += w[isort[i]] * (2*k-1);
rnew[1] = fv[2*isort[i]+k]; rnew[1] = fv[2*isort[i]+k];
rnew[2] = p->age++; rnew[2] = p->age++;
if (!rb_tree_insert(&p->rtree, rnew)) { if (!nlopt_rb_tree_insert(&p->rtree, rnew)) {
free(rnew); free(rnew);
return NLOPT_OUT_OF_MEMORY; return NLOPT_OUT_OF_MEMORY;
} }
...@@ -220,12 +220,12 @@ static nlopt_result divide_rect(double *rdiv, params *p) ...@@ -220,12 +220,12 @@ static nlopt_result divide_rect(double *rdiv, params *p)
} }
else else
i = imax; /* trisect longest side */ i = imax; /* trisect longest side */
if (!(node = rb_tree_find(&p->rtree, rdiv))) if (!(node = nlopt_rb_tree_find(&p->rtree, rdiv)))
return NLOPT_FAILURE; return NLOPT_FAILURE;
w[i] *= THIRD; w[i] *= THIRD;
rdiv[0] = rect_diameter(n, w, p); rdiv[0] = rect_diameter(n, w, p);
rdiv[2] = p->age++; rdiv[2] = p->age++;
node = rb_tree_resort(&p->rtree, node); node = nlopt_rb_tree_resort(&p->rtree, node);
for (k = 0; k <= 1; ++k) { for (k = 0; k <= 1; ++k) {
double *rnew; double *rnew;
ALLOC_RECT(rnew, L); ALLOC_RECT(rnew, L);
...@@ -233,7 +233,7 @@ static nlopt_result divide_rect(double *rdiv, params *p) ...@@ -233,7 +233,7 @@ static nlopt_result divide_rect(double *rdiv, params *p)
rnew[3 + i] += w[i] * (2*k-1); rnew[3 + i] += w[i] * (2*k-1);
FUNCTION_EVAL(rnew[1], rnew + 3, p, rnew); FUNCTION_EVAL(rnew[1], rnew + 3, p, rnew);
rnew[2] = p->age++; rnew[2] = p->age++;
if (!rb_tree_insert(&p->rtree, rnew)) { if (!nlopt_rb_tree_insert(&p->rtree, rnew)) {
free(rnew); free(rnew);
return NLOPT_OUT_OF_MEMORY; return NLOPT_OUT_OF_MEMORY;
} }
...@@ -267,9 +267,9 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups) ...@@ -267,9 +267,9 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups)
/* Monotone chain algorithm [Andrew, 1979]. */ /* Monotone chain algorithm [Andrew, 1979]. */
n = rb_tree_min(t); n = nlopt_rb_tree_min(t);
if (!n) return 0; if (!n) return 0;
nmax = rb_tree_max(t); nmax = nlopt_rb_tree_max(t);
xmin = n->k[0]; xmin = n->k[0];
yminmin = n->k[1]; yminmin = n->k[1];
...@@ -278,7 +278,7 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups) ...@@ -278,7 +278,7 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups)
if (allow_dups) if (allow_dups)
do { /* include any duplicate points at (xmin,yminmin) */ do { /* include any duplicate points at (xmin,yminmin) */
hull[nhull++] = n->k; hull[nhull++] = n->k;
n = rb_tree_succ(n); n = nlopt_rb_tree_succ(n);
} while (n && n->k[0] == xmin && n->k[1] == yminmin); } while (n && n->k[0] == xmin && n->k[1] == yminmin);
else else
hull[nhull++] = n->k; hull[nhull++] = n->k;
...@@ -288,15 +288,15 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups) ...@@ -288,15 +288,15 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups)
/* set nmax = min mode with x == xmax */ /* set nmax = min mode with x == xmax */
#if 0 #if 0
while (nmax->k[0] == xmax) while (nmax->k[0] == xmax)
nmax = rb_tree_pred(nmax); /* non-NULL since xmin != xmax */ nmax = nlopt_rb_tree_pred(nmax); /* non-NULL since xmin != xmax */
nmax = rb_tree_succ(nmax); nmax = nlopt_rb_tree_succ(nmax);
#else #else
/* performance hack (see also below) */ /* performance hack (see also below) */
{ {
double kshift[2]; double kshift[2];
kshift[0] = xmax * (1 - 1e-13); kshift[0] = xmax * (1 - 1e-13);
kshift[1] = -HUGE_VAL; kshift[1] = -HUGE_VAL;
nmax = rb_tree_find_gt(t, kshift); /* non-NULL since xmin != xmax */ nmax = nlopt_rb_tree_find_gt(t, kshift); /* non-NULL since xmin != xmax */
} }
#endif #endif
...@@ -306,18 +306,18 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups) ...@@ -306,18 +306,18 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups)
/* set n = first node with x != xmin */ /* set n = first node with x != xmin */
#if 0 #if 0
while (n->k[0] == xmin) while (n->k[0] == xmin)
n = rb_tree_succ(n); /* non-NULL since xmin != xmax */ n = nlopt_rb_tree_succ(n); /* non-NULL since xmin != xmax */
#else #else
/* performance hack (see also below) */ /* performance hack (see also below) */
{ {
double kshift[2]; double kshift[2];
kshift[0] = xmin * (1 + 1e-13); kshift[0] = xmin * (1 + 1e-13);
kshift[1] = -HUGE_VAL; kshift[1] = -HUGE_VAL;
n = rb_tree_find_gt(t, kshift); /* non-NULL since xmin != xmax */ n = nlopt_rb_tree_find_gt(t, kshift); /* non-NULL since xmin != xmax */
} }
#endif #endif
for (; n != nmax; n = rb_tree_succ(n)) { for (; n != nmax; n = nlopt_rb_tree_succ(n)) {
double *k = n->k; double *k = n->k;
if (k[1] > yminmin + (k[0] - xmin) * minslope) if (k[1] > yminmin + (k[0] - xmin) * minslope)
continue; continue;
...@@ -333,7 +333,7 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups) ...@@ -333,7 +333,7 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups)
that k[0] > 0 always in DIRECT */ that k[0] > 0 always in DIRECT */
kshift[0] = k[0] * (1 + 1e-13); kshift[0] = k[0] * (1 + 1e-13);
kshift[1] = -HUGE_VAL; kshift[1] = -HUGE_VAL;
n = rb_tree_pred(rb_tree_find_gt(t, kshift)); n = nlopt_rb_tree_pred(nlopt_rb_tree_find_gt(t, kshift));
continue; continue;
} }
else { /* equal y values, add to hull */ else { /* equal y values, add to hull */
...@@ -369,7 +369,7 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups) ...@@ -369,7 +369,7 @@ static int convex_hull(rb_tree *t, double **hull, int allow_dups)
if (allow_dups) if (allow_dups)
do { /* include any duplicate points at (xmax,ymaxmin) */ do { /* include any duplicate points at (xmax,ymaxmin) */
hull[nhull++] = nmax->k; hull[nhull++] = nmax->k;
nmax = rb_tree_succ(nmax); nmax = nlopt_rb_tree_succ(nmax);
} while (nmax && nmax->k[0] == xmax && nmax->k[1] == ymaxmin); } while (nmax && nmax->k[0] == xmax && nmax->k[1] == ymaxmin);
else else
hull[nhull++] = nmax->k; hull[nhull++] = nmax->k;
...@@ -444,12 +444,12 @@ static nlopt_result divide_good_rects(params *p) ...@@ -444,12 +444,12 @@ static nlopt_result divide_good_rects(params *p)
to time, and the heuristic here seems to work well, to time, and the heuristic here seems to work well,
but I don't recall this situation being discussed in but I don't recall this situation being discussed in
the references?) */ the references?) */
rb_node *max = rb_tree_max(&p->rtree); rb_node *max = nlopt_rb_tree_max(&p->rtree);
rb_node *pred = max; rb_node *pred = max;
double wmax = max->k[0]; double wmax = max->k[0];
do { /* note: this loop is O(N) worst-case time */ do { /* note: this loop is O(N) worst-case time */
max = pred; max = pred;
pred = rb_tree_pred(max); pred = nlopt_rb_tree_pred(max);
} while (pred && pred->k[0] == wmax); } while (pred && pred->k[0] == wmax);
return divide_rect(max->k, p); return divide_rect(max->k, p);
} }
...@@ -502,7 +502,7 @@ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data, ...@@ -502,7 +502,7 @@ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data,
p.hull = 0; p.hull = 0;
p.age = 0; p.age = 0;
rb_tree_init(&p.rtree, cdirect_hyperrect_compare); nlopt_rb_tree_init(&p.rtree, cdirect_hyperrect_compare);
p.work = (double *) malloc(sizeof(double) * (2*n)); p.work = (double *) malloc(sizeof(double) * (2*n));
if (!p.work) goto done; if (!p.work) goto done;
...@@ -520,7 +520,7 @@ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data, ...@@ -520,7 +520,7 @@ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data,
rnew[0] = rect_diameter(n, rnew+3+n, &p); rnew[0] = rect_diameter(n, rnew+3+n, &p);
rnew[1] = function_eval(rnew+3, &p); rnew[1] = function_eval(rnew+3, &p);
rnew[2] = p.age++; rnew[2] = p.age++;
if (!rb_tree_insert(&p.rtree, rnew)) { if (!nlopt_rb_tree_insert(&p.rtree, rnew)) {
free(rnew); free(rnew);
goto done; goto done;
} }
...@@ -539,7 +539,7 @@ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data, ...@@ -539,7 +539,7 @@ nlopt_result cdirect_unscaled(int n, nlopt_func f, void *f_data,
} }
done: done:
rb_tree_destroy_with_keys(&p.rtree); nlopt_rb_tree_destroy_with_keys(&p.rtree);
free(p.hull); free(p.hull);
free(p.iwork); free(p.iwork);
free(p.work); free(p.work);
......
...@@ -138,7 +138,7 @@ static nlopt_result divide_largest(params *p) ...@@ -138,7 +138,7 @@ static nlopt_result divide_largest(params *p)
{ {
int L = p->L; int L = p->L;
int n = p->n; int n = p->n;
rb_node *node = rb_tree_max(&p->rtree); /* just using it as a heap */ rb_node *node = nlopt_rb_tree_max(&p->rtree); /* just using it as a heap */
double minf_start = p->minf; double minf_start = p->minf;
double *r = node->k, *rnew = NULL; double *r = node->k, *rnew = NULL;
double *x = r + 3, *c = x + n, *w = c + n; double *x = r + 3, *c = x + n, *w = c + n;
...@@ -179,7 +179,7 @@ static nlopt_result divide_largest(params *p) ...@@ -179,7 +179,7 @@ static nlopt_result divide_largest(params *p)
r[0] = longest(n, w); /* new diameter */ r[0] = longest(n, w); /* new diameter */
/* r[1] unchanged since still contains local optimum x */ /* r[1] unchanged since still contains local optimum x */
r[2] = p->age--; r[2] = p->age--;
node = rb_tree_resort(&p->rtree, node); node = nlopt_rb_tree_resort(&p->rtree, node);
rnew = (double *) malloc(sizeof(double) * L); rnew = (double *) malloc(sizeof(double) * L);
if (!rnew) return NLOPT_OUT_OF_MEMORY; if (!rnew) return NLOPT_OUT_OF_MEMORY;
...@@ -192,7 +192,7 @@ static nlopt_result divide_largest(params *p) ...@@ -192,7 +192,7 @@ static nlopt_result divide_largest(params *p)
memcpy(rnew+3, rnew+3+n, sizeof(double) * n); /* x = c */ memcpy(rnew+3, rnew+3+n, sizeof(double) * n); /* x = c */
ret = optimize_rect(rnew, p); ret = optimize_rect(rnew, p);
if (ret != NLOPT_SUCCESS) { free(rnew); return ret; } if (ret != NLOPT_SUCCESS) { free(rnew); return ret; }
if (!rb_tree_insert(&p->rtree, rnew)) { if (!nlopt_rb_tree_insert(&p->rtree, rnew)) {
free(rnew); return NLOPT_OUT_OF_MEMORY; free(rnew); return NLOPT_OUT_OF_MEMORY;
} }
} }
...@@ -201,7 +201,7 @@ static nlopt_result divide_largest(params *p) ...@@ -201,7 +201,7 @@ static nlopt_result divide_largest(params *p)
r[0] = longest(n, w); r[0] = longest(n, w);
/* r[1] unchanged since still contains local optimum x */ /* r[1] unchanged since still contains local optimum x */
r[2] = p->age--; r[2] = p->age--;
node = rb_tree_resort(&p->rtree, node); node = nlopt_rb_tree_resort(&p->rtree, node);
for (i = -1; i <= +1; i += 2) { for (i = -1; i <= +1; i += 2) {
rnew = (double *) malloc(sizeof(double) * L); rnew = (double *) malloc(sizeof(double) * L);
...@@ -215,7 +215,7 @@ static nlopt_result divide_largest(params *p) ...@@ -215,7 +215,7 @@ static nlopt_result divide_largest(params *p)
memcpy(rnew+3, rnew+3+n, sizeof(double) * n); /* x = c */ memcpy(rnew+3, rnew+3+n, sizeof(double) * n); /* x = c */
ret = optimize_rect(rnew, p); ret = optimize_rect(rnew, p);
if (ret != NLOPT_SUCCESS) { free(rnew); return ret; } if (ret != NLOPT_SUCCESS) { free(rnew); return ret; }
if (!rb_tree_insert(&p->rtree, rnew)) { if (!nlopt_rb_tree_insert(&p->rtree, rnew)) {
free(rnew); return NLOPT_OUT_OF_MEMORY; free(rnew); return NLOPT_OUT_OF_MEMORY;
} }
} }
...@@ -254,7 +254,7 @@ nlopt_result cdirect_hybrid_unscaled(int n, nlopt_func f, void *f_data, ...@@ -254,7 +254,7 @@ nlopt_result cdirect_hybrid_unscaled(int n, nlopt_func f, void *f_data,
p.randomized_div = randomized_div; p.randomized_div = randomized_div;
p.local_opt = 0; p.local_opt = 0;
rb_tree_init(&p.rtree, cdirect_hyperrect_compare); nlopt_rb_tree_init(&p.rtree, cdirect_hyperrect_compare);
p.work = (double *) malloc(sizeof(double) * (2*n)); p.work = (double *) malloc(sizeof(double) * (2*n));
if (!p.work) goto done; if (!p.work) goto done;
...@@ -289,14 +289,14 @@ nlopt_result cdirect_hybrid_unscaled(int n, nlopt_func f, void *f_data, ...@@ -289,14 +289,14 @@ nlopt_result cdirect_hybrid_unscaled(int n, nlopt_func f, void *f_data,
ret = optimize_rect(rnew, &p); ret = optimize_rect(rnew, &p);
if (ret != NLOPT_SUCCESS) { free(rnew); goto done; } if (ret != NLOPT_SUCCESS) { free(rnew); goto done; }
if (!rb_tree_insert(&p.rtree, rnew)) { free(rnew); goto done; } if (!nlopt_rb_tree_insert(&p.rtree, rnew)) { free(rnew); goto done; }
do { do {
ret = divide_largest(&p); ret = divide_largest(&p);
} while (ret == NLOPT_SUCCESS); } while (ret == NLOPT_SUCCESS);
done: done:
rb_tree_destroy_with_keys(&p.rtree); nlopt_rb_tree_destroy_with_keys(&p.rtree);
free(p.work); free(p.work);
nlopt_destroy(p.local_opt); nlopt_destroy(p.local_opt);
......
...@@ -124,8 +124,8 @@ static void random_trial(crs_data *d, double *x, rb_node *best) ...@@ -124,8 +124,8 @@ static void random_trial(crs_data *d, double *x, rb_node *best)
static nlopt_result crs_trial(crs_data *d) static nlopt_result crs_trial(crs_data *d)
{ {
rb_node *best = rb_tree_min(&d->t); rb_node *best = nlopt_rb_tree_min(&d->t);
rb_node *worst = rb_tree_max(&d->t); rb_node *worst = nlopt_rb_tree_max(&d->t);
int mutation = NUM_MUTATION; int mutation = NUM_MUTATION;
int i, n = d->n; int i, n = d->n;
random_trial(d, d->p + 1, best); random_trial(d, d->p + 1, best);
...@@ -151,14 +151,14 @@ static nlopt_result crs_trial(crs_data *d) ...@@ -151,14 +151,14 @@ static nlopt_result crs_trial(crs_data *d)
} }
} while (1); } while (1);
memcpy(worst->k, d->p, sizeof(double) * (n+1)); memcpy(worst->k, d->p, sizeof(double) * (n+1));
rb_tree_resort(&d->t, worst); nlopt_rb_tree_resort(&d->t, worst);
return NLOPT_SUCCESS; return NLOPT_SUCCESS;
} }
static void crs_destroy(crs_data *d) static void crs_destroy(crs_data *d)
{ {
nlopt_sobol_destroy(d->s); nlopt_sobol_destroy(d->s);
rb_tree_destroy(&d->t); nlopt_rb_tree_destroy(&d->t);
free(d->ps); free(d->ps);
} }
...@@ -190,7 +190,7 @@ static nlopt_result crs_init(crs_data *d, int n, const double *x, ...@@ -190,7 +190,7 @@ static nlopt_result crs_init(crs_data *d, int n, const double *x,
d->ps = (double *) malloc(sizeof(double) * (n + 1) * (d->N + 1)); d->ps = (double *) malloc(sizeof(double) * (n + 1) * (d->N + 1));
if (!d->ps) return NLOPT_OUT_OF_MEMORY; if (!d->ps) return NLOPT_OUT_OF_MEMORY;
d->p = d->ps + d->N * (n+1); d->p = d->ps + d->N * (n+1);
rb_tree_init(&d->t, crs_compare); nlopt_rb_tree_init(&d->t, crs_compare);
/* we can either use pseudorandom points, as in the original CRS /* we can either use pseudorandom points, as in the original CRS
algorithm, or use a low-discrepancy Sobol' sequence ... I tried algorithm, or use a low-discrepancy Sobol' sequence ... I tried
...@@ -204,7 +204,7 @@ static nlopt_result crs_init(crs_data *d, int n, const double *x, ...@@ -204,7 +204,7 @@ static nlopt_result crs_init(crs_data *d, int n, const double *x,
memcpy(d->ps + 1, x, sizeof(double) * n); memcpy(d->ps + 1, x, sizeof(double) * n);
d->ps[0] = f(n, x, NULL, f_data); d->ps[0] = f(n, x, NULL, f_data);
++ *(stop->nevals_p); ++ *(stop->nevals_p);
if (!rb_tree_insert(&d->t, d->ps)) return NLOPT_OUT_OF_MEMORY; if (!nlopt_rb_tree_insert(&d->t, d->ps)) return NLOPT_OUT_OF_MEMORY;
if (d->ps[0] < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (d->ps[0] < stop->minf_max) return NLOPT_MINF_MAX_REACHED;
if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED;
if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED;
...@@ -219,7 +219,7 @@ static nlopt_result crs_init(crs_data *d, int n, const double *x, ...@@ -219,7 +219,7 @@ static nlopt_result crs_init(crs_data *d, int n, const double *x,
} }
k[0] = f(n, k + 1, NULL, f_data); k[0] = f(n, k + 1, NULL, f_data);
++ *(stop->nevals_p); ++ *(stop->nevals_p);
if (!rb_tree_insert(&d->t, k)) return NLOPT_OUT_OF_MEMORY; if (!nlopt_rb_tree_insert(&d->t, k)) return NLOPT_OUT_OF_MEMORY;
if (k[0] < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (k[0] < stop->minf_max) return NLOPT_MINF_MAX_REACHED;
if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED;
if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED;
...@@ -243,13 +243,13 @@ nlopt_result crs_minimize(int n, nlopt_func f, void *f_data, ...@@ -243,13 +243,13 @@ nlopt_result crs_minimize(int n, nlopt_func f, void *f_data,
ret = crs_init(&d, n, x, lb, ub, stop, f, f_data, population, lds); ret = crs_init(&d, n, x, lb, ub, stop, f, f_data, population, lds);
if (ret < 0) return ret; if (ret < 0) return ret;
best = rb_tree_min(&d.t); best = nlopt_rb_tree_min(&d.t);
*minf = best->k[0]; *minf = best->k[0];
memcpy(x, best->k + 1, sizeof(double) * n); memcpy(x, best->k + 1, sizeof(double) * n);
while (ret == NLOPT_SUCCESS) { while (ret == NLOPT_SUCCESS) {
if (NLOPT_SUCCESS == (ret = crs_trial(&d))) { if (NLOPT_SUCCESS == (ret = crs_trial(&d))) {
best = rb_tree_min(&d.t); best = nlopt_rb_tree_min(&d.t);
if (best->k[0] < *minf) { if (best->k[0] < *minf) {
if (best->k[0] < stop->minf_max) if (best->k[0] < stop->minf_max)
ret = NLOPT_MINF_MAX_REACHED; ret = NLOPT_MINF_MAX_REACHED;
......
...@@ -130,12 +130,12 @@ static double distance2(int n, const double *x1, const double *x2) ...@@ -130,12 +130,12 @@ static double distance2(int n, const double *x1, const double *x2)
this function is called when p is first added to our tree */ this function is called when p is first added to our tree */
static void find_closest_pt(int n, rb_tree *pts, pt *p) static void find_closest_pt(int n, rb_tree *pts, pt *p)
{ {
rb_node *node = rb_tree_find_lt(pts, (rb_key) p); rb_node *node = nlopt_rb_tree_find_lt(pts, (rb_key) p);
double closest_d = HUGE_VAL; double closest_d = HUGE_VAL;
while (node) { while (node) {
double d = distance2(n, p->x, ((pt *) node->k)->x); double d = distance2(n, p->x, ((pt *) node->k)->x);
if (d < closest_d) closest_d = d; if (d < closest_d) closest_d = d;
node = rb_tree_pred(node); node = nlopt_rb_tree_pred(node);
} }
p->closest_pt_d = closest_d; p->closest_pt_d = closest_d;
} }
...@@ -144,12 +144,12 @@ static void find_closest_pt(int n, rb_tree *pts, pt *p) ...@@ -144,12 +144,12 @@ static void find_closest_pt(int n, rb_tree *pts, pt *p)
this function is called when p is first added to our tree */ this function is called when p is first added to our tree */
static void find_closest_lm(int n, rb_tree *lms, pt *p) static void find_closest_lm(int n, rb_tree *lms, pt *p)
{ {
rb_node *node = rb_tree_find_lt(lms, &p->f); rb_node *node = nlopt_rb_tree_find_lt(lms, &p->f);
double closest_d = HUGE_VAL; double closest_d = HUGE_VAL;
while (node) { while (node) {
double d = distance2(n, p->x, node->k+1); double d = distance2(n, p->x, node->k+1);
if (d < closest_d) closest_d = d; if (d < closest_d) closest_d = d;
node = rb_tree_pred(node); node = nlopt_rb_tree_pred(node);
} }
p->closest_lm_d = closest_d; p->closest_lm_d = closest_d;
} }
...@@ -161,14 +161,14 @@ static void find_closest_lm(int n, rb_tree *lms, pt *p) ...@@ -161,14 +161,14 @@ static void find_closest_lm(int n, rb_tree *lms, pt *p)
local minimization from the same point twice */ local minimization from the same point twice */
static void pts_update_newpt(int n, rb_tree *pts, pt *newpt) static void pts_update_newpt(int n, rb_tree *pts, pt *newpt)
{ {
rb_node *node = rb_tree_find_gt(pts, (rb_key) newpt); rb_node *node = nlopt_rb_tree_find_gt(pts, (rb_key) newpt);
while (node) { while (node) {
pt *p = (pt *) node->k; pt *p = (pt *) node->k;
if (!p->minimized) { if (!p->minimized) {
double d = distance2(n, newpt->x, p->x); double d = distance2(n, newpt->x, p->x);
if (d < p->closest_pt_d) p->closest_pt_d = d; if (d < p->closest_pt_d) p->closest_pt_d = d;
} }
node = rb_tree_succ(node); node = nlopt_rb_tree_succ(node);
} }
} }
...@@ -182,14 +182,14 @@ static void pts_update_newlm(int n, rb_tree *pts, double *newlm) ...@@ -182,14 +182,14 @@ static void pts_update_newlm(int n, rb_tree *pts, double *newlm)
pt tmp_pt; pt tmp_pt;
rb_node *node; rb_node *node;
tmp_pt.f = newlm[0]; tmp_pt.f = newlm[0];
node = rb_tree_find_gt(pts, (rb_key) &tmp_pt); node = nlopt_rb_tree_find_gt(pts, (rb_key) &tmp_pt);
while (node) { while (node) {
pt *p = (pt *) node->k; pt *p = (pt *) node->k;
if (!p->minimized) { if (!p->minimized) {
double d = distance2(n, newlm+1, p->x); double d = distance2(n, newlm+1, p->x);
if (d < p->closest_lm_d) p->closest_lm_d = d; if (d < p->closest_lm_d) p->closest_lm_d = d;
} }
node = rb_tree_succ(node); node = nlopt_rb_tree_succ(node);
} }
} }
...@@ -257,12 +257,12 @@ static double fcount(unsigned n, const double *x, double *grad, void *p_) ...@@ -257,12 +257,12 @@ static double fcount(unsigned n, const double *x, double *grad, void *p_)
static void get_minf(mlsl_data *d, double *minf, double *x) static void get_minf(mlsl_data *d, double *minf, double *x)
{ {
rb_node *node = rb_tree_min(&d->pts); rb_node *node = nlopt_rb_tree_min(&d->pts);
if (node) { if (node) {
*minf = ((pt *) node->k)->f; *minf = ((pt *) node->k)->f;
memcpy(x, ((pt *) node->k)->x, sizeof(double) * d->n); memcpy(x, ((pt *) node->k)->x, sizeof(double) * d->n);
} }
node = rb_tree_min(&d->lms); node = nlopt_rb_tree_min(&d->lms);
if (node && node->k[0] < *minf) { if (node && node->k[0] < *minf) {
*minf = node->k[0]; *minf = node->k[0];
memcpy(x, node->k + 1, sizeof(double) * d->n); memcpy(x, node->k + 1, sizeof(double) * d->n);
...@@ -301,8 +301,8 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -301,8 +301,8 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
d.lb = lb; d.ub = ub; d.lb = lb; d.ub = ub;
d.stop = stop; d.stop = stop;
d.f = f; d.f_data = f_data; d.f = f; d.f_data = f_data;
rb_tree_init(&d.pts, pt_compare); nlopt_rb_tree_init(&d.pts, pt_compare);
rb_tree_init(&d.lms, lm_compare); nlopt_rb_tree_init(&d.lms, lm_compare);
d.s = lds ? nlopt_sobol_create((unsigned) n) : NULL; d.s = lds ? nlopt_sobol_create((unsigned) n) : NULL;
nlopt_set_min_objective(local_opt, fcount, &d); nlopt_set_min_objective(local_opt, fcount, &d);
...@@ -334,7 +334,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -334,7 +334,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
memcpy(p->x, x, n * sizeof(double)); memcpy(p->x, x, n * sizeof(double));
p->f = f(n, x, NULL, f_data); p->f = f(n, x, NULL, f_data);
++ *(stop->nevals_p); ++ *(stop->nevals_p);
if (!rb_tree_insert(&d.pts, (rb_key) p)) { if (!nlopt_rb_tree_insert(&d.pts, (rb_key) p)) {
free(p); ret = NLOPT_OUT_OF_MEMORY; free(p); ret = NLOPT_OUT_OF_MEMORY;
} }
if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP;
...@@ -359,7 +359,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -359,7 +359,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
} }
p->f = f(n, p->x, NULL, f_data); p->f = f(n, p->x, NULL, f_data);
++ *(stop->nevals_p); ++ *(stop->nevals_p);
if (!rb_tree_insert(&d.pts, (rb_key) p)) { if (!nlopt_rb_tree_insert(&d.pts, (rb_key) p)) {
free(p); ret = NLOPT_OUT_OF_MEMORY; free(p); ret = NLOPT_OUT_OF_MEMORY;
} }
if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP;
...@@ -378,7 +378,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -378,7 +378,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
* pow(log((double) d.pts.N) / d.pts.N, 1.0 / n); * pow(log((double) d.pts.N) / d.pts.N, 1.0 / n);
/* local search phase: do local opt. for promising points */ /* local search phase: do local opt. for promising points */
node = rb_tree_min(&d.pts); node = nlopt_rb_tree_min(&d.pts);
for (i = (int) (ceil(d.gamma * d.pts.N) + 0.5); for (i = (int) (ceil(d.gamma * d.pts.N) + 0.5);
node && i > 0 && ret == NLOPT_SUCCESS; --i) { node && i > 0 && ret == NLOPT_SUCCESS; --i) {
p = (pt *) node->k; p = (pt *) node->k;
...@@ -407,7 +407,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -407,7 +407,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
(t - stop->start)); (t - stop->start));
p->minimized = 1; p->minimized = 1;
if (lret < 0) { free(lm); ret = lret; goto done; } if (lret < 0) { free(lm); ret = lret; goto done; }
if (!rb_tree_insert(&d.lms, lm)) { if (!nlopt_rb_tree_insert(&d.lms, lm)) {
free(lm); ret = NLOPT_OUT_OF_MEMORY; free(lm); ret = NLOPT_OUT_OF_MEMORY;
} }
else if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP;
...@@ -424,7 +424,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -424,7 +424,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
/* TODO: additional stopping criteria based /* TODO: additional stopping criteria based
e.g. on improvement in function values, etc? */ e.g. on improvement in function values, etc? */
node = rb_tree_succ(node); node = nlopt_rb_tree_succ(node);
} }
} }
...@@ -432,7 +432,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, ...@@ -432,7 +432,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data,
done: done:
nlopt_sobol_destroy(d.s); nlopt_sobol_destroy(d.s);
rb_tree_destroy_with_keys(&d.lms); nlopt_rb_tree_destroy_with_keys(&d.lms);
rb_tree_destroy_with_keys(&d.pts); nlopt_rb_tree_destroy_with_keys(&d.pts);
return ret; return ret;
} }
...@@ -125,7 +125,7 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, ...@@ -125,7 +125,7 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data,
c = scratch + (n+1)*(n+1); c = scratch + (n+1)*(n+1);
xcur = c + n; xcur = c + n;
rb_tree_init(&t, simplex_compare); nlopt_rb_tree_init(&t, simplex_compare);
*fdiff = HUGE_VAL; *fdiff = HUGE_VAL;
...@@ -165,14 +165,14 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, ...@@ -165,14 +165,14 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data,
restart: restart:
for (i = 0; i < n + 1; ++i) for (i = 0; i < n + 1; ++i)
if (!rb_tree_insert(&t, pts + i*(n+1))) { if (!nlopt_rb_tree_insert(&t, pts + i*(n+1))) {
ret = NLOPT_OUT_OF_MEMORY; ret = NLOPT_OUT_OF_MEMORY;
goto done; goto done;
} }
while (1) { while (1) {
rb_node *low = rb_tree_min(&t); rb_node *low = nlopt_rb_tree_min(&t);
rb_node *high = rb_tree_max(&t); rb_node *high = nlopt_rb_tree_max(&t);
double fl = low->k[0], *xl = low->k + 1; double fl = low->k[0], *xl = low->k + 1;
double fh = high->k[0], *xh = high->k + 1; double fh = high->k[0], *xh = high->k + 1;
double fr; double fr;
...@@ -242,7 +242,7 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, ...@@ -242,7 +242,7 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data,
memcpy(xh, xcur, sizeof(double)*n); memcpy(xh, xcur, sizeof(double)*n);
} }
} }
else if (fr < rb_tree_pred(high)->k[0]) { /* accept new point */ else if (fr < nlopt_rb_tree_pred(high)->k[0]) { /* accept new point */
memcpy(xh, xcur, sizeof(double)*n); memcpy(xh, xcur, sizeof(double)*n);
fh = fr; fh = fr;
} }
...@@ -258,8 +258,8 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, ...@@ -258,8 +258,8 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data,
fh = fc; fh = fc;
} }
else { /* failed contraction, shrink simplex */ else { /* failed contraction, shrink simplex */
rb_tree_destroy(&t); nlopt_rb_tree_destroy(&t);
rb_tree_init(&t, simplex_compare); nlopt_rb_tree_init(&t, simplex_compare);
for (i = 0; i < n+1; ++i) { for (i = 0; i < n+1; ++i) {
double *pt = pts + i * (n+1); double *pt = pts + i * (n+1);
if (pt+1 != xl) { if (pt+1 != xl) {
...@@ -276,11 +276,11 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data, ...@@ -276,11 +276,11 @@ nlopt_result nldrmd_minimize_(int n, nlopt_func f, void *f_data,
} }
high->k[0] = fh; high->k[0] = fh;
rb_tree_resort(&t, high); nlopt_rb_tree_resort(&t, high);
} }
done: done:
rb_tree_destroy(&t); nlopt_rb_tree_destroy(&t);
return ret; return ret;
} }
......
...@@ -33,7 +33,7 @@ rb_node nil = { &nil, &nil, &nil, 0, BLACK }; ...@@ -33,7 +33,7 @@ rb_node nil = { &nil, &nil, &nil, 0, BLACK };
#define NIL (&nil) #define NIL (&nil)
void rb_tree_init(rb_tree * t, rb_compare compare) void nlopt_rb_tree_init(rb_tree * t, rb_compare compare)
{ {
t->compare = compare; t->compare = compare;
t->root = NIL; t->root = NIL;
...@@ -49,21 +49,21 @@ static void destroy(rb_node * n) ...@@ -49,21 +49,21 @@ static void destroy(rb_node * n)
} }
} }
void rb_tree_destroy(rb_tree * t) void nlopt_rb_tree_destroy(rb_tree * t)
{ {
destroy(t->root); destroy(t->root);
t->root = NIL; t->root = NIL;
} }
void rb_tree_destroy_with_keys(rb_tree * t) void nlopt_rb_tree_destroy_with_keys(rb_tree * t)
{ {
rb_node *n = rb_tree_min(t); rb_node *n = nlopt_rb_tree_min(t);
while (n) { while (n) {
free(n->k); free(n->k);
n->k = NULL; n->k = NULL;
n = rb_tree_succ(n); n = nlopt_rb_tree_succ(n);
} }
rb_tree_destroy(t); nlopt_rb_tree_destroy(t);
} }
static void rotate_left(rb_node * p, rb_tree * t) static void rotate_left(rb_node * p, rb_tree * t)
...@@ -166,7 +166,7 @@ static void insert_node(rb_tree * t, rb_node * n) ...@@ -166,7 +166,7 @@ static void insert_node(rb_tree * t, rb_node * n)
} }
} }
rb_node *rb_tree_insert(rb_tree * t, rb_key k) rb_node *nlopt_rb_tree_insert(rb_tree * t, rb_key k)
{ {
rb_node *n = (rb_node *) malloc(sizeof(rb_node)); rb_node *n = (rb_node *) malloc(sizeof(rb_node));
if (!n) if (!n)
...@@ -206,7 +206,7 @@ static int check_node(rb_node * n, int *nblack, rb_tree * t) ...@@ -206,7 +206,7 @@ static int check_node(rb_node * n, int *nblack, rb_tree * t)
return 1; return 1;
} }
int rb_tree_check(rb_tree * t) int nlopt_rb_tree_check(rb_tree * t)
{ {
int nblack; int nblack;
if (nil.c != BLACK) if (nil.c != BLACK)
...@@ -220,7 +220,7 @@ int rb_tree_check(rb_tree * t) ...@@ -220,7 +220,7 @@ int rb_tree_check(rb_tree * t)
return check_node(t->root, &nblack, t); return check_node(t->root, &nblack, t);
} }
rb_node *rb_tree_find(rb_tree * t, rb_key k) rb_node *nlopt_rb_tree_find(rb_tree * t, rb_key k)
{ {
rb_compare compare = t->compare; rb_compare compare = t->compare;
rb_node *p = t->root; rb_node *p = t->root;
...@@ -251,7 +251,7 @@ static rb_node *find_le(rb_node * p, rb_key k, rb_tree * t) ...@@ -251,7 +251,7 @@ static rb_node *find_le(rb_node * p, rb_key k, rb_tree * t)
} }
/* find greatest point in t <= k */ /* find greatest point in t <= k */
rb_node *rb_tree_find_le(rb_tree * t, rb_key k) rb_node *nlopt_rb_tree_find_le(rb_tree * t, rb_key k)
{ {
return find_le(t->root, k, t); return find_le(t->root, k, t);
} }
...@@ -274,7 +274,7 @@ static rb_node *find_lt(rb_node * p, rb_key k, rb_tree * t) ...@@ -274,7 +274,7 @@ static rb_node *find_lt(rb_node * p, rb_key k, rb_tree * t)
} }
/* find greatest point in t < k */ /* find greatest point in t < k */
rb_node *rb_tree_find_lt(rb_tree * t, rb_key k) rb_node *nlopt_rb_tree_find_lt(rb_tree * t, rb_key k)
{ {
return find_lt(t->root, k, t); return find_lt(t->root, k, t);
} }
...@@ -297,12 +297,12 @@ static rb_node *find_gt(rb_node * p, rb_key k, rb_tree * t) ...@@ -297,12 +297,12 @@ static rb_node *find_gt(rb_node * p, rb_key k, rb_tree * t)
} }
/* find least point in t > k */ /* find least point in t > k */
rb_node *rb_tree_find_gt(rb_tree * t, rb_key k) rb_node *nlopt_rb_tree_find_gt(rb_tree * t, rb_key k)
{ {
return find_gt(t->root, k, t); return find_gt(t->root, k, t);
} }
rb_node *rb_tree_min(rb_tree * t) rb_node *nlopt_rb_tree_min(rb_tree * t)
{ {
rb_node *n = t->root; rb_node *n = t->root;
while (n != NIL && n->l != NIL) while (n != NIL && n->l != NIL)
...@@ -310,7 +310,7 @@ rb_node *rb_tree_min(rb_tree * t) ...@@ -310,7 +310,7 @@ rb_node *rb_tree_min(rb_tree * t)
return (n == NIL ? NULL : n); return (n == NIL ? NULL : n);
} }
rb_node *rb_tree_max(rb_tree * t) rb_node *nlopt_rb_tree_max(rb_tree * t)
{ {
rb_node *n = t->root; rb_node *n = t->root;
while (n != NIL && n->r != NIL) while (n != NIL && n->r != NIL)
...@@ -318,7 +318,7 @@ rb_node *rb_tree_max(rb_tree * t) ...@@ -318,7 +318,7 @@ rb_node *rb_tree_max(rb_tree * t)
return (n == NIL ? NULL : n); return (n == NIL ? NULL : n);
} }
rb_node *rb_tree_succ(rb_node * n) rb_node *nlopt_rb_tree_succ(rb_node * n)
{ {
if (!n) if (!n)
return NULL; return NULL;
...@@ -337,7 +337,7 @@ rb_node *rb_tree_succ(rb_node * n) ...@@ -337,7 +337,7 @@ rb_node *rb_tree_succ(rb_node * n)
} }
} }
rb_node *rb_tree_pred(rb_node * n) rb_node *nlopt_rb_tree_pred(rb_node * n)
{ {
if (!n) if (!n)
return NULL; return NULL;
...@@ -356,7 +356,7 @@ rb_node *rb_tree_pred(rb_node * n) ...@@ -356,7 +356,7 @@ rb_node *rb_tree_pred(rb_node * n)
} }
} }
rb_node *rb_tree_remove(rb_tree * t, rb_node * n) rb_node *nlopt_rb_tree_remove(rb_tree * t, rb_node * n)
{ {
rb_key k = n->k; rb_key k = n->k;
rb_node *m, *mp; rb_node *m, *mp;
...@@ -434,9 +434,9 @@ rb_node *rb_tree_remove(rb_tree * t, rb_node * n) ...@@ -434,9 +434,9 @@ rb_node *rb_tree_remove(rb_tree * t, rb_node * n)
return n; /* the node that was deleted may be different from initial n */ return n; /* the node that was deleted may be different from initial n */
} }
rb_node *rb_tree_resort(rb_tree * t, rb_node * n) rb_node *nlopt_rb_tree_resort(rb_tree * t, rb_node * n)
{ {
n = rb_tree_remove(t, n); n = nlopt_rb_tree_remove(t, n);
insert_node(t, n); insert_node(t, n);
return n; return n;
} }
...@@ -452,7 +452,7 @@ static void shift_keys(rb_node * n, ptrdiff_t kshift) ...@@ -452,7 +452,7 @@ static void shift_keys(rb_node * n, ptrdiff_t kshift)
shift_keys(n->r, kshift); shift_keys(n->r, kshift);
} }
void rb_tree_shift_keys(rb_tree * t, ptrdiff_t kshift) void nlopt_rb_tree_shift_keys(rb_tree * t, ptrdiff_t kshift)
{ {
if (t->root != NIL) if (t->root != NIL)
shift_keys(t->root, kshift); shift_keys(t->root, kshift);
......
...@@ -48,26 +48,26 @@ extern "C" { ...@@ -48,26 +48,26 @@ extern "C" {
int N; /* number of nodes */ int N; /* number of nodes */
} rb_tree; } rb_tree;
extern void rb_tree_init(rb_tree * t, rb_compare compare); extern void nlopt_rb_tree_init(rb_tree * t, rb_compare compare);
extern void rb_tree_destroy(rb_tree * t); extern void nlopt_rb_tree_destroy(rb_tree * t);
extern void rb_tree_destroy_with_keys(rb_tree * t); extern void nlopt_rb_tree_destroy_with_keys(rb_tree * t);
extern rb_node *rb_tree_insert(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_insert(rb_tree * t, rb_key k);
extern int rb_tree_check(rb_tree * t); extern int nlopt_rb_tree_check(rb_tree * t);
extern rb_node *rb_tree_find(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find(rb_tree * t, rb_key k);
extern rb_node *rb_tree_find_le(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find_le(rb_tree * t, rb_key k);
extern rb_node *rb_tree_find_lt(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find_lt(rb_tree * t, rb_key k);
extern rb_node *rb_tree_find_gt(rb_tree * t, rb_key k); extern rb_node *nlopt_rb_tree_find_gt(rb_tree * t, rb_key k);
extern rb_node *rb_tree_resort(rb_tree * t, rb_node * n); extern rb_node *nlopt_rb_tree_resort(rb_tree * t, rb_node * n);
extern rb_node *rb_tree_min(rb_tree * t); extern rb_node *nlopt_rb_tree_min(rb_tree * t);
extern rb_node *rb_tree_max(rb_tree * t); extern rb_node *nlopt_rb_tree_max(rb_tree * t);
extern rb_node *rb_tree_succ(rb_node * n); extern rb_node *nlopt_rb_tree_succ(rb_node * n);
extern rb_node *rb_tree_pred(rb_node * n); extern rb_node *nlopt_rb_tree_pred(rb_node * n);
extern void rb_tree_shift_keys(rb_tree * t, ptrdiff_t kshift); extern void nlopt_rb_tree_shift_keys(rb_tree * t, ptrdiff_t kshift);
/* To change a key, use rb_tree_find+resort. Removing a node /* To change a key, use nlopt_rb_tree_find+resort. Removing a node
currently wastes memory unless you change the allocation scheme currently wastes memory unless you change the allocation scheme
in redblack.c */ in redblack.c */
extern rb_node *rb_tree_remove(rb_tree * t, rb_node * n); extern rb_node *nlopt_rb_tree_remove(rb_tree * t, rb_node * n);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
......
...@@ -58,18 +58,18 @@ int main(int argc, char **argv) ...@@ -58,18 +58,18 @@ int main(int argc, char **argv)
N = atoi(argv[1]); N = atoi(argv[1]);
k = (int *) malloc(N * sizeof(int)); k = (int *) malloc(N * sizeof(int));
rb_tree_init(&t, comp); nlopt_rb_tree_init(&t, comp);
srand((unsigned) (argc > 2 ? atoi(argv[2]) : time(NULL))); srand((unsigned) (argc > 2 ? atoi(argv[2]) : time(NULL)));
for (i = 0; i < N; ++i) { for (i = 0; i < N; ++i) {
double *newk = (double *) malloc(sizeof(double)); double *newk = (double *) malloc(sizeof(double));
*newk = (k[i] = rand() % N); *newk = (k[i] = rand() % N);
if (!rb_tree_insert(&t, newk)) { if (!nlopt_rb_tree_insert(&t, newk)) {
fprintf(stderr, "error in rb_tree_insert\n"); fprintf(stderr, "error in nlopt_rb_tree_insert\n");
return 1; return 1;
} }
if (!rb_tree_check(&t)) { if (!nlopt_rb_tree_check(&t)) {
fprintf(stderr, "rb_tree_check_failed after insert!\n"); fprintf(stderr, "nlopt_rb_tree_check_failed after insert!\n");
return 1; return 1;
} }
} }
...@@ -81,34 +81,34 @@ int main(int argc, char **argv) ...@@ -81,34 +81,34 @@ int main(int argc, char **argv)
for (i = 0; i < N; ++i) { for (i = 0; i < N; ++i) {
kd = k[i]; kd = k[i];
if (!rb_tree_find(&t, &kd)) { if (!nlopt_rb_tree_find(&t, &kd)) {
fprintf(stderr, "rb_tree_find lost %d!\n", k[i]); fprintf(stderr, "nlopt_rb_tree_find lost %d!\n", k[i]);
return 1; return 1;
} }
} }
n = rb_tree_min(&t); n = nlopt_rb_tree_min(&t);
for (i = 0; i < N; ++i) { for (i = 0; i < N; ++i) {
if (!n) { if (!n) {
fprintf(stderr, "not enough successors %d\n!", i); fprintf(stderr, "not enough successors %d\n!", i);
return 1; return 1;
} }
printf("%d: %g\n", i, n->k[0]); printf("%d: %g\n", i, n->k[0]);
n = rb_tree_succ(n); n = nlopt_rb_tree_succ(n);
} }
if (n) { if (n) {
fprintf(stderr, "too many successors!\n"); fprintf(stderr, "too many successors!\n");
return 1; return 1;
} }
n = rb_tree_max(&t); n = nlopt_rb_tree_max(&t);
for (i = 0; i < N; ++i) { for (i = 0; i < N; ++i) {
if (!n) { if (!n) {
fprintf(stderr, "not enough predecessors %d\n!", i); fprintf(stderr, "not enough predecessors %d\n!", i);
return 1; return 1;
} }
printf("%d: %g\n", i, n->k[0]); printf("%d: %g\n", i, n->k[0]);
n = rb_tree_pred(n); n = nlopt_rb_tree_pred(n);
} }
if (n) { if (n) {
fprintf(stderr, "too many predecessors!\n"); fprintf(stderr, "too many predecessors!\n");
...@@ -125,17 +125,17 @@ int main(int argc, char **argv) ...@@ -125,17 +125,17 @@ int main(int argc, char **argv)
if (i >= N) if (i >= N)
abort(); abort();
kd = k[i]; kd = k[i];
if (!(n = rb_tree_find(&t, &kd))) { if (!(n = nlopt_rb_tree_find(&t, &kd))) {
fprintf(stderr, "rb_tree_find lost %d!\n", k[i]); fprintf(stderr, "nlopt_rb_tree_find lost %d!\n", k[i]);
return 1; return 1;
} }
n->k[0] = knew; n->k[0] = knew;
if (!rb_tree_resort(&t, n)) { if (!nlopt_rb_tree_resort(&t, n)) {
fprintf(stderr, "error in rb_tree_resort\n"); fprintf(stderr, "error in nlopt_rb_tree_resort\n");
return 1; return 1;
} }
if (!rb_tree_check(&t)) { if (!nlopt_rb_tree_check(&t)) {
fprintf(stderr, "rb_tree_check_failed after change %d!\n", N - M + 1); fprintf(stderr, "nlopt_rb_tree_check_failed after change %d!\n", N - M + 1);
return 1; return 1;
} }
k[i] = -1 - knew; k[i] = -1 - knew;
...@@ -153,9 +153,9 @@ int main(int argc, char **argv) ...@@ -153,9 +153,9 @@ int main(int argc, char **argv)
rb_node *le, *gt; rb_node *le, *gt;
double lek, gtk; double lek, gtk;
kd = 0.01 * (rand() % (N * 150) - N * 25); kd = 0.01 * (rand() % (N * 150) - N * 25);
le = rb_tree_find_le(&t, &kd); le = nlopt_rb_tree_find_le(&t, &kd);
gt = rb_tree_find_gt(&t, &kd); gt = nlopt_rb_tree_find_gt(&t, &kd);
n = rb_tree_min(&t); n = nlopt_rb_tree_min(&t);
lek = le ? le->k[0] : -HUGE_VAL; lek = le ? le->k[0] : -HUGE_VAL;
gtk = gt ? gt->k[0] : +HUGE_VAL; gtk = gt ? gt->k[0] : +HUGE_VAL;
printf("%g <= %g < %g\n", lek, kd, gtk); printf("%g <= %g < %g\n", lek, kd, gtk);
...@@ -172,14 +172,14 @@ int main(int argc, char **argv) ...@@ -172,14 +172,14 @@ int main(int argc, char **argv)
rb_node *succ = n; rb_node *succ = n;
do { do {
n = succ; n = succ;
succ = rb_tree_succ(n); succ = nlopt_rb_tree_succ(n);
} while (succ && succ->k[0] <= kd); } while (succ && succ->k[0] <= kd);
if (n != le) { if (n != le) {
fprintf(stderr, "rb_tree_find_le gave wrong result for k=%g\n", kd); fprintf(stderr, "nlopt_rb_tree_find_le gave wrong result for k=%g\n", kd);
return 1; return 1;
} }
if (succ != gt) { if (succ != gt) {
fprintf(stderr, "rb_tree_find_gt gave wrong result for k=%g\n", kd); fprintf(stderr, "nlopt_rb_tree_find_gt gave wrong result for k=%g\n", kd);
return 1; return 1;
} }
} }
...@@ -194,15 +194,15 @@ int main(int argc, char **argv) ...@@ -194,15 +194,15 @@ int main(int argc, char **argv)
if (i >= N) if (i >= N)
abort(); abort();
kd = k[i]; kd = k[i];
if (!(n = rb_tree_find(&t, &kd))) { if (!(n = nlopt_rb_tree_find(&t, &kd))) {
fprintf(stderr, "rb_tree_find lost %d!\n", k[i]); fprintf(stderr, "nlopt_rb_tree_find lost %d!\n", k[i]);
return 1; return 1;
} }
n = rb_tree_remove(&t, n); n = nlopt_rb_tree_remove(&t, n);
free(n->k); free(n->k);
free(n); free(n);
if (!rb_tree_check(&t)) { if (!nlopt_rb_tree_check(&t)) {
fprintf(stderr, "rb_tree_check_failed after remove!\n"); fprintf(stderr, "nlopt_rb_tree_check_failed after remove!\n");
return 1; return 1;
} }
k[i] = -1 - k[i]; k[i] = -1 - k[i];
...@@ -213,7 +213,7 @@ int main(int argc, char **argv) ...@@ -213,7 +213,7 @@ int main(int argc, char **argv)
return 1; return 1;
} }
rb_tree_destroy(&t); nlopt_rb_tree_destroy(&t);
free(k); free(k);
printf("SUCCESS.\n"); printf("SUCCESS.\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册