improve project structure
[epclust.git] / code / stage1 / src / Classification / getClass.c
diff --git a/code/stage1/src/Classification/getClass.c b/code/stage1/src/Classification/getClass.c
new file mode 100644 (file)
index 0000000..aed1467
--- /dev/null
@@ -0,0 +1,46 @@
+#include "Algorithm/get_dissimilarities.h"
+#include "TimeSeries/deserialize.h"
+#include <math.h>
+#include "Algorithm/compute_coefficients.h"
+#include <string.h>
+#include "Util/utils.h"
+
+uint32_t* get_class(PowerCurve* data, uint32_t nbSeries, PowerCurve* medoids, 
+       uint32_t nbClusters, uint32_t nbValues, uint32_t p_for_dissims, double* DISTOR)
+{
+       // nbReducedCoordinates = smallest power of 2 which is above nbValues
+       uint32_t nbReducedCoordinates = (uint32_t)ceil(log2(nbValues));
+
+       // Preprocessing to reduce dimension of both data and medoids
+       Real* reducedCoordinates_data = (Real*) malloc(nbSeries * nbReducedCoordinates * sizeof(Real));
+       compute_coefficients(data, nbSeries, nbValues, 
+               reducedCoordinates_data, 0, nbReducedCoordinates);
+       Real* reducedCoordinates_medoids = (Real*) malloc(nbClusters * nbReducedCoordinates * sizeof(Real));
+       compute_coefficients(medoids, nbClusters, nbValues, 
+               reducedCoordinates_medoids, 0, nbReducedCoordinates);
+       
+       Real* dissimilarities = get_dissimilarities_inter(reducedCoordinates_data, nbSeries, 
+               reducedCoordinates_medoids, nbClusters, nbReducedCoordinates, p_for_dissims);
+       free(reducedCoordinates_data);
+       free(reducedCoordinates_medoids);
+       
+       // 3] Finally, assign each row to the least dissimilar center
+       uint32_t* result = (uint32_t*) malloc(nbSeries*sizeof(uint32_t));
+       for (uint32_t i=0; i<nbSeries; i++)
+       {
+               uint32_t minIndex = 0;
+               Real minDissim = dissimilarities[i*nbClusters + 0];
+               for (uint32_t j=1; j<nbClusters; j++)
+               {
+                       if (dissimilarities[i*nbClusters + j] < minDissim)
+                       {
+                               minDissim = dissimilarities[i*nbClusters + j];
+                               minIndex = j;
+                       }
+               }
+               result[i] = minIndex + 1;
+               (*DISTOR) += minDissim;
+       }
+       free(dissimilarities);
+       return result;
+}