diff --git a/TutoImportation.md b/TutoImportation.md index 592e0443424a4a1fd680597de456ad7efc519c09..d9d265925512ae680dec9284d36b8e90884d68fb 100644 --- a/TutoImportation.md +++ b/TutoImportation.md @@ -2,9 +2,9 @@ #### Préambule -Avant de commencer, sachez que cette importation nécessite certaines connaissances en Java ou en programmation orientée objet. Toutefois, si vous n'êtes pas familier avec ces concepts, ce tutoriel vous guidera à travers toutes les étapes nécessaires pour importer de nouvelles données. +Avant de commencer, sachez que cette importation nécessite certaines connaissances en Java ou en programmation orientée objet. Cependant, si vous n'êtes pas familier avec ces concepts, ce tutoriel vous guidera à travers toutes les étapes nécessaires pour importer de nouvelles données. -Assurez-vous que votre base de données est sous forme de fichier CSV, avec les noms des colonnes sur la première ligne. Il est également essentiel de savoir quelles données vous souhaitez analyser. Cette étape est indépendante du logiciel que vous utilisez, et dépend plutôt de la manière dont vous allez importer vos données. +Assurez-vous que votre base de données est sous forme de fichier CSV, avec les noms des colonnes sur la première ligne. Il est également essentiel de savoir quelles données vous souhaitez analyser. Cette étape est indépendante du logiciel que vous utilisez et dépend plutôt de la manière dont vous allez importer vos données. --- @@ -27,19 +27,20 @@ private double column4; Réitérez cette opération pour toutes les colonnes de votre CSV. Vous remarquerez qu’il est nécessaire d’attribuer un type à chaque attribut. Assurez-vous de bien distinguer les types numériques (entiers, réels) des chaînes de caractères. -Ensuite, créez les différents constructeurs pour votre classe. Commencez par un constructeur vide, indispensable au bon fonctionnement de l’importation : +Ensuite, créez les différents constructeurs pour votre classe. Commencez par un constructeur vide, indispensable au bon fonctionnement de l’importation. N'oubliez pas d'initialiser la donnée à classifier par défaut. Par exemple, la première donnée correspond à l'indice 0 : ```java public [NomDeLaClasse]() { - // Constructeur vide + classificationType = [numéro de la donnée à classifier]; } ``` -Puis, créez un constructeur prenant en paramètre tous les attributs définis précédemment : +Puis, créez un constructeur prenant en paramètre tous les attributs définis précédemment, ainsi que le numéro de la donnée à classifier, la première donnée correspondant à l'indice 0 : ```java public [NomDeLaClasse](String column1, int column2, boolean column3, double column4) { super(); + classificationType = [numéro de la donnée à classifier]; this.column1 = column1; this.column2 = column2; this.column3 = column3; @@ -59,17 +60,55 @@ Ensuite, modifiez les méthodes `getClassification()` et `setClassification()` p ```java @Override -public String getClassification() { - return [DonnéeÀClassifier]; +public String getClassification() throws IllegalAccessException { + return (String) this.getClass().getDeclaredFields()[classificationType].get(this).toString(); } @Override -public void setClassification(String classification) { - this.[DonnéeÀClassifier] = classification; +public void setClassification(String classification) throws IllegalAccessException { + this.getClass().getDeclaredFields()[classificationType].set(this, classification); } ``` -La méthode `getAttributesNames()` permet de renvoyer les différents attributs étudiés dans le graphe, c'est-à-dire tous les attributs sauf celui que vous souhaitez classifier. Vous pouvez rendre les noms des attributs plus lisibles que leur nom de variable, comme dans l’exemple ci-dessous : +Il vous suffit ensuite de copier-coller cette méthode pour pouvoir définir le type de classification actuel : + +```java +public void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException { + if (classificationType < 0 || classificationType >= getAttributesNames().size()) { + throw new IllegalArgumentException("Cet attribut n'existe pas."); + } + String keyToVerify = getAttributesNames().keySet().toArray(new String[0])[classificationType]; + if (!getClassifiedAttributes().containsKey(keyToVerify)) { + throw new IllegalArgumentException("Cet attribut ne peut pas être utilisé pour la classification."); + } + LoadableData.classificationType = classificationType; + LoadableData.setClassificationTypes(ClassificationModel.getClassificationModel().getDatas()); +} +``` + +Vous devez ensuite inscrire les différentes classifications que vous souhaitez étudier : + +```java +public Map<String, Object> getClassifiedAttributes() { + Map<String, Object> attributes = new LinkedHashMap<>(); + attributes.put("column1", column1); + attributes.put("column2", column2); + attributes.put("column3", column3); + attributes.put("column4", column4); + return attributes; +} +``` + +Puis ajoutez cette méthode pour pouvoir définir le type de classification : + +```java +@Override +public int getClassificationType() { + return classificationType; +} +``` + +La méthode `getAttributesNames()` renvoie les différents attributs étudiés dans le graphe, c'est-à-dire tous les attributs sauf celui que vous souhaitez classifier. Vous pouvez rendre les noms des attributs plus lisibles que leur nom de variable, comme dans l’exemple ci-dessous : ```java @Override @@ -88,7 +127,7 @@ La méthode `getAttributes()` permet de renvoyer les différents attributs numé ```java @Override public double[] getAttributes() { - return new double[]{column1, column2, column3, column4}; + return new double[]{column1, column2, column3 ? 1.0 : 0.0, column4}; // Assurez-vous de convertir les booléens } ``` @@ -97,7 +136,7 @@ La méthode `getStringAttributes()` renvoie un tableau d'attributs de type chaî ```java @Override public String[] getStringAttributes() { - return new String[]{column1, String.valueOf(column2)}; + return new String[]{column1, String.valueOf(column2), String.valueOf(column3)}; } ``` @@ -134,4 +173,4 @@ case [Nom des données]: --- -Ces explications devraient vous permettre d’ajouter des données à la classification. Si vous rencontrez des difficultés lors de votre implémentation, n'hésitez pas à relire ce tutoriel ou à consulter les implémentations existantes. \ No newline at end of file +Ces explications devraient vous permettre d’ajouter des données à la classification. Si vous rencontrez des difficultés lors de votre implémentation, n'hésitez pas à relire ce tutoriel ou à consulter les implémentations existantes. Veillez à vous assurer que toutes les méthodes ont bien été implémentées, sinon l'implémentation ne fonctionnera pas correctement. diff --git a/res/stages/axes-settings-stage.fxml b/res/stages/axes-settings-stage.fxml index e19aa3020780237261a7602394e6b241b1913e23..f5bcb1d57a7fb0017b0b0086b7f40d2405cde7c3 100644 --- a/res/stages/axes-settings-stage.fxml +++ b/res/stages/axes-settings-stage.fxml @@ -84,11 +84,6 @@ </children></AnchorPane> </content> </Tab> - <Tab text="Couleurs des données"> - <content> - <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> - </content> - </Tab> </tabs> </TabPane> </children></AnchorPane> diff --git a/res/stages/choose-attributes.fxml b/res/stages/choose-attributes.fxml index e16bafd0057ed87a9f7b09cfc503c9e7f610a4e7..b046d8b6bc710a876fb1681854c3cdb24c1431ef 100644 --- a/res/stages/choose-attributes.fxml +++ b/res/stages/choose-attributes.fxml @@ -1,14 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> -<?import javafx.scene.Scene?> -<?import javafx.scene.control.Button?> -<?import javafx.scene.control.ChoiceBox?> -<?import javafx.scene.layout.AnchorPane?> -<?import javafx.scene.layout.VBox?> -<?import javafx.scene.text.Text?> -<?import javafx.stage.Stage?> +<?import javafx.scene.*?> +<?import javafx.scene.control.*?> +<?import javafx.scene.layout.*?> +<?import javafx.scene.text.*?> +<?import javafx.stage.*?> -<Stage fx:id="stage" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.ChooseAttributesController"> +<Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.ChooseAttributesController"> <scene> <Scene> <AnchorPane prefHeight="175.0" prefWidth="317.0"> @@ -17,7 +15,10 @@ <children> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Veuillez selectionner l'attribut sur lequel vous souhaitez classifier les données" textAlignment="CENTER" wrappingWidth="254.06924438476562" /> <ChoiceBox fx:id="choice" prefWidth="150.0" stylesheets="@../css/style.css" /> - <Button mnemonicParsing="false" onAction="#validate" stylesheets="@../css/style.css" text="Valider" textFill="WHITE" /> + <Button mnemonicParsing="false" onAction="#validate" stylesheets="@../css/style.css" text="Valider" textFill="WHITE"> + <font> + <Font name="System Bold" size="13.0" /> + </font></Button> </children> </VBox> </children></AnchorPane> diff --git a/res/stages/k-NN-stage.fxml b/res/stages/k-NN-stage.fxml index d85e37816d2a07190893f8454bbc57f4dc5c0871..0098c9719114f20d296fe1ef34c6d6b8666f3301 100644 --- a/res/stages/k-NN-stage.fxml +++ b/res/stages/k-NN-stage.fxml @@ -36,7 +36,7 @@ </HBox> <HBox alignment="CENTER" prefHeight="36.0" prefWidth="364.0" spacing="20.0"> <children> - <Spinner fx:id="kEntry" /> + <Spinner fx:id="kEntry" stylesheets="@../css/style.css" /> <Button fx:id="autoK" mnemonicParsing="false" onAction="#bestK" stylesheets="@../css/style.css" text="Attribution auto" textFill="WHITE"> <font> <Font name="System Bold" size="13.0" /> @@ -46,7 +46,7 @@ </HBox> <HBox alignment="CENTER" prefHeight="59.0" prefWidth="364.0"> <children> - <Button fx:id="confirmK" onAction="#validate" mnemonicParsing="false" stylesheets="@../css/style.css" text="Valider" textFill="WHITE"> + <Button fx:id="confirmK" mnemonicParsing="false" onAction="#validate" stylesheets="@../css/style.css" text="Valider" textFill="WHITE"> <font> <Font name="System Bold" size="14.0" /> </font></Button> diff --git a/res/stages/load-data-stage.fxml b/res/stages/load-data-stage.fxml index 6c6f3fc9506adec0621557c674947a76c68e0ef8..026abc2aa9d7e6991c65b0d8924e9a4b797d6c48 100644 --- a/res/stages/load-data-stage.fxml +++ b/res/stages/load-data-stage.fxml @@ -29,7 +29,10 @@ </HBox> <HBox alignment="CENTER" prefHeight="76.0" prefWidth="310.0"> <children> - <Button fx:id="confirmDataSelection" mnemonicParsing="false" onAction="#validate" stylesheets="@../css/style.css" text="Valider" textFill="WHITE" /> + <Button fx:id="confirmDataSelection" mnemonicParsing="false" onAction="#validate" stylesheets="@../css/style.css" text="Valider" textFill="WHITE"> + <font> + <Font name="System Bold" size="13.0" /> + </font></Button> </children> </HBox> </children> diff --git a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java index 4d38f1f0d7b078b7a5511cae8186bc47f2b122cf..d43cf728c2ede7f6b8d12c3fb539138ce2dae351 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java @@ -13,10 +13,7 @@ import javafx.stage.Stage; import java.io.IOException; import java.lang.reflect.Array; import java.time.temporal.Temporal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Controlleur pour le FXML add-data-stage, pour ajouter une nouvelle donnée