24static double dist(
int dim,
double *x,
double *y){
27 for (k = 0; k <
dim; k++) d += (x[k] - y[k])*(x[k]-y[k]);
36 for (i = 0; i < k; i++){
45 for (i = 0; i < k; i++){
59void furtherest_point(
int k,
int dim,
double *wgt,
double *pts,
double *
center,
double width,
int max_level,
double *dist_max,
double **argmax){
87 for (
int i = 0; i < k; i++) wmax =
MAX(wgt[i], wmax);
95 if (!(*argmax)) *argmax =
gv_calloc(
dim,
sizeof(
double));
96 memcpy(*argmax,
center,
sizeof(
double)*
dim);
98 qt_list_t candidates = {0};
99 qt_list_t candidates2 = {0};
105 while (level++ < max_level){
107 fprintf(stderr,
"level=%d=================\n", level);
110 for (
size_t i = 0; i <
LIST_SIZE(&candidates); i++){
117 fprintf(stderr,
"candidate %" PRISIZE_T " at {", i);
118 for (j = 0; j <
dim; j++) fprintf(stderr,
"%f, ", qt->
center[j]);
125 for (ii = 0; ii < 1<<
dim; ii++) {
132 fprintf(stderr,
"new distmax=%f, pt={", *dist_max);
133 for (j = 0; j <
dim; j++) fprintf(stderr,
"%f, ", qt->
qts[ii]->
center[j]);
134 fprintf(stderr,
"}\n");
136 memcpy(*argmax, qt->
qts[ii]->
center,
sizeof(
double)*
dim);
146 SWAP(&candidates, &candidates2);
157 double *dist_max,
double **argmax){
189 for (
int i = 0; i < k; i++) wmax =
MAX(wgt[i], wmax);
196 if (!(*argmax)) *argmax =
gv_calloc(
dim,
sizeof(
double));
197 memcpy(*argmax, average,
sizeof(
double)*
dim);
199 qt_list_t candidates = {0};
200 qt_list_t candidates2 = {0};
206 while (level++ < max_level){
208 fprintf(stderr,
"level=%d=================\n", level);
211 for (
size_t i = 0; i <
LIST_SIZE(&candidates); i++){
215 fprintf(stderr,
"candidate %" PRISIZE_T " at {", i);
216 for (j = 0; j <
dim; j++) fprintf(stderr,
"%f, ", qt->
center[j]);
221 if (qt->
n == 1 ||
distance + wmax*2*sqrt(((
double)
dim))*qt->
width < *dist_max)
continue;
224 if (!(qt->
qts))
continue;
226 for (ii = 0; ii < 1<<
dim; ii++) {
227 if (!(qt->
qts[ii]))
continue;
233 fprintf(stderr,
"new distmax=%f, pt={", *dist_max);
234 for (j = 0; j <
dim; j++) fprintf(stderr,
"%f, ", qt->
qts[ii]->
average[j]);
235 fprintf(stderr,
"}\n");
247 SWAP(&candidates, &candidates2);
QuadTree QuadTree_new_in_quadrant(int dim, double *center, double width, int max_level, int i)
QuadTree QuadTree_new(int dim, double *center, double width, int max_level)
void QuadTree_delete(QuadTree q)
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
void furtherest_point_in_list(int k, int dim, double *wgt, double *pts, QuadTree qt, int max_level, double *dist_max, double **argmax)
static double dist(int dim, double *x, double *y)
static double distance_to_group(int k, int dim, double *wgt, double *pts, double *center)
void furtherest_point(int k, int dim, double *wgt, double *pts, double *center, double width, int max_level, double *dist_max, double **argmax)
double distance(double *x, int dim, int i, int j)
Arithmetic helper functions.
type-generic dynamically expanding list
#define LIST_APPEND(list, item)
#define LIST_GET(list, index)
static point center(point vertex[], size_t n)