Afin d’offrir plus d’expressivité au langage, il peut être intéressant de pouvoir paramétrer
dynamiquement certains éléments comme les senseurs/effecteurs ou de pouvoir prendre certaines
décisions en fonction d’informations obtenues plus avant dans le réseau. Prenons par exemple
le calcul de la suite de Fibonacci (pour rappel n=n−1+n−2). Sans configuration dynamique,
il est impossible de réaliser ce calcul, car leurs résultats ne sont pas mémorisés. Nous proposons
d’étendre le modèle de réseaux en ajoutant la possibilité de faire transiter des informations grâce
aux jetons. Pour cela, nous utilisons les éléments suivants :
Un jetonest une collection de variables. Ces variables peuvent être de types de base ou des
entités plus complexes. Les senseurs et effecteurs peuvent utiliser ces variables par l’intermédiaire
du “Contexte local” lié à une transition en aval de la place qui contient le jeton. Les places
initiales peuvent décrire le jeton qu’elles contiennent lorsqu’il est créé. Dans le cas des
sous-scénarios, cette fonctionnalité est ignorée pour permettre d’utiliser le jeton en entrée du réseau
à la manière des paramètres des fonctions.
Le contexte local est un ensemble de données issues de tous les jetons contenus dans les
places en amont d’une transition dont la portée est limitée à cette transition. Pour manipuler
les données des jetons, une transition est associée à deux fonctions. “La fonction de fusion”
construit le contexte local à partir des jetons et “la fonction de distribution” distribue les
données du contexte local dans les jetons des places en aval. Les senseurs et les effecteurs ont
accès au contexte local en lecture. De plus, certains types d’effecteurs peuvent modifier les
variables du contexte local. Ces effecteurs réalisent leur calcul avant de rendre la main à la
transition pour la suite de la mise à jour. Ils doivent donc réaliser des calculs instantanés. Dans
notre implémentation, nous proposons un ensemble de senseurs et d’effecteurs qui permettent de
réaliser des opérations de base, ou plus avancées, sur des types de bases. Par exemple, réaliser
des calculs sur des variables numériques ou manipuler des chaines de caractères.
La Fonction de Fusion construit le contexte local lors de la vérification de la condition
d’un senseur. Par défaut elle réalise une union des variables issues de chaque jeton. Cependant,
elle peut être redéfinie pour prendre en compte des cas qui poseraient des problèmes. Par
exemple, si deux jetons contiennent une variable nommée Aassociée des valeurs différentes “la
fonction de fusion” peut proposer différents traitements comme en renommer une, l’ignorer,
réaliser une moyenne ou choisir la plus grande valeur des deux.
La Fonction de Distributionconstruit les jetons positionnés dans les places en aval après
le déclenchement de l’effecteur. Elle réalise une copie du contexte local dans chacun des jetons.
Elle permet également d’ajouter dans les jetons des données issues d’autres sources. Par exemple,
elle peut permettre de faire passer à la suite du réseau des informations issues du “contexte
évènementiel” ( c.f. Section1) obtenu lors du déclenchement de son senseur. L’algorithme de
déclenchement d’une transition est donc le suivant :
2. Vérification de la condition par le senseur
3. Récupération du contexte évènementiel (c.f. définition des senseurs, Section 1)
4. déclenchement de l’effecteur.
5. Consommation des jetons
6. Production des nouveaux jetons par la fonction de distribution
L’introduction de cette fonctionnalité est la raison pour laquelle nous utilisons des réseaux de
Petri saufs. Elle induit un problème dans un réseau de Petri non-sauf (plus de 1 jeton par places) :
lorsqu’une transition est activée, elle consomme un jeton au hasard dans chacune de ses places en
amont. Par exemple, si une transition possède des places amont AetB et qu’elles contiennent
chacune deux jetons a1, a2 et b1, b2, la transition consommera aléatoirement une des paires
parmi(a1, b1),(a1, b2),(a2, b1),(a2, b2),. Ceci peut être un problème si les jetons contiennent des
données qui doivent être cohérentes entre elles. En théorie, les jetons représentent des exécutions
parallèles du processus représenté par le réseau. Puisque nous cherchons à représenter l’exécution
d’un scénario parmi un ensemble de possibles, nous avons donc restreint la classe de réseaux
utilisés aux réseaux sauf pour assurer la cohérence des données.
La Figure 3.10 présente un réseau permettant le calcul de la suite de Fibonacci. Lors du
chargement du réseau, le jeton initial contient les deux premiers éléments de la suite (Aet B),
ainsi que le nombre d’itérations à réaliser Iter. L’effecteur de la Transition 2 réalise le calcul
de l’élément suivant et l’ajoute au jeton dans la variable RES. La transition 3 décrémente
le nombre d’itérations à réaliser grâce à son effecteur, puis réalise grâce à la fonction de sa
répartition, l’échange des valeurs telles que la valeur de B du jeton dans la placeP Result soit
donnée à la variableA du jeton dans sa place en sortie et que la valeur de la variableRES soit
donnée à la variable B. Tant que le nombre d’itérations n’est pas atteint, le réseau réinjecte
le nouveau jeton à la place initiale. Lorsque la valeur de la variable Iter atteint 0, le jeton est
placé dans la place finale “Fin”.
La Figure 3.11 présente le même algorithme récursif utilisant les sous-réseaux. Si Iter ne
vaut pas 0, le réseau courant charge un sous-réseau qui réalise une étape du calcul. Le jeton
initial dans le sous-réseau est alors remplacé par le jeton issu du réseau parent. Lorsque Iter
atteint 0 dans le réseau de plus bas niveau, le jeton est placé sur la place finale (Transition 4)
sans créer de nouveau sous réseau. La transition 10 du réseau parent consomme alors le jeton
de la place hiérarchique et le place sur la place finale, résolvant la récursivité jusqu’au réseau
parent de plus haut niveau.
Les jetons permettent de passer des données d’un réseau parent à un sous-réseau et
inversement. Les “places hiérarchiques” utilisent une “Fonction de Distribution” pour répartir
les données dans les jetons des places initiales de leur sous-réseau. Elles utilisent également
une “Fonction de Fusion” pour créer le jeton qu’elles contiennent, lors d’un marquage final du
sous-réseau, à partir des jetons contenus dans les places finales de leur sous-réseau.
Figure 3.10 –Calcul de la suite de Fibonacci grâce à un réseau #SEVEN et à la configuration
locale.
Dans le document
Séquencement d'actions en environnement virtuel collaboratif
(Page 79-83)