]> AND Private Git Repository - hdrcouchot.git/blob - modelchecking.tex
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
f69df766c9df0b31764fc39a46c1b96a696b5685
[hdrcouchot.git] / modelchecking.tex
1 \JFC{donner dans les rappels les délais et les propriétés de convergence uniforme}
2
3
4 \section{Rappels sur le langage PROMELA}
5 \label{sec:spin:promela}
6
7 Cette section  rappelle les éléments fondamentaux du langage PROMELA (Process Meta  Language).
8 On peut trouver davantage de détails dans~\cite{Hol03,Wei97}.
9
10
11
12
13 \begin{figure}[ht]
14 \begin{tiny}
15 \begin{lstlisting}
16 #define N 3
17 #define d_0 5
18
19 bool X [N]; bool Xp [N]; int mods [N];
20 typedef vals{bool v [N]};
21 vals Xd [N];  
22
23 typedef a_send{chan sent[N]=[d_0] of {bool}};
24 a_send channels [N];
25
26 chan unlock_elements_update=[1] of {bool};
27 chan sync_mutex=[1] of {bool};
28 \end{lstlisting}
29 \end{tiny}
30 \caption{Declaration des types de la traduction.}
31 \label{fig:arrayofchannels}
32 \end{figure}
33
34
35 Les types primaires de PROMELA sont \texttt{bool}, \texttt{byte},
36 \texttt{short} et  \texttt{int}. Comme dans le langage C par exemple,
37 on peut déclarer des tableaux à une dimension de taille constante 
38 ou des nouveaux types de données (introduites par le mot clef 
39 \verb+typedef+). Ces derniers sont utilisés pour définir des tableaux à deux
40 dimension.
41
42 \begin{xpl}
43 Le programme donné à la {\sc Figure}~\ref{fig:arrayofchannels} correspond à des 
44 déclarations de variables qui serviront dans l'exemple jouet de ce chapitre. 
45 Il définit tout d'abord:
46 \begin{itemize}
47 \item les constantes \verb+N+ et \verb+d_0+ qui précisent respectivement le nombre
48  $n$ d'éléments et le délais maximum $\delta_0$;
49 \item les deux tableaux  (\verb+X+ et \verb+Xp+) de \verb+N+ variables booléennes; 
50 les cellules \verb+X[i]+ et \verb+Xp[i]+ sont associées à la variables $X_{i+1}$
51 d'un système dynamique discret 
52 (le décalages d'un entier est dû à l'indexation à partir de zéro des cellules d'un tableau);
53 Elles  mémorisent les  valeurs de $X_{i+1}$ respectivement avant et après sa mise à jour; 
54 il suffit ainsi de comparer  \verb+X+ et \verb+Xp+ pour constater si $X$ à changé ou pas;
55 \item le tableau \verb+mods+ contient les éléments qui doivent être modifiés lors de l'itération 
56 en cours; cela correspond naturellement à l'ensemble des éléments $S^t$;
57 \item le type de données structurées \verb+vals+ et le tableau de tableaux 
58  \verb+Xd[+$i$\verb+].v[+$j$\verb+]+ qui vise à mémoriser $X_{j+1}^{D^{t-1}_{i+1j+1}}$
59  pour l'itération au temps $t$ (en d'autres termes, utile lors du calcul de $X^{t}$).
60 \end{itemize}
61
62
63 Puisque le décalage d'un indices ne change pas fondamentalement 
64 le comportement de la version PROMELA par rapport au modèle initial
65 et pour des raisons de clarté, on utilisera par la suite la même 
66 lettre d'indice entre les deux niveaux (pour le modèle: $X_i$ et pour  PROMELA: 
67 \texttt{X[i]}). Cependant, ce décalage devra être conservé mémoire.
68
69 Une donnée de type \texttt{channel} permet le 
70 transfert de messages entre processus dans un ordre FIFO.
71 Elles serait déclarée avec le mot clef \verb+chan+ suivi par sa capacité 
72 (qui est constante), son nom et le type des messages qui sont stockés dans ce canal.
73 Dans l'exemple précédent, on déclare successivement:
74 \begin{itemize}
75 \item un canal \verb+sent+ qui vise à mémoriser\verb+d_0+ messages de type
76  \verb+bool+; le tableau nommé \verb+channels+ de \verb+N+*\verb+N+
77  éléments de type \verb+a_send+ est utilisé pour mémoriser les valeurs intermédiaires $X_j$;
78  Il permet donc de temporiser leur emploi par d'autres elements $i$.
79 \item les deux canaux  \verb+unlock_elements_update+ et  \verb+sync_mutex+ contenant 
80 chacun un message booléen et utilisé ensuite comme des sémaphores.
81 \end{itemize}
82 \end{xpl}
83
84 %\subsection{PROMELA Processes} 
85 Le langage PROMELA exploite la notion de \emph{process} pour modéliser la concurrence
86 au sein de systèmes. Un process est déclaré avec le mot-clé
87 \verb+proctype+  et est  instancié soit immédiatement (lorsque sa déclaration est préfixée 
88  par le mot-clef  \verb+active+) ou bien au moment de l'exécution de l'instruction 
89 \texttt{run}.
90 Parmi tous les process,  \verb+init+ est le process  initial qui permet 
91 d'initialiser les variables, lancer d'autres process\ldots
92
93
94 Les instructions d'affectation sont interprétées usuellement.
95 Les canaux sont cernés par des instructions particulières d'envoi et de
96 réception de messages. Pour un canal  
97 \verb+ch+,  ces instruction sont respectivement notées
98 \verb+ch  !  m+ et \verb+ch  ?  m+.
99 L'instruction de réception consomme la valeur en tête du canal \verb+ch+
100 et l'affecte à la variable \verb+m+ (pour peu que  \verb+ch+ soit initialisé et non vide).
101 De manière similaire,l'instruction d'envoi ajoute la valeur de \verb+m+ à la queue du canal
102 \verb+ch+ (pour peu que celui-ci soit initialisé et non rempli).
103 Dans les cas problématiques, canal non initialisé et vide pour une réception ou bien rempli pour un envoi,
104 le processus est bloqué jusqu'à ce que les  conditions soient  remplies.
105
106 La structures de contrôle   \verb+if+   (resp.   \verb+do+)   définit un choix non déterministe 
107  (resp.  une boucle non déterministe). Que ce soit pour la conditionnelle ou la boucle, 
108 si plus d'une des conditions est établie, l'ensemble des instructions correspondantes 
109 sera choisi aléatoirement puis exécuté.
110
111 Dans le process \verb+init+ détaillé à la {\sc Figure}~\ref{fig:spin:init}, 
112 une boucle de taille $N$ initialise aléatoirement la variable  globale de type tableau \verb+Xp+.
113 Ceci permet par la suite de vérifier si les itérations sont  convergentes pour n'importe  
114 quelle configuration initiale $X^{(0)}$.
115
116
117
118 Pour chaque  élément $i$, si les itérations sont asynchrones
119 \begin{itemize}
120 \item on stocke d'abord la valeur de \verb+Xp[i]+ dans chaque \verb+Xd[j].v[i]+ 
121 puisque la matrice $S^0$ est égale à $(0)$,
122 \item puis, la valeur  de $i$ (représentée par  \verb+Xp[i]+) devrait être transmise 
123   à $j$  s'il y a un arc de $i$ à   $j$ dans le graphe d'incidence. Dans ce cas,
124   c'est la fonction  \verb+hasnext+ (non détaillée ici)  
125   \JFC{la détailler}
126   qui   mémorise ce graphe
127   en fixant à  \texttt{true} la variable \verb+is_succ+, naturellement et à 
128   \texttt{false} dans le cas contraire. 
129   Cela permet d'envoyer la valeur de $i$ dans le canal au travers de \verb+channels[i].sent[j]+.
130 \end{itemize}
131
132 \begin{figure}[t]
133  \begin{minipage}[h]{.52\linewidth}
134 \begin{tiny}
135 \begin{lstlisting}
136 init{
137  int i=0; int j=0; bool is_succ=0;
138  do
139  ::i==N->break;
140  ::i< N->{
141    if
142    ::Xp[i]=0;
143    ::Xp[i]=1;
144    fi;
145    j=0;
146    do
147    ::j==N -> break;
148    ::j< N -> Xd[j].v[i]=Xp[i]; j++;
149    od;
150    j=0;
151    do
152    ::j==N -> break;
153    ::j< N -> {
154      hasnext(i,j);
155      if
156      ::(i!=j && is_succ==1) -> 
157      channels[i].sent[j] ! Xp[i];
158      ::(i==j || is_succ==0) -> skip; 
159      fi;  
160      j++;}
161    od;
162    i++;}
163  od;
164  sync_mutex ! 1;
165 }
166 \end{lstlisting}
167 \end{tiny}
168 \caption{Process init.}\label{fig:spin:init} 
169 \end{minipage}\hfill
170  \begin{minipage}[h]{.42\linewidth}
171 \begin{tiny}
172 \begin{lstlisting}
173 active proctype scheduler(){ 
174  do
175  ::sync_mutex ? 1 -> {
176    int i=0; int j=0;
177    do
178    :: i==N -> break;
179    :: i< N -> {
180      if
181      ::skip;
182      ::mods[j]=i; j++;
183      fi;
184      i++;}
185    od;
186    ar_len=i; 
187    unlock_elements_update ! 1;
188    }
189  od
190 }
191 \end{lstlisting}
192 \end{tiny}
193 \caption{Process scheduler pour la stratégie pseudo pérodique.
194  \label{fig:scheduler}}
195 \end{minipage}
196 \end{figure}
197
198
199
200 \section{Du système booléen au modèle PROMELA}
201 \label{sec:spin:translation}
202 Les éléments principaux des itérations asynchrones rappelées à l'équation 
203 (\ref{eq:async}) sont  la stratégie, la  fonctions et la gestion des délais.
204 Dans cette section, nous présentons successivement comment chacune de 
205 ces notions est traduite vers un modèle PROMELA.
206
207
208 \subsection{La stratégie}\label{sub:spin:strat}
209 Regardons comment une stratégie pseudo périodique peut être représentée en PROMELA.
210 Intuitivement, un process \verb+scheduler+ (comme représenté à la {\sc Figure}~\ref{fig:scheduler}) 
211 est iterrativement appelé pour construire chaque $S^t$ représentant 
212 les éléments possiblement mis à jour à l'itération $t$.
213
214 Basiquement, le process est une boucle qui est débloquée lorsque la valeur du sémaphore
215 \verb+sync_mutex+ est 1. Dans ce cas, les éléments à modifier sont choisis
216 aléatoirement  (grâce à  $n$ choix successifs) et sont mémorisés dans le tableau
217 \verb+mods+,  dont la taille est  \verb+ar_len+.   
218 Dans la séquence d'exécution, le choix d'un élément mis à jour est directement
219 suivi par des mis à jour: ceci est réalisé grâce à la modification de la valeur du sémaphore
220  \verb+unlock_elements_updates+.
221
222 \subsection{Itérer la fonction $F$}\label{sub:spin:update}
223 La mise à jour de l'ensemble  $S^t=\{s_1,\ldots, s_m\}$  des éléments qui constituent la stratégie
224 $(S^t)^{t \in \Nats}$ est implanté à l'aide du process  \verb+update_elems+ fourni à la 
225 {\sc Figure}~\ref{fig:proc}.  
226 Ce process actif attend jusqu'à ce qu'il soit débloqué par le process
227 \verb+scheduler+  à l'aide du sémaphore \verb+unlock_elements_update+.
228 L'implantation contient donc cinq étapes:
229
230 \begin{enumerate}
231 \item elle commence en mettant à jour la variable \texttt{X} avec les valeurs de \texttt{Xp}
232   dans la fonction \texttt{update\_X} (non détaillée ici);
233 \item elle mémorise dans  \texttt{Xd} la valeurs disponibles des  éléments grâce à 
234   la fonction \texttt{fetch\_values} (cf. \Sec{sub:spin:vt});
235 \item  une boucle sur les  \texttt{ar\_len} éléments qui peuvent être modifiés
236   met à jour iterrativement la valeur de $j$ (grâce à l'appel de fonction \texttt{F(j)})
237   pour peu que celui-ci doive être modifié,  \textit{i.e.},   pour peu qu'il soit renseigné dans
238   \texttt{mods[count]}; le code source de \texttt{F} est donné en {\sc Figure}~\ref{fig:p} et est une 
239   traduction directe de l'application $F$;
240 \item les nouvelles valeurs des éléments \texttt{Xp} sont symboliquement envoyés aux 
241   autres éléments qui en dépendent grâce à la fonction 
242   \texttt{diffuse\_values(Xp)} (cf. \Sec{sub:spin:vt});
243 \item finalement, le process informe le scheduler de la fin de la tâche 
244   (au travers  du sémaphore \texttt{sync\_mutex}).
245 \end{enumerate}
246
247
248 \begin{figure}[t]
249   \begin{minipage}[h]{.475\linewidth}
250 \begin{tiny}
251 \begin{lstlisting}
252 active proctype update_elems(){
253  do
254  ::unlock_elements_update ? 1 ->
255    {
256     atomic{
257      bool is_succ=0;
258      update_X();
259      fetch_values();
260      int count = 0;
261      int j = 0;
262      do
263      ::count == ar_len -> break;
264      ::count < ar_len ->
265        j = mods[count];     
266        F(j);
267        count++;
268      od;
269      diffuse_values(Xp);
270      sync_mutex ! 1
271     }
272    }
273  od
274 }
275 \end{lstlisting}
276 \end{tiny}
277 \caption{Mise à jour des éléments.}\label{fig:proc}
278   \end{minipage}\hfill%
279 %\end{figure}
280 %\begin{figure}
281   \begin{minipage}[h]{.45\linewidth}
282 \begin{tiny}
283 \begin{lstlisting}
284 inline F(){
285  if
286  ::j==0 -> Xp[0] = 
287       (Xs[j].v[0] & !Xs[j].v[1]) 
288      |(Xs[j].v[2])
289  ::j==1 -> Xp[1] =  Xs[j].v[0] 
290                  | !Xs[j].v[2]
291  ::j==2 -> Xp[2] =  Xs[j].v[1] 
292                  &  Xs[j].v[2]
293  fi
294 }
295 \end{lstlisting}
296 \end{tiny}
297 \caption{Application de la fonction $F$.}\label{fig:p}
298   \end{minipage}
299 \end{figure}
300
301
302 \subsection{Gestion des délais}\label{sub:spin:vt}
303 Cette  section montre comment les délais inhérents au mode asynchrone sont 
304 traduits dans le modèle  PROMELA  grâce à deux 
305 fonctions \verb+fetch_values+  et   \verb+diffuse_values+.   
306 Celles-ci sont données en {\sc Figure}~\ref{fig:val} et~\ref{fig:broadcast}, 
307 qui récupèrent et diffusent respectivement les valeurs des elements.
308
309 \begin{figure}[t]
310   \begin{minipage}[h]{.475\linewidth}
311 \begin{tiny}
312 \begin{lstlisting}
313 inline fetch_values(){
314  int countv = 0;
315  do
316  :: countv == ar_len -> break ;
317  :: countv < ar_len ->
318     j = mods[countv];
319     i = 0;       
320     do
321     :: (i == N) -> break;
322     :: (i < N && i == j) -> {
323         Xd[j].v[i] = Xp[i] ;
324         i++ }   
325     :: (i < N && i != j) -> {
326         hasnext(i,j);
327         if
328         :: skip
329         :: is_succ==1 &&
330     nempty(channels[i].sent[j]) ->
331             channels[i].sent[j] ?
332                         Xd[j].v[i];
333         fi; 
334         i++ }
335     od;
336     countv++
337  od
338 }
339 \end{lstlisting}
340 \end{tiny}
341 \caption{Récupérer les valeurs des elements\label{fig:val}}
342   \end{minipage}\hfill%
343   \begin{minipage}[h]{.475\linewidth}
344 \begin{tiny}
345 \begin{lstlisting}
346 inline diffuse_values(values){   
347  int countb=0;
348  do
349  :: countb == ar_len -> break ;
350  :: countb < ar_len ->
351     j = mods[countb];
352     i = 0 ;
353     do
354     :: (i == N) -> break;
355     :: (i < N && i == j) -> i++;   
356     :: (i < N && i != j) -> {
357         hasnext(j,i);
358         if
359         :: skip
360         :: is_succ==1 && 
361      nfull(channels[j].sent[i]) ->
362             channels[j].sent[i] ! 
363                          values[j];
364         fi;
365         i++ }
366     od;
367     countb++
368  od
369 }       
370 \end{lstlisting}
371 \end{tiny}
372 \caption{Diffuser les valeurs des elements}\label{fig:broadcast}
373   \end{minipage}
374 \end{figure}
375
376 La première fonction met à jour le tableau   \verb+Xd+ requis pour les éléments
377 qui doivent être modifiés.
378 Pour chaque élément dans  \verb+mods+, identifié par la variable 
379 $j$, la fonction récupère les valeurs  des autres éléments  (dont le libellé est $i$)
380 dont $j$ dépend. \JFC{vérifier si c'est ce sens ici}
381 Il y a deux cas.
382 \begin{itemize}
383 \item puisque $i$ connaît sa dernière valeur (\textit{i.e.},  $D^t_{ii}$ est toujours $t$)
384   \verb+Xd[i].v[i]+ est donc  \verb+Xp[i]+;
385 \item sinon, il y a deux sous cas qui peuvent peuvent potentiellement modifier la valeur 
386   que $j$ a de $i$ (et qui peuvent être choisies de manière aléatoire):
387   \begin{itemize}
388   \item  depuis la perspective de $j$ la valeur de  $i$ peut ne pas avoir changé  (
389     c'est l'instruction \verb+skip+) ou n'est pas utile; ce dernier cas apparaît 
390     lorsqu'il n'y a pas d'arc de  $i$ à $j$ dans le graphe d'incidence, \textit{i.e.}, lorsque
391     la valeur de \verb+is_succ+ qui est calculée par  \verb+hasnext(i,j)+  is 0;
392     dans ce cas, la valeur de \verb+Xd[j].v[i]+ n'est pas modifiée;
393   \item sinon,  on affecte à \verb+Xd[j].v[i]+ la valeur mémorisée
394     dans le canal \verb+channels[i].sent[j]+  (pour peu que celui-ci ne soit pas vide).
395     Les valeurs des éléments sont ajoutées dans ce canal au travers de la fonction  \verb+diffuse_values+
396     donnée juste après.
397   \end{itemize}
398 \end{itemize}
399
400 L'objectif de la fonction \verb+diffuse_values+  est de stocker les valeurs de $X$  représenté
401 dans le modèle par \verb+Xp+ dans le canal  \verb+channels+.
402 Il permet au modèle-checker SPIN  d'exécuter 
403 le modèle PROMELA   comme s'il pouvait y avoir des délais entre processus
404 Il y a deux cas différents pour la valeur de $X_{j}$:
405 \begin{itemize}
406 \item soit elle est \og perdue\fg{}, \og oubliée\fg{} pour permettre à $i$ de ne pas tenir compte d'une 
407 des valeurs de  $j$; ce cas a lieu soit lors de l'instruction  \verb+skip+ ou lorsqu'il 
408 n'y a pas d'arc de $j$ à $i$ dans le graphe d'incidence;
409 \item soit elle est mémorisée dans le canal \verb+channels[j].sent[i]+ (pour peu que celui-ci ne soit pas plein).
410 \end{itemize}
411
412 L'introduction de l'indéterminisme  à la fois dans les fonctions \verb+fetch_values+ 
413 et \verb+diffuse_values+ est nécessaire dans notre contexte. Si celui-ci n'était 
414 présent que dans la fonction \verb+fetch_values+, nous ne pourrions pas par exemple récupérer 
415 la valeur $X_i^{(t)}$ sans considérer la valeur $X_i^{(t-1)}$.  
416 De manière duale, si le  non déterminisme  était uniquement
417 utilisé dans la fonction \verb+diffuse_values+, alors chaque fois qu'une valeur serait 
418 mise dans le canal, elle serait immédiatement consommé, ce qui est contradictoire avec la notion de 
419 délai.
420
421 % \subsection{Discussion}
422 % A  coarse approach  could consist  in providing  one process  for  each element.
423 % However, the  distance with  the mathematical model  given in  \Equ{eq:async} of
424 % such a translation would be larger  than the method presented along these lines.
425 % It induces  that it would be harder  to prove the soundness  and completeness of
426 % such a translation.   For that reason we have developed a  PROMELA model that is
427 % as close as possible to the mathematical one.
428
429 % Notice furthermore that PROMELA is an  imperative language which
430 % often results in generating  intermediate  states 
431 % (to  execute  a matrix assignment  for
432 % instance). 
433 % The  use  of  the  \verb+atomic+  keyword  allows  the  grouping  of
434 % instructions, making the PROMELA code and the DDN as closed as possible.
435
436 \subsection{Propriété de convergence universelle}
437 Il reste à formaliser dans le model checker SPIN que les itérations d'un système 
438 dynamique à $n$ éléments est universellement convergent.
439
440 Rappelons tout d'abord que les variables \verb+X+  et \verb+Xp+ 
441 contiennent respectivement la valeur de $X$ avant et après la mise à jour. 
442 Ainsi, si l'on effectue une initialisation  non déterministe de 
443 \verb+Xp+  et si l'on applique une stratégie pseudo périodique,  
444 il est nécessaire et suffisant
445 de prouver la formule temporelle linéaire (LTL) suivante:
446 \begin{equation}
447 \diamond  (\Box  \verb+Xp+ = \verb+X+)
448 \label{eq:ltl:conv}
449 \end{equation}
450 où les opérateur  $\diamond$ et  $\Box$ on la sémantique usuelle \textit{i.e.}, à savoir
451 respectivement {\em éventuellement} et {\em toujours} dans les chemins suivants.
452 On note que cette propriété assure seulement la stabilisation du système, 
453 mais ne donne aucune métrique quant à la manière dont celle-ci est obtenue.
454 En particulier, on peut converger très lentement ou le système peut même 
455 disposer de plusieurs points fixes.
456 vers plusieurs 
457
458
459 \section{Correction et complétude de la démarche}\label{sec:spin:proof}
460
461 Cette section présente les théorème de correction et de  complétude de l'approche.
462 (Théorèmes~\ref{Theo:sound} et~\ref{Theo:completeness}). 
463 Toutes les preuves sont déplacées en 
464 annexes~\ref{anx:promela}.
465
466
467 \begin{theorem}[Correction]\label{Theo:sound}
468   Soit $\phi$ un modèle de système dynamique discret et $\psi$ sa traduction PROMELA.  
469   Si $\psi$ vérifie
470   la propriété  LTL  (\ref{eq:ltl:conv})  sous hypothèse d'équité faible,  alors
471   les itérations de $\phi$ sont universellement convergentes.
472 \end{theorem}
473
474
475
476 \begin{theorem}[Complétude]\label{Theo:completeness}
477   Soit $\phi$ un modèle de système dynamique discret et $\psi$ sa traduction.  Si $\psi$ ne vérifie pas 
478   la propriété LTL (\ref{eq:ltl:conv}) sous hypothèse d'équité faible,
479   alors les itérations de  $\phi$ ne sont pas universellement convergentes.
480 \end{theorem}
481
482
483
484
485 \section{Données pratiques}
486 \label{sec:spin:practical}
487 Cette section donne tout d'abord quelques mesures de complexité de l'approche 
488 puis présente ensuite les expérimentations issues de ce travail.
489
490 \begin{theorem}[Nombre d'états ]
491   Soit  $\phi$  un modèle de système dynamique discret à  $n$ éléments, $m$ arc dans le graphe d'incidence
492   et $\psi$ sa traduction en PROMELA.  Le nombre de configurations 
493   de l'exécution en SPIN de $\psi$ est bornée par $2^{m\times(\delta_0+1)+n(n+2)}$.
494 \end{theorem}
495 \begin{Proof}
496   Une configuration est une valuation des variables globales.
497   Leur nombre ne dépend que de celles qui ne sont pas constantes.
498
499   Les  variables  \verb+Xp+ et \verb+X+ engendrent  $2^{2n}$ états.
500   La variable
501   \verb+Xs+ génère $2^{n^2}$ états.  
502   Chaque canal de \verb+array_of_channels+
503   peut engendrer $1+2^1+\ldots+2^{\delta_0}=  2^{\delta_0+1}-1$  états. 
504   Puisque le nombre d'arêtes du graphe d'incidence  est $m$,  
505   il y a  $m$ canaux non constants,  ce qui génère approximativement $2^{m\times(\delta_0+1)}$ états. 
506   Le nombre de configurations est donc borné par $2^{m\times(\delta_0+1)+n(n+2)}$.
507   On remarque que cette borne est traitable par SPIN pour des valeurs raisonnables de  $n$, 
508   $m$ et $\delta_0$.
509   \JFC{Donner un ordre de grandeur de cet ordre de grandeur}
510   
511 \end{Proof}
512
513 La méthode détaillée ici a pu être appliquée sur l'exemple jouet
514 pour prouver formellement sa convergence uniforme.
515
516 On peut remarquer que SPIN n'impose l'équité faible qu'entre les process
517 alors que les preuves des deux théorèmes précédentes reposent sur le fait que 
518 celle-ci est établie dès qu'un choix indéterministe est effectué.
519 Naïvement, on pourrait considérer comme hypothèse la formule suivante 
520 chaque fois qu'un choix indéterministe se produit entre $k$ événements
521 respectivement notés $l1$, \ldots $lk$:  
522 $$
523 [] <> (l == l0) \Rightarrow 
524 (([] <> (l== l1)) \land  \ldots \land ([] <> (l == lk)))
525 $$
526
527 où le libellé $l0$ dénote le libellé de la ligne précédent le choix indéterministe.
528 Cette formule traduit exactement l'équité faible.
529 Cependant en raison de l'explosion de la taille du produit entre 
530 l'automate de Büchi issu de cette formule et celui issu du programme  PROMELA,
531 SPIN n'arrive pas à vérifier si la convergence uniforme est établie ou non sur des exemples 
532 simples\JFC{faire référence à un tel exemple}. 
533
534 Ce problème a été pratiquement résolu en laissant SPIN générer toutes les traces d'exécution,
535 même les non équitables, puis en le laissant vérifier la propriété de convergence dessus. 
536 Il reste alors à interpréter les résultats qui peuvent être de deux types. Si la convergence est 
537 établie pour toutes les traces, elle le reste en particulier pour les traces équitables.
538 Dans le cas contraire on doit analyser le contre exemple produit par SPIN.
539
540 % \begin{xpl}
541 % \JFC{Reprendre ce qui suit}
542 % Experiments have shown that all the iterations of the running example are 
543 % convergent for a delay equal to 1 in less than 10 min.
544 % The example presented in~\cite{abcvs05} with five elements taking boolean 
545 % values has been verified with method presented in this article.   
546 % Immediately, SPIN computes a counter example, that unfortunately does not
547 % fulfill fairness properties. Fair counter example is obtained
548 % after few minutes.
549 % All the experimentation have been realized in a classic desktop computer.
550 % \end{xpl}
551
552
553 La méthode détaillée ici a été appliquée sur des exemples pour prouver formellement 
554 leur convergence ou leur divergence (Fig.~\ref{fig:async:exp}).
555 Dans ces expériences, les délais on été bornés par $\delta_0=10$.
556 Dans ce tableau,  $P$ est vrai ($\top$) si et seulement si la convergence uniforme 
557 est établie et faux ($\bot$) sinon. Le nombre $M$ et la taille de la  mémoire consommée (en MB) et 
558 $T$ est le temps d'exécution sur un  Intel Centrino Dual Core 2 Duo @1.8GHz avec 2GB de mémoire vive
559 pour établir un verdict.
560
561 L'exemple RE est l'exemple jouet de ce chapitre,
562 AC2D est un automate cellulaire  avec 9 elements prenant des valeurs booléennes en fonction de 
563 de 4 voisins et BM99, issu de~\cite{BM99} consiste en  10 process
564 qui modifient leur valeur booléennes dans un graphe d'adjacence proche du graphe complet.
565
566
567 \begin{figure}
568 \begin{center}
569 \tiny
570 \begin{tabular}{|*{13}{c|}}
571 \cline{2-13}
572 \multicolumn{1}{c|}{ }
573 &\multicolumn{6}{|c|}{Mixed Mode} & \multicolumn{6}{|c|}{Only Bounded} \\
574 \cline{2-13}
575 \multicolumn{1}{c|}{ }
576 &\multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Pseudo-Periodic} &
577 \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Pseudo-Periodic} \\
578 \cline{2-13}
579 \multicolumn{1}{c|}{ }
580 &P & M & T &
581 P & M & T &
582 P & M & T&
583 P & M & T \\
584 \hline %cline{2-13}
585 Running Example & 
586 $\top$ & 409 & 1m11s&
587 $\bot$ & 370 & 0.54 &
588 $\bot$ & 374 & 7.7s&
589 $\bot$ & 370 & 0.51s \\
590 \hline %\cline{2-13}
591 AC2D 
592 &$\bot$ & 2.5 & 0.001s  % RC07_async_mixed.spin
593 &$\bot$ & 2.5 & 0.01s   % RC07_async_mixed_all.spin
594 &$\bot$ & 2.5 & 0.01s   % RC07_async.spin
595 &$\bot$ & 2.5 & 0.01s  \\ % RC07_async_all.spin 
596 \hline %\cline{2-13}
597 BM99 
598 &$\top$ &  &   %BM99_mixed_para.spin 
599 &$\top$ &  &    % RC07_async_mixed_all.spin
600 &$\bot$ &  &    % RC07_async.spin
601 &$\bot$ &  &   \\ % RC07_async_all.spin 
602 \hline %\cline{2-13}
603 \end{tabular}
604 \end{center}
605 \caption{Expérimentations avec des itérations asynchrones}\label{fig:async:exp}
606 \end{figure} 
607
608
609
610 L'exemple~\cite{RC07} concerne un réseau composé de deux gènes à valeur dans $\{0,1,2\}$. 
611 Comme la convergence n'est déjà pas établie pour les itérations parallèles, il en est donc 
612 de même pour les itérations asynchrones.
613 LA {\sc Figure}~\ref{fig:RC07CE} donne une trace de la sortie de SPIN de menant à la violation 
614 de la convergence. Celle-ci correspond à une stratégie périodique qui répète
615 $\{1,2\};\{1,2\};\{1\};\{1,2\};\{1,2\}$ et débute avec $X=(0,0)$.
616    
617   
618 Dans l'exemple issu de~\cite{BM99}, nous avons 10 process
619 à valeur booléennes. En raison de la dépendance forte entre les éléments, 
620 $\delta_0$ est réduit à 1. Cela aboutit cependant à $2^{100}$ 
621 configurations dans le mode des itérations asynchrones.
622 La convergence des itérations asynchrones de l'exemple~\cite{BCVC10:ir} n'est pas établie 
623 lorsque pour $\delta_0$ vaut 1. Il ne peut donc y avoir convergence uniforme.
624
625 \begin{figure}
626 \begin{center}
627 \begin{tiny}
628 \begin{tabular}{|*{7}{c|}}
629 \cline{2-7}
630 \multicolumn{1}{c|}{ }
631 &\multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Pseudo-Periodic} \\
632 \cline{2-7}
633 \multicolumn{1}{c|}{ }& 
634 P & M & T&
635 P & M & T \\
636 \hline %\cline{2-7}
637 Running  &
638 $\top$ & 2.7 & 0.01s & 
639 $\bot$ & 369.371 & 0.509s \\ 
640 \hline %\cline{2-7}
641 \cite{RC07} exemples &
642 $\bot$ & 2.5 & 0.001s & % RC07_sync.spin
643 $\bot$ & 2.5 & 0.01s \\ % RC07_sync_chao_all.spin
644 \hline
645 \cite{BM99} exemple &
646 $\top$ & 36.7 & 12s & % BM99_sync_para.spin
647 $\top$ &  &  \\ % BM99_sync_chao.spin
648 \hline
649 \end{tabular}
650 \end{tiny}
651 \end{center}
652 \caption{Expérimentations avec des itérations synchrones}\label{fig:sync:exp}
653 \end{figure} 
654
655
656
657
658
659
660 % \begin{tabular}{|*{19}{c|}}
661 % % \hline 
662 % % e \\
663 % % 
664 % \hline
665 % & \multicolumn{6}{|c|}{Synchronous} & \multicolumn{12}{|c|}{Asynchronous}\\
666 % \cline{8-19}
667 % Delay &  \multicolumn{6}{|c|}{ }
668 % & \multicolumn{6}{|c|}
669 % {Only Bounded}
670 % & \multicolumn{6}{|c|}
671 % {Bounded+Mixed Mode}\\
672 % Strategy&
673 % \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} &
674 % \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} &
675 % \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} \\
676
677
678 %  \end{tabular}
679
680  
681 \section{Conclusion}
682 \label{sec:spin:concl}
683 Des méthodes de simulation basées sur des stratégies et des délais générés aléatoirement 
684 ont déjà été présentées~\cite{BM99,BCV02}.
685 Cependant, comme ces implantations ne sont pas exhaustives, elles ne donnent un résultat 
686 formel que lorsqu'elles fournissent un contre-exemple. Lorsqu'elles exhibent une convergence,  
687 cela ne permet que donner une intuition de convergence, pas  une preuve.
688 Autant que nous sachions, aucune démarche de preuve formelle de convergence n'a jamais été établie. 
689 Dans le travail théorique~\cite{Cha06}, Chandrasekaran a montré que les itérations asynchrones sont convergentes 
690 si et seulement si on peut construire une fonction de Lyaponov décroissante, mais il ne donne pas de méthode 
691 automatique pour construire cette fonction.
692
693 \JFC{Déplacer ceci dans les perspective}
694 Among drawbacks of the method,  one can argue that bounded delays is only 
695 realistic in practice for close systems. 
696 However, in real large scale distributed systems where bandwidth is weak, 
697 this restriction is too strong. In that case, one should only consider that 
698 matrix $S^{t}$ follows the  iterations of the system, \textit{i.e.},
699 for all $i$, $j$, $1 \le i \le j \le n$,  we have$
700 \lim\limits_{t \to \infty} S_{ij}^t = + \infty$. 
701 One challenge of this work should consist in weakening this constraint. 
702 We plan as future work to take into account other automatic approaches 
703 to discharge proofs notably by deductive analysis~\cite{CGK05}. 
704
705
706
707
708
709