• Aucun résultat trouvé

Paramétrage local du Réseau

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=n1+n2). 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.