FIX: C code (double, float, ...) + wrapper (read/write data, get medoids)
[epclust.git] / code / stage1 / src / Algorithm / pam.c
index ecd72c3..60e3efe 100644 (file)
@@ -27,11 +27,11 @@ static void sample(uint32_t* v, uint32_t n, uint32_t k)
 
 // assign a vector (represented by its dissimilarities to others, as dissimilarities[index,])
 // to a cluster, represented by its center ==> output is integer in 0..K-1
-static uint32_t assignCluster(uint32_t index, Real* dissimilarities,
+static uint32_t assignCluster(uint32_t index, float* dissimilarities,
        uint32_t* centers, uint32_t n, uint32_t K)
 {
        uint32_t minIndex = 0;
-       Real minDist = dissimilarities[index * n + centers[0]];
+       float minDist = dissimilarities[index * n + centers[0]];
 
        for (uint32_t j = 1; j < K; j++)
        {
@@ -46,8 +46,8 @@ static uint32_t assignCluster(uint32_t index, Real* dissimilarities,
 }
 
 // assign centers given a clustering, and also compute corresponding distortion
-static void assign_centers(uint32_t nbClusters, Vector** clusters, Real* dissimilarities,
-       uint32_t nbItems, uint32_t* ctrs, Real* distor)
+static void assign_centers(uint32_t nbClusters, Vector** clusters, float* dissimilarities,
+       uint32_t nbItems, uint32_t* ctrs, float* distor)
 {
        *distor = 0.0;
        // TODO [heuristic]: checking only a neighborhood of the former center ?
@@ -55,13 +55,13 @@ static void assign_centers(uint32_t nbClusters, Vector** clusters, Real* dissimi
        {
                // If the cluster is empty, choose a center at random (pathological case...)
                uint32_t minIndex = get_rand_int() % nbItems;
-               Real minSumDist = INFINITY;
+               float minSumDist = INFINITY;
                for (uint32_t i = 0; i < vector_size(clusters[j]); i++)
                {
                        uint32_t index1;
                        vector_get(clusters[j], i, index1);
                        // attempt to use current index as center
-                       Real sumDist = 0.0;
+                       float sumDist = 0.0;
                        for (uint32_t ii = 0; ii < vector_size(clusters[j]); ii++)
                        {
                                uint32_t index2;
@@ -80,7 +80,7 @@ static void assign_centers(uint32_t nbClusters, Vector** clusters, Real* dissimi
 }
 
 // Core PAM algorithm from a dissimilarity matrix; (e.g. nstart=10, maxiter=100)
-void pam(Real* dissimilarities, uint32_t nbItems, uint32_t nbClusters, int clustOnMedoids,
+void pam(float* dissimilarities, uint32_t nbItems, uint32_t nbClusters, int clustOnMedoids,
        uint32_t nbStart, uint32_t maxNbIter, Result_t* result)
 {
        uint32_t* ctrs = result->medoids_ranks; //shorthand
@@ -93,7 +93,7 @@ void pam(Real* dissimilarities, uint32_t nbItems, uint32_t nbClusters, int clust
                bestClusts[j] = vector_new(uint32_t);
        }
 
-       Real lastDistor, distor, bestDistor = INFINITY;
+       float lastDistor, distor, bestDistor = INFINITY;
        for (uint32_t startKount = 0; startKount < nbStart; startKount++)
        {
                // centers (random) [re]initialization