From 197b747da1af5afeb45bcc7229b24eb4de51e498 Mon Sep 17 00:00:00 2001
From: "dario.genga" <dario.genga@etu.hesge.ch>
Date: Sat, 18 Jun 2022 22:01:03 +0200
Subject: [PATCH] Update readme and distance used

---
 .gitignore |  1 -
 README.md  | 62 +++++++++++++++++++++++++++++++++++++++++-------------
 kmeans.c   |  6 +++---
 3 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/.gitignore b/.gitignore
index 90da48c..42b5b5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -80,6 +80,5 @@ dkms.conf
 # Custom gitignore for project
 main
 tests
-output_data.txt
 cmake-build-debug
 .idea
\ No newline at end of file
diff --git a/README.md b/README.md
index 969b7cd..a04f683 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,48 @@
 # K-means
 Travail réalisé par : Dario GENGA
 
-Bref rappel de l'énoncé :
-## But
+## Structure du projet
+
+- files_utils (.c/.h) : Fichiers contenant les méthodes de manipulation de fichiers.
+- values_utils (.c/.h) : Fichiers contenant les méthodes de swap, génération aléatoires de nombres et de calcul de distances.
+- kmeans (.c/.h) : Fichiers contenant les méthodes appliquant l'algorithme K-means.
+- main.c : Fichier principal du projet servant à exécuter l'algorithme.
+- main : Exécutable du projet.
+- values_utils_tests.c : Fichier de test pour les méthodes de calcul de distances.
+
+## Exécuter le programme
+
+Compiler le programme avec la commande `make`.
+
+Exécuter le fichier `main` de l'une des manières suivantes :
+
+`./main` : Sans arguments, le programme vous demandera de les saisir.
+
+`./main <path_to_custom_data_source>` : Passe en paramètre le chemin d'un fichier source définit comme dans  l'énoncé.
+Crée le fichier `output.txt` qui contiendra le résultat du clustering.
+
+`./main <path_to_custom_data_source> <output_path>` : Même chose qu'avant mais l'utilisateur définit lui-même le chemin de sortie.
+
+`./main <number of dimensions> <number of cluster> <path_to_data_source> <output_path>` : Configure intégralement le clustering avec les arguments du programme. Attention, le fichier source ne doit pas contenir les lignes pour le nombre de clusters et le nombre de dimensions. Un fichier CSV (séparé par des virgules) est recommandé.
+
+Quelques exemples d'exécution : 
+
+`./main source_data.txt`
+
+`./main 2 5 country.csv country_result.txt`
+
+## Rappel de l'énoncé
+Voir le fichier `enonce.pdf` pour la version au propre.
+
+### But
 
 Le but de ce travail est d'implémenter la méthode des k-moyennes
 pour partitionner des données de façon non supervisée.
 
-# Implémentation
+## Implémentation
 
 
-## Format d'entrée
+### Format d'entrée
 
 L'entrée sera un fichier spécifié en argument au programme.
 Si aucun argument est fourni, le fichier d'entrée sera l'entrée standard (stdin).
@@ -30,7 +62,7 @@ y1,y2,...,yn
 ```
 
 
-## Format de sortie
+### Format de sortie
 
 La sortie sera écrite dans un fichier spécifié en argument au programme.
 Si aucun argument est fourni, le fichier de sortie sera la sortie standard (stdout).
@@ -57,7 +89,7 @@ t1,t2,...,tn
 ```
 
 
-## Interface utilisateur
+### Interface utilisateur
 
 Le programme fonctionnera entièrement en ligne de commande.
 Les formats d'entrée et de sortie ont été choisis pour être
@@ -65,7 +97,7 @@ Les formats d'entrée et de sortie ont été choisis pour être
 à l'utilisateur.
 
 
-## Déroulement de l'exécution du programme
+### Déroulement de l'exécution du programme
 
 - appel de la commande avec éventuellement le passage des
   fichiers d'entrée et de sortie en argument
@@ -78,7 +110,7 @@ Les formats d'entrée et de sortie ont été choisis pour être
   (ou de la sortie standard, selon les arguments passés au programme)
 
 
-## Fonctions à implémenter
+### Fonctions à implémenter
 
 Il faut absolument implémenter les fonctionnalités suivantes:
 
@@ -90,15 +122,15 @@ Il faut absolument implémenter les fonctionnalités suivantes:
 - les étapes de l'algorithme k-means
 
 
-## Travail supplémentaire possible
+### Travail supplémentaire possible
 
-### Affichage en temps réel
+#### Affichage en temps réel
 
 Au lieu d'afficher uniquement le résultat final, il s'agirait
 d'afficher chaque étape effectuée afin de pouvoir observer
 l'algorithme en action.
 
-### Déterminer le nombre de clusters optimal
+#### Déterminer le nombre de clusters optimal
 
 Faire des recherches sur les méthodes permettant d'optimiser
 le nombre de clusters et les implémenter.
@@ -108,7 +140,7 @@ de clusters souhaité.
 De légères modifications du format sont envisageables pour autant
 qu'elles soient justifiées.
 
-### Interface graphique
+#### Interface graphique
 
 On peut imaginer créer une interface graphique permettant de visualiser
 le résultat dans une fenêtre graphique.
@@ -116,7 +148,7 @@ Pour cela, une option serait de mettre à profit la librairie gfx
 utilisée pendant les labos de physique.
 
 
-## Vérification du travail réalisé
+### Vérification du travail réalisé
 
 Il serait bon de mettre en place des tests unitaires pour les
 fonctions implémentées.
@@ -127,14 +159,14 @@ Néanmoins, un point placé dans le mauvais groupe est facile à identifier
 par comparaison des distances du point aux différents centroïdes.
 
 
-# Travail à rendre
+## Travail à rendre
 
 - repo git contenant le code réalisé
 - présentation du travail à l'aide d'un support (projection)
 - démonstration du programme
 
 
-# Références
+## Références
 
 https://www.editions-eni.fr/livre/le-machine-learning-avec-python-de-la-theorie-a-la-pratique-9782409031816/extrait-du-livre.pdf
 
diff --git a/kmeans.c b/kmeans.c
index eadded0..206c93e 100644
--- a/kmeans.c
+++ b/kmeans.c
@@ -247,11 +247,11 @@ float compute_distance(point* p1, point* p2) {
         printf("The points don't have the same dimensions!\n");
         exit(EXIT_FAILURE);
     }
-    float euclidean = compute_euclidean_distance(p1->value, p2->value, p1->dimensions);
-    //float manhattan = compute_manhattan_distance(p1->value, p2->value, p1->dimensions);
+    //float euclidean = compute_euclidean_distance(p1->value, p2->value, p1->dimensions);
+    float manhattan = compute_manhattan_distance(p1->value, p2->value, p1->dimensions);
     //float chebyshev = compute_chebyshev_distance(p1->value, p2->value, p1->dimensions);
 
-    return euclidean;
+    return manhattan;
 }
 
 bool compute_center_of_gravity(cluster* clstr, kmeans* universe) {
-- 
GitLab