diff options
Diffstat (limited to 'src/km-find.c')
-rw-r--r-- | src/km-find.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/km-find.c b/src/km-find.c index 5ae5948..e9fed0f 100644 --- a/src/km-find.c +++ b/src/km-find.c @@ -28,9 +28,9 @@ find_solve_on_stats( km_find_data_t * const find_data = cb_data; UNUSED(set); - // save total sum and silouette + // save total sum and silhouette find_data->distance_sum = stats->sum; - find_data->silouette = stats->silouette; + find_data->silhouette = stats->silhouette; } static const km_solve_cbs_t @@ -59,7 +59,14 @@ km_find( return false; } - float best_silouette = -2.0; + // allocate row map: row => distance, cluster ID + km_row_map_t * const row_map = calloc(set->num_rows, sizeof(km_row_map_t)); + if (!row_map) { + // return failure + return false; + } + + float best_silhouette = -2.0; for (size_t i = 2; i < cbs->max_clusters; i++) { for (size_t j = 0; j < cbs->num_tests; j++) { // init cluster set @@ -76,8 +83,8 @@ km_find( }; // solve test - // (populates sum and silouette) - if (!km_solve(&cs, set, &FIND_SOLVE_CBS, &find_data)) { + // (populates sum and silhouette) + if (!km_solve(&cs, set, row_map, &FIND_SOLVE_CBS, &find_data)) { // return failure return false; } @@ -88,15 +95,15 @@ km_find( // emit result cbs->on_data(&find_data, cb_data); - if (find_data.silouette > best_silouette) { + if (find_data.silhouette > best_silhouette) { // emit new best result - if (cbs->on_best && !cbs->on_best(find_data.silouette, &cs, cb_data)) { + if (cbs->on_best && !cbs->on_best(find_data.silhouette, &cs, cb_data)) { // return failure return false; } - // update best silouette - best_silouette = find_data.silouette; + // update best silhouette + best_silhouette = find_data.silhouette; } // finalize cluster set @@ -107,6 +114,9 @@ km_find( } } + // free row map + free(row_map); + // return success return true; } |