diff --git a/TP1/BubbleCursor.py b/TP1/BubbleCursor.py index 49d54c06e02cbb81d3924c1d3f0c3956ccca3a2f..d4eed38878f465de878350cb3b0dcf247f1a4f01 100644 --- a/TP1/BubbleCursor.py +++ b/TP1/BubbleCursor.py @@ -30,5 +30,4 @@ class BubbleCursor: if previous_closest != self.closest: if previous_closest: previous_closest.highlighted = False - self.closest.highlighted = True - + self.closest.highlighted = True \ No newline at end of file diff --git a/TP1/BubbleWidget.py b/TP1/BubbleWidget.py index 4b20faf1e9fc85d9d520ffa6356638778899de72..22f8a86050cdaa08ca60b29c9874e35a3bb5c77f 100644 --- a/TP1/BubbleWidget.py +++ b/TP1/BubbleWidget.py @@ -1,26 +1,36 @@ -import csv, random, time +import csv +import random + +import time from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QWidget -from Target import Target + from BubbleCursor import BubbleCursor +from Target import Target + class BubbleWidget(QWidget): - def __init__(self): + def __init__(self, file_name, exp_setup, number_of_targets): super().__init__() + self.exp_setup = exp_setup self.targets = [] - self.loadTargets() - self.cursor = BubbleCursor(self.targets) self.setMouseTracking(True) self.start_time = None - self.selectRandomTarget() + self.errors = 0 - def loadTargets(self): - with open('src_tp_bubble.csv', newline='') as csvfile: + # Chargement du fichier csv + with open(file_name) as csvfile: reader = csv.reader(csvfile) for row in reader: - if len(row) >= 3: - x, y, size = map(int, row[:3]) - self.targets.append(Target(x,y,size)) + x = int(row[0]) + y = int(row[1]) + size = int(row[2]) + target = Target(x, y, size) + self.targets.append(target) + + self.target_to_select = self.targets[:number_of_targets] + self.cursor = BubbleCursor(self.targets) + self.selectRandomTarget() def paintEvent(self, event): painter = QPainter(self) @@ -35,15 +45,23 @@ class BubbleWidget(QWidget): def selectRandomTarget(self): if self.start_time == None: self.start_time = time.time() - target = random.choice(self.targets) + target = self.target_to_select.pop() target.toSelect = True self.update() - def printTime(self): - print((time.time() - self.start_time)*1000) + def printLog(self): + current_time = (time.time() - self.start_time)*1000 + self.exp_setup.add_line_to_response(current_time, self.errors) + self.errors = 0 self.start_time = None def mousePressEvent(self, event): - if self.cursor.closest.click_cible(): - self.printTime() - self.selectRandomTarget() \ No newline at end of file + if self.cursor.closest is not None: + if self.cursor.closest.click_cible(): + self.printLog() + if len(self.target_to_select) > 0: + self.selectRandomTarget() + else: + self.exp_setup.next_experience() + else: + self.errors += 1 diff --git a/TP1/MainBubble.py b/TP1/MainBubble.py index 22990badbd4ea889c7361a5b01d99a77600745f1..bbfdcf3490f0eac5a92242e25d00cca6fcb01645 100644 --- a/TP1/MainBubble.py +++ b/TP1/MainBubble.py @@ -3,14 +3,18 @@ import sys from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QApplication, QMainWindow from BubbleWidget import BubbleWidget + +file_name = "data/src_tp_bubble.csv" def main(): app = QApplication(sys.argv) main_window = QMainWindow() main_window.resize(1024, 800) - bubble_widget = BubbleWidget() + bubble_widget = BubbleWidget(file_name) main_window.setCentralWidget(bubble_widget) main_window.show() sys.exit(app.exec_()) if __name__ == "__main__": + if len(sys.argv) == 2: + file_name = sys.argv[1] main() diff --git a/TP1/MainNormal.py b/TP1/MainNormal.py index 73a04e56a5dd64ad80b1e08b46fa7505e33015f0..d932cb9c0576e2c12e9668c78fb85415b8f4ce71 100644 --- a/TP1/MainNormal.py +++ b/TP1/MainNormal.py @@ -1,13 +1,19 @@ +import sys + from PyQt5.QtWidgets import QApplication, QMainWindow from NormalWidget import NormalWidget + +file_name = "data/src_tp_bubble.csv" def main(): app = QApplication([]) window = QMainWindow() window.resize(1024, 800) - normalWidget = NormalWidget() + normalWidget = NormalWidget(file_name) window.setCentralWidget(normalWidget) window.show() app.exec_() if __name__ == "__main__": + if len(sys.argv) == 2: + file_name = sys.argv[1] main() diff --git a/TP1/MainRope.py b/TP1/MainRope.py index e9519fb7cc860234008ae68547634186653d38ac..dd1c364d04d6a5e1e602bf72e3cb0afb2f65ed9f 100644 --- a/TP1/MainRope.py +++ b/TP1/MainRope.py @@ -1,10 +1,12 @@ from PyQt5.QtWidgets import QApplication, QMainWindow from RopeWidget import RopeWidget + +file_name = "data/src_tp_bubble.csv" def main(): app = QApplication([]) window = QMainWindow() window.resize(1024, 800) - bubble_widget = RopeWidget() + bubble_widget = RopeWidget(file_name) window.setCentralWidget(bubble_widget) window.show() app.exec_() diff --git a/TP1/NormalCursor.py b/TP1/NormalCursor.py index a2339e29affb24a6b58f98723a64dd6b154fc9ed..bc38c2d697a08531bd1b56f0f3b5ce05e25434c5 100644 --- a/TP1/NormalCursor.py +++ b/TP1/NormalCursor.py @@ -11,16 +11,19 @@ class NormalCursor: def move(self, x, y): self.x = x self.y = y - previous_closest = self.closest + closest_target = None + min_distance = float('inf') for target in self.targets: - distance = ((self.x - target.x) ** 2 + (self.y - target.y) ** 2) ** 0.5 # cf. Theoreme de Pythagore + distance = ((self.x - target.x) ** 2 + (self.y - target.y) ** 2) ** 0.5 + if distance < min_distance: + min_distance = distance + closest_target = target - if distance < target.size/2: - self.closest = target - self.closest.highlighted = True + if closest_target and min_distance < closest_target.size / 2: + closest_target.highlighted = True + else: + if self.closest and self.closest != closest_target: + self.closest.highlighted = False - if previous_closest is not None: - distance = ((self.x - previous_closest.x) ** 2 + (self.y - previous_closest.y) ** 2) ** 0.5 # cf. Theoreme de Pythagore - if distance > previous_closest.size / 2: - previous_closest.highlighted = False \ No newline at end of file + self.closest = closest_target \ No newline at end of file diff --git a/TP1/NormalWidget.py b/TP1/NormalWidget.py index 9f34fb9eb50f719b48c421e28d7fb2e4af5137fe..2cbcbe7d6866f78513bb2d774682bfe21c193fdc 100644 --- a/TP1/NormalWidget.py +++ b/TP1/NormalWidget.py @@ -1,26 +1,35 @@ -import csv, random, time +import csv +import random + +import time from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QWidget + +from NormalCursor import NormalCursor from Target import Target -from TP1.NormalCursor import NormalCursor class NormalWidget(QWidget): - def __init__(self): + def __init__(self, file_name, exp_setup, number_of_targets): super().__init__() self.targets = [] - self.loadTargets() - self.cursor = NormalCursor(self.targets) self.setMouseTracking(True) self.start_time = None - self.selectRandomTarget() + self.exp_setup = exp_setup + self.errors = 0 - def loadTargets(self): - with open('src_tp_bubble.csv', newline='') as csvfile: + # Chargement du fichier csv + with open(file_name) as csvfile: reader = csv.reader(csvfile) for row in reader: - if len(row) >= 3: - x, y, size = map(int, row[:3]) - self.targets.append(Target(x,y,size)) + x = int(row[0]) + y = int(row[1]) + size = int(row[2]) + target = Target(x, y, size) + self.targets.append(target) + + self.target_to_select = self.targets[:number_of_targets] + self.cursor = NormalCursor(self.targets) + self.selectRandomTarget() def paintEvent(self, event): painter = QPainter(self) @@ -32,17 +41,30 @@ class NormalWidget(QWidget): self.update() def selectRandomTarget(self): - if self.start_time == None: + if self.start_time is None: self.start_time = time.time() - target = random.choice(self.targets) + + target = self.target_to_select.pop() target.toSelect = True self.update() - def printTime(self): - print((time.time() - self.start_time)*1000) + def printLog(self): + current_time = (time.time() - self.start_time)*1000 + self.exp_setup.add_line_to_response(current_time, self.errors) + self.errors = 0 self.start_time = None def mousePressEvent(self, event): - if self.cursor.closest.click_cible(): - self.printTime() - self.selectRandomTarget() + if self.cursor.closest is not None and self.cursor.closest.toSelect: + distance = ((event.x() - self.cursor.closest.x) ** 2 + (event.y() - self.cursor.closest.y) ** 2) ** 0.5 + if distance <= self.cursor.closest.size / 2: + if self.cursor.closest.click_cible(): + self.printLog() + if len(self.target_to_select) > 0: + self.selectRandomTarget() + else: + self.exp_setup.next_experience() + else: + self.errors += 1 + else: + self.errors += 1 \ No newline at end of file diff --git a/TP1/README.md b/TP1/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1087c3cdeb7fc15a761cff97d47c22712ec9788e 100644 --- a/TP1/README.md +++ b/TP1/README.md @@ -0,0 +1,2 @@ +# Programmation d'une technique d'interaction : le Bubble Cursor + diff --git a/TP1/RopeWidget.py b/TP1/RopeWidget.py index 2aafc7af070aff0f4e62cc661d7bb73ae0885835..93bb765a0aed31102fdafc7caa7e32ecc5c34eef 100644 --- a/TP1/RopeWidget.py +++ b/TP1/RopeWidget.py @@ -5,22 +5,27 @@ from Target import Target from RopeCursor import RopeCursor class RopeWidget(QWidget): - def __init__(self): + def __init__(self, file_name, exp_setup, number_of_targets): super().__init__() + self.exp_setup = exp_setup self.targets = [] - self.loadTargets() - self.cursor = RopeCursor(self.targets) self.setMouseTracking(True) self.start_time = None - self.selectRandomTarget() + self.errors = 0 - def loadTargets(self): - with open('src_tp_bubble.csv', newline='') as csvfile: + # Chargement du fichier csv + with open(file_name) as csvfile: reader = csv.reader(csvfile) for row in reader: - if len(row) >= 3: - x, y, size = map(int, row[:3]) - self.targets.append(Target(x,y,size)) + x = int(row[0]) + y = int(row[1]) + size = int(row[2]) + target = Target(x, y, size) + self.targets.append(target) + + self.target_to_select = self.targets[:number_of_targets] + self.cursor = RopeCursor(self.targets) + self.selectRandomTarget() def paintEvent(self, event): painter = QPainter(self) @@ -35,15 +40,23 @@ class RopeWidget(QWidget): def selectRandomTarget(self): if self.start_time == None: self.start_time = time.time() - target = random.choice(self.targets) + target = self.target_to_select.pop() target.toSelect = True self.update() - def printTime(self): - print((time.time() - self.start_time)*1000) + def printLog(self): + current_time = (time.time() - self.start_time)*1000 + self.exp_setup.add_line_to_response(current_time, self.errors) + self.errors = 0 self.start_time = None def mousePressEvent(self, event): - if self.cursor.closest.click_cible(): - self.printTime() - self.selectRandomTarget() + if self.cursor.closest is not None: + if self.cursor.closest.click_cible(): + self.printLog() + if len(self.target_to_select) > 0: + self.selectRandomTarget() + else: + self.exp_setup.next_experience() + else: + self.errors += 1 diff --git a/TP1/__init__.py b/TP1/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/TP1/__pycache__/BubbleCursor.cpython-39.pyc b/TP1/__pycache__/BubbleCursor.cpython-39.pyc index 4d49281a3a479273257899a9b740c614c215d99e..e3cc227bd4c22cca27fc49eff4e11c2714483ea4 100644 Binary files a/TP1/__pycache__/BubbleCursor.cpython-39.pyc and b/TP1/__pycache__/BubbleCursor.cpython-39.pyc differ diff --git a/TP1/__pycache__/BubbleWidget.cpython-39.pyc b/TP1/__pycache__/BubbleWidget.cpython-39.pyc index 3e9ebd96cf92dcab43c8065bb5482a9f7eccc59e..3f7d594363ce5f597ab00b02311700104235408b 100644 Binary files a/TP1/__pycache__/BubbleWidget.cpython-39.pyc and b/TP1/__pycache__/BubbleWidget.cpython-39.pyc differ diff --git a/TP1/__pycache__/Target.cpython-39.pyc b/TP1/__pycache__/Target.cpython-39.pyc index 23ca47c2f5451c35bafb6733925f0380401c87fa..947e9a63a4839aed0cd1353eae11b904ae83af75 100644 Binary files a/TP1/__pycache__/Target.cpython-39.pyc and b/TP1/__pycache__/Target.cpython-39.pyc differ diff --git a/TP1/experience/ExpSetup.py b/TP1/experience/ExpSetup.py new file mode 100644 index 0000000000000000000000000000000000000000..0ea14e7c6d5315d47a18e7fbae6333b307412fcb --- /dev/null +++ b/TP1/experience/ExpSetup.py @@ -0,0 +1,127 @@ +import os +import sys + +from PyQt5.QtGui import QIntValidator +from PyQt5.QtWidgets import QDialog, QLabel, QLineEdit, QComboBox, QGridLayout, QPushButton, QHBoxLayout, QVBoxLayout + +from Experience import Experience +from FileDisplayWidget import FileDisplayWidget + +DIR_PATH = "experience/generated_exp/" +TARGETS_PER_EXPERIENCE = 15 + +class ExpSetup(QDialog): + def __init__(self, window): + super().__init__() + + self.file_name = 'experience/data/response.csv' + self.current_ordonnance = None + self.ordonnance = None + self.window = window + + self.user_number = None + self.technique = None + self.repeats = None + + self.current_repeat_series = 0 + self.current_target_number = 1 + + user_label = QLabel("Numéro d'utilisateur :") + self.user_edit = QLineEdit() + self.user_edit.setValidator(QIntValidator()) + + tech_label = QLabel("Technique :") + self.tech_combo = QComboBox() + self.tech_combo.addItems(["Bubble", "Rope", "Normal"]) + repeats_label = QLabel("Nombre de répétitions :") + self.repeats_edit = QLineEdit() + self.repeats_edit.setValidator(QIntValidator()) + + layout = QGridLayout() + layout.addWidget(user_label, 0, 0) + layout.addWidget(self.user_edit, 0, 1) + layout.addWidget(tech_label, 1, 0) + layout.addWidget(self.tech_combo, 1, 1) + layout.addWidget(repeats_label, 4, 0) + layout.addWidget(self.repeats_edit, 4, 1) + + self.validate_button = QPushButton("Valider") + self.validate_button.clicked.connect(self.verify_entry) + + h_layout = QHBoxLayout() + h_layout.addStretch() + h_layout.addWidget(self.validate_button) + h_layout.addStretch() + v_layout = QVBoxLayout() + v_layout.addLayout(layout) + v_layout.addLayout(h_layout) + + self.setLayout(v_layout) + + def verify_entry(self): + self.user_number = self.user_edit.text() + self.technique = self.tech_combo.currentIndex() + self.repeats = int(self.repeats_edit.text()) + if self.repeats <= 1: + print('Répétition doit être strictement supérieur à 1') + else: + self.init_ordonnance() + self.next_experience() + + def create_experience(self, experience, density, target_size): + if experience not in Experience: + # Error + print('Aucune expérience selectionné') + return None + + density = str(density) + target_size = str(target_size) + file_name = "src_d_" + density + "_s_" + target_size + ".csv" + + file_path = DIR_PATH + file_name + return experience.create_widget(file_path, self, TARGETS_PER_EXPERIENCE) + + def start_experience(self, widget): + if widget is not None: + self.window.resize(1024, 800) + self.window.setCentralWidget(widget) + self.window.show() + + def init_ordonnance(self): + self.ordonnance = [] + self.current_ordonnance = -1 + experience_list = [Experience.BUBBLE, Experience.ROPE, Experience.NORMAL] + experience_ordered = experience_list[self.technique:] + experience_list[:self.technique] + density_list = [30, 60, 90] + size_list = [9, 12, 18] + + # Répéter la création des widgets pour chaque expérience en fonction du nombre de répétitions + for _ in range(self.repeats): # Répéter pour le nombre total de répétitions + for experience in experience_ordered: + for density in density_list: + for size in size_list: + widget = self.create_experience(experience, density, size) + self.ordonnance.append((widget, experience, density, size)) + + def next_experience(self): + self.current_target_number = 1 + self.current_ordonnance += 1 + if self.current_ordonnance >= len(self.ordonnance): + self.display_data() + return + + if self.current_ordonnance % (len(self.ordonnance) / self.repeats) == 0: + self.current_repeat_series += 1 + + widget = self.ordonnance[self.current_ordonnance][0] + self.start_experience(widget) + + def add_line_to_response(self, time, error): + line = f"{self.user_number}, {self.current_repeat_series}, {self.current_target_number}, {self.ordonnance[self.current_ordonnance][2]}, {self.ordonnance[self.current_ordonnance][3]}, {self.ordonnance[self.current_ordonnance][1].name}, {time}, {error}" + with open(self.file_name, "a") as file: + file.write(line + '\n') + self.current_target_number += 1 + + def display_data(self): + widget = FileDisplayWidget(self.file_name) + self.start_experience(widget) diff --git a/TP1/experience/Experience.py b/TP1/experience/Experience.py new file mode 100644 index 0000000000000000000000000000000000000000..ea343038752fa5dd725f1676a83b6c09ed61dda0 --- /dev/null +++ b/TP1/experience/Experience.py @@ -0,0 +1,22 @@ +from enum import Enum + +from BubbleWidget import BubbleWidget +from RopeWidget import RopeWidget +from NormalWidget import NormalWidget + +class Experience(Enum): + BUBBLE = 1 + ROPE = 2 + NORMAL = 3 + + def create_widget(self, file_path, exp_setup, number_of_targets): + if self.value == Experience.BUBBLE.value: + widget = BubbleWidget(file_path, exp_setup, number_of_targets) + elif self.value == Experience.ROPE.value: + widget = RopeWidget(file_path, exp_setup, number_of_targets) + elif self.value == Experience.NORMAL.value: + widget = NormalWidget(file_path, exp_setup, number_of_targets) + else: + print('Aucune expérience selectionnée') + widget = None + return widget \ No newline at end of file diff --git a/TP1/experience/FileDisplayWidget.py b/TP1/experience/FileDisplayWidget.py new file mode 100644 index 0000000000000000000000000000000000000000..c71af36f1a790b51c6382bb5befed91f28d28c0d --- /dev/null +++ b/TP1/experience/FileDisplayWidget.py @@ -0,0 +1,15 @@ +from PyQt5.QtWidgets import QTextEdit, QWidget, QApplication, QMainWindow + + +class FileDisplayWidget(QWidget): + def __init__(self, filename): + super().__init__() + self.filename = filename + self.textEdit = QTextEdit(self) + self.textEdit.setReadOnly(True) + + with open(self.filename, 'r') as f: + self.textEdit.setPlainText(f.read()) + + def resizeEvent(self, event): + self.textEdit.setGeometry(0, 0, self.width(), self.height()) diff --git a/TP1/experience/Generate_targets.py b/TP1/experience/Generate_targets.py new file mode 100644 index 0000000000000000000000000000000000000000..f0bc38c03b089b44d11340f1839dab8dde6966cb --- /dev/null +++ b/TP1/experience/Generate_targets.py @@ -0,0 +1,52 @@ +import random +import csv + +SIZE_X_MAX = 1000 +SIZE_Y_MAX = 800 +DIR_NAME = 'generated_exp/' +SPACING = 5 +all_density = (30, 60, 90) +all_size = (9, 12, 18) +max_density = max(all_density) +max_size = max(all_size) + +def generate_targets(num_targets, max_target_size, min_spacing): + all_targets = [] + for _ in range(num_targets): + x = random.randint(0, SIZE_X_MAX) + y = random.randint(0, SIZE_Y_MAX) + target = (x, y, max_target_size) + if not all_targets: + all_targets.append(target) + else: + # cf. Theoreme de Pythagore + # Prendre la distance avec le cercle et pas le centre + min_distance = min([(((x - t[0]) ** 2 + (y - t[1]) ** 2) ** 0.5) - max_target_size/2 for t in all_targets]) + if min_distance >= min_spacing: + all_targets.append(target) + return all_targets + +def save_to_csv(filename, all_targets, density, change_size): + with open(filename, "w", newline='\n') as f: + writer = csv.writer(f) + for target in all_targets[:density]: + as_list = list(target) + as_list[2] = change_size + writer.writerow(as_list) + + +def create_csv(filename, all_targets, density, change_size): + save_to_csv(filename, all_targets, density, change_size) + + +def create_all_files(min_spacing): + all_targets = generate_targets(max_density, max_size, min_spacing) + + for density in all_density: + for size in all_size: + filename = "src_d_" + str(density) + '_s_' + str(size) + '.csv' + create_csv(DIR_NAME + filename, all_targets, density, size) + + +if __name__ == '__main__': + create_all_files(SPACING) diff --git a/TP1/experience/MainExp.py b/TP1/experience/MainExp.py new file mode 100644 index 0000000000000000000000000000000000000000..e68cc72e36b4994006a5e1978cbc551b7205d85c --- /dev/null +++ b/TP1/experience/MainExp.py @@ -0,0 +1,15 @@ +from PyQt5.QtWidgets import QApplication, QMainWindow + +from experience.ExpSetup import ExpSetup + +def main(): + app = QApplication([]) + window = QMainWindow() + exp_widget = ExpSetup(window) + window.setCentralWidget(exp_widget) + window.show() + app.exec_() + + +if __name__ == "__main__": + main() diff --git a/TP1/experience/data/__init__.py b/TP1/experience/data/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/TP1/experience/data/response.csv b/TP1/experience/data/response.csv new file mode 100644 index 0000000000000000000000000000000000000000..0d3c21caad5ceb60a6d56deb751a7827cf8e80e3 --- /dev/null +++ b/TP1/experience/data/response.csv @@ -0,0 +1,15 @@ +1, 1, 1, 30, 9, BUBBLE, 6032.421827316284, 0 +1, 1, 2, 30, 9, BUBBLE, 966.8619632720947, 0 +1, 1, 3, 30, 9, BUBBLE, 1031.6030979156494, 0 +1, 1, 4, 30, 9, BUBBLE, 964.9369716644287, 0 +1, 1, 5, 30, 9, BUBBLE, 1550.239086151123, 0 +1, 1, 6, 30, 9, BUBBLE, 683.8860511779785, 0 +1, 1, 7, 30, 9, BUBBLE, 1350.4488468170166, 0 +1, 1, 8, 30, 9, BUBBLE, 1297.9211807250977, 0 +1, 1, 9, 30, 9, BUBBLE, 1032.7260494232178, 0 +1, 1, 10, 30, 9, BUBBLE, 1032.9539775848389, 0 +1, 1, 11, 30, 9, BUBBLE, 896.4080810546875, 0 +1, 1, 12, 30, 9, BUBBLE, 969.0001010894775, 1 +1, 1, 13, 30, 9, BUBBLE, 866.1530017852783, 0 +1, 1, 14, 30, 9, BUBBLE, 614.9580478668213, 0 +1, 1, 15, 30, 9, BUBBLE, 815.1013851165771, 0 diff --git a/TP1/experience/generated_exp/src_d_30_s_12.csv b/TP1/experience/generated_exp/src_d_30_s_12.csv new file mode 100644 index 0000000000000000000000000000000000000000..32d9f175b31c65a0f375a8433b0e22a77fd3178a --- /dev/null +++ b/TP1/experience/generated_exp/src_d_30_s_12.csv @@ -0,0 +1,30 @@ +666,638,12 +1,172,12 +864,57,12 +8,125,12 +162,369,12 +796,19,12 +677,424,12 +312,9,12 +558,732,12 +674,128,12 +973,467,12 +592,150,12 +245,148,12 +425,561,12 +687,794,12 +14,652,12 +607,52,12 +295,440,12 +571,375,12 +769,588,12 +412,625,12 +857,611,12 +191,673,12 +648,702,12 +445,344,12 +218,338,12 +951,523,12 +542,229,12 +851,671,12 +518,383,12 diff --git a/TP1/experience/generated_exp/src_d_30_s_18.csv b/TP1/experience/generated_exp/src_d_30_s_18.csv new file mode 100644 index 0000000000000000000000000000000000000000..3d90b12fd19a3158643a95c807a94fa2b11fa4d0 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_30_s_18.csv @@ -0,0 +1,30 @@ +666,638,18 +1,172,18 +864,57,18 +8,125,18 +162,369,18 +796,19,18 +677,424,18 +312,9,18 +558,732,18 +674,128,18 +973,467,18 +592,150,18 +245,148,18 +425,561,18 +687,794,18 +14,652,18 +607,52,18 +295,440,18 +571,375,18 +769,588,18 +412,625,18 +857,611,18 +191,673,18 +648,702,18 +445,344,18 +218,338,18 +951,523,18 +542,229,18 +851,671,18 +518,383,18 diff --git a/TP1/experience/generated_exp/src_d_30_s_9.csv b/TP1/experience/generated_exp/src_d_30_s_9.csv new file mode 100644 index 0000000000000000000000000000000000000000..7b530a42b80d113cf774a25b818b9bf1d843a705 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_30_s_9.csv @@ -0,0 +1,30 @@ +666,638,9 +1,172,9 +864,57,9 +8,125,9 +162,369,9 +796,19,9 +677,424,9 +312,9,9 +558,732,9 +674,128,9 +973,467,9 +592,150,9 +245,148,9 +425,561,9 +687,794,9 +14,652,9 +607,52,9 +295,440,9 +571,375,9 +769,588,9 +412,625,9 +857,611,9 +191,673,9 +648,702,9 +445,344,9 +218,338,9 +951,523,9 +542,229,9 +851,671,9 +518,383,9 diff --git a/TP1/experience/generated_exp/src_d_60_s_12.csv b/TP1/experience/generated_exp/src_d_60_s_12.csv new file mode 100644 index 0000000000000000000000000000000000000000..2e1da251469913ac90d595046cb0199bf799de69 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_60_s_12.csv @@ -0,0 +1,60 @@ +666,638,12 +1,172,12 +864,57,12 +8,125,12 +162,369,12 +796,19,12 +677,424,12 +312,9,12 +558,732,12 +674,128,12 +973,467,12 +592,150,12 +245,148,12 +425,561,12 +687,794,12 +14,652,12 +607,52,12 +295,440,12 +571,375,12 +769,588,12 +412,625,12 +857,611,12 +191,673,12 +648,702,12 +445,344,12 +218,338,12 +951,523,12 +542,229,12 +851,671,12 +518,383,12 +670,3,12 +304,665,12 +562,112,12 +198,128,12 +363,337,12 +583,344,12 +168,558,12 +715,629,12 +697,660,12 +435,149,12 +239,82,12 +46,69,12 +380,685,12 +964,5,12 +620,136,12 +351,471,12 +528,536,12 +501,75,12 +910,317,12 +223,724,12 +563,641,12 +791,244,12 +987,77,12 +907,244,12 +22,538,12 +782,353,12 +235,793,12 +751,447,12 +515,258,12 +418,538,12 diff --git a/TP1/experience/generated_exp/src_d_60_s_18.csv b/TP1/experience/generated_exp/src_d_60_s_18.csv new file mode 100644 index 0000000000000000000000000000000000000000..fc9e4bfe0643e680546b2623d1eab88792850859 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_60_s_18.csv @@ -0,0 +1,60 @@ +666,638,18 +1,172,18 +864,57,18 +8,125,18 +162,369,18 +796,19,18 +677,424,18 +312,9,18 +558,732,18 +674,128,18 +973,467,18 +592,150,18 +245,148,18 +425,561,18 +687,794,18 +14,652,18 +607,52,18 +295,440,18 +571,375,18 +769,588,18 +412,625,18 +857,611,18 +191,673,18 +648,702,18 +445,344,18 +218,338,18 +951,523,18 +542,229,18 +851,671,18 +518,383,18 +670,3,18 +304,665,18 +562,112,18 +198,128,18 +363,337,18 +583,344,18 +168,558,18 +715,629,18 +697,660,18 +435,149,18 +239,82,18 +46,69,18 +380,685,18 +964,5,18 +620,136,18 +351,471,18 +528,536,18 +501,75,18 +910,317,18 +223,724,18 +563,641,18 +791,244,18 +987,77,18 +907,244,18 +22,538,18 +782,353,18 +235,793,18 +751,447,18 +515,258,18 +418,538,18 diff --git a/TP1/experience/generated_exp/src_d_60_s_9.csv b/TP1/experience/generated_exp/src_d_60_s_9.csv new file mode 100644 index 0000000000000000000000000000000000000000..1052f3e9feef9c4face82ce323debac2ddbcb42b --- /dev/null +++ b/TP1/experience/generated_exp/src_d_60_s_9.csv @@ -0,0 +1,60 @@ +666,638,9 +1,172,9 +864,57,9 +8,125,9 +162,369,9 +796,19,9 +677,424,9 +312,9,9 +558,732,9 +674,128,9 +973,467,9 +592,150,9 +245,148,9 +425,561,9 +687,794,9 +14,652,9 +607,52,9 +295,440,9 +571,375,9 +769,588,9 +412,625,9 +857,611,9 +191,673,9 +648,702,9 +445,344,9 +218,338,9 +951,523,9 +542,229,9 +851,671,9 +518,383,9 +670,3,9 +304,665,9 +562,112,9 +198,128,9 +363,337,9 +583,344,9 +168,558,9 +715,629,9 +697,660,9 +435,149,9 +239,82,9 +46,69,9 +380,685,9 +964,5,9 +620,136,9 +351,471,9 +528,536,9 +501,75,9 +910,317,9 +223,724,9 +563,641,9 +791,244,9 +987,77,9 +907,244,9 +22,538,9 +782,353,9 +235,793,9 +751,447,9 +515,258,9 +418,538,9 diff --git a/TP1/experience/generated_exp/src_d_90_s_12.csv b/TP1/experience/generated_exp/src_d_90_s_12.csv new file mode 100644 index 0000000000000000000000000000000000000000..46334491410fb62c39a9725013b359ef63889638 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_90_s_12.csv @@ -0,0 +1,88 @@ +666,638,12 +1,172,12 +864,57,12 +8,125,12 +162,369,12 +796,19,12 +677,424,12 +312,9,12 +558,732,12 +674,128,12 +973,467,12 +592,150,12 +245,148,12 +425,561,12 +687,794,12 +14,652,12 +607,52,12 +295,440,12 +571,375,12 +769,588,12 +412,625,12 +857,611,12 +191,673,12 +648,702,12 +445,344,12 +218,338,12 +951,523,12 +542,229,12 +851,671,12 +518,383,12 +670,3,12 +304,665,12 +562,112,12 +198,128,12 +363,337,12 +583,344,12 +168,558,12 +715,629,12 +697,660,12 +435,149,12 +239,82,12 +46,69,12 +380,685,12 +964,5,12 +620,136,12 +351,471,12 +528,536,12 +501,75,12 +910,317,12 +223,724,12 +563,641,12 +791,244,12 +987,77,12 +907,244,12 +22,538,12 +782,353,12 +235,793,12 +751,447,12 +515,258,12 +418,538,12 +643,468,12 +471,327,12 +789,481,12 +48,420,12 +364,625,12 +296,629,12 +201,320,12 +159,3,12 +414,168,12 +873,230,12 +481,633,12 +357,702,12 +815,292,12 +393,674,12 +411,435,12 +646,90,12 +439,101,12 +691,187,12 +101,627,12 +411,597,12 +671,381,12 +977,516,12 +302,562,12 +383,285,12 +109,253,12 +37,337,12 +826,741,12 +583,91,12 diff --git a/TP1/experience/generated_exp/src_d_90_s_18.csv b/TP1/experience/generated_exp/src_d_90_s_18.csv new file mode 100644 index 0000000000000000000000000000000000000000..81c233ba15aba003d5910fdb92a7798127ea56f9 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_90_s_18.csv @@ -0,0 +1,88 @@ +666,638,18 +1,172,18 +864,57,18 +8,125,18 +162,369,18 +796,19,18 +677,424,18 +312,9,18 +558,732,18 +674,128,18 +973,467,18 +592,150,18 +245,148,18 +425,561,18 +687,794,18 +14,652,18 +607,52,18 +295,440,18 +571,375,18 +769,588,18 +412,625,18 +857,611,18 +191,673,18 +648,702,18 +445,344,18 +218,338,18 +951,523,18 +542,229,18 +851,671,18 +518,383,18 +670,3,18 +304,665,18 +562,112,18 +198,128,18 +363,337,18 +583,344,18 +168,558,18 +715,629,18 +697,660,18 +435,149,18 +239,82,18 +46,69,18 +380,685,18 +964,5,18 +620,136,18 +351,471,18 +528,536,18 +501,75,18 +910,317,18 +223,724,18 +563,641,18 +791,244,18 +987,77,18 +907,244,18 +22,538,18 +782,353,18 +235,793,18 +751,447,18 +515,258,18 +418,538,18 +643,468,18 +471,327,18 +789,481,18 +48,420,18 +364,625,18 +296,629,18 +201,320,18 +159,3,18 +414,168,18 +873,230,18 +481,633,18 +357,702,18 +815,292,18 +393,674,18 +411,435,18 +646,90,18 +439,101,18 +691,187,18 +101,627,18 +411,597,18 +671,381,18 +977,516,18 +302,562,18 +383,285,18 +109,253,18 +37,337,18 +826,741,18 +583,91,18 diff --git a/TP1/experience/generated_exp/src_d_90_s_9.csv b/TP1/experience/generated_exp/src_d_90_s_9.csv new file mode 100644 index 0000000000000000000000000000000000000000..76a475e51986a4b893b09d6d6b9d84d11e64d8a9 --- /dev/null +++ b/TP1/experience/generated_exp/src_d_90_s_9.csv @@ -0,0 +1,88 @@ +666,638,9 +1,172,9 +864,57,9 +8,125,9 +162,369,9 +796,19,9 +677,424,9 +312,9,9 +558,732,9 +674,128,9 +973,467,9 +592,150,9 +245,148,9 +425,561,9 +687,794,9 +14,652,9 +607,52,9 +295,440,9 +571,375,9 +769,588,9 +412,625,9 +857,611,9 +191,673,9 +648,702,9 +445,344,9 +218,338,9 +951,523,9 +542,229,9 +851,671,9 +518,383,9 +670,3,9 +304,665,9 +562,112,9 +198,128,9 +363,337,9 +583,344,9 +168,558,9 +715,629,9 +697,660,9 +435,149,9 +239,82,9 +46,69,9 +380,685,9 +964,5,9 +620,136,9 +351,471,9 +528,536,9 +501,75,9 +910,317,9 +223,724,9 +563,641,9 +791,244,9 +987,77,9 +907,244,9 +22,538,9 +782,353,9 +235,793,9 +751,447,9 +515,258,9 +418,538,9 +643,468,9 +471,327,9 +789,481,9 +48,420,9 +364,625,9 +296,629,9 +201,320,9 +159,3,9 +414,168,9 +873,230,9 +481,633,9 +357,702,9 +815,292,9 +393,674,9 +411,435,9 +646,90,9 +439,101,9 +691,187,9 +101,627,9 +411,597,9 +671,381,9 +977,516,9 +302,562,9 +383,285,9 +109,253,9 +37,337,9 +826,741,9 +583,91,9