283{
285 uint32_t cur_k = min_k;
286
288
289 update_r(objs, clusters, n, centers, radii, cur_k);
292 {
293
295 {
297 converged =
update_r(objs, clusters, n, centers, radii, cur_k);
298 if (converged)
299 break;
301 }
302 if (!converged || !max_radius)
303 break;
304
305
306 uint32_t new_k =
improve_structure(objs, clusters, n, centers, radii, cur_k, max_radius);
307 if (new_k == cur_k)
308 break;
309 cur_k = new_k;
310 }
311
312 if (!converged)
313 {
315 return 0;
316 }
317 return cur_k;
318}
#define LW_ON_INTERRUPT(x)
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
#define KMEANS_MAX_ITERATIONS
static void kmeans_init(POINT4D *objs, uint32_t n, POINT4D *centers, uint32_t k)
static uint8_t update_r(POINT4D *objs, uint32_t *clusters, uint32_t n, POINT4D *centers, double *radii, uint32_t k)
static void update_means(POINT4D *objs, uint32_t *clusters, uint32_t n, POINT4D *centers, uint32_t k)
static uint32_t improve_structure(POINT4D *objs, uint32_t *clusters, uint32_t n, POINT4D *centers, double *radii, uint32_t k, double max_radius)