Generator/fr

Generator est un modèle qui ne fait que générer un événement sans aucune donnée (juste un beep) toutes les X unités de temps, X étant paramétrable.

Implantation du modèle à l'aide GVLE
Lancez GVLE, vous devez obtenir ceci :



Création d'un nouveau projet
Cliquez sur File en haut à droite de la fenêtre, puis sur New Project, une petite fenêtre s'ouvre et vous invite à entrer le nom que vous voulez donner au projet. Remplissez le champ vide et cliquez sur Valider.



Création du VPZ
Une fois le projet créé, une liste apparaît sur la gauche de la fenêtre, cliquez sur File en haut à gauche de GVLE, pluis cliquez sur New Vpz. Cliquez ensuite sur Simulation dans le menu du haut et ensuite sur Project, puis remplissez les différents champs de la fenêtre qui vient de s'ouvrir (Les champs surlignés en rouge sur l'image ci-dessous sont obligatoires).



Une fois tous les champs obligatoires remplis, cliquez sur Valider.

Sauvegardez ensuite le VPZ en cliquant sur File puis sur Save File, une petite fenêtre s'ouvre pour entrer les nom du VPZ, remplissez le champ prévu à cet effet (ici generator) et cliquez sur Valider.

Création de la dynamique
Dans la liste sur la gauche de la fenêtre, cliquez-droit sur src puis cliquez sur New File, une fois encore une petite fenêtre s'ouvre et vous invite à rentrer le nom que vous voulez donner à la dynamique, n'oubliez pas de lui donner l'extension .cpp (generator.cpp dans notre exemple). Cliquez sur Valider une fois le champ rempli.



Sélectionnez le fichier en double cliquant dessus, vous pouvez maintenant écrire votre dynamique dans le cadre central. N'oubliez pas de sauvegarder votre travail de temps en temps.

Configuration et Construction
Dans le sous-répertoire src (cliquez sur la petite flèche pour le faire apparaître), double-cliquez sur le fichier CMakeLists.txt qui s'ouvre alors dans un nouvel onglet du cadre central.

A la commande cmake ADD_LIBRARY, supprimer simple.cpp et ajoutez votre dynamique : generator.cpp

Vous pouvez aussi donner un nom plus explicite à votre librairie en replaçant emptylibrary par le nom que vous voulez (ici GeneratorProject) dans les commandes ADD_LIBRARY, TARGET_LINK_LIBRARIES et INSTALL.



Il faut ensuite configure et compiler le projet. Pour se faire, il suffit de cliquer sur Project puis sur Configure Project pour que GVLE configure le tout.



Une fois que cela est fini (image ci-dessus dans le cadre du bas), re-cliquez sur Project puis cette fois-ci sur Build Project. Le projet est compilé une fois que le cadre du bas affiche :



Création du modèle
Retournez dans le fichier VPZ en cliquant sur le petit triangle à côté de exp si le sous-répertoire de celui-ci n'est pas déjà ouvert, puis double-cliquez sur votre fichier vpz (ici : generator.vpz) pour l'ouvrir dans le cadre central. On peut ouvrir un VPZ en faisant aussi Ctrl+Shift+0

Cliquez sur dans la barre du haut puis cliquez dans le cadre noir du fichier vpz. Une petite fenêtre s'ouvre, vous invitant à entrer le nom du modèle. Une fois le champ complété, cliquez sur Valider. Vous devez obtenir ceci dans le cadre du milieu :



Ajout d'un port
Nous allons maintenant ajouter un port out à ce modèle pour qu'il puisse émettre le beep sur celui-ci. Cliquez sur le bouton puis double-cliquez sur le petit cadre de votre modèle, une fenêtre s'ouvre,cliquez sur l'onglet Ports sur la gauche puis cliquez-droit dans le cadre output ports et cliquez sur Add :



Une petite fenêtre s'ouvre et vous invite à rentrer le nom du port (out par exemple), cliquez sur valider une fois le champ rempli.

Ajout d'une dynamique
Nous allons ensuite ajouter là dynamique generator.cpp à notre modèle. Garder la fenêtre ouverte (si vous l'avez fermée cliquez 2 fois sur le petit cadre de generator) puis allez sur l'onglet Dynamics. Comme pour le port out, faites un clic droit dans le cadre blanc puis cliquez sur add, entrez le nom de la dynamique dans la petite fenêtre qui s'ouvre (dyn_generator par exemple) puis cliquez sur valider, une autre fenêtre s'ouvre, choisissez le nom de votre package, votre librairie (emptylibrary par défaut ou le nom que vous avez donné lorsque vous avez modifier CMakeLists.txt) et enfin dans la case Model entrez le nom de votre dynamique, ici generator puis cliquez sur valider.



Ajout d'une condition
Après cela, nous allons ajouter la condition m_duration qui nous servira dans la dynamique à indiquer le pas de temps que nous voulons. Dans la fenêtre toujours ouverte cliquez sur l'onglet Conditions. Double-cliquez ensuite dans le cadre blanc, une nouvelle fenêtre s'ouvre. Dans le premier cadre Initial conditions fait un clic-droit puis cliquez sur add, une fenêtre vous invite à rentrer le nom des conditions pour l'ensemble des modèle, entrez donc un nom qui vous permettra de retrouver toutes les conditions de generator facilement, cond_generator par exemple. Sélectionnez ensuite cette condition et ajoutez-lui un paramètre en cliquant-droit dans le cadre Parameters puis sur add, entrez le nom du paramètre voulu (ici duration) et cliquez sur Valider. Sélectionnez enfin ce paramètre puis fait un clic-droit dans le dernier cadre Type | Overview, cliquez sur Add puis choisissez un type (ici double). Enfin double cliquez sur ce type, une fenêtre s'ouvre, vous invitant à entrer la valeur de ce paramètre. Vous devriez obtenir quelque chose de semblable à ceci :



Validez et n'oubliez pas de cocher la condition dans la fenêtre.

Ajout d'une vue et des observables
Dans le menu du haut, cliquez sur Simulation, puis sur View, une nouvelle fenêtre s'ouvre. Dans le cadre de droite, faites un clic-droit puis cliquez sur Add, entrez le nom que vous voulez donner à votre vue (view par exemple) puis validez. Laissez Type à timed puis choisissez un pas de temps (ici 0.1), puis dans le cadre Outup type, choisissez le pluging text :



Validez, votre vue est créée.

Pour ajouter des observables, double-cliquez sur le cadre de generator puis sélectionnez l'onglet Observables. Faites un clic-droit dans le cadre puis cliquez sur Add, entrez un nom de groupe pour ce que vous allez observer (obs_generator par exemple) puis validez. Cliquez-droit sur lui puis cliquez sur Edit, une nouvelle fenêtre s'ouvre. Dans le cadre ObservablePorts faites un clic-droit puis cliquez sur Add puis entrez le nom de la variable que vous voulez observer. Dans cette exemple, nous voulons regarder lastTime et sigma. Une fois les variables ajouter, prenez la vue que vous avez créer précédemment dans le cadre de droite puis faite un glisser-déposer sur chacune des variables que vous venez d'ajouter.

Vous devriez obtenir ceci :

Validez, votre modèle est terminer, vous pouvez alors lancer la simulation en cliquant sur Simulation puis sur Launch simulation.

Première version
Nous considérons qu'aucun événement en entrée ne peut se produire.

Constructeur :

C'est ici que nous récupérons le paramètre duration (le pas de temps de la génération des événements).

Ne pas oublier de déclarer m_duration en privé après toutes les déclarations publiques :

Destructeur :

Le destructeur est vide mais obligatoire.

Init :

Nous retournons la date de la première génération d'événement.

Output :

Le modèle génère un événement vide sur le port out. Le nom du port pourrait être un paramètre du modèle. VLE permet aussi de récupérer le nom du port de sortie si nous voulons rendre l'exemple plus générique (via getModel.getOutputPortList).

TimeAdvance (Ta) :

Nous retournons la durée entre deux générations ce qui va permettre de déclencher un événement toutes les m_duration unités de temps.

Deuxième version
Si le modélisateur ajoute un port d'entrée au modèle et y connecte un modèle de type Generator, il faut que le modèle continue à générer ses événements à pas régulier.

Attributs du modèle Deux nouveaux attributs :
 * m_sigma : c'est lui qui va nous permettre de calculer le temps restant entre chaque événement reçu pour continuer à générer ses événements à pas régulier.
 * m_lastTime : cet attribut va permettre de récupérer la date à laquelle a eu lieu le dernier événement.

Le constructeur et le destructeur restent inchangés.

Init : 

Nous initialisons m_lastTime à la date de départ, et sigma au paramètre duration.

La fonction de sortie output reste inchangée elle aussi.

TimeAdvance (Ta) : Nous retournons ici le temps avant la prochaine génération pour que le modèle continue à produire un événement à pas régulier.

InternalTransition :  La fonction InternalTransition attribut la valeur time à lastTime ce qui va ensuite nous offrir la possibilité de mettre à jour sigma si c'est une externalTransition. Il réinitialise ensuite sigma avec le paramètre duration défini par l'utilisateur.

ExternalTansition :  La fonction externalTransition met à jour l'attribut sigma en lui attribuant comme valeur la durée qu'il reste avant le prochain événement à générer. Il attribue ensuite la valeur time à lastTime comme dans l'internalTransition.

Troisième version
Si les événements d'entrée se produisent très exactement à la même date que la génération des événements externes, il faut que le modèle continue à bien se comporter.

Il suffit alors d'ajouter la fonction confluentTransitions : Cette fonction dit que lorsqu'il y a un conflit (lorsque le modèle doit faire une transition interne et une transition externe en même temps), nous ignorons les événements externes et on ne fait que la transition interne.

Observation
Il est possible d'observer les valeurs de chaque variable de l'état du modèle generator selon un certain pas de temps.

Pour cela, il faut ajouter la fonction suivant :

Depuis GVLE, il faut ensuite créer une vue (view) de type timed redirigée dans un fichier texte (par exemple) ainsi que les observables que nous souhaitons observer, ici lastTime et sigma.

''Pour voir comment créer une vue dans GVLE, veuillez consulter : http://www.vle-project.org/pub/vle/docs/v3.0.0/cours-gvle.pdf svp. "

Lors de la simulation, un fichier .dat sera créé dans le dossier output.

Sur la première ligne du fichier généré sont écrites les différentes variables observées au cours du temps, la première étant la date, les suivantes les observables mis dans GVLE (dans notre exemple lastTime et sigma).

Tests unitaires
Pour vérifier que notre modèle fait exactement ce que nous voulons, il est possible d'effectuer des tests unitaires sur celui-ci.

Tout d'abord, créer un dossier test dans le dossier src du package. Ici :

Nous allons ensuite créer un fichier test-generator.cpp pour faire ces tests, ainsi qu'un fichier CMakeLists.txt pour la compilation.

Explication du code
Nous sélectionnons notre package avec cette fonction : examples.

Nous choisissons ensuite notre modèle (le fichier vpz) avec cette fonction.

Nous récupérons une référence sur la vue (view) qui nous permettra de récupérer les données de la simulation.

Tests
Nous observons deux choses : la date et deux attributs (sigma et last_time) donc nous vérifions que result.shape[0] est bien égal à 3

La durée de la simulation est de 29 unités de temps et nous observons la dynamique du modèle tous les 0.1 unités de temps, il y a donc 290 lignes générées.

Nous vérifions ensuite que les différentes observations (la date, sigma et last_time) sont correctes.

La simulation débutant dans l'exemple à 2455308,00000 (date julienne représentant le 24 avril 2010), nous vérifions que le résultat à la ligne 0 est bien la date attendue. value::toDouble(result[0][0] étant la valeur de la date obtenue, 2455308 celle que l'on veut obtenir et 1e -2 signifie que l'on veut une marge d'erreur <0.01% (car nous travaillons en float).

Le lastTime étant initialisé avec la date courante, il est normal qu'il ait la même valeur.

Et enfin nous vérifions que Sigma est bien initialisé à 5 (durée entre deux générations d'événements).