Qualité de Développement - R4.02

Le thème de ce TP est d’améliorer une preuve de concept de simulation de population.

L’objectif de cette simulation de population est à terme d’évaluer l’influence de mesure sanitaires sur l’évolution d’une épidémie.

Vous trouverez un prototype dans cette archive.

Vous devriez être en mesure de compiler puis lancer l’exécutable en lançant la commande cargo run dans un terminal à l’intérieur du projet.

La première compilation peut prendre un peu de temps puisque qu’elle requiert l’installation de la bibliothèque egui.

Vous devriez obtenir une fenêtre semblable à ceci :

social simulation base egui

Le code du prototype est organisé comme suit :

  • le fichier main.rs contient le code permettant de lancer l’interface graphique, soit dans une fenêtre, soit dans un navigateur web. Vous ne modifierez pas ce fichier.

  • le fichier lib.rs est le module racine de votre package. Il contient les déclarations des modules de celui-ci.

  • le fichier app.rs contient la logique de l’interface graphique et de la simulation.

  • Dans ce fichier, vous trouverez la structure SocialSimulationApp qui contient pour le moment les données des individus.

  • La logique de déplacement des individus est implémentée dans la méthode update de cette structure.

Première impression

En examinant le code, remplissez le document "EvaluationQualite.md" qui se trouve dans le projet. Vous devrez l’ajouter à votre Git, il sera évalué.

Améliorations attendues

Ne vous lancez pas tout de suite dans la réalisation de ces améliorations. Le travail commencera par une structuration du code, notamment en séparant la logique de simulation de la logique d’affichage.

Fonctionnalités

À terme, on souhaite simuler la propagation d’une épidémie au sein d’une population et mesurer l’influence de mesures sanitaires sur cette propagation. Pour cela, vous êtes en charge de réaliser une application à partir du prototype qui aura les fonctionnalités supplémentaires suivantes :

  1. Simulation d’une épidémie :

    1. Ajout d’un état vis-à-vis d’une maladie : saint, malade, guéri, mort.

    2. Paramètres d’évolution de la maladie :

      • Probabilité de guérir ou de mourir quand on est malade.

    3. Ajout de la propagation de la maladie avec des paramètres :

      • Rayon de contagion

      • Probabilité de contamination.

    4. Déplacements aléatoires. Ajouter des changements aléatoires de direction pour les individus au cours de la simulation.

  2. Récupération de données sur l’épidémie

    • Nombre de personnes dans chaque état à chaque pas de temps,

    • Bilan global, c’est-à-dire nombre final de personnes dans chaque état,

    • Durée de l’épidémie, c’est-à-dire temps qu’il faut pour que les états ne changent plus.

  3. Lecture de la configuration dans un fichier.

    • Taille de l’environnement.

    • Nombre d’entités.

    • Différents paramètres.

  4. Mesures sanitaires :

    • Port du masque : influence sur le taux de transmission.

    • Vaccination : influence sur le taux de survie et sur le taux de transmission.

  5. Amélioration de la finesse du comportement :

    • Comportement de déplacement individuel, pour pouvoir simuler des mesures de confinement.

    • Notion de lieu spéciaux où toutes les personnes doivent se rendre (supermarchés, travail, écoles).

Qualité

Cet outils de simulation vise à fournir des données fiables aux agences de gestion médicales, il est donc important que les résultats donnés soient fiables. Les requis sont amenés à évoluer.

Il faudra donc prêter un soin particulier aux critères de qualité suivants :

  • Testabilité

  • Maintenabilité

  • Extensibilité

  • Performance

Structuration

Afin de clarifier le code, commencez par séparer la partie simulation de la partie graphique. Pour cela, vous allez créer des modules et des structures de données pour organiser le code implémentant la logique de la simulation.

Organisez les données et leurs méthodes, sans hiérarchie de classe puisqu’il n’y a pas d’héritage en Rust, mais à l’aide de modules.

Une proposition de hiérarchie de modules est représentée ci-dessous :

social simulation
Figure 1. Social simulation modules hierarchy. (This is a suggestion, you can adapt it to a better design.)

Vous n’aurez pas besoin des "Traits" pour obtenir une structure déjà cohérente. Vous pouvez vous référer au support de cours sur la structuration pour construire votre hiérarchie de modules.

Seules les fonctions new et update de SocialSimulationApp sont à modifier pour utiliser les nouvelles structures de données.

Structures de données

Commencez par déclarer les structures de données dont vous aurez besoin.

Fonctions

En utilisant la méthodologie TDD, implémentez les fonctions dont vous aurez besoin.

À ce stade vous devez avoir obtenu le même fonctionnement que le prototype mais avec une qualité de code bien meilleure.

Pensez à commiter et pousser votre travail.

C’est une bonne idée de faire un "tag" sur cette version (ce commit)

Épidémie - Propagation

Ne commencez pas cette partie tant que vous n’avez pas terminé la partie précédente.

Comme première amélioration et toujours en mode TDD, faites en sorte que l’état des individus évolue en fonction de :

  • Leur état courant

  • L’état des autres individus dans un rayon de contamination

  • Une probabilité de contamination

  • Une probabilité de survie

Commitez, poussez et taguez cette version.

Configuration depuis un fichier

Ajoutez la possibilité de configurer la simulation à partir d’un fichier. Choisissez un format de fichier pour lequel des parseurs existent, json ou toml sont des exemples.

Mesures sanitaires globales

Ajoutez la possibilité d’activer des mesures sanitaires globales :

  • Port du masque : influence la probabilité de contamination lorsque des individus sont à proximité.

  • Vaccination : influence sur la probabilité de contamination et sur la probabilité éde décès.

Production de résultats

Maintenant que vous avez une première version de simulation il est temps de produire des résultats.

Pour exploiter les résultats, vous pouvez au choix :

  • Tracer les nombres de personnes dans chaque état à l’aide de egui_plot ou

  • Produire des fichiers de log contenant les différentes données intéressantes. Dans ce deuxième cas, vous choisirez le format du fichier judicieusement pour pouvoir générer des graphs.

Évaluation

Le code produit sera évalué selon les critères suivants :
  • Qualité du code en terme de :

    • Structuration, lisibilité et clarté du code,

    • Tests réalisés,

    • Documentation, incluant des exemples-tests lorsque cela est pertinent.

  • Avancement des fonctionnalités demandées.

L’ordre des critères est pertinent : un code de meilleure qualité mais avec moins de fonctionnalités sera plus valorisé lors de l’évaluation.

Extensions bonus suggérées

Si vous avez terminé les fonctionnalités attendues avec un niveau de qualité satisfaisant et que le sujet vous intéresse, vous pouvez proposer des améliorations de la simulation.

Vous pouvez par exemple travailler sur :

  • L’amélioration de l’aspect graphique de la simulation.

  • La possibilité de lancer la simulation en mode "headless", sans l’affichage graphique pour rendre la simulation plus rapide.

Ajout de lieux particuliers dans l’environnement

Vous ajouterez dans l’environnement différents types de lieux :

  • Domicile

  • Travail

  • Magasins

  • Lieu publique

  • École (pour certains individus)

Vous ferez ensuite en sorte que les individus possèdent une liste de lieux et naviguent entre ces lieux pour simuler les croisements plus fréquents que lors de déplacements aléatoires. Procédez de manière incrémentale.

Comportements individuels

Afin de pouvoir évaluer l’impact de mesures sanitaires s’appliquant aux individus comme le télé-travail ou la restriction des contacts sociaux à un groupe restreint, vous allez ajouter un comportement individuel de déplacement aux individus.

Mesures sanitaires liées aux déplacements

Ajoutez la possibilité d’activer des mesures sanitaires liées aux déplacements :

  • Télétravail, les individus ne vont plus au travail.

  • Confinement : seuls quelques individus vont au travail, les écoles sont fermées, les fréquences de déplacement sont réduites.

Parallèlisation de la simulation

Utiliser des threads ou une bibliothèque comme rayon pour paralléliser la simulation.