CellDevs/fr

Introduction
CellDevs est une extension de DEVS dont l'objectif est la modélisation d'automates cellulaires. Elle est développée par Gabriel Wainer et Norbert Giambiasi.

La dynamique des cellules est temporisée c'est-à-dire que l'état d'une cellule sera modifiée en fonction de l'état de son voisinage mais il ne sera connu des cellules voisines qu'après un certain délai. L'idée de base est de fournir un mécanisme simple de définition de la synchronisation des cellules. Comme toute proposition d'extensions, les auteurs offrent à la fois l'extension du formalisme qui se résument à l'ajout de variables supplémentaires et de leur sémantique et le simulateur abstrait.

Deux spécifications sont proposées : l'une pour la dynamique des cellules et l'autre pour la dynamique de l'automate complet. Un modèle CellDevs est défini comme un espace composé de cellules qui peuvent être couplées afin de former un espace complet. La sémantique liée aux cellules n'est pas précisée, seule la dynamique du modèle couplé fait l'objet d'une description détaillée. Il est donc possible d'utiliser ce formalisme pour représenter un espace réel (un lieu de déplacement pour des entités) ou un espace plus abstrait (un espace comme un ensemble de lieux abstraits).

La structure
Le nombre de ports d'entrée à définir est fonction du type de voisinage. Les noms de ces ports est laissé libre au modélisateur. En ce qui concerne les sorties, CellDevs impose un seul port de sortie out.

Les ports d'entrée ont pour objectif la réception des états des voisins et le port de sortie, l'envoi de l'état de la cellule. L'envoi et la réception sont pris en charge par CellDevs.

Les connexions sont très simples mais très nombreuses. Il suffit de connecter la sortie out d'une cellule à l'entrée de l'ensemble de ses voisins.

Les initialisations
Il y a deux éléments à initialiser qui sont directement liés à la dynamique de CellDevs :
 * le délai entre le changement d'état de la cellule et l'envoi aux cellules voisines ;
 * la définition du voisinage ;

La définition du voisinage passe simplement par la liste des noms des ports d'entrée qui seront par la suite connectés au port de sortie out des voisins.

Les initialisations sont complétées par les valeurs qui initialisent :
 * l'état de la cellule (qui sera transmise aux voisines) ;
 * les paramètres de la cellule.

Les paramètres sont des données utilisées par la dynamique de la cellule.

Nous verrons par la suite que Color sera considéré dans la méthode d'initialisation de la cellule comme la valeur de l'état initial et que TimeStep comme la valeur d'un paramètre.

Comment écrire un modèle à base de CellDevs ?
Comme toute extension, la classe CellDevs simplifie l'écriture de la dynamique d'une cellule. L'interface fonctionnelle se résume à :

Lors de l'initialisation du modèle, la méthode processParameters est appelée pour chaque valeur d'initialisation de l'état de la cellule et pour chaque valeur de paramètre. Init permet de définit l'état initial de la cellule et d'indiquer que l'on ne connaît pas l'état de ses voisins. La méthode processInternalEvent est invoquée à chaque changement d'état de la cellule. Par la suite, nous allons voir un graphe d'états classiques. Un modèle CellDevs peut être perturbé dès qu'un événement n'arrive pas sur les ports d'entrée définis dans le voisinage. Dans ce cas, la méthode processPerturbation est appelée.

Nous allons prendre l'exemple du jeu de vie pour illustrer le contenu de chacune de ces méthodes (sauf processPerturbation qui sera évoqué dans la section suivante).

Notre modèle possède un état qui se limite à une variable color. L'appel à la méthode initBooleanState permet d'initialiser cet état booléen mais surtout permet d'enregistrer cet élément comme un élément de l'état de la cellule qui sera propagé aux voisins. Vous pouvez utiliser des éléments d'initialisation pour initialiser des attributs de votre classe comme TimeStep. Ce dernier pourrait faire parti de la définition globale de l'état mais il sera privé à la cellule. Dans notre cas, TimeStep est un paramètre. Il n'évolue pas pendant la simulation.

La méthode init débute toujours par la définition du buffer des états des voisins. On initialise donc pour l'ensemble des voisins la variable color. On vérifie ensuite que l'état de la cellule est bien créée et initialisée. Si ce n'est pas le cas alors on procède à l'opération d'initialisation.

Le modèle doit gérer son graphe d'état. Ce dernier est défini par 3 états : INIT, IDLE et NEWSTATE. La neighbourModify signale que l'on ne connaît pas l'état de ses voisins. On finit par fixer la variable sigma à zéro. Cette variable définit la durée de l'état courant.

Les deux premières transitions sont nécessaires à la logique de CellDevs. Le troisième état (NEWSTATE) calcule le nouvel état de la cellule. Plusieurs méthodes sont à votre disposition pour récupérer l'état courant des voisins qui est dans le buffer ou le nombre de voisins vérifiant une certaine condition, ... A l'aide de ses méthodes, on peut calculer le nouvel état et indiquer que l'on a changé d'état (resetNeighbourModified).

Comment perturber un CellDevs ?
Un modèle CellDevs peut être perturbé dès qu'un événement n'arrive pas sur les ports d'entrée définis dans le voisinage. Dans ce cas, la méthode processPerturbation est appelée. Il reste juste à traduire les informations transportées par l'événement en modification de l'état.

Références

 * Wainer G. A. et Giambiasi N., Application of the Cell-DEVS Paradigm for Cell Spaces Modelling and Simulation, Simulation 76 :1, pp. 22-39, 2001.