Counter/fr

Tout modèle hérite de la classe vle::devs::Dynamics. Cette classe définit l'interface fonctionnelle de tout modèle de simulation ainsi qu'un certain nombre de fonctions facilitant l'écriture des modèles de simulation. L'interface fonctionnelle respecte le simulateur abstrait Parallel DEVS et DSDEVS nommé DSDE.

Toutes ces fonctions possèdent un comportement par défaut qui aboutit à un modèle passif c'est-à-dire, ne fait rien pendant une durée infinie. Si vous voulez développer un modèle, il faut donc surcharger toutes les méthodes ou seulement une partie.

Prenons l'exemple suivant : à l'arrivée d'un événement sur son port d'entrée, le modèle incrémente un compteur. Le but de ce modèle étant simplement de compter le nombre d'événements sortants d'un port d'un autre modèle. Naturellement, ce comptage est possible si le port d'entrée de ce modèle est connecté au port de sortie du modèle générant les événements.

Le modèle DEVS est le suivant :
 * $$S = (counter)$$ : le vecteur d'état se limite au compteur
 * $$\delta_{ext}((counter), e, X) = (counter+1)$$
 * $$ta(S) = \infty$$

Tous les autres éléments de la structure DEVS sont vides. Il est donc nécessaire de surcharger les méthodes externalEvent et timeAdvance.

Dans le cas de la fonction de transition externe, le compteur est simplement incrémenté. Il n'est pas nécessaire d'invoquer les fonctions d'analyse de l'événement externe puisque seule son arrivée nous intéresse.

La fonction de durée de vie de l'état est tout aussi simple. Nous utilisons la constante infinity définie dans la classe devs::Time.

Il reste plus qu'une fonction à surcharger pour que le modèle puisse être complet : c'est la fonction d'initialisation.

Le modèle est maintenant terminé. Naturellement, il ne faut pas oublier la déclaration de la classe Counter.

Nous retrouvons ici la définition du constructeur et du destructeur et l'utilisation de la macro DECLARE_DYNAMICS permettant de déclarer ce modèle comme un plugin de simulation pour VLE.

VLE propose un dernier mécanisme que nous pouvons intégrer à ce modèle simple : l'observation de son état. Pour cela, il faut surcharger la fonction observation. Cette fonction est invoquée lorsqu'un observateur interroge le modèle sur son état. Attention, cette fonction est constante. Il ne faut pas que l'état du modèle soit modifié lorsqu'il est interrogé. On ajoute donc la déclaration de la fonction dans la classe et on ajoute le code suivant :

Que nous dit le code ci-dessus. Premièrement, le port d'interrogation se nomme c. Il faudra donc que lors de la définition du fichier d'expérimentation, attacher une mesure à ce port. Si l'événement d'interrogation est arrivé sur le port c alors nous retournons la valeur de l'état counter. Nous utilisons la fonction buildInteger</tt> pour transformer l'état de type int</tt> en un pointeur sur un objet vle::value::Value</tt>. La classe vle::value::Value</tt> prend, en autre, en charge la sérialisation. Si votre modèle peut être interrogé sur une autre variable d'états, il est nécessaire de définir un autre port et faire une nouvelle condition sur l'arrivée d'un événement sur ce port.