--- /dev/null
+#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;
+}