Storage/fr

Storage est un modèle qui réplique ce qu'on lui envoie en entrée, en sortie du modèle après un laps de temps. Si une nouvelle entrée se présente avant la réplication, alors cette nouvelle entrée est ignorée.

Explication du code
Attributs du modèle

Comme pour le modèle Generator, mDuration est un paramètre qui va nous permettre de stocker le pas de temps entre la réception d'un évènement et sa réplication. L'attribut mStorage stockera l'entrée à répliquer. Dans notre exemple, une entrée est représentée par un réel. mSigma nous permettra de calculer le temps restant entre chaque évènement reçu pour continuer à répliquer la première entrée reçue. mState servira à nous situer dans l'état du modèle : s'il est en attente d'une entrée ou s'il est en train de la répliquer. Et enfin mLastTime, toujours comme dans le modèle Generator servira à stocker la date du dernier évènement.

Constructeur / Destructeur

Ce sont exactement les mêmes que pour le modèle Generator, le constructeur récupère le paramètre duration. Et le destructeur est vide mais obligatoire.

Init

On initialise l'attribut mSigma au paramètre duration, mLastTime à la date de départ. Au début de la simulation, nous sommes en attente d'une entrée, on initialise donc mState à PASSIVE. Enfin on retourne l'infini pour attendre indéfiniment jusqu'à la réception d'une entrée.

Output

Nous voulons répliquer ce que nous avons reçu en entrée. Pour cela, nous commençons par créer un event nommé event qui sera envoyé sur le port "out". Nous ajoutons ensuite à ce nouvel événement l'attribut mStorage (qui contient ce qui doit être répliqué) et qui sera envoyé sur le port "out". Enfin, nous ajoutons l'événement à ce qui sera envoyé par la fonction de sortie.

TimeAdvance (Ta)

Si nous sommes en train d'attendre un événement en entrée du modèle, nous attendons indéfiniment. Si nous sommes en train de répliquer une entrée (état "RESPOND"), nous retournons le temps restant avant l'envoi de l'entrée répliquée.

InternalTransition

La transition interne n'a lieu que lors de la réplication de l'entrée. On met mLastTIme à time pour pouvoir mettre mSigma à jour si la prochaine transition est une externalTransition. On remet mSigma à mDuration et on remet mState à "PASSIVE" car on repart pour une nouvelle attente d'une entrée.

ExternalTransition

On regarde d'abord si nous sommes dans une phase d'attente d'entrée ("PASSIVE") ou si nous avons déjà une entrée à répliquer ("RESPOND"). Si nous attendons une entrée, nous récupérons cette entrée sur le port "in" grâce à :

Nous réinitialisons ensuite mSigma au paramètre duration, mettons à jour mLastTime et passons en état de réplication ("RESPOND"). Sinon, si nous sommes déjà en train de répliquer ("RESPOND"), nous mettons à jour le mSigma en lui attribuant comme valeur la durée qu'il reste avant la fin de la réplication. Nous mettons aussi à jour le mLastTime.

ConfluentTransitions

Comme pour le modèle Generator, cette fonction dit que lorsqu'il y a un conflit, nous ignorons les événements externes et on ne fait que la transition interne.