aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/ndpi_api.h.in3
-rw-r--r--src/lib/ndpi_analyze.c34
2 files changed, 22 insertions, 15 deletions
diff --git a/src/include/ndpi_api.h.in b/src/include/ndpi_api.h.in
index 94f5f54fe..b21bcd3fe 100644
--- a/src/include/ndpi_api.h.in
+++ b/src/include/ndpi_api.h.in
@@ -1078,7 +1078,8 @@ extern "C" {
char* ndpi_print_bin(struct ndpi_bin *b, u_int8_t normalize_first, char *out_buf, u_int out_buf_len);
float ndpi_bin_similarity(struct ndpi_bin *b1, struct ndpi_bin *b2, u_int8_t normalize_first);
int ndpi_cluster_bins(struct ndpi_bin *bins, u_int16_t num_bins,
- u_int8_t num_clusters, u_int16_t *cluster_ids);
+ u_int8_t num_clusters, u_int16_t *cluster_ids,
+ struct ndpi_bin *centroids);
#ifdef __cplusplus
}
diff --git a/src/lib/ndpi_analyze.c b/src/lib/ndpi_analyze.c
index 8d4e939f0..8c21c0e0e 100644
--- a/src/lib/ndpi_analyze.c
+++ b/src/lib/ndpi_analyze.c
@@ -476,25 +476,29 @@ float ndpi_bin_similarity(struct ndpi_bin *b1, struct ndpi_bin *b2, u_int8_t nor
- (in) bins: a vection 'num_bins' long of bins to cluster
- (in) 'num_clusters': number of desired clusters 0...(num_clusters-1)
- (out) 'cluster_ids': a vector 'num_bins' long containing the id's of each clustered bin
-
+ - (out) 'centroids': an optional 'num_clusters' long vector of (centroid) bins
See
- https://en.wikipedia.org/wiki/K-means_clustering
*/
int ndpi_cluster_bins(struct ndpi_bin *bins, u_int16_t num_bins,
- u_int8_t num_clusters, u_int16_t *cluster_ids) {
+ u_int8_t num_clusters, u_int16_t *cluster_ids,
+ struct ndpi_bin *centroids) {
u_int16_t i, j, max_iterations = 100, num_iterations = 0, num_moves;
- struct ndpi_bin *centroids;
- u_int8_t verbose = 0;
+ u_int8_t verbose = 0, alloc_centroids = 0;
if(num_clusters > num_bins) return(-1);
- if((centroids = (struct ndpi_bin*)ndpi_malloc(sizeof(struct ndpi_bin)*num_clusters)) == NULL)
- return(-2);
- else {
- for(i=0; i<num_clusters; i++)
- ndpi_init_bin(&centroids[i], ndpi_bin_family32 /* Use 32 bit to avoid overlaps */, bins[0].num_bins);
- }
+ if(centroids == NULL) {
+ alloc_centroids = 1;
+ if((centroids = (struct ndpi_bin*)ndpi_malloc(sizeof(struct ndpi_bin)*num_clusters)) == NULL)
+ return(-2);
+ else {
+ for(i=0; i<num_clusters; i++)
+ ndpi_init_bin(&centroids[i], ndpi_bin_family32 /* Use 32 bit to avoid overlaps */, bins[0].num_bins);
+ }
+ }
+
/* Reset the id's */
memset(cluster_ids, 0, sizeof(u_int16_t) * num_bins);
@@ -570,11 +574,13 @@ int ndpi_cluster_bins(struct ndpi_bin *bins, u_int16_t num_bins,
break;
}
- for(i=0; i<num_clusters; i++)
- ndpi_free_bin(&centroids[i]);
-
- ndpi_free(centroids);
+ if(alloc_centroids) {
+ for(i=0; i<num_clusters; i++)
+ ndpi_free_bin(&centroids[i]);
+ ndpi_free(centroids);
+ }
+
return(0);
}