\documentclass[a4paper]{article}

\usepackage[margin=2.5cm]{geometry}
\usepackage[francais]{babel}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{enumitem}
\usepackage{censor}
\usepackage{cleveref}
\usepackage{tabularx}

\usetikzlibrary{shapes,snakes}


\title{Khôlloscopinator}
\author{Mysaa}
\date{2019}

\begin{document}


\maketitle

\tableofcontents
\newpage

Ce document traitera de comment sera codé Khôlloscopinator et de comment l'utiliser (en \LaTeX !).
Il sera utilisé pendant la phase de conception informatique.

\section{Entrées sorties du programme}
	
	Cette section présentera les documents que pourra créer le programme et les données requises pour que la tâche soit accomplie.
	
	\subsection{Cycle d'utilisation}
		
		Présentons tout d'abord le cycle que parcourront les fichiers avant de créer le khôlloscope.
		Pour des raisons de 'normalisation' des fichiers d'entrée, le programme générera d'abord des fichiers \emph{à compléter}
		
		\begin{figure}[h]
			\centering
			\begin{tikzpicture}[shift={(current page.center)}]
				
				\tikzstyle{file} = [rectangle,draw,text width=150,align=center]
				\tikzstyle{debut} = [regular polygon,regular polygon sides=5,inner sep=0,outer sep=0,draw,scale=0.9]
				\tikzstyle{actionA} = [->, >=latex]
				\tikzstyle{action} = [midway,right,text width=150,anchor=west,align=right]
				
				\node[debut] (start) at (0,7) {Démarrage};
				\node[file] (template) at (0,4) {Les fichiers 'Template' générés};
				\node[file] (rempli) at (0,2) {Les fichiers d'entrée remplis};
				\node[file] (donnees) at (0,0) {Les fichiers contenant les données du khôlloscope};
				\node[draw=none] (xl) at (6,7) {};
				\node[draw=none] (xr) at (-6,7) {};
				
				\draw[actionA] (start)--(template) node[action] {L'utilisateur demande au programme un template};
				\draw[actionA] (template)--(rempli) node[action] {L'utilisateur remplis les données};
				\draw[actionA] (rempli)--(donnees) node[action] {L'utilisateur lance le programme};
							
			\end{tikzpicture}
			
			\caption{Le cycle de création du khôlloscope}
		\end{figure}
			
		
		Au départ, l'utilisateur lance le programme avec les paramètres de son futur khôlloscope: calendrier, inclusion de la génération des groupes ou non, etc ... (Voir les Entrées en \ref{inputs})
		
		Une fois que le programme a généré ces fichiers vides, l'utilisateur va pouvoir les remplir (voire les faire remplir) convenablement : Horaires de disponibilités pour les khôlleurs, pour les élèves, les spécificités des élèves (LV2,PSI ...), les groupes si ils ne sont pas à générer, etc...
		
		Ensuite, l'utilisateur pourra relancer le programme dans le même dossier, ce dernier s'occupera d'acquérir ces données et de générer un khôlloscope convenant aux besoins de l'utilisateur, qui sautera de joie et embrassera l'ordinateur de joie (pensez à vérifier l'étanchéité des machines)
		
	\subsection{Entrées}\label{inputs}
		
		Cette partie va donc lister les entrées nécessaires ou facultatives, pour qu'un khôlloscope puisse être généré et quelles restrictions ces dernieres doivent avoir.
		
		
		\setlist[description]{style=nextline}
		\begin{description}
			\item[Calendrier de l'année/semestre] Rentrer les jours féries, les horaires bloqués (repas de noël), les vacances, les semaines 1 ou 2 ...
			
			\item[Liste des Khôlleurs] Le nom, la matière, des informations complémentaires
			
			\item[Liste des Élèves] Nom, prénom, les différents groupes auxquels l'élève appartient (desquels découlerons ses contraintes dans l'emploi du temps) par exemple (A,INFO2,PSI)
			
			\item[Disponibilités Khôlleurs] Deux types de fichiers différent :
			\begin{itemize}[label=\textbullet]
				\item Un fichier général où l'utilisateur fourni les disponibilités de tous les khôlleurs. À utiliser lorsque l'utilisateur a une seule disponibilité à rajouter ou à enlever
				\item Un dossier de fichiers, avec un fichier par khôlleur . L'utilisateur pourrai envoyer ces fichiers à remplir aux différents khôlleurs, pour les faire remplir.
			\end{itemize}
			Le programme va ensuite synthétiser les deux types de fichiers pour référencer les disponibilités des khôlleurs.
			
			\item[EDT élèves] Séparer les semaines 1 des semaines 2, possibilité d'organiser des semaines spéciales (à l'emploi du temps unique dans l'année). Ces dernières seront gérées comme des semaines d'un autre type (par exemple S3,S4 ou plus) et seront à préciser dans le calendrier.
			
			Dans cet emploi du temps, préciser les groupes concernés par les horaire (un raccourci, le groupe X représentera tous les élèves). Échantillonnage élémentaire temporel : l'heure ou bien plus petit
		\end{description}
		
	\subsection{Sorties}
		Cette partie va (je vous le donne en mille) lister les différents formes que pourra prendre le khôlloscope généré. Bien sur, tous ces différents types pourrons être générés en même temps, il s'agit là d'un changement de style d'affichage du khôlloscope, pas de génération (qui elle, sera discutée en partie \ref{khgen})
		
		\begin{description}
			\item[Khôlloscope condensé] Un khôlloscope basé sur celui donné l'année 2018-2019: un gros condensé des khôlles de tous les élèves, visible sur une seule page (typiquement le khôlloscope a imprimer en A3 pour afficher au fond de la salle)
			
			\item[Khôlloscope par élève] Un dossiers de khôlloscopes présentés sous la forme d'une liste d'instants (date+heure) durant lesquels l'élève à une khôlle, en indiquant la matière, la salle et le professeur. De tels khôlloscopes serons similaires au sein d'un même groupe de khôlle, c'est pourquoi le programme proposera de générer les fichiers assignés aux élèves (plus simple à distribuer mais des doublons), ou alors de générer un fichier par groupe (à mettre en ligne, par exemple).
			
			\item[Les fichiers \og fat\fg] Ces fichiers ne serons que des versions concaténées des fichiers précédents (un fichier contenant touts les khôlloscope par élève). Cela permettra d'imprimer la grande masse de papier plus facilement (au lieu d'imprimer chaque document une fois, imprimer une seule fois un gros document)
			
			\item[Khôlloscope condensé par professeur] Il s'agit d'un khôlloscope avec le même affichage que le khôlloscope condensé, mais contenant seulement les lignes concernant le professeur en question.
			
			\item[Khôlloscope liste par professeur] Une liste des khôlles à effectuer, présentées dans l'ordre chronologique. Seront précisés les jours/heures, les groupes à khôller et éventuellement les salles de khôlle (ou du moins un emplacement vide \og à compéter \fg)
			
			\item[Khôlloscope calendrier par professeur] Il s'agit là d'une vue d'ensemble, des khôlles organisées sous la forme d'un calendrier où ne serons affichées que les heures auxquelles le khôlleur khôlle. Cela peux être imprimé en petit et collé à l'arrière de son casier.
			
			\item[Khôlloscope pour élèves, mode liste] Un l'instar du khôlloscope liste pour les professeurs, ce khôlloscope présente les khôlles du semestre sous la forme d'une liste d'horaires (normalement deux par semaine). Ce document est facile à imprimer et contient toutes les informations nécessaires : date, heure, khôlleur, matière, salle (ou une case à compléter)
			
			\item[Khôlloscope pour élèves, mode calendrier] Il s'agit d'un calendrier du semestre (sous la forme habituelle, mois-colonnes et lignes-jours). Dedans seront indiqué les noms des khôlleurs et les horaires. Là aussi, il ne contient pas beaucoup d'informations, et est plus destiné à satisfaire les rapides coups d’œil \og Tiens, ai-je khôlle aujourd'hui ? \fg ou encore \og \censor{Merde} ! À quelle heure ai-je khôlle aujourd'hui ? \fg
			
			\item[Le récapitulatif des groupes] Un simple tableau référençant les groupes, affichant par ligne les nom des trois membres, leur numéro de groupe et leurs \og contraintes \fg (voir \ref{contraintes_def})
		
	
	\end{description}
		
\section{Conventions}
	Je vais définir ici les éléments logiques de la création du khôlloscope.
	\begin{description}
		\item[Contraintes] \label{contraintes_def}Appliquées à un élève ou a un groupe de khôlle, il s'agit de l'ensemble des groupes auxquels appartient l'élève ou le groupe. Dans le cas du groupe, il s'agit de l'union des contraintes des élèves (exemple: un groupe formé d'un élève dans les groupes (A,I1,ALL) et d'un élève dans les groupes (A,I2) aura les contraintes (A,I1,I2,ALL)
		
		\item[Horaire] Il s'agit d'une heure dans la semaine, contenant l'information (Jour de la semaine, heure de début). Par exemple, l'horaire (Mer,15h) correspond à l'heure s'écoulant de 15h à 16h les mercredis
		
	\end{description}
		
\section{Algorithmie / Informatique}

	Le programme suivra le pattern MVC (Model View Controller) qui sépare le code en trois parties distinctes :
	\begin{itemize}
		\item\textbf{Le Modèle (Model)} encodant les données utilisées et transférées (par exemple, les classes représentant les Khôlles, les Horaires, etc ...  décrites en partie \ref{model})
		
		\item\textbf{La Vue (View)} Régissant les flux d'entrées sortie avec l'utilisateur et les fichiers. Il va s'agir principalement de la fenêtre graphique, dans laquelle l'utilisateur rentrera ses options de génération et aura un retour du travail fait par l'algorithme
		
		\item\textbf{Le Contrôlleur (Controller)} La partie qui va effectuer les travaux demandés par la partie Vue à travers des objets du Modèle. C'est dans cette partie que se fera tout le travail de génération, d'écriture des fichiers (tout la partie \textit{active}, en fait)
	\end{itemize}
	
	\subsection{Modèle}\label{model}
		\subsubsection{Informatisations des données}
			\og \textit{Donnez moi des bits, je vous encoderai le monde} \fg
			
			Pour pouvoir rendre le programme le plus adaptable possible et sans descendre dans une complexité de classe trop hautes, certaines données basiques seront enregistrées sous la forme d'un type de base (int,string,etc...). Voici donc la liste de ces \og désobjetifications\fg des variables.
			
			\begin{description}
				\item[Appartenances] Les groupes auxquels appartiennent un élève seront représentés par une chaîne de caractères. Ces groupes sont les "Groupes d'informatique", les "groupes A \& B", etc\ldots. Les chaînes de caractères représenterons chaque groupe. Par exemple "I1" ou "A", mais on pourrait tout aussi bien mettre n'importe quelle autre chaîne, comme "\verb|le_meilleur_des_groupes|" voire "\verb|#@~&§!%£|" (l'utilité de la chose reste néanmoins à prouver).
				
				\item[Matières] Les matières scolaires seront décrites comme des chaînes de caractères, en majuscules, possiblement abrégées. La convention de nommage doit bien entendu rester la même tout le long de la génération du khôlloscope. On aura ainsi les matières "\verb|MATHS|","\verb|PHYSIQUE|" ou encore "\verb|ANG|"
				
			\end{description}
			
		
		
		\subsubsection{Les Classes}
			Afin d'obtenir un code lisible et \og beau \fg, de nombreuses classes aux rôles bien spécifiques devront être crées, leurs sens et leurs attributs vont être présentés ici.
			
			À noter que un vocabulaire lié au POO (Programmation orientée objet) va être utilisée dans cette partie. Si vous ne connaissez pas les termes objet, classe, instance ou attribut, sauter cette partie peut être une bonne idée.
			\begin{description}
				\item[Élève] Une instance de cette classe représente un élève, et ce de manière unique. Il contient le nom, prénom et toutes les autres informations personnelles, ainsi que les contraintes de l'élève (voir partie \ref{contraintes_def} pour les définitions)
				
				\item[Groupe] Une instance de cette classe représente un groupe d'élèves dans un khôlloscope. C'est à dire, que si plusieurs khôlloscopes existent en même temps, même si ils possèdent des groupes constitués identiquement, ils contiendrons leur propre de \textit{Groupe}), sauf si les groupes sont donnés par l'utilisateur, auquel cas, tous les khôlloscopes partagerons les mêmes instances de groupe. Les groupes n'auront comme attribut que la liste des élèves membres, ainsi que la liste des contraintes associées au groupe.
				
				\item[Khôlleur] À l'instar de celle des élèves, les instances de cette classe représenteront un khôlleur de manière unique. Elles contiendrons les informations tel que le Nom, la matière enseignée, ainsi que d'autres informations personnelles
			\end{description}
	
	
	
	\subsection{Génération du khôlloscope}
	\label{khgen}
	
		Voici la partie la plus délicate (et bien évidemment le cœur du programme).
		La génération se fera en plusieurs étapes, présentées ci-dessous.
		
		\subsubsection{Étape 1 : Analyse des possibles et impossibles}
			Cette première étape est plutôt simple et rapide. Son rôle est de supprimer tout horaire ou date impossible à satisfaire (par exemple, un khôlleur ayant un horaire libre pendant que tous les élèves auront cours : cet horaire ne pourra jamais être utilisé et sera donc supprimé) réduisant ainsi la taille et la quantité des données d'entrée à traiter, et donc le temps d’exécution
			
		\subsubsection{Étape 2 : Taggage}
			L'étape de taggage (en anglais, to tag = coller une étiquette) permettra au programme d'être plus simple à coder. En effet, les horaires, élèves, khôlleurs, etc... se verront accolés de nombreux tags, par exemple pour indiquer que les élèves d'un certain groupe ne pourrons jamais rencontrer un khôlleur, ou que certaines khôlles bien qu'à des horaires déconseillés (voir \ref{crit_kh}) devront être effectuées pour respecter la contrainte de diversité des khôlleurs. Ces \og tags \fg  seront utilisés durant les générations des khôlloscopes pour éviter d'en générer de trop pourris (c'est à dire ne respectant que peu les contraintes) qui seraient tout de suite invalidés. (À noter que le caractère aléatoire de la génération rendra toujours possible la génération fortuite d'un khôlloscope pourri, mais qui sera sous-classé face à d'autres khôlloscopes, meilleurs).
			
		\subsubsection{Étape 3 : Créations des khôlloscopes}
			
			Viens la section la plus complexe : des khôlloscopes seront générés semaine par semaine jusqu'à ce qu'une impossibilité arrive (c'est probable). Les conditions initiales seront tirées au hasard, mais avec un hasard pondéré, de manière à vérifier avec une plus forte probabilité les critères de Khôlloscope. Le programme va ainsi lancer plusieurs générations de Khôlloscope. Pour des raisons pratiques, chaque génération sera lancée dans des \textit{threads} (processus) parallèles. Les semaines se remplirons de Khôlles jusqu'à ce que tout soit rempli ou jusqu'à ce qu'une impossibilité survienne (par exemple, nécessite mais impossibilité de placer une khôlle d'anglais)
			
		\subsubsection{Étape 4 : Qui est le meilleur}
		
			Pour cette étape, il suffit d'affecter un score à chaque khôlloscope complètement généré, afin de n'afficher que les meilleurs. Les critères et leur importance pour le calcul du score seront vues en \ref{score_kh}. Un algorithme génétique serait une idée, mais le jeu de nombre aléatoires n'évoluant pas de manière continue, nous ne pourrons faire converger les khôlloscopes vers un objet stable.
			
	
	\subsection{Qu'es-ce qu'un khôlloscope ?}
		
		Mais comment doit faire le programme pour déterminer si un khôlloscope est bon ou non ?
	
		\subsubsection{Critères de génération}
		\label{crit_kh}
			Je vais ici lister les critères que devrons respecter les khôlloscopes. Cela se présentera sous la forme d'un tableau listant:
			\begin{description}
				\item[Importance] Cette valeur permet de classer les critères, les plus basses valeurs étant les plus \og dispensables\fg
				\item[Decription] Une description du critère
				\item[Fallback] Que faire si le critère ne peut être satisfait (exemple : avoir tous les khôlleurs alors que c'est impossible à cause de l'emploi du temps)
			\end{description}
		
			\begin{tabularx}{\textwidth}{|c|X|X|}
				\hline
				Importance & Description & Fallback \\\hline
				$\infty$ & Tous les élèves doivent avoir les khôlles demandées par semaine & Les repousser dans les deux semaines avant ou après, les annuler sinon \\\hline
				$\infty$ & Les élèves doivent voir tous les khôlleurs, et les khôlleurs doivent être le mieux répartis (Éviter qu'un groupe n'ai principalement qu'un khôlleur) & Ne pas considérer les khôlleurs \og impossibles \fg  mais essayer tout de même de respecter la diversité \\\hline
				$\infty$ & Les élèves doivent pouvoir manger & Non négociable, invalidation du khôlloscope si non satisfait \\\hline
				$\infty$ & Les groupes de khôlle doivent être de la bonne taille (par exemple, pas de groupe de un mais plutôt deux groupes de deux) & Invalidation du khôlloscope \\\hline
				$\infty$ & Les professeurs ayant demandant un créneau repas doivent y avoir accès & Invalidation du khôlloscope, les professeurs sont aussi des humains \\\hline
				$15$ & Éviter deux khôlles par jour & \\\hline
				$11$ & Éviter les khôlles lors des grosses journées (par exemple, préférer les journées avec cours de sport, avec TD ...) & \\\hline
				$10$ & Séparer les khôlleurs temporellement (éviter d'avoir un certain professeur trois fois de suite ...) & \\\hline
				$9$ & Droit à la justice pour les élèves : tous les groupes de khôlle sont égaux :un même groupe ne doit pas se prendre, par exemple, un horaire de khôlle dérangeant cinq fois d'affilée & \\\hline
			\end{tabularx}
		
			Ce critères ont une valeur indicative, chacun correspondra à un module algorithmique indépendant, ce qui permettra de rajouter ou d'enlever des critères simplement. Ceci ne sont pas fixés et peuvent être modifiés, supprimés ou ajoutés.
		
		
		\subsubsection{Score des Khôlloscopes}
		\label{score_kh}
			
			Le score des khôlloscope se basera principalement sur les critères dispensables. Si ils sont respectés, le khôlloscope sera bien noté. Leur importance dans le calcul (coefficients) sera jugée par rapport à leur \og Importance\fg  donnée dans le tableau ci-dessus. Bien sur, d'autres mesures du score pourront être ajoutées au tableau suivant :
			
			\begin{tabularx}{\textwidth}{|c|X|X|}
				\hline
				Importance & Description \\\hline
				$10$ & Critère du dodo : les khôlles les moins tard seront à privilégier \\\hline
			\end{tabularx}
		

\end{document}