aboutsummaryrefslogtreecommitdiff
path: root/src/km-find.c
diff options
context:
space:
mode:
authorPaul Duncan <pabs@pablotron.org>2019-02-05 11:08:51 -0500
committerPaul Duncan <pabs@pablotron.org>2019-02-05 11:08:51 -0500
commit42a5ea32a5bbba10b112a601ea8f34412842f1c3 (patch)
tree91b6ac1e940cc3d24fb2258df03bd16d6a11cbdd /src/km-find.c
parent7907db7627aafa35a45f7246e79f5369b6714828 (diff)
downloadkmeans-42a5ea32a5bbba10b112a601ea8f34412842f1c3.tar.bz2
kmeans-42a5ea32a5bbba10b112a601ea8f34412842f1c3.zip
use openmp, s/silouette/silhouette/, move row_map allocation outside of km_solve()
Diffstat (limited to 'src/km-find.c')
-rw-r--r--src/km-find.c28
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;
}