From 1b923f193392e3ce847882c24a128eff4bee9992 Mon Sep 17 00:00:00 2001 From: couchot Date: Tue, 24 Jun 2014 16:28:32 +0200 Subject: [PATCH 1/1] un paquet d'ajouts --- Gi.dot | 9 + Gi.pdf | Bin 0 -> 4574 bytes Makefile | 49 ++ Suite_logistique_390_100.png | Bin 0 -> 5003 bytes annexePromelaProof.tex | 2 + annexecontinuite.tex | 48 ++ annexesccg.tex | 126 ++++ g.dot | 10 + g.pdf | Bin 0 -> 4230 bytes glossaire.tex | 92 +++ gp.dot | 5 + gp.pdf | Bin 0 -> 4046 bytes h.dot | 10 + h.pdf | Bin 0 -> 4213 bytes hp.dot | 5 + hp.pdf | Bin 0 -> 4049 bytes images/Gi.dot | 9 + images/Gi.pdf | Bin 0 -> 4574 bytes images/Suite_logistique_390_100.png | Bin 0 -> 5003 bytes images/g.dot | 10 + images/g.pdf | Bin 0 -> 4230 bytes images/gp.dot | 5 + images/gp.pdf | Bin 0 -> 4046 bytes images/h.dot | 10 + images/h.pdf | Bin 0 -> 4213 bytes images/hp.dot | 5 + images/hp.pdf | Bin 0 -> 4049 bytes images/logistique.png | Bin 0 -> 36033 bytes images/tente.png | Bin 0 -> 40257 bytes images/texput.log | 21 + latexStyle/tex-templates | 1 + logistique.png | Bin 0 -> 36033 bytes main.glsdefs | 330 +++++++++ main.tex | 204 ++++++ modelchecking.tex | 1042 +++++++++++++++++++++++++++ sdd.tex | 255 +++++++ spimufchdr-backpage.eps | 1 + spimufchdr-backpage.pdf | 1 + spimufchdr-frontpage.eps | 1 + spimufchdr-frontpage.pdf | 1 + spimufchdr-p3-head.eps | 1 + spimufchdr-p3-head.pdf | 1 + spimufchdr.cls | 1 + tente.png | Bin 0 -> 40257 bytes upmext-spimufchdr.cfg | 1 + 45 files changed, 2256 insertions(+) create mode 100644 Gi.dot create mode 100644 Gi.pdf create mode 100755 Makefile create mode 100644 Suite_logistique_390_100.png create mode 100644 annexePromelaProof.tex create mode 100644 annexecontinuite.tex create mode 100644 annexesccg.tex create mode 100644 g.dot create mode 100644 g.pdf create mode 100644 glossaire.tex create mode 100644 gp.dot create mode 100644 gp.pdf create mode 100644 h.dot create mode 100644 h.pdf create mode 100644 hp.dot create mode 100644 hp.pdf create mode 100644 images/Gi.dot create mode 100644 images/Gi.pdf create mode 100644 images/Suite_logistique_390_100.png create mode 100644 images/g.dot create mode 100644 images/g.pdf create mode 100644 images/gp.dot create mode 100644 images/gp.pdf create mode 100644 images/h.dot create mode 100644 images/h.pdf create mode 100644 images/hp.dot create mode 100644 images/hp.pdf create mode 100644 images/logistique.png create mode 100644 images/tente.png create mode 100644 images/texput.log create mode 160000 latexStyle/tex-templates create mode 100644 logistique.png create mode 100644 main.glsdefs create mode 100644 main.tex create mode 100644 modelchecking.tex create mode 100644 sdd.tex create mode 120000 spimufchdr-backpage.eps create mode 120000 spimufchdr-backpage.pdf create mode 120000 spimufchdr-frontpage.eps create mode 120000 spimufchdr-frontpage.pdf create mode 120000 spimufchdr-p3-head.eps create mode 120000 spimufchdr-p3-head.pdf create mode 120000 spimufchdr.cls create mode 100644 tente.png create mode 120000 upmext-spimufchdr.cfg diff --git a/Gi.dot b/Gi.dot new file mode 100644 index 0000000..cf9e416 --- /dev/null +++ b/Gi.dot @@ -0,0 +1,9 @@ +digraph { +1 -> 1 [label=" -"] +1 -> 4 [label=" +-"] +2 -> 2 [label=" -"] +2 -> 4 [label=" +-"] +3 -> 3 [label=" -"] +3 -> 4 [label=" +-"] +4 -> 4 [label=" +-"] +} \ No newline at end of file diff --git a/Gi.pdf b/Gi.pdf new file mode 100644 index 0000000000000000000000000000000000000000..22af9dce27804f3245e6db3bbe08026b8dd0c84a GIT binary patch literal 4574 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 NG2ZauVdKJi{|9kcIQ9Sl literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..7e5377b --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +MAIN = main +SOURCES = $(MAIN).tex abstract.tex intro.tex ddn.tex xpl.tex promela.tex translation.tex proof.tex complexity.tex exp.tex conclusion.tex abbrev.bib biblioand.bib +LOG=logLatex + +pdf: $(MAIN).pdf + +$(MAIN).pdf: $(SOURCES) + @printf "***** Compilation 1 *****\n" + @pdflatex $(MAIN) > $(LOG) + @printf "***** Biblio *****\n" + @bibtex $(MAIN) >> $(LOG) + @printf "***** Compilation 2 *****\n" + @pdflatex $(MAIN) >> $(LOG) + @printf "***** Compilation 3 *****\n" + @pdflatex $(MAIN) >> $(LOG) + +all: + latex $(MAIN).tex > $(LOG) + latex $(MAIN).tex >> $(LOG) + bibtex $(MAIN) >> $(LOG) + latex $(MAIN).tex >> $(LOG) + dvips -t a4 $(MAIN).dvi -o >> $(LOG) + ps2pdf $(MAIN).ps >> $(LOG) + +fast: + latex $(MAIN).tex > $(LOG) + dvips -t a4 $(MAIN).dvi -o >> $(LOG) + ps2pdf $(MAIN).ps >> $(LOG) + +test: + acroread $(MAIN).pdf + +testr: + kghostview $(MAIN).ps + +clean: + rm -rf *~ *.aux *.log *.bbl *.blg *.dvi *.bak *.thm *.lof *.loe *.lot *.out *.toc + + +# construit l'archive toute prete (pour Springer) +TEXSOURCES = main.tex ddn.tex +PACKAGES = mathpartir.sty synttree.sty bcprules.sty arydshln.sty +CLSSTY = llncs.cls llncsdoc.sty splncs.bst sprmindx.sty +UTIL = Makefile copyright.pdf CL07-CameraReady.pdf readme +FILES = $(TEXSOURCES) $(PACKAGES) $(CLSSTY) $(UTIL) + +arch: + zip Archive.zip $(FILES) + diff --git a/Suite_logistique_390_100.png b/Suite_logistique_390_100.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3dc124099cefe92f8e1d6f1a7e159181614584 GIT binary patch literal 5003 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 literal 0 HcmV?d00001 diff --git a/annexePromelaProof.tex b/annexePromelaProof.tex new file mode 100644 index 0000000..8c95761 --- /dev/null +++ b/annexePromelaProof.tex @@ -0,0 +1,2 @@ +\JFC{Voir section~\ref{sec:spin:proof}} + diff --git a/annexecontinuite.tex b/annexecontinuite.tex new file mode 100644 index 0000000..85cbd4c --- /dev/null +++ b/annexecontinuite.tex @@ -0,0 +1,48 @@ +Montrons que pour toute fonction booléenne +$f$ de $\Bool^n$ dans lui même, $G_f$ est continue sur $(\mathcal{X},d)$. + +Soit donc $(s_t,x^t)^{t \in \Nats}$ une suite de points de +l'espace $\mathcal{X}$ qui converge vers $(s,x)$. +Montrons que $(G_f (s_t,x^t))^{t \in \Nats}$ converge vers $G_f (s,x)$. + +La distance $d((s_t,x^t), (s,x))$ tend vers 0. +Il en est donc de même pour $d_H(x^t, x)$ et $d_S(s_t, s)$. +Or, $d_H(x^t, x)$ ne prend que des valeurs entières. +Cette distance est donc nulle à partir d'un certain $t_0$. +Ainsi, à partir de $t>t_0$, on a $x^t = x$ . +De plus, $d_S(s_t, s)$ tend vers $0$ donc $d_S(s_t, s) < 10^{-1}$ +à partir d'un certain rang $t_1$. +Ainsi, à partir de $t>t_1$, les suites $(s_t)_{t \in \Nats}$ +ont toutes le même premier terme, qui est celui +de $s$ pour $t$ supérieur à $t_1$. +Pour $t > \max(t_0,t_1)$, les configurations $x^t$ et $x$ +sont les mêmes, +et les stratégies $s_t$ et $s$ ont le même premier terme +($s_0^t = s_0$), donc les configurations +de $F_f(s_0^t,x^t)$ et de $F_f (s_0,x)$ sont égales et donc la distance +entre $G_f(s_t,x^t)$ et $G_f (s,x)$ est inférieure à 1. + +Montrons maintenant que la distance entre +$G_f (s_t,x^t)$ et $G_f (s,x)$ +tend bien vers 0 quand $t$ tend vers $+\infty$. Soit $\epsilon > 0$. +\begin{itemize} + \item Si $\epsilon \ge 1$. Comme la distance $d(G_f(s_t,x^t), G_f (s,x))<1$ + pour $t > \max(t_0, t_1)$, alors + $d(G_f(s_t,x^t), G_f (s,x))<\epsilon$ + \item Si $\epsilon < 1$, alors $\exists k \in \Nats \textrm{ tel que } + 10^{-k} > \epsilon > 10^{-(k+1)}$. + Comme $d_S(s_t, s)$ tend vers 0, il existe +un rang $t_2$ à partir duquel +$\forall t > t_2 , d_S(s_t, s) < 10^{-(k+2)}$: +à partir de ce rang, les $k+2$ premiers termes de $s_t$ sont ceux de $s$. +Donc les $k + 1$ premiers termes des stratégies de +$G_f (s_t,x^t)$ et de +$G_f (s,x)$ sont les mêmes (puisque $G_f$ +opère un décalage sur les stratégies), et vue la +définition de $d_S$, la partie décimale de la distance entre les points +$(s_t,x^t)$ et $(s,x)$ est +inférieure à $10^{-(k+1)} \le \epsilon$. +\end{itemize} +Pour conclure, pour tout $\epsilon > 0$, +$\exists~T_0 = \max(t_0, t_1, t_2) \in \Nats \textrm{ tel que } +\forall t > T_0 , d (Gf (s_t,x^t),G_f (s,x))< \epsilon$. diff --git a/annexesccg.tex b/annexesccg.tex new file mode 100644 index 0000000..3db4320 --- /dev/null +++ b/annexesccg.tex @@ -0,0 +1,126 @@ +Soit $\alpha\in\Bool$. +On nomme $f^{\alpha}$ la fonction de $\Bool^{n-1}$ +dans lui-même définie pour +chaque $x\in\Bool^{n-1}$ par +\[ +f^{\alpha}(x)=(f_1(x,\alpha),\dots,f_{n-1}(x,\alpha)). +\] +On nomme $\Gamma(f)^\alpha$ le sous-graphe +de $\Gamma(f)$ engendré par le sous-ensemble +$\Bool^{n-1} \times \{\alpha\}$ de $\Bool^n$. + + + + +Énonçons et prouvons tout d'abord les lemmes techniques suivants: + +\begin{lemma}\label{lemma:subgraph} +$G(f^\alpha)$ est un sous-graphe de $G(f)$: chaque arc de $G(f^\alpha)$ est +un arc de $G(f)$. De plus si $G(f)$ n'a pas d'arc de $n$ vers un autre +sommet $i\neq n$, alors on déduit +$G(f^\alpha)$ de $G(f)$ en supprimant le sommet $n$ ainsi que tous les +arcs dont $n$ est soit l'extrémité, soit l'origine (et dans ce dernier +cas, les arcs sont des boucles sur $n$). +\end{lemma} + +\begin{Proof} +Supposons que $G(f^{\alpha})$ possède un arc de $j$ vers $i$ de signe +$s$. Par définition, il existe un sommet $x\in\Bool^{n-1}$ tel que +$f^{\alpha}_{ij}(x)=s$, et puisque +$f^{\alpha}_{ij}(x)=f_{ij}(x,\alpha)$, on en déduit que $G(f)$ possède un arc +de $j$ à $i$ de signe $s$. Ceci prouve la première assertion. +Pour démontrer la seconde, il suffit de prouver que si +$G(f)$ a un arc de $j$ vers $i$ de signe $s$, avec $i,j\neq n$, alors +$G(f^\alpha)$ contient aussi cet arc. Ainsi, supposons que $G(f)$ a un +arc de $j$ vers $i$ de signe $s$, avec $i,j\neq n$. +Alors, il existe +$x\in\Bool^{n-1}$ et $\beta\in\Bool$ tels que +$f_{ij}(x,\beta)=s$. Si $f_{ij}(x,\beta)\neq f_{ij}(x,\alpha)$, alors +$f_i$ dépend du $n^{\textrm{ème}}$ composant, ce qui est en contradiction +avec les hypothèses. +Ainsi $f_{ij}(x,\alpha)$ est égal à $s$. +On a donc aussi +$f^{\alpha}_{ij}(x)=s$. Ainsi $G(f^\alpha)$ possède un arc +arc de $j$ vers $i$ de signe $s$. +\end{Proof} + +\begin{lemma}\label{lemma:iso} +Les graphes $\Gamma(f^\alpha)$ et $\Gamma(f)^\alpha$ sont isomorphes. +\end{lemma} + +\begin{Proof} +Soit $h$ la bijection de $\Bool^{n-1}$ vers +$\Bool^{n-1}\times \{\alpha\}$ définie par $h(x)=(x,\alpha)$ pour chaque +$x\in\Bool^{n-1}$. +On voit facilement que $h$ permet de définir un isomorphisme +entre $\Gamma(f^\alpha)$ et $\Gamma(f)^\alpha$: +$\Gamma(f^\alpha)$ possède un arc de $x$ vers $y$ si et seulement si +$\Gamma(f)^\alpha$ a un arc de $h(x)$ vers $h(y)$. +\end{Proof} + + +\begin{Proof} +du Théorème~\ref{th:Adrien}. +La preuve se fait par induction sur $n$. +Soit $f$ une fonction de $\Bool^n$ dans lui-même et qui vérifie les hypothèses +du théorème. +Si $n=1$ la démonstration est élémentaire: +en raison du troisième point du théorème, $G(f)$ a une boucle négative; +ainsi $f(x)=\overline{x}$ et $\Gamma(f)$ est un cycle de longueur 2. +On suppose donc que $n>1$ et que le théorème est valide pour toutes les +fonctions de $\Bool^{n-1}$ dans lui-même. +En raison du premier point du théorème, $G(f)$ +contient au moins un sommet $i$ tel qu'il n'existe pas dans $G(f)$ +d'arc de $i$ vers un autre sommet $j\neq i$. +Sans perte de généralité, on peut considérer que +ce sommet est $n$. +Alors, d'après le lemme~\ref{lemma:subgraph}, +$f^0$ et $f^1$ vérifient les conditions de l'hypothèse. +Alors, par hypothèse d'induction $\Gamma(f^0)$ et +$\Gamma(f^1)$ sont fortement connexes. +Ainsi, d'après le lemme~\ref{lemma:iso}, +$\Gamma(f)^0$ et $\Gamma(f)^1$ sont fortement +connexes. +Pour prouver que $\Gamma(f)$ est fortement connexe, il suffit +de prouver que $\Gamma(f)$ contient un arc $x\to y$ avec +$x_n=0y_n$. +En d'autres mots, il suffit de prouver que: +\begin{equation}\tag{$*$} +\forall \alpha\in\Bool,~\exists x\in\Bool^n,\qquad x_n=\alpha\neq f_n(x). +\end{equation} + +On suppose tout d'abord que $n$ a une boucle +négative. +Alors, d'après la définition de +$G(f)$, il existe $x\in\Bool^n$ tel que $f_{nn}(x)<0$. +Ainsi si $x_n=0$, on a $f_n(x)>f_n(\overline{x}^n)$, et donc +$x_n=0\neq f_n(x)$ et +$\overline{x}^n_n=1\neq f_n(\overline{x}^n)$; +et si $x_n=1$, on a +$f_n(x) 00 + 00 -> 10 + 01 -> 00 + 01 -> 11 + 10 -> 11 + 10 -> 00 + 11 -> 10 + 11 -> 01 +} diff --git a/g.pdf b/g.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f69e01a50f697938abc415e96b35eb535786344 GIT binary patch literal 4230 zcmb_fdsI}_8uvOe4a9`l}NMq!3Qf>9jkiU~K*%sImxn3*%3b4CU- zEVayDmPtM`jUbG=tGa4tvI4ElRPup6uJ@u>0>KngG_x|{?la85Aie(ZtTk)){=WTv z`+NTO-qW+p7AY=MAk+7EtbQF)0t~SBLPW1eGih&u-~uX0v7r{mEzlf5EpAev&9sB1 zXrmF~1&$^?NMO^e4;a`cY}CmsiHe=iWZeJdHxIsc_RETzp1prd&)T%I%G6Vq{`9sp zqdqM1UEHv3%THaC6Y2xGN0)&&jIB zJ5%P?NS`{ka_!!&A78<}VKITQ%X{q?(^6-MweiQ+r=%&U-obD^&k(TX8-5X_W#nCADVyHucgh~-b%Z4zVdu|T&;b~!%W%9Cdp$*&a+oN{+aoW zv9r!Ktg(Mvzov6Ttl^!F6?s@!(>&a>5Q!fuaK6VB6=qD53kripnH5b1!oEq_n zbEyq))1TeHX3h_eHx6%#9dUhk)kyXqYs)B)^OqOj(pKn>znk$~;lv-Qs>U9Al05c& z;62%nnuD+0_OWg_6H^BkM@_uqt2k;~SUzIj(F28byN57)KRdHyeR)%DMT#%!$Hjac zraC<9*&(jsDM!FqcDQ$nEA{9;TfHvj_FLn#8b^Kq7TQ4V_QM6UImgqU-n8s_n9(^9~;QzU0ymDhqOD(>{ zp7cqL>RfYqMf*i{#hS+j$AQXbzSFaLF@n9oj2t zA_daT7KBxVthdqvNkI<4dkOt}s|PCRcLPD^W?2DlG=_`}dKKErrba|LTfds1n_;d7 z(G28@(-1R-6 zjYnB8jh50Jn-FvX;x;V@I599g!FkB}USy91c4$Oo$V}mrKtX7X#y-e*P>V?WB8qAq zd7!~6{d)AlBi4qfuJ_Ak%e!A7f0=ryDgRpK>8-=wPFj8>&w0u_xy?KIw@9?xNeMJIA-K zOK@q5?v0L#jy^YZWOjW+Q&ppV*n71Te!V1}uw?u)+wly3>@yf09UZ-X)To%~TVhts zdfu6S@?z!k3u$ScjayPOV(zN%Hnu1)UrnDWHJf&id%KYsx;%U7_Trwlj_xmZwW-_R zIX$}T+S98SUpRkCRd9WGisZ@p5uvGBgJwVJ}Zch~Rp9?v$s|A>13YIVnwGnbdH_@ZYr zvBfj}o2c*0Un&VqZaC9SFB&rBo|pcGixoc*Cxe&}S^QzN=udsFH8Y%dT%o}F60e^b z@R5!pS^##sfbkk67i#MzfT0YM`AREh^_gfFGrN?dvrFgXI7*8gT1qn0i0EgM5TI#k zfb>b7!K(xhU=tYPOtwr*oVXyM3wV4U2wEWEaeH}Pz#s{V=-^l+qY@BYA`}@Uxz;Qo zu&ld?5db06%5W(zPXbO3wrerV6#-nPl0cOl<2tFN(78e)Gisdqv zD?o9rR*PZ;N)S@GLdutT1u`J@^7p{~f`%};ePUi-7PLv`U_B_4i{dg24Q~`iF^2U5 zabwcX`UQhTqp_<9%Hfo1;B}Um;YnyD zFdUa+a;Y58!Eqg~)yeThjL>129=%~DOgR)a!3!k3Q2qtch?NndESCcd!I;L8KG$NV z6fCAWUQ7WYBQO~O;&c2ou)^a55P-mS3YCsffd_I-0NRNq^x70u9MYpl#oR@N?j{D4 z^jWQc98Ql%ta5Rk&dfUe9(YEioBv`B-Ndw0jy^Mee$E|i6Uu?oZd$a6hndHros>i8 zWH}EBi=6cN;1Na&Fz_g>P>E3wnF1rYX=AVnlifn^z|DwFrE`3QY=F4Ag~wD{t(uOp(FmckRt)! zQ^d%^EQnLFY#XN_g`g zNW(N5_^h~rrj`$;VfY|@m>P$-=7F*}M4mx37~w%QLJe>3H_9ppufsHhX-Z;{Ed(Zy zutnfVcr)bSJ0GCgOeuWAC;)0>S@_lvuZjRo_c~b!n&LAAO*eyudacGxsN_USib7@9 tSO~(R)ubk?F#^{nr{bv=v+>VY{`Yt45|zPn~N){tvTIu*?7e literal 0 HcmV?d00001 diff --git a/glossaire.tex b/glossaire.tex new file mode 100644 index 0000000..4932ec2 --- /dev/null +++ b/glossaire.tex @@ -0,0 +1,92 @@ +\newglossaryentry{graphoriente}{name=graphe orienté, description={ +Un graphe orienté $G=(S,A)$ +est défini par la donnée d'un ensemble de sommets $S$ et +d'un ensemble d'arcs $A$, +chaque arc étant représenté par un couple de sommets. +Si $x$ et $y$ sont des sommets de $S$, +le couple $(x,y)$ représente l'arc orienté allant du sommet \emph{origine} +$x$ au sommet \emph{extremité} $y$.}} + +\newglossaryentry{graphfortementconnexe}{name=graphe fortement connexe, description={ +Un graphe orienté $G=(S,A)$ est fortement connexe si pour tout +couple de sommets $x$, $y$ de $S$ il existe un chemin reliant $x$ à $y$ +et $y$ à $x$.} +} + + +\newglossaryentry{distributionuniforme}{name=distribution uniforme, description={Les lois de distribution uniforme (ou loi uniformes continues) +forment une famille de lois à densité caractérisées par la propriété suivante: +tous les intervalles de même longueur inclus dans le support de la loi ont +la même probabilité.} +} + + +\newglossaryentry{partieentiere}{name=partie entière, description= +{La partie entière d'un nombre réel est l'entier qui lui est immédiatement + inférieur ou égal. Pour un nombre réel $x$, on la note $\lfloor x \rfloor$. +}, +symbol={\ensuremath{\lfloor x \rfloor}} +} + + +\newglossaryentry{distanceHamming}{name=distance de Hamming, description= +{La distance de Hamming entre deux éléments $x=(x_1,\ldots,x_n)$ et +$y=(y_1,\ldots,y_n)$ dans $\Bool^n$ +est le nombre d'indices $i$, $1 \le i \le n$ tels que +$x_i$ diffère de $y_i$. +}} + + + +\newglossaryentry{decalageDeBits}{name=décalage de bits, +plural=décalages de bits, +description={Soit $x$ un nombre binaire de $n$ bits et $b$ un entier. +Le nombre binaire de $n$ bits $x \ll b$ (respectivement $x \gg b$) +est obtenu en +décalant les bits de $x$ de $b$ bits vers la gauche +(resp. vers la droite) et +en complétant avec des zéros à droite (resp. à gauche). +}} + + + +\newglossaryentry{chaineDeMarkov}{name=chaîne de Markov, +plural=chaînes de Markov, description={ +On se restreint à la définition d'une chaîne de Markov homogène. Celle-ci +désigne une suite de variables aléatoires $(X_n)_{n \in \Nats}$ +à temps discret, à espace d'états discret, sans mémoire et +dont le mécanisme de transition ne change pas au cours du temps. +Formellement la propriété suivante doit être établie:\newline +$ +%\begin{array}{l} +\forall n \ge 0, \forall (i_0, \ldots, i_{n-1}, i,j),\\ +\textrm{ }P(X_{n+1}=j\mid X_0=i_0, X_1=i_1, X_2=i_2, \ldots, X_{n-1}=i_{n-1}, X_{n}=i) \\ +\textrm{ }= P(X_{1}=j\mid X_n=i). +%\end{array} +$ +}} + + +\newglossaryentry{vecteurDeProbabilite}{name=vecteur de probabilités, +plural=vecteurs de probabilités, description={ +Un vecteur de probabilités est un vecteur tel que toutes ses composantes +sont positives ou nulles et leur somme vaut 1.}} + +\newglossaryentry{matriceDAdjacence}{name=matrice d'adjacence, description={ +La matrice d'adjacence du graphe orienté $G=(S,A)$ à $n$ sommets +est la matrice $\check{M}$ de dimension $n \times n$ +dont l'élément $\check{M}_{ij}$ représente le nombre d'arcs d'origine $i$ et d'extrémité $j$.}} + + +\newglossaryentry{xor}{name=ou exclusif, description= +{La fonction \og ou exclusif\fg{}, XOR, est l'opérateur de $\Bool^2$ dans +$\Bool$ qui prend la valeur 1 si seulement +si les deux opérandes ont des valeurs distinctes.}, +symbol={\ensuremath{\oplus}} +} + +\newglossaryentry{matriceDeTransitions}{name=matrice de transitions, description= +{ + Le nombre $p_{ij}= P(X_1=j \mid X_0 =i)$ est appelé probabilité de transition + de l'état $i$ à l'état $j$ en un pas. La matrice composée des $p_{ij}$ + est la matrice de transitions associée à la chaine de Markov $X$.}} \ No newline at end of file diff --git a/gp.dot b/gp.dot new file mode 100644 index 0000000..161e9d2 --- /dev/null +++ b/gp.dot @@ -0,0 +1,5 @@ +digraph{ + 1 -> 1 [label=" -"] + 1 -> 2 [label=" +"] + 2 -> 2 [label=" -"] +} \ No newline at end of file diff --git a/gp.pdf b/gp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a99b1fa1f4e789c7c235297dde877f6ef80c69c GIT binary patch literal 4046 zcmb^!X>b$gH3I{M4M_+kVam|q3&fS(SlV5!ZX^*~#(-^sk%f;KgVxeY-XLj}-4zz* zY6vuGn*@UigAIm;CY~IofiUE7!ciz!4RHd6W=w4$Ffg2k&;TYJecxI#vdQ&>^?3As z@4fHc?|tt}$a+7jbH`<_Hsyc&tEJB^s&h2Icx+FH z&P5E_>#|P&;9~9m)zw2szdhv)|Hqf>_v}Z8{eE>U)Z^?wXHVqa$#rv zW09QIhu%4)J9%=z!jnVwkL>Ng$2PR~)o+%+_S*D*BLbhCIC`b;n(SD=^FyZQ{Jy@W zap1i7u6+6Ie3K(bKXLnzrfKxzsU_9UvF{&VviV$S(f7wn+fUk#uA9*B(Gd$yHyAoJ z%TL@MrT*}ZOKYbe4ZJtU&#g&oKO3%>&m7rZJL~3-k50Fi*STBnc%~j2T{fwC-|DZn zFMe?o_mO+e!QK98P0QAdeudn8YDdfW|4|RtS8r%*X#88bd@%i!(zkQ3N6yx%-~DP? zN{PByUG#qOcYD+SRKlHWy|bXt=B26~j$8BlZhGabprqbFOb4k&noNh|HLY;t&M`4&_Bjc2uw;Vzgu)8(-@wvWWM|6;dgo)nnJ+|ED)# z7cvYso+2our<8vjwJ?+_9}WPEa7I|-yY~grav5g`_9{3b5h|=xlD~VYtZXN-A@0Yl z%Y-yjvP{qDkilpu!wn-KA%k9TFcD;i~B(t;csS~sB3Mt40zm;o144%t(=vwF3f%Y1%K6=g~O|-tf;G* zQN60JsC@nLLGJpRn%c(dH3cQrQyQyRE?ZXD=irkoR@T(5Kfa>2rX;_5M#EoEG`{Qc zc|7kt{B+)JtyGiqmnXJgD!knMvHS9r0Xa_cz{K<&%UO@dqu05Vfmk;)Pe8<`2 zUXR!3yE3Ecn+rQf{&wzIOH<&siMo1l?(UA-$7;6;cloDo9^Lte%`4{JT*TkLy+u+T zIJ>s>z(!Aw^P^j9CtSPKczW5nhPsB<*Z-+`y{_XK|Hh;Lb5Fk5e&EWDNui85KiSIhw zqkpddVD6nI8#<3UPH$R&s%rZdQTtfSOP^XlA2jHp4Mi<3Tq8X@u+nXk%O%l=?&VIg zGcS=iv`$BLXO4Aj3{rF^C!=yMz=v(Bj?cEK5bv|8iu6v(8F6qG{DdlzE2x^}_EydG zntiIVcEUQAh1SohV{An2SFU6ULE+d&Ib3_rJ7hocS{#9%P{1xJ%8la30a z8xp}jUSuN`v-m1BixVXr0i)PzYx^rn6)T-e?H!m5EuuFozys*nQq^H6u|msFaD%OL9RD zYa~JBY0%T>wfF@w#6ps@kqBITtPGAPAwyMmD{M>M7=bg$uA9jZL|g$u=YZgo-F?YUpa=9lI7auHF|>G_suH)_`?(qJsXo`opldQ8o-;9{m2hKA3q)Uk@9R6qvx{xcNuno9k#x}5ftg*hz^gk(hJ z3PDVrmI&&!_NN@p~gvNLshTE}E$IY6aM!#IY@u>U+o8Gay1GAqhTfEWYK5Gg6+CTA1>2iQYd A%m4rY literal 0 HcmV?d00001 diff --git a/h.dot b/h.dot new file mode 100644 index 0000000..b23b196 --- /dev/null +++ b/h.dot @@ -0,0 +1,10 @@ +digraph { + 00 -> 00 + 00 -> 10 + 01 -> 11 + 01 -> 01 + 10 -> 11 + 10 -> 00 + 11 -> 10 + 11 -> 01 +} diff --git a/h.pdf b/h.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df4d68bf68aa718215304da744cc29c9211572b1 GIT binary patch literal 4213 zcmb_fd2|!i8duuNA&K1fwb?=G-=b~_6KuLPVW8g zcfb3szx&;U{7j1iQ>tYNht4nEB+~#Cu%)wPsi{aV?Q;okpoJ70VqrW2%>l&XAq6^< zcCZv}GRb&>qe-tUxNiMaBYPYjeB$S1^{(f09{TKy=^NWWdv#0K!P~R**DbCycU4Y# z?wvD(_mq_!U;WPwi5!NnE%2UY@hblDrY(EP zVWCr%%ro2aE>IduQ%7jPjwMg!)OUfQF=Jjlo$>1CT}{I#)UF843*6pX{bs|br6ahDi&O{S zZa>!Y_JJ=eVm+~wHFsKKmtAwVpNV-B-Ro|jmi6VZSSm3)w%lwzWodlx&Z9CsVZzWc zE8cszZcy5~XAT(GKlaTg#q^Fhl-sUOjw>2IZrLtv!HB%3hi)H2FPj{<(&U=BP}j6* z`;qq#Te-M-wdWPDU2bv>etcq$J7GN$i*I>%Q_KUuEUg(Nf9UX>yoJlPIfP~E)sn5l z*X9M+gRK;qktBQ5Lg@lvC}~TvQG&LSp@=2e}IW%;1&xDw_}(zfz^PR;T%fjfmlU086<_Z z5|8MvDku%A1th(AfaEX~4~k@>);3u&fD!_t$f&KN^l(9T?=+JF>0w1#te5mj4$Gu@2gmpYmIHcGh~yAy1v-@Bc){!@IiMzxTrx7&Bhwg4 zaPvhn4T=Kz6QkjS7{vHoaLJeM7&LA11x@?`fR@ z(+6gc0#gIEP7Aa;ZLx@jE*@w#8m(T2r1K6jncxD<1JeH>&A8m*sc5md1~4$K(HYLKePctuu`kD^{r%~E<$tSWPj`KN-+=?o9~NTF zvwUSb{fM)|@@%!moxi(&*RG)%|M|GJ)i!?1U6X20E}y<`bxp&@JE(tb4z-PJs}HR# zOeSKco^7KhCD)y`kD!Jp-&bE(SO4TYPbY-xoXNZC5H(_W+bc@-EDdGFm@TU7%V6jbdf?+TsoY}p;soqg-%kjvMfTRP|B_g`yW zH}=*p)>fWv@BHYet4qk$_w{?vwB=p zjH12f=hFw8bABAP-({jY_ucD0$PSD7eEKin-Ch6ll`9{uS2tA6(jBT!(tOoXHQ}qq z9cyx4Ups5ftOxFDBxdc~w(5P~rv=8HPv{OU)t#Sr=EtgqEnQ<(8@vf$#9UapVs3D3 z^OZxZ-V0%=o@IDPcl%@<-63H}r+p+(_IpwHoaSd}>qoT~Ar{rlSS!x;y0h(3>Nx#A=bq+j$MPQs@ zw&hwThzvnP(Cha?&;miP$HyCjM!B@b0LLO3kpqcEC^O0nt@%J;Sx*@w0F_dt5w z0-PKy*K(FC1DH}Phax%3X|O@O?iL7VM!8!M{00OmFE3Y?<4TruA(&pTM^F`_QYj#Z zf}iUX$e_ZDL-bGZvL32iVR(>wX zaM%JHw)_?-1S9g>w!<)njZcL<1}g+!=iE$q6Pi>ghAB{7fn#wl6FT(!uFKmtCjM~a_c9;mJEROWM=P(su4$bjm2vkZHs#JkQ zdw>R3czpmBP+bu zJOVRRZc2rV0wZ{6lT?K19-({SVZ@>`cu1eiC=V(q+DQgHg4{Hd^s&CVUN*qbgoz@C zz{8lj2hv`oR~{TW#GGNdZjlA_?1*erqJs@M+^moU!h@8Qlz!qQc2Qi9kl%>7M1sfx zgOBv!l1T<`(Rb?v^@1^kc%!^rgxZ_HUcCFmSRa9o#NR@WB-p2jo`q2q>oGCYAQm%< z;~4z(QXR`tR1Vo-z5fYExTX?+uP$f&VPVclf`_CB1UJhi&WHqcMs!r+x?Rk##OTaP z>gimA9PN~$0Jc{m*mi$nUxsUd6GUiw6>L()5BMT9T!X_dw=WGPw6Im|N7G?9(@+d{ z`ThBz^!_xx9(Lq?`7l%uJN|w&l?Fa%`q5DQW1NB 1 [label=" -"] + 1 -> 2 [label=" +-"] + 2 -> 2 [label=" +-"] +} \ No newline at end of file diff --git a/hp.pdf b/hp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d4746828ca1a4e268ad6a218d6f18aa07983b1a8 GIT binary patch literal 4049 zcmb_fd2~}{7DpN8$OA!C^b8({Pqe1hCU4758>S?brA=GYQmCb;c}-rDSCYK=-V063 zQbjp)&J5a02b2opAfhwYg?0o*78St}$}%W8Qz(KmAZtY!HYuI^y(T3sxctHE>B+a; zd%wHn~jhaiRVH@Y{^pBw!BT$9qT%#oE-K{<&4hr!v{X`%^yA=>8Ko5Ib>e{jdfqu zt$5y5|47c6*!tCeM$UH4f9Tci-~OiV$0t7%-Jgtf&zjf#?2q?Gp06*tD{pvZ-d5)E z7w&G!GCBf3thzPZo&U&|f)~y&-`LK~MY~r_`{clq;ClO!{kz^?G`YGtx-&OBCSKX_ zT;!e|Oq)LMqW;M(Tx;W~=FNxtO@8>*^IQMB<&`^!+_nEq=l275_FwnZ*|7^9uMM4N z;Oa+wHe~Cj0SmtTN5Apk+sCg<14f^_k+7?nJ{48bpu zL{A~Fl#&1sL>BQe1<1$6l<|cM002aEvt*0FPSffH@IcyO4iaUAapWRkDXtbiq8nEr z4fH~)VlpCg1h0%r39Pn@C_^A2ibW=|V(D>6c5~V}g$s)QgowEIPF~@>umh&`Ios4* zz%?@nGQYryXqzprq-s_CD3^)Ae6DLIsAeX1&4ju4E}q6W$8s`{9Yf|kUR+R^_h^w2 z;$^K%3~^x+uRD0zBMA{jl#m4rQ5~Z05Rhk*tk?sbgjj~m<>F%lMNSdCNr2pDpg{d zsxwqDo<%eR)+GlO&*Rp1*SO>o2PY@{$eyT)dJAi_^%Osk*UeS9z23tEKW}wv_ujsB zr?a*HnfK;QV6WD5mmk=+zrEA5Cx1|J$#0i^(7LWYqqRLFebAgQ2hLtL>f-u_u9*$} z`m+yuHm^w8acRK9af^@rE`=EJ*Q`U0ZEe=uhS_s+a^|g=^y2)vIh9ZNYF?f@qW-Z( zjSc1XFEvi7c`N~%g zHT}))b-Ujf^iXamBR5R?^YD*O7k|HPP0{y{-8RWdZl9R`$zM3P+ilRhcJ1ZecU0Wr zb9)bR2R&|&*L$XX?KdYkjl6%>80%Vpr)|Uw%gD z>|8HvwjW#8wtba*l5_QyWfRVyZaT8y_{zqWZO?tGd#A?VfwQ@td_NwWgNYYc8Gs;qc~_C)!OZUzfHQ3>io| z^BT78X!`tZsbtr~t1g|oyyxDvmeV5#GHagQ!g_W8L7v{ob9j(}i=ScL`RjO>(*< z>d-apOm*fafJ5u`R1b18#>4=k(|H9|@O~kjsp9EaWos-` zqq10GjF(9bQc0BQnVPB20;GsyaJrx%MrYB{TAEEqJ_!=MN|dG}T4&UNNXhH7y5J`0 z76`LUO+Zm1R+6l$s?t@lI#KeIw8df}DTZViEl_CX>afDav|;%{I8RkXnA*b@mUXI5 zI*%A4g{dU1qsYWTiTWsrVT2FnD#WOgsbS0&KC?;BYb~rrucc|eLQBD?wQw}gSNRo!Vj)Dz1iv<_J$O^ZdH|pV~OwIU$Tr@r)%1U=>MrNIf){t?_Z-PP)ksI3% zVT>D}0W?-8lxknK1MXNGL(#OBVzn$?MAKH+ut^h85&uS|6ON(|k^uzNi{YDS_`P)!rB zhvb7i)<}lP)1arFN3r;=lFJwk2}adinQ2Lzw&sY^Bj-K6j43A$E{p~Pous&J{juGl9v z3yIQ^dZWsb25kxUEJP9KW2(c7lbK>!8a|_%#~O;#02$=_FHppDD)p!Ga@x-(=Cm|8 zBrB=}L@9MzBB;}nqYC>)7+D4D&Y;Z(czGr06p4e@Qi3NlA`68YcpT{w=@LbF#o%5OkrTr{5sD^^p|N$K z(hLJ-G1(oau~~Y+0%I~7XorI_jI%rRX2!(OCfhGll;H=GtZ 1 [label=" -"] +1 -> 4 [label=" +-"] +2 -> 2 [label=" -"] +2 -> 4 [label=" +-"] +3 -> 3 [label=" -"] +3 -> 4 [label=" +-"] +4 -> 4 [label=" +-"] +} \ No newline at end of file diff --git a/images/Gi.pdf b/images/Gi.pdf new file mode 100644 index 0000000000000000000000000000000000000000..22af9dce27804f3245e6db3bbe08026b8dd0c84a GIT binary patch literal 4574 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 NG2ZauVdKJi{|9kcIQ9Sl literal 0 HcmV?d00001 diff --git a/images/Suite_logistique_390_100.png b/images/Suite_logistique_390_100.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3dc124099cefe92f8e1d6f1a7e159181614584 GIT binary patch literal 5003 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 literal 0 HcmV?d00001 diff --git a/images/g.dot b/images/g.dot new file mode 100644 index 0000000..6f25f41 --- /dev/null +++ b/images/g.dot @@ -0,0 +1,10 @@ +digraph { + 00 -> 00 + 00 -> 10 + 01 -> 00 + 01 -> 11 + 10 -> 11 + 10 -> 00 + 11 -> 10 + 11 -> 01 +} diff --git a/images/g.pdf b/images/g.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f69e01a50f697938abc415e96b35eb535786344 GIT binary patch literal 4230 zcmb_fdsI}_8uvOe4a9`l}NMq!3Qf>9jkiU~K*%sImxn3*%3b4CU- zEVayDmPtM`jUbG=tGa4tvI4ElRPup6uJ@u>0>KngG_x|{?la85Aie(ZtTk)){=WTv z`+NTO-qW+p7AY=MAk+7EtbQF)0t~SBLPW1eGih&u-~uX0v7r{mEzlf5EpAev&9sB1 zXrmF~1&$^?NMO^e4;a`cY}CmsiHe=iWZeJdHxIsc_RETzp1prd&)T%I%G6Vq{`9sp zqdqM1UEHv3%THaC6Y2xGN0)&&jIB zJ5%P?NS`{ka_!!&A78<}VKITQ%X{q?(^6-MweiQ+r=%&U-obD^&k(TX8-5X_W#nCADVyHucgh~-b%Z4zVdu|T&;b~!%W%9Cdp$*&a+oN{+aoW zv9r!Ktg(Mvzov6Ttl^!F6?s@!(>&a>5Q!fuaK6VB6=qD53kripnH5b1!oEq_n zbEyq))1TeHX3h_eHx6%#9dUhk)kyXqYs)B)^OqOj(pKn>znk$~;lv-Qs>U9Al05c& z;62%nnuD+0_OWg_6H^BkM@_uqt2k;~SUzIj(F28byN57)KRdHyeR)%DMT#%!$Hjac zraC<9*&(jsDM!FqcDQ$nEA{9;TfHvj_FLn#8b^Kq7TQ4V_QM6UImgqU-n8s_n9(^9~;QzU0ymDhqOD(>{ zp7cqL>RfYqMf*i{#hS+j$AQXbzSFaLF@n9oj2t zA_daT7KBxVthdqvNkI<4dkOt}s|PCRcLPD^W?2DlG=_`}dKKErrba|LTfds1n_;d7 z(G28@(-1R-6 zjYnB8jh50Jn-FvX;x;V@I599g!FkB}USy91c4$Oo$V}mrKtX7X#y-e*P>V?WB8qAq zd7!~6{d)AlBi4qfuJ_Ak%e!A7f0=ryDgRpK>8-=wPFj8>&w0u_xy?KIw@9?xNeMJIA-K zOK@q5?v0L#jy^YZWOjW+Q&ppV*n71Te!V1}uw?u)+wly3>@yf09UZ-X)To%~TVhts zdfu6S@?z!k3u$ScjayPOV(zN%Hnu1)UrnDWHJf&id%KYsx;%U7_Trwlj_xmZwW-_R zIX$}T+S98SUpRkCRd9WGisZ@p5uvGBgJwVJ}Zch~Rp9?v$s|A>13YIVnwGnbdH_@ZYr zvBfj}o2c*0Un&VqZaC9SFB&rBo|pcGixoc*Cxe&}S^QzN=udsFH8Y%dT%o}F60e^b z@R5!pS^##sfbkk67i#MzfT0YM`AREh^_gfFGrN?dvrFgXI7*8gT1qn0i0EgM5TI#k zfb>b7!K(xhU=tYPOtwr*oVXyM3wV4U2wEWEaeH}Pz#s{V=-^l+qY@BYA`}@Uxz;Qo zu&ld?5db06%5W(zPXbO3wrerV6#-nPl0cOl<2tFN(78e)Gisdqv zD?o9rR*PZ;N)S@GLdutT1u`J@^7p{~f`%};ePUi-7PLv`U_B_4i{dg24Q~`iF^2U5 zabwcX`UQhTqp_<9%Hfo1;B}Um;YnyD zFdUa+a;Y58!Eqg~)yeThjL>129=%~DOgR)a!3!k3Q2qtch?NndESCcd!I;L8KG$NV z6fCAWUQ7WYBQO~O;&c2ou)^a55P-mS3YCsffd_I-0NRNq^x70u9MYpl#oR@N?j{D4 z^jWQc98Ql%ta5Rk&dfUe9(YEioBv`B-Ndw0jy^Mee$E|i6Uu?oZd$a6hndHros>i8 zWH}EBi=6cN;1Na&Fz_g>P>E3wnF1rYX=AVnlifn^z|DwFrE`3QY=F4Ag~wD{t(uOp(FmckRt)! zQ^d%^EQnLFY#XN_g`g zNW(N5_^h~rrj`$;VfY|@m>P$-=7F*}M4mx37~w%QLJe>3H_9ppufsHhX-Z;{Ed(Zy zutnfVcr)bSJ0GCgOeuWAC;)0>S@_lvuZjRo_c~b!n&LAAO*eyudacGxsN_USib7@9 tSO~(R)ubk?F#^{nr{bv=v+>VY{`Yt45|zPn~N){tvTIu*?7e literal 0 HcmV?d00001 diff --git a/images/gp.dot b/images/gp.dot new file mode 100644 index 0000000..161e9d2 --- /dev/null +++ b/images/gp.dot @@ -0,0 +1,5 @@ +digraph{ + 1 -> 1 [label=" -"] + 1 -> 2 [label=" +"] + 2 -> 2 [label=" -"] +} \ No newline at end of file diff --git a/images/gp.pdf b/images/gp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a99b1fa1f4e789c7c235297dde877f6ef80c69c GIT binary patch literal 4046 zcmb^!X>b$gH3I{M4M_+kVam|q3&fS(SlV5!ZX^*~#(-^sk%f;KgVxeY-XLj}-4zz* zY6vuGn*@UigAIm;CY~IofiUE7!ciz!4RHd6W=w4$Ffg2k&;TYJecxI#vdQ&>^?3As z@4fHc?|tt}$a+7jbH`<_Hsyc&tEJB^s&h2Icx+FH z&P5E_>#|P&;9~9m)zw2szdhv)|Hqf>_v}Z8{eE>U)Z^?wXHVqa$#rv zW09QIhu%4)J9%=z!jnVwkL>Ng$2PR~)o+%+_S*D*BLbhCIC`b;n(SD=^FyZQ{Jy@W zap1i7u6+6Ie3K(bKXLnzrfKxzsU_9UvF{&VviV$S(f7wn+fUk#uA9*B(Gd$yHyAoJ z%TL@MrT*}ZOKYbe4ZJtU&#g&oKO3%>&m7rZJL~3-k50Fi*STBnc%~j2T{fwC-|DZn zFMe?o_mO+e!QK98P0QAdeudn8YDdfW|4|RtS8r%*X#88bd@%i!(zkQ3N6yx%-~DP? zN{PByUG#qOcYD+SRKlHWy|bXt=B26~j$8BlZhGabprqbFOb4k&noNh|HLY;t&M`4&_Bjc2uw;Vzgu)8(-@wvWWM|6;dgo)nnJ+|ED)# z7cvYso+2our<8vjwJ?+_9}WPEa7I|-yY~grav5g`_9{3b5h|=xlD~VYtZXN-A@0Yl z%Y-yjvP{qDkilpu!wn-KA%k9TFcD;i~B(t;csS~sB3Mt40zm;o144%t(=vwF3f%Y1%K6=g~O|-tf;G* zQN60JsC@nLLGJpRn%c(dH3cQrQyQyRE?ZXD=irkoR@T(5Kfa>2rX;_5M#EoEG`{Qc zc|7kt{B+)JtyGiqmnXJgD!knMvHS9r0Xa_cz{K<&%UO@dqu05Vfmk;)Pe8<`2 zUXR!3yE3Ecn+rQf{&wzIOH<&siMo1l?(UA-$7;6;cloDo9^Lte%`4{JT*TkLy+u+T zIJ>s>z(!Aw^P^j9CtSPKczW5nhPsB<*Z-+`y{_XK|Hh;Lb5Fk5e&EWDNui85KiSIhw zqkpddVD6nI8#<3UPH$R&s%rZdQTtfSOP^XlA2jHp4Mi<3Tq8X@u+nXk%O%l=?&VIg zGcS=iv`$BLXO4Aj3{rF^C!=yMz=v(Bj?cEK5bv|8iu6v(8F6qG{DdlzE2x^}_EydG zntiIVcEUQAh1SohV{An2SFU6ULE+d&Ib3_rJ7hocS{#9%P{1xJ%8la30a z8xp}jUSuN`v-m1BixVXr0i)PzYx^rn6)T-e?H!m5EuuFozys*nQq^H6u|msFaD%OL9RD zYa~JBY0%T>wfF@w#6ps@kqBITtPGAPAwyMmD{M>M7=bg$uA9jZL|g$u=YZgo-F?YUpa=9lI7auHF|>G_suH)_`?(qJsXo`opldQ8o-;9{m2hKA3q)Uk@9R6qvx{xcNuno9k#x}5ftg*hz^gk(hJ z3PDVrmI&&!_NN@p~gvNLshTE}E$IY6aM!#IY@u>U+o8Gay1GAqhTfEWYK5Gg6+CTA1>2iQYd A%m4rY literal 0 HcmV?d00001 diff --git a/images/h.dot b/images/h.dot new file mode 100644 index 0000000..b23b196 --- /dev/null +++ b/images/h.dot @@ -0,0 +1,10 @@ +digraph { + 00 -> 00 + 00 -> 10 + 01 -> 11 + 01 -> 01 + 10 -> 11 + 10 -> 00 + 11 -> 10 + 11 -> 01 +} diff --git a/images/h.pdf b/images/h.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df4d68bf68aa718215304da744cc29c9211572b1 GIT binary patch literal 4213 zcmb_fd2|!i8duuNA&K1fwb?=G-=b~_6KuLPVW8g zcfb3szx&;U{7j1iQ>tYNht4nEB+~#Cu%)wPsi{aV?Q;okpoJ70VqrW2%>l&XAq6^< zcCZv}GRb&>qe-tUxNiMaBYPYjeB$S1^{(f09{TKy=^NWWdv#0K!P~R**DbCycU4Y# z?wvD(_mq_!U;WPwi5!NnE%2UY@hblDrY(EP zVWCr%%ro2aE>IduQ%7jPjwMg!)OUfQF=Jjlo$>1CT}{I#)UF843*6pX{bs|br6ahDi&O{S zZa>!Y_JJ=eVm+~wHFsKKmtAwVpNV-B-Ro|jmi6VZSSm3)w%lwzWodlx&Z9CsVZzWc zE8cszZcy5~XAT(GKlaTg#q^Fhl-sUOjw>2IZrLtv!HB%3hi)H2FPj{<(&U=BP}j6* z`;qq#Te-M-wdWPDU2bv>etcq$J7GN$i*I>%Q_KUuEUg(Nf9UX>yoJlPIfP~E)sn5l z*X9M+gRK;qktBQ5Lg@lvC}~TvQG&LSp@=2e}IW%;1&xDw_}(zfz^PR;T%fjfmlU086<_Z z5|8MvDku%A1th(AfaEX~4~k@>);3u&fD!_t$f&KN^l(9T?=+JF>0w1#te5mj4$Gu@2gmpYmIHcGh~yAy1v-@Bc){!@IiMzxTrx7&Bhwg4 zaPvhn4T=Kz6QkjS7{vHoaLJeM7&LA11x@?`fR@ z(+6gc0#gIEP7Aa;ZLx@jE*@w#8m(T2r1K6jncxD<1JeH>&A8m*sc5md1~4$K(HYLKePctuu`kD^{r%~E<$tSWPj`KN-+=?o9~NTF zvwUSb{fM)|@@%!moxi(&*RG)%|M|GJ)i!?1U6X20E}y<`bxp&@JE(tb4z-PJs}HR# zOeSKco^7KhCD)y`kD!Jp-&bE(SO4TYPbY-xoXNZC5H(_W+bc@-EDdGFm@TU7%V6jbdf?+TsoY}p;soqg-%kjvMfTRP|B_g`yW zH}=*p)>fWv@BHYet4qk$_w{?vwB=p zjH12f=hFw8bABAP-({jY_ucD0$PSD7eEKin-Ch6ll`9{uS2tA6(jBT!(tOoXHQ}qq z9cyx4Ups5ftOxFDBxdc~w(5P~rv=8HPv{OU)t#Sr=EtgqEnQ<(8@vf$#9UapVs3D3 z^OZxZ-V0%=o@IDPcl%@<-63H}r+p+(_IpwHoaSd}>qoT~Ar{rlSS!x;y0h(3>Nx#A=bq+j$MPQs@ zw&hwThzvnP(Cha?&;miP$HyCjM!B@b0LLO3kpqcEC^O0nt@%J;Sx*@w0F_dt5w z0-PKy*K(FC1DH}Phax%3X|O@O?iL7VM!8!M{00OmFE3Y?<4TruA(&pTM^F`_QYj#Z zf}iUX$e_ZDL-bGZvL32iVR(>wX zaM%JHw)_?-1S9g>w!<)njZcL<1}g+!=iE$q6Pi>ghAB{7fn#wl6FT(!uFKmtCjM~a_c9;mJEROWM=P(su4$bjm2vkZHs#JkQ zdw>R3czpmBP+bu zJOVRRZc2rV0wZ{6lT?K19-({SVZ@>`cu1eiC=V(q+DQgHg4{Hd^s&CVUN*qbgoz@C zz{8lj2hv`oR~{TW#GGNdZjlA_?1*erqJs@M+^moU!h@8Qlz!qQc2Qi9kl%>7M1sfx zgOBv!l1T<`(Rb?v^@1^kc%!^rgxZ_HUcCFmSRa9o#NR@WB-p2jo`q2q>oGCYAQm%< z;~4z(QXR`tR1Vo-z5fYExTX?+uP$f&VPVclf`_CB1UJhi&WHqcMs!r+x?Rk##OTaP z>gimA9PN~$0Jc{m*mi$nUxsUd6GUiw6>L()5BMT9T!X_dw=WGPw6Im|N7G?9(@+d{ z`ThBz^!_xx9(Lq?`7l%uJN|w&l?Fa%`q5DQW1NB 1 [label=" -"] + 1 -> 2 [label=" +-"] + 2 -> 2 [label=" +-"] +} \ No newline at end of file diff --git a/images/hp.pdf b/images/hp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d4746828ca1a4e268ad6a218d6f18aa07983b1a8 GIT binary patch literal 4049 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

bMQ1uaPof7HkMgD!_uGm^cw%dEf!8~%#(qe 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

    05e=#<80DF8y$*>2VI* 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 I+4%1N0|@2O`Tzg` literal 0 HcmV?d00001 diff --git a/images/tente.png b/images/tente.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b6f2433874731b7406b074431b23641644f61a GIT binary patch literal 40257 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 literal 0 HcmV?d00001 diff --git a/images/texput.log b/images/texput.log new file mode 100644 index 0000000..8597ede --- /dev/null +++ b/images/texput.log @@ -0,0 +1,21 @@ +This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2010.9.1) 31 MAR 2011 21:10 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**main.tex + +! Emergency stop. +<*> main.tex + +End of file on the terminal! + + +Here is how much of TeX's memory you used: + 3 strings out of 495061 + 105 string characters out of 1182622 + 45108 words of memory out of 3000000 + 3282 multiletter control sequences out of 15000+50000 + 3640 words of font info for 14 fonts, out of 3000000 for 9000 + 28 hyphenation exceptions out of 8191 + 0i,0n,0p,1b,6s stack positions out of 5000i,500n,10000p,200000b,50000s +! ==> Fatal error occurred, no output PDF file produced! diff --git a/latexStyle/tex-templates b/latexStyle/tex-templates new file mode 160000 index 0000000..15fc32d --- /dev/null +++ b/latexStyle/tex-templates @@ -0,0 +1 @@ +Subproject commit 15fc32dafcfefd531b8e19721d3e66d22b269b8c diff --git a/logistique.png b/logistique.png new file mode 100644 index 0000000000000000000000000000000000000000..88a4288669bff1829a903c36d5e374070340d2f4 GIT binary patch literal 36033 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

    bMQ1uaPof7HkMgD!_uGm^cw%dEf!8~%#(qe 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

      05e=#<80DF8y$*>2VI* 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 I+4%1N0|@2O`Tzg` literal 0 HcmV?d00001 diff --git a/main.glsdefs b/main.glsdefs new file mode 100644 index 0000000..334ef46 --- /dev/null +++ b/main.glsdefs @@ -0,0 +1,330 @@ +\ifglsentryexists{graphoriente}{}% +{% +\gls@defglossaryentry{graphoriente}% +{% +name={graphe orienté},% +sort={graphe orienté},% +type={main},% +first={graphe orient\IeC {\'e}},% +firstplural={graphe orient\IeC {\'e}s},% +text={graphe orient\IeC {\'e}},% +plural={graphe orient\IeC {\'e}s},% +description={Un graphe orienté $G=(S,A)$ est défini par la donnée d'un ensemble de sommets $S$ et d'un ensemble d'arcs $A$, chaque arc étant représenté par un couple de sommets. Si $x$ et $y$ sont des sommets de $S$, le couple $(x,y)$ représente l'arc orienté allant du sommet \emph {origine} $x$ au sommet \emph {extremité} $y$.},% +descriptionplural={Un graphe orienté $G=(S,A)$ est défini par la donnée d'un ensemble de sommets $S$ et d'un ensemble d'arcs $A$, chaque arc étant représenté par un couple de sommets. Si $x$ et $y$ sont des sommets de $S$, le couple $(x,y)$ représente l'arc orienté allant du sommet \emph {origine} $x$ au sommet \emph {extremité} $y$.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{graphfortementconnexe}{}% +{% +\gls@defglossaryentry{graphfortementconnexe}% +{% +name={graphe fortement connexe},% +sort={graphe fortement connexe},% +type={main},% +first={graphe fortement connexe},% +firstplural={graphe fortement connexes},% +text={graphe fortement connexe},% +plural={graphe fortement connexes},% +description={Un graphe orienté $G=(S,A)$ est fortement connexe si pour tout couple de sommets $x$, $y$ de $S$ il existe un chemin reliant $x$ à $y$ et $y$ à $x$.},% +descriptionplural={Un graphe orienté $G=(S,A)$ est fortement connexe si pour tout couple de sommets $x$, $y$ de $S$ il existe un chemin reliant $x$ à $y$ et $y$ à $x$.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{distributionuniforme}{}% +{% +\gls@defglossaryentry{distributionuniforme}% +{% +name={distribution uniforme},% +sort={distribution uniforme},% +type={main},% +first={distribution uniforme},% +firstplural={distribution uniformes},% +text={distribution uniforme},% +plural={distribution uniformes},% +description={Les lois de distribution uniforme (ou loi uniformes continues) forment une famille de lois à densité caractérisées par la propriété suivante: tous les intervalles de même longueur inclus dans le support de la loi ont la même probabilité.},% +descriptionplural={Les lois de distribution uniforme (ou loi uniformes continues) forment une famille de lois à densité caractérisées par la propriété suivante: tous les intervalles de même longueur inclus dans le support de la loi ont la même probabilité.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{partieentiere}{}% +{% +\gls@defglossaryentry{partieentiere}% +{% +name={partie entière},% +sort={partie entière},% +type={main},% +first={partie enti\IeC {\`e}re},% +firstplural={partie enti\IeC {\`e}res},% +text={partie enti\IeC {\`e}re},% +plural={partie enti\IeC {\`e}res},% +description={La partie entière d'un nombre réel est l'entier qui lui est immédiatement inférieur ou égal. Pour un nombre réel $x$, on la note $\lfloor x \rfloor $.},% +descriptionplural={La partie entière d'un nombre réel est l'entier qui lui est immédiatement inférieur ou égal. Pour un nombre réel $x$, on la note $\lfloor x \rfloor $.},% +symbol={\ensuremath {\lfloor x \rfloor }},% +symbolplural={\ensuremath {\lfloor x \rfloor }},% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{distanceHamming}{}% +{% +\gls@defglossaryentry{distanceHamming}% +{% +name={distance de Hamming},% +sort={distance de Hamming},% +type={main},% +first={distance de Hamming},% +firstplural={distance de Hammings},% +text={distance de Hamming},% +plural={distance de Hammings},% +description={La distance de Hamming entre deux éléments $x=(x_1,\ldots ,x_n)$ et $y=(y_1,\ldots ,y_n)$ dans $\Bool ^n$ est le nombre d'indices $i$, $1 \le i \le n$ tels que $x_i$ diffère de $y_i$.},% +descriptionplural={La distance de Hamming entre deux éléments $x=(x_1,\ldots ,x_n)$ et $y=(y_1,\ldots ,y_n)$ dans $\Bool ^n$ est le nombre d'indices $i$, $1 \le i \le n$ tels que $x_i$ diffère de $y_i$.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{decalageDeBits}{}% +{% +\gls@defglossaryentry{decalageDeBits}% +{% +name={décalage de bits},% +sort={décalage de bits},% +type={main},% +first={d\IeC {\'e}calage de bits},% +firstplural={d\IeC {\'e}calages de bits},% +text={d\IeC {\'e}calage de bits},% +plural={d\IeC {\'e}calages de bits},% +description={Soit $x$ un nombre binaire de $n$ bits et $b$ un entier. Le nombre binaire de $n$ bits $x \ll b$ (respectivement $x \gg b$) est obtenu en décalant les bits de $x$ de $b$ bits vers la gauche (resp. vers la droite) et en complétant avec des zéros à droite (resp. à gauche).},% +descriptionplural={Soit $x$ un nombre binaire de $n$ bits et $b$ un entier. Le nombre binaire de $n$ bits $x \ll b$ (respectivement $x \gg b$) est obtenu en décalant les bits de $x$ de $b$ bits vers la gauche (resp. vers la droite) et en complétant avec des zéros à droite (resp. à gauche).},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{chaineDeMarkov}{}% +{% +\gls@defglossaryentry{chaineDeMarkov}% +{% +name={chaîne de Markov},% +sort={chaîne de Markov},% +type={main},% +first={cha\IeC {\^\i }ne de Markov},% +firstplural={cha\IeC {\^\i }nes de Markov},% +text={cha\IeC {\^\i }ne de Markov},% +plural={cha\IeC {\^\i }nes de Markov},% +description={On se restreint à la définition d'une chaîne de Markov homogène. Celle-ci désigne une suite de variables aléatoires $(X_n)_{n \in \Nats }$ à temps discret, à espace d'états discret, sans mémoire et dont le mécanisme de transition ne change pas au cours du temps. Formellement la propriété suivante doit être établie:\newline $ \forall n \ge 0, \forall (i_0, \ldots , i_{n-1}, i,j),\\ \textrm { }P(X_{n+1}=j\mid X_0=i_0, X_1=i_1, X_2=i_2, \ldots , X_{n-1}=i_{n-1}, X_{n}=i) \\ \textrm { }= P(X_{1}=j\mid X_n=i). $},% +descriptionplural={On se restreint à la définition d'une chaîne de Markov homogène. Celle-ci désigne une suite de variables aléatoires $(X_n)_{n \in \Nats }$ à temps discret, à espace d'états discret, sans mémoire et dont le mécanisme de transition ne change pas au cours du temps. Formellement la propriété suivante doit être établie:\newline $ \forall n \ge 0, \forall (i_0, \ldots , i_{n-1}, i,j),\\ \textrm { }P(X_{n+1}=j\mid X_0=i_0, X_1=i_1, X_2=i_2, \ldots , X_{n-1}=i_{n-1}, X_{n}=i) \\ \textrm { }= P(X_{1}=j\mid X_n=i). $},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{vecteurDeProbabilite}{}% +{% +\gls@defglossaryentry{vecteurDeProbabilite}% +{% +name={vecteur de probabilités},% +sort={vecteur de probabilités},% +type={main},% +first={vecteur de probabilit\IeC {\'e}s},% +firstplural={vecteurs de probabilit\IeC {\'e}s},% +text={vecteur de probabilit\IeC {\'e}s},% +plural={vecteurs de probabilit\IeC {\'e}s},% +description={Un vecteur de probabilités est un vecteur tel que toutes ses composantes sont positives ou nulles et leur somme vaut 1.},% +descriptionplural={Un vecteur de probabilités est un vecteur tel que toutes ses composantes sont positives ou nulles et leur somme vaut 1.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{matriceDAdjacence}{}% +{% +\gls@defglossaryentry{matriceDAdjacence}% +{% +name={matrice d'adjacence},% +sort={matrice d'adjacence},% +type={main},% +first={matrice d'adjacence},% +firstplural={matrice d'adjacences},% +text={matrice d'adjacence},% +plural={matrice d'adjacences},% +description={La matrice d'adjacence du graphe orienté $G=(S,A)$ à $n$ sommets est la matrice $\check {M}$ de dimension $n \times n$ dont l'élément $\check {M}_{ij}$ représente le nombre d'arcs d'origine $i$ et d'extrémité $j$.},% +descriptionplural={La matrice d'adjacence du graphe orienté $G=(S,A)$ à $n$ sommets est la matrice $\check {M}$ de dimension $n \times n$ dont l'élément $\check {M}_{ij}$ représente le nombre d'arcs d'origine $i$ et d'extrémité $j$.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{xor}{}% +{% +\gls@defglossaryentry{xor}% +{% +name={ou exclusif},% +sort={ou exclusif},% +type={main},% +first={ou exclusif},% +firstplural={ou exclusifs},% +text={ou exclusif},% +plural={ou exclusifs},% +description={La fonction \og ou exclusif\fg {}, XOR, est l'opérateur de $\Bool ^2$ dans $\Bool $ qui prend la valeur 1 si seulement si les deux opérandes ont des valeurs distinctes.},% +descriptionplural={La fonction \og ou exclusif\fg {}, XOR, est l'opérateur de $\Bool ^2$ dans $\Bool $ qui prend la valeur 1 si seulement si les deux opérandes ont des valeurs distinctes.},% +symbol={\ensuremath {\oplus }},% +symbolplural={\ensuremath {\oplus }},% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% +\ifglsentryexists{matriceDeTransitions}{}% +{% +\gls@defglossaryentry{matriceDeTransitions}% +{% +name={matrice de transitions},% +sort={matrice de transitions},% +type={main},% +first={matrice de transitions},% +firstplural={matrice de transitionss},% +text={matrice de transitions},% +plural={matrice de transitionss},% +description={Le nombre $p_{ij}= P(X_1=j \mid X_0 =i)$ est appelé probabilité de transition de l'état $i$ à l'état $j$ en un pas. La matrice composée des $p_{ij}$ est la matrice de transitions associée à la chaine de Markov $X$.},% +descriptionplural={Le nombre $p_{ij}= P(X_1=j \mid X_0 =i)$ est appelé probabilité de transition de l'état $i$ à l'état $j$ en un pas. La matrice composée des $p_{ij}$ est la matrice de transitions associée à la chaine de Markov $X$.},% +symbol={\relax },% +symbolplural={\relax },% +user1={},% +user2={},% +user3={},% +user4={},% +user5={},% +user6={},% +long={},% +longplural={},% +short={},% +shortplural={},% +counter={page},% +parent={},% +% +}% +}% diff --git a/main.tex b/main.tex new file mode 100644 index 0000000..79ec26a --- /dev/null +++ b/main.tex @@ -0,0 +1,204 @@ +%% Use the standard UP-methodology class +%% with French language. +%% +%% You may specify the option 'twoside' or 'oneside' for +%% the document. +%% +%% See the documentation tex-upmethodology on +%% http://www.arakhne.org/tex-upmethodology/ +%% for details about the macros that are provided by the class and +%% to obtain the list of the packages that are already included. + +\documentclass[french]{spimufchdr} +\usepackage{dsfont} +\usepackage{glossaries} +\usepackage{graphicx} +\usepackage{listings} +\usepackage{verbatim} + +% The TeX code is entering with UTF8 +% character encoding (Linux and MacOS standards) +\usepackage[utf8]{inputenc} + +%%-------------------- +%% Search path for pictures +%\graphicspath{{path1/},{path2/}} + +%%-------------------- +%% Definition of the bibliography entries +\declarebiblio{J}{Journaux internationaux avec comités de lecture}{mabiblio} + +%%-------------------- +%% Title of the document +\declarehdr{Title}{XX Mois XXXX} + +%%-------------------- +%% Set the author of the HDR +\addauthor[first.name@utbm.fr]{First}{Name} + +%%-------------------- +%% Add a member of the jury +%% \addjury{Firstname}{Lastname}{Role in the jury}{Position} +\addjury{First}{Name}{Rapporteur}{Professeur à l'Université de XXX} +\addjury{First}{Name}{Examinateur}{Professeur à l'Université de XXX} + +%%-------------------- +%% Change the style of the text in the list of the members of the jury. +%% \Set{jurystyle}{ style of the text} +%\Set{jurystyle}{\small} + +%%-------------------- +%% Set the University where HDR was made +\hdrpreparedin{Université de Technologie de Belfort-Montbéliard} + +%%-------------------- +%% Set the English abstract +%\hdrabstract[english]{This is the abstract in English} + +%%-------------------- +%% Set the English keywords. They only appear if +%% there is an English abstract +%\hdrkeywords[english]{Keyword 1, Keyword 2} + +%%-------------------- +%% Set the French abstract +\hdrabstract[french]{Blabla blabla.} + +%%-------------------- +%% Set the French keywords. They only appear if +%% there is an French abstract +%\hdrkeywords[french]{Mot-cl\'e 1, Mot-cl\'e 2} + +%%-------------------- +%% Change the layout and the style of the text of the "primary" abstract. +%% If your document is written in French, the primary abstract is in French, +%% otherwise it is in English. +\Set{primaryabstractstyle}{\small} + +%%-------------------- +%% Change the layout and the style of the text of the "secondary" abstract. +%% If your document is written in French, the secondary abstract is in English, +%% otherwise it is in French. +%\Set{secondaryabstractstyle}{\tiny} + +%%-------------------- +%% Change the layout and the style of the text of the "primary" keywords. +%% If your document is written in French, the primary keywords are in French, +%% otherwise they are in English. +%\Set{primarykeywordstyle}{\tiny} + +%%-------------------- +%% Change the layout and the style of the text of the "secondary" keywords. +%% If your document is written in French, the secondary keywords are in English, +%% otherwise they are in French. +%\Set{secondarykeywordstyle}{\tiny} + +%%-------------------- +%% Change the speciality of the PhD thesis +%\Set{speciality}{Informatique} + +%%-------------------- +%% Change the institution +%\Set{universityname}{Universit\'e de Technologie de Belfort-Montb\'eliard} + +%%-------------------- +%% Add the logo of a partner or a sponsor +%\addpartner{partner_logo} +\newcommand{\JFC}[1]{\begin{color}{green}\textit{#1}\end{color}} +\newcommand{\vectornorm}[1]{\ensuremath{\left|\left|#1\right|\right|_2}} +\newcommand{\ie}{\textit{i.e.}} +\newcommand{\Nats}[0]{\ensuremath{\mathbb{N}}} +\newcommand{\Reels}[0]{\ensuremath{\mathbb{R}}} +\newcommand{\Zed}[0]{\ensuremath{\mathbb{Z}}} +\newcommand{\Bool}[0]{\ensuremath{\mathds{B}}} +\newcommand{\rel}[0]{\ensuremath{{\mathcal{R}}}} +\newcommand{\Gall}[0]{\ensuremath{\mathcal{G}}} +\newcommand{\Sec}[1]{Sect.\,\ref{#1}} +\newcommand{\Fig}[1]{Fig.\,\ref{#1}} +\newcommand{\Alg}[1]{Algorithm~\ref{#1}} +\newcommand{\Tab}[1]{Table~\ref{#1}} +\newcommand{\Equ}[1]{(\ref{#1})} +\newcommand{\deriv}{\mathrm{d}} +\newcommand{\class}[1]{\ensuremath{\langle #1\rangle}} +\newcommand{\dom}[0]{\ensuremath{\textit{dom}}} + + +\newtheorem{theorem}{Théorème} +\newtheorem{lemma}{Lemme} +\newtheorem{xpl}{Exemple} +\newtheorem{Proof}{Preuve} + +\begin{document} +\input{glossaire.tex} + +% \chapter*{Remerciements} + +% Blabla blabla. + +% \tableofcontents + + + + + +\chapter*{Introduction} + +Blabla blabla. + +\mainmatter + +\part{Système Booléens} + +\chapter{Iterations discrètes de Systèmes Dynamiques booléens} + +\JFC{Chapeau chapitre à faire} +\input{sdd} + + +\chapter[Preuve de convergence de systèmes booléens]{Preuve automatique de convergence de systèmes booléens} +\input{modelchecking} + + + + +\JFC{Mixage} + + + + + + +% \part{Conclusion et Perspectives} + +% \chapter{Conclusion} + +% Blabla blabla. + + +\appendix + +\chapter{Preuves sur les SDD} + +\section{Preuve du théorème~\ref{th:Adrien}}\label{anx:sccg} +\input{annexesccg} + +\section{Preuve de continuité de $G_f$ dans $(\mathcal{X},d)$}\label{anx:cont} +\input{annexecontinuite.tex} + +\section{Preuve de Correction et de complétude de l'approche de vérification de convergence à l'aide de SPIN} +\input{annexePromelaProof} + +\backmatter + +\bibliographystyle{apalike} +\bibliography{abbrev,biblioand} +\listoffigures +\listoftables +\listofdefinitions + +\end{document} + + + + + diff --git a/modelchecking.tex b/modelchecking.tex new file mode 100644 index 0000000..936835b --- /dev/null +++ b/modelchecking.tex @@ -0,0 +1,1042 @@ + + + +\section{Rappels sur le langage PROMELA} +\label{sec:spin:promela} + +Cette section rappelle les éléments fondamentaux du langage PROMELA (Process Meta Language). +On peut trouver davantage de détails dans~\cite{Hol03,Wei97}. + + + + +\begin{figure}[ht] +\begin{scriptsize} +\begin{lstlisting} +#define N 3 +#define d_0 5 + +bool X [N]; bool Xp [N]; int mods [N]; +typedef vals{bool v [N]}; +vals Xd [N]; + +typedef a_send{chan sent[N]=[d_0] of {bool}}; +a_send channels [N]; + +chan unlock_elements_update=[1] of {bool}; +chan sync_mutex=[1] of {bool}; +\end{lstlisting} +\end{scriptsize} +\caption{Type declaration of the DDNs translation.} +\label{fig:arrayofchannels} +\end{figure} + + +Les types primaires de PROMELA sont \texttt{bool}, \texttt{byte}, +\texttt{short} et \texttt{int}. Comme dans le langage C par exemple, +on peut declarer des tableaux à une dimension de taille constante +ou des nouveaux types de données (introduites par le mot clef +\verb+typedef+). Ces derniers sont utilisés pour définir des tableaux à deux +dimension. + +\begin{xpl} +Le programme donné à la {\sc Figure}~\ref{fig:arrayofchannels} correspond à des +déclarations de variables qui serviront dans l'exemple jouet de ce chapitre. +Il définit tout d'abord: +\begin{itemize} +\item les constantes \verb+N+ et \verb+d_0+ qui précisent respectivement le numbre + $n$ d'éléments et le délais maximum $\delta_0$; +\item les deux tableaux (\verb+X+ et \verb+Xp+) de \verb+N+ variables booléennes; +les cellules \verb+X[i]+ et \verb+Xp[i]+ sont associées à la variables $X_{i+1}$ +d'un systène dynamique discret +(le décallage d'un entier est dû à l'indexation à partir de zéro des cellules d'un tableau); +Elles memorisent les valeurs de $X_{i+1}$ respectivement avant et après sa mise à jour; +il suffit ainsi de comparer \verb+X+ et \verb+Xp+ pour constater si $X$ à changé ou pas; +\item le tableau \verb+mods+ contient les éléments qui doivent être modifiés lors de l'iteration +en cours; cela correspond naturellement à l'ensemble des éléments $S^t$; +\item le type de données structurées \verb+vals+ et le tableau de tableaux + \verb+Xd[+$i$\verb+].v[+$j$\verb+]+ qui vise à mémoriser $X_{j+1}^{D^{t-1}_{i+1j+1}}$ + pour l'itération au temps $t$ (en d'autres termes, utile lors du calcul de $X^{t}$). +\end{itemize} + + +Puisque le décallage d'un indices ne change pas fondamentalement +le comportement de la version PROMELA par rapport au modèle initial +et pour des raisons de clareté, on utilisera par la suite la même +lettre d'indice entre les deux niveaux (pour le modèle: $X_i$ et pour PROMELA: +\texttt{X[i]}). Cependant, ce décallage devra être conservé mémoire. + +Une donnée de type \texttt{channel} permet le +transfert de messages entre processus dans un ordre FIFO. +Elles serait déclarée avec le mot clef \verb+chan+ suivi par sa capacité +(qui est constante), son nom et le type des messages qui sont stockés dans ce cannal. +Dans l'exemple précédent, on déclare successivement: +\begin{itemize} +\item un cannal \verb+sent+ qui vise à mémoriser\verb+d_0+ messages de type + \verb+bool+; le tableau nommé \verb+channels+ de \verb+N+*\verb+N+ + éléments de type \verb+a_send+ est utilisé pour mémoriser les valeurs intermédiaires $X_j$; + Il permet donc de temporiser leur emploi par d'autres elements $i$. +\item les deux cannaux \verb+unlock_elements_update+ et \verb+sync_mutex+ contenant +chacun un message booléen et utilisé ensuite comme des sémaphores. +\end{itemize} +\end{xpl} + +%\subsection{PROMELA Processes} +Le langage PROMELA exploite la notion de \emph{process} pour modéliser la concurence +au sein de systèmes. Un process est déclaréavec le mot-clef +\verb+proctype+ et est instancié soit imédiatement (lorsque sa déclaration est préfixée + par le mot-clef \verb+active+) ou bien au moment de l'exécution de l'instruction +\texttt{run}. +Parmi tous les process, \verb+init+ est le process initial qui permet +d'initialiser les variables, lancer d'autres processes\ldots + + +Les instructions d'affecatation sont interprétées usuellement. +Les cannaux sont cernés par des instructions particulières d'envoi et de +réception de messages. Pour un cannal +\verb+ch+, ces instruction sont respectivement notées +\verb+ch ! m+ et \verb+ch ? m+. +L'instruction de réception consomme la valeur en tête du cannal \verb+ch+ +et l'affecte à la variable \verb+m+ (pour peu que \verb+ch+ soit initialisé et non vide). +De manière similaire,l'instruction d'envoi ajoute la valeur de \verb+m+ à la queue du canal +\verb+ch+ (pour peu que celui-ci soit initialisé et non rempli). +Dans les cas problématiques, canal non initialisé et vide pour une reception ou bien rempli pour un envoi, +le processus est blocké jusqu'à ce que les conditions soient remplies. + +La structures de contrôle \verb+if+ (resp. \verb+do+) définit un choix non déterministe + (resp. une boucle non déterministe). Que ce soit pour la conditionnelle ou la boucle, +si plus d'une des conditions est établie, l'ensemble des instructions correspondantes +sera choisi aléatoirement puis exécuté. + +Dans le process \verb+init+ détaillé à la {\sc Figure}~\ref{fig:spin:init}, +une boucle de taille $N$ initialise aléatoirement la variable globale de type tableau \verb+Xp+. +Ceci permet par la suite de verifier si les itérations sont convergentes pour n'importe +quelle configuration initiale $X^{(0)}$. + + + +Pour chaque élément $i$, si les itérations sont asynchrones +\begin{itemize} +\item on stocke d'abord la valeur de \verb+Xp[i]+ dans chaque \verb+Xd[j].v[i]+ +puisque la matrice $S^0$ est égale à $(0)$, +\item puis, la valeur de $i$ (représentée par \verb+Xp[i]+) devrait être transmise + à $j$ s'il y a un arc de $i$ à $j$ dans le graphe d'incidence. Dans ce cas, + c'est la fonction \verb+hasnext+ (non détaillée ici) + \JFC{la détailler} + qui memorise ce graphe + en fixant à \texttt{true} la variable \verb+is_succ+, naturellement et à + \texttt{false} dans le cas contraire. + Cela permet d'envoyer la valeur de $i$ dans le canal au travers de \verb+channels[i].sent[j]+. +\end{itemize} + +\begin{figure}[t] + \begin{minipage}[h]{.52\linewidth} +\begin{scriptsize} +\begin{lstlisting} +init{ + int i=0; int j=0; bool is_succ=0; + do + ::i==N->break; + ::i< N->{ + if + ::Xp[i]=0; + ::Xp[i]=1; + fi; + j=0; + do + ::j==N -> break; + ::j< N -> Xd[j].v[i]=Xp[i]; j++; + od; + j=0; + do + ::j==N -> break; + ::j< N -> { + hasnext(i,j); + if + ::(i!=j && is_succ==1) -> + channels[i].sent[j] ! Xp[i]; + ::(i==j || is_succ==0) -> skip; + fi; + j++;} + od; + i++;} + od; + sync_mutex ! 1; +} +\end{lstlisting} +\end{scriptsize} +\caption{PROMELA init process.}\label{fig:spin:init} +\end{minipage}\hfill + \begin{minipage}[h]{.42\linewidth} +\begin{scriptsize} +\begin{lstlisting} +active proctype scheduler(){ + do + ::sync_mutex ? 1 -> { + int i=0; int j=0; + do + :: i==N -> break; + :: i< N -> { + if + ::skip; + ::mods[j]=i; j++; + fi; + i++;} + od; + ar_len=i; + unlock_elements_update ! 1; + } + od +} +\end{lstlisting} +\end{scriptsize} +\caption{Scheduler process for common pseudo-periodic strategy. + \label{fig:scheduler}} +\end{minipage} +\end{figure} + + + +\section{Du système booléen au modèle PROMELA} +\label{sec:spin:translation} +Les éléments principaux des itérations asynchrones rappelées à l'équation +(\ref{eq:async}) sont la stratégie, la fonctions et la gestion des délais. +Dans cette section, nous présentons successivement comment chacune de +ces notions est traduite vers un modèle PROMELA. + + +\subsection{La stratégie}\label{sub:spin:strat} +Regardons comment une stratégie pseudo-périodique peut être représentée en PROMELA. +Intuitivement, un process \verb+scheduler+ (comme représenté à la {\sc Figure}~\ref{fig:scheduler}) +est itérativement appelé pour construire chaque $S^t$ représentant +les éléments possiblement mis à jour à l'itération $t$. + +Basiquement, le process est une boucle qui est débloquée lorsque la valeur du sémaphore +\verb+sync_mutex+ est 1. Dans ce cas, les éléments à modifier sont choisis +aléatoirement (grâce à $n$ choix successifs) et sont mémorisés dans le tableau +\verb+mods+, dont la taille est \verb+ar_len+. +Dans la séquence d'éxécution, le choix d'un élément mis à jour est directement +suivi par des mis àjour: ceci est réalisé grace à la modification de la valeur du sémaphore + \verb+unlock_elements_updates+. + +\subsection{Applying the function $F$}\label{sub:spin:update} +Updating a set $S^t=\{s_1,\ldots, s_m\}$ of elements that occur in the strategy +$(S^t)^{t \in \Nats}$ is implemented by the \verb+update_elems+ process given +in~\ref{fig:proc}. This active process waits until it is unlocked by the +\verb+scheduler+ process through the semaphore \verb+unlock_elements_update+. +The implementation is then fivefold: + +\begin{enumerate} +\item it starts with updating the variable \texttt{X} with the values of \texttt{Xp} + thanks to the \texttt{update\_X} function (not detailed here); + %%we recall that the variable \texttt{X} is only defined as +\item it stores in \texttt{Xd} the current available values of the elements thanks + to the function \texttt{fetch\_values} (see \Sec{sub:spin:vt}); +\item a loop over the number \texttt{ar\_len} of elements that have to evolve + iteratively updates the value of $j$ (through the function call \texttt{F(j)}) + provided this has to evolve, \textit{i.e.}, it is referenced by + \texttt{mods[count]}; source code of \texttt{F} is given in~\ref{fig:p} and is a + direct translation of the map $F$; +\item the new components values in \texttt{Xp} are symbolically sent to the other + components requiring them % for future access + thanks to the \texttt{diffuse\_values(Xp)} function (see \Sec{sub:spin:vt}); +\item finally, this process informs the scheduler about the end of the task + (through the semaphore \texttt{sync\_mutex}). +\end{enumerate} + + +\begin{figure}[t] + \begin{minipage}[h]{.475\linewidth} +\begin{scriptsize} +\begin{lstlisting} +active proctype update_elems(){ + do + ::unlock_elements_update ? 1 -> + { + atomic{ + bool is_succ=0; + update_X(); + fetch_values(); + int count = 0; + int j = 0; + do + ::count == ar_len -> break; + ::count < ar_len -> + j = mods[count]; + F(j); + count++; + od; + diffuse_values(Xp); + sync_mutex ! 1 + } + } + od +} +\end{lstlisting} +\end{scriptsize} +\caption{Updatings of the elements.}\label{fig:proc} + \end{minipage}\hfill% +%\end{figure} +%\begin{figure} + \begin{minipage}[h]{.45\linewidth} +\begin{scriptsize} +\begin{lstlisting} +inline F(){ + if + ::j==0 -> Xp[0] = + (Xs[j].v[0] & !Xs[j].v[1]) + |(Xs[j].v[2]) + ::j==1 -> Xp[1] = Xs[j].v[0] + | !Xs[j].v[2] + ::j==2 -> Xp[2] = Xs[j].v[1] + & Xs[j].v[2] + fi +} +\end{lstlisting} +\end{scriptsize} +\caption{Application of function $F$.}\label{fig:p} + \end{minipage} +\end{figure} + +% \subsection{Modifying Values of one Element} + +% Each element $i$ may modify its value through the coresponding +% active process \verb+pi+. +% In Fig.~\ref{fig:p4} that gives the translation of +% modifying the element $4$, the process is waiting until it is unlocked +% and then it computes the new value of $X_4$, represented by $X'_4$ +% and memorized as \verb+Xp[4]+. + + +% \begin{ProofCr} + +% First of all, the second hypothesis of the previous proof is established. + +% In this part, we prove that for any time $t$, + +% The proof is achieved under the hypothesis that at current time $t$, + +% For $j$ in $J^t$, variables +% \verb+v0+, \ldots \verb+vn-1+ are respectively +% $X_0^{S_{j0}^t},\ldots, X_{n-1}^{S_{jn-1}^t}$. +% Since \verb+F+ is the direct translation of $F$, rest of the proof is obvious. + + +% \end{ProofCr} + +\subsection{Delays Handling}\label{sub:spin:vt} +This section shows how delays are translated into PROMELA through the two +functions \verb+fetch_values+ and \verb+diffuse_values+, given in~\ref{fig:val} and~\ref{fig:broadcast}, that respectively store and transmit the +element values. + +\begin{figure}[t] + \begin{minipage}[h]{.475\linewidth} +\begin{scriptsize} +\begin{lstlisting} +inline fetch_values(){ + int countv = 0; + do + :: countv == ar_len -> break ; + :: countv < ar_len -> + j = mods[countv]; + i = 0; + do + :: (i == N) -> break; + :: (i < N && i == j) -> { + Xd[j].v[i] = Xp[i] ; + i++ } + :: (i < N && i != j) -> { + hasnext(i,j); + if + :: skip + :: is_succ==1 && + nempty(channels[i].sent[j]) -> + channels[i].sent[j] ? + Xd[j].v[i]; + fi; + i++ } + od; + countv++ + od +} +\end{lstlisting} +\end{scriptsize} +\caption{Fetching of the elements values\label{fig:val}} + \end{minipage}\hfill% + \begin{minipage}[h]{.475\linewidth} +\begin{scriptsize} +\begin{lstlisting} +inline diffuse_values(values){ + int countb=0; + do + :: countb == ar_len -> break ; + :: countb < ar_len -> + j = mods[countb]; + i = 0 ; + do + :: (i == N) -> break; + :: (i < N && i == j) -> i++; + :: (i < N && i != j) -> { + hasnext(j,i); + if + :: skip + :: is_succ==1 && + nfull(channels[j].sent[i]) -> + channels[j].sent[i] ! + values[j]; + fi; + i++ } + od; + countb++ + od +} +\end{lstlisting} +\end{scriptsize} +\caption{Diffusion of the elements values}\label{fig:broadcast} + \end{minipage} +\end{figure} + +The former potentially updates the array \verb+Xd+ needed by elements that have +to be modified. For each element in \verb+mods+, identified by the variable +$j$, the function retrieves the values of the other elements (labeled by $i$) +whose $j$ depends on. There are two cases: +\begin{itemize} +\item since $i$ knows its last value (\textit{i.e.}, $D^t_{ii}$ is always $t$) + \verb+Xd[i].v[i]+ is then \verb+Xp[i]+. +\item otherwise, there are two sub-cases which potentially update the value that + $j$ knows about $i$ (that may be chosen in a random way): + \begin{itemize} + \item from the viewpoint of $j$ the value of $i$ may not change (the + \verb+skip+ statement) or is not relevant; this latter case arises when + there is no edge from $i$ to $j$ in the incidence graph, \textit{i.e.}, when + the value of \verb+is_succ+ that is computed by \verb+hasnext(i,j)+ is 0; + then the value of \verb+Xd[j].v[i]+ is not modified; + \item otherwise, \verb+Xd[j].v[i]+ is assigned with the value stored in the + channel \verb+channels[i].sent[j]+ (provided this one is not empty). + Element values are added into this channel during the \verb+diffuse_values+ + function as follows. + \end{itemize} +\end{itemize} + +The \verb+diffuse_values+ function aims at storing the values of $X$ represented by +\verb+Xp+ in the \verb+channels+. It allows the SPIN model-checker to execute +the PROMELA model as if it allowed delays between processes. +% as if computation mode were asynchronous. +%For that reason, when an iteration has to synchronize the elements $i$ and +%$j$ (\textit{i.e.} when \verb+sync[j] == sync[i]+ is true), +% no delay emulation is performed. +%In the asynchronous mode, +There are two cases concerning the value of $X_{j}$: +\begin{itemize} +\item either it is left out to allow $i$ not to take into account all the values + of $j$; this case occurs either through the \verb+skip+ statement or when + there is no edge from $j$ to $i$ in the incidence graph; +\item or it is stored in the channel \verb+channels[j].sent[i]+ (provided it is + not full). +\end{itemize} + +Introducing non-determinism both in \verb+fetch_values+ and +\verb+diffuse_values+ functions is necessary in our context. If the +non-determinism would be used only in \verb+fetch_values+, then it would not be +possible for instance to retrieve the value $X_i^{(t)}$ without taking into +account the value $X_i^{(t-1)}$. On the other hand, if the non-determinism is +only used in \verb+diffuse_values+, then each time a value is pushed into the +channel, this value is immediately consumed, which contradicts the notion of +delays. + +\subsection{Discussion} +A coarse approach could consist in providing one process for each element. +However, the distance with the mathematical model given in \Equ{eq:async} of +such a translation would be larger than the method presented along these lines. +It induces that it would be harder to prove the soundness and completeness of +such a translation. For that reason we have developed a PROMELA model that is +as close as possible to the mathematical one. + +Notice furthermore that PROMELA is an imperative language which +often results in generating intermediate states +(to execute a matrix assignment for +instance). +The use of the \verb+atomic+ keyword allows the grouping of +instructions, making the PROMELA code and the DDN as closed as possible. + +\subsection{Universal Convergence Property} +We are left to show how to formalize into the SPIN model-checker that iterations +of a DDN with $n$ elements are universally convergent. We first recall that the +variables \verb+X+ and \verb+Xp+ respectively contain the value of $X$ before +and after an update. Then, by applying a non-deterministic initialization of +\verb+Xp+ and applying a pseudo-periodic strategy, it is necessary and +sufficient to establish the following Linear Temporal Logic (LTL) formula: +\begin{equation} +\diamond (\Box \verb+Xp+ = \verb+X+) +\label{eq:ltl:conv} +\end{equation} +where $\diamond$ and $\Box$ have the usual meaning \textit{i.e.}, respectively +{\em eventually} and {\em always} in the subsequent path. It is worth noticing +that this property only ensures the stabilization of the system, but it does not +provide any information over the way the system converges. In particular, some +indeterminism may still be present under the form of multiple fixed points +accessible from some initial states. + + + +\section{Proof of Translation Correctness}\label{sec:spin:proof} +\JFC{Déplacer les preuves en annexes} + +This section establishes the soundness and completeness of the approach +(Theorems~\ref{Theo:sound} and ~\ref{Theo:completeness}). Technical lemmas are +first shown to ease the proof of the two theorems. + + +% \begin{Lemma}[Absence of deadlock]\label{lemma:deadlock} +% Let $\phi$ be a DDN model and $\psi$ be its translation. There is no deadlock +% in any execution of $\psi$. +% \end{Lemma} +% \begin{Proof} +% In current translation, deadlocks of PROMELA may only be introduced through +% sending or receiving messages in channels. Sending (resp. receiving) a +% message in the \verb+diffuse_values+ (resp. \verb+fetch_values+) function is +% executed only if the channel is not full (resp. is not empty). In the +% \verb+update_elems+ and \verb+scheduler+ processes, each time one adds a value +% in any semaphore channel (\verb+unlock_elements_update+ and +% \verb+sync_mutex+), the corresponding value is read; avoiding deadlocks by the +% way. +% \end{Proof} + + +\begin{lemma}[Strategy Equivalence]\label{lemma:strategy} + Let $\phi$ be a DDN with strategy $(S^t)^{t \in \Nats}$ and $\psi$ be its + translation. There exists an execution of $\psi$ with weak fairness s.t. the + scheduler makes \verb+update_elems+ update elements of $S^t$ at iteration $t$. +\end{lemma} +\begin{Proof} + The proof is direct for $t=0$. Let us suppose it is established until $t$ is + some $t_0$. Let us consider pseudo-periodic strategies. Thanks to the weak + fairness equity property, \verb+update_elems+ will modify elements of $S^t$ at + iteration $t$. +\end{Proof} + +In what follows, let $Xd^t_{ji}$ be the value of +\verb+Xd[+$j$\verb+].v[+$i$\verb+]+ after the $t^{\text{th}}$ call to the +function \verb+fetch_values+. Furthermore, let $Y^k_{ij}$ be the element at +index $k$ in the channel \verb+channels[i].sent[j]+ of size $m$, $m \le +\delta_0$; $Y^0_{ij}$ and $Y^{m-1}_{ij}$ are respectively the head and the tail +of the channel. Secondly, let $(M_{ij}^t)^{t \in \{1, 1.5, 2, 2.5,\ldots\}}$ be a +sequence such that $M_{ij}^t$ is the partial function that associates to each +$k$, $0 \le k \le m-1$, the tuple $(Y^k_{ij},a^k_{ij},c^k_{ij})$ while entering +into the \verb+update_elems+ at iteration $t$ where +% \begin{itemize} +% \item + $Y^k_{ij}$ is the value of the channel \verb+channels[i].sent[j]+ + at index $k$, +%\item +$a^k_{ij}$ is the date (previous to $t$) when $Y^k_{ij}$ has been added and +%\item +$c^k_{ij}$ is the first date at which the value is available on $j$. So, + the value is removed from the channel $i\rightarrow j$ at date $c^k_{ij}+1$. +%\end{itemize} +$M_{ij}^t$ has the following signature: +\begin{equation*} +\begin{array}{rrcl} +M_{ij}^t: & +\{0,\ldots, \textit{max}-1\} &\rightarrow & E_i\times \Nats \times \Nats \\ +& k \in \{0,\ldots, m-1\} & \mapsto & M_{ij}(k)= (Y^k_{ij},a^k_{ij},c^k_{ij}). +\end{array} +\end{equation*} + +Intuitively, $M_{ij}^t$ is the memory of \verb+channels[i].sent[j]+ while +starting the iteration $t$. Notice that the domain of any $M_{ij}^1$ is $\{0\}$ +and $M_{ij}^1(0)=(\verb+Xp[i]+,0,0)$: indeed, the \verb+init+ process +initializes \verb+channels[i].sent[j]+ with \verb+Xp[i]+. + +Let us show how to make the indeterminism inside the two functions\linebreak +\verb+fetch_values+ and \verb+diffuse_values+ compliant with \Equ{eq:async}. +The function $M_{ij}^{t+1}$ is obtained by the successive updates of +$M_{ij}^{t}$ through the two functions\linebreak \verb+fetch_values+ and +\verb+diffuse_values+. Abusively, let $M_{ij}^{t+1/2}$ be the value of +$M_{ij}^{t}$ after the former function during iteration $t$. + +In what follows, we consider elements $i$ and $j$ both in $\llbracket 1, n +\rrbracket$ that are updated. At iteration $t$, $t \geq 1$, let +$(Y^0_{ij},a^0_{ij},c^0_{ij})$ be the value of $M_{ij}^t(0)$ at the beginning of +\verb+fetch_values+. If $t$ is equal to $c^0_{ij}+1$ then we execute the +instruction that assigns $Y^0_{ij}$ (\textit{i.e.}, the head value of +\verb+channels[i].sent[j]+) to $Xd_{ji}^t$. In that case, the function +$M_{ij}^t$ is updated as follows: $M_{ij}^{t+1/2}(k) = M_{ij}^{t}(k+1)$ for each +$k$, $0 \le k \le m-2$ and $m-1$ is removed from the domain of $M_{ij}^{t+1/2}$. +Otherwise (\textit{i.e.}, when $t < c^0_{ij}+1$ or when the domain of $M_{ij}$ +is empty) the \verb+skip+ statement is executed and $M_{ij}^{t+1/2} = +M_{ij}^{t}$. + +In the function \verb+diffuse_values+, if there exists some $\tau$, $\tau\ge t$ +such that \mbox{$D^{\tau}_{ji} = t$}, let $c_{ij}$ be defined by $ \min\{l \mid +D^{l}_{ji} = t \} $. In that case, we execute the instruction that adds the +value \verb+Xp[i]+ to the tail of \verb+channels[i].sent[j]+. Then, +$M_{ij}^{t+1}$ is defined as an extension of $M_{ij}^{t+1/2}$ in $m$ such that +$M_{ij}^{t+1}(m)$ is $(\verb+Xp[i]+,t,c_{ij})$. Otherwise (\textit{i.e.}, when $\forall l +\, . \, l \ge t \Rightarrow D^{l}_{ji} \neq t$ is established) the \verb+skip+ +statement is executed and $M_{ij}^{t+1} = M_{ij}^{t+1/2}$. + + +\begin{lemma}[Existence of SPIN Execution]\label{lemma:execution} + For any sequences $(S^t)^{t \in \Nats}$,\linebreak $(D^t)^{t \in \Nats}$, for + any map $F$ there exists a SPIN execution such that for any iteration $t$, $t + \ge 1$, for any $i$ and $j$ in $\llbracket 1, n \rrbracket$ we have the + following properties: + +\noindent If the domain of $M_{ij}^t$ is not empty, then +\begin{equation} + \left\{ + \begin{array}{rcl} + M_{ij}^1(0) & = & \left(X_i^{D_{ji}^{0}}, 0,0 \right) \\ + \textrm{if $t \geq 2$ then }M_{ij}^t(0) & = & + \left(X_i^{D_{ji}^{c}},D_{ji}^{c},c \right) \textrm{, } + c = \min\{l | D_{ji}^l > D_{ji}^{t-2} \} + \end{array} + \right. + \label{eq:Mij0} +\end{equation} +\noindent Secondly we have: +\begin{equation} + \forall t'\, .\, 1 \le t' \le t \Rightarrow Xd^{t'}_{ji} = X^{D^{t'-1}_{ji}}_i + \label{eq:correct_retrieve} +\end{equation} +\noindent Thirdly, for any $k\in S^t$. Then, the value of the computed variable +\verb+Xp[k]+ at the end of the \verb+update_elems+ process is equal to +$X_k^{t}$ \textit{i.e.}, $F_{k}\left( X_1^{D_{k\,1}^{t-1}},\ldots, + X_{n}^{D_{k\,{n}}^{t-1}}\right)$ at the end of the $t^{\text{th}}$ iteration. +\end{lemma} +\begin{Proof} +The proof is done by induction on the number of iterations. + +\paragraph{Initial case:} + +For the first item, by definition of $M_{ij}^t$, we have $M_{ij}^1(0) = \left( + \verb+Xp[i]+, 0,0 \right)$ that is obviously equal to $\left(X_i^{D_{ji}^{0}}, + 0,0 \right)$. + +Next, the first call to the function \verb+fetch_value+ either assigns the head +of \verb+channels[i].sent[j]+ to \verb+Xd[j].v[i]+ or does not modify +\verb+Xd[j].v[i]+. Thanks to the \verb+init+ process, both cases are equal to +\verb+Xp[i]+, \textit{i.e.}, $X_i^0$. The equation (\ref{eq:correct_retrieve}) is then +established. + + +For the last item, let $k$, $0 \le k \le n-1$. At the end of the first +execution\linebreak of the \verb+update_elems+ process, the value of +\verb+Xp[k]+ is\linebreak $F(\verb+Xd[+k\verb+].v[0]+, \ldots, +\verb+Xd[+k\verb+].v[+n-1\verb+]+)$. Thus, by definition of $Xd$, it is equal +to $F(Xd^1_{k\,0}, \ldots,Xd^1_{k\,n-1})$. Thanks to \Equ{eq:correct_retrieve}, +we can conclude the proof. + + + +\paragraph{Inductive case:} + +Suppose now that lemma~\ref{lemma:execution} is established until iteration $l$. + +First, if domain of definition of the function $M_{ij}^l$ is not empty, by +induction hypothesis $M_{ij}^{l}(0)$ is $\left(X_i^{D_{ji}^{c}}, D_{ji}^{c},c +\right)$ where $c$ is $\min\{k | D_{ji}^k > D_{ji}^{l-2} \}$. + +At iteration $l$, if $l < c + 1$ then the \verb+skip+ statement is executed in +the \verb+fetch_values+ function. Thus, $M_{ij}^{l+1}(0)$ is equal to +$M_{ij}^{l}(0)$. Since $c > l-1$ then $D_{ji}^c > D_{ji}^{l-1}$ and hence, $c$ +is $\min\{k | D_{ji}^k > D_{ji}^{l-1} \}$. Obviously, this implies also that +$D_{ji}^c > D_{ji}^{l-2}$ and $c=\min\{k | D_{ji}^k > D_{ji}^{l-2} \}$. + +We now consider that at iteration $l$, $l$ is $c + 1$. In other words, $M_{ij}$ +is modified depending on the domain $\dom(M^l_{ij})$ of $M^l_{ij}$: +\begin{itemize} +\item if $\dom(M_{ij}^{l})=\{0\}$ and $\forall k\, . \, k\ge l \Rightarrow + D^{k}_{ji} \neq l$ is established then $\dom(M_{ij}^{l+1})$ is empty and the + first item of the lemma is established; +\item if $\dom(M_{ij}^{l})=\{0\}$ and $\exists k\, . \, k\ge l \land D^{k}_{ji} + = l$ is established then $M_{ij}^{l+1}(0)$ is $(\verb+Xp[i]+,l,c_{ij})$ that + is added in the \verb+diffuse_values+ function s.t.\linebreak $c_{ij} = + \min\{k \mid D^{k}_{ji} = l \} $. Let us prove that we can express + $M_{ij}^{l+1}(0)$ as $\left(X_i^{D_{ji}^{c'}},D_{ji}^{c'},c' \right)$ where + $c'$ is $\min\{k | D_{ji}^k > D_{ji}^{l-1} \}$. First, it is not hard to + establish that $D_{ji}^{c_{ij}}= l \geq D_{ji}^{l} > D_{ji}^{l-1}$ and thus + $c_{ij} \geq c'$. Next, since $\dom(M_{ij}^{l})=\{0\}$, then between + iterations $D_{ji}^{c}+1$ and $l-1$, the \texttt{diffuse\_values} function has + not updated $M_{ij}$. Formally we have +$$ +\forall t,k \, .\, D_{ji}^c < t < l \land k \geq t \Rightarrow D_{ji}^k \neq +t.$$ + +Particularly, $D_{ji}^{c'} \not \in \{D_{ji}^{c}+1,\ldots,l-1\}$. We can apply +the third item of the induction hypothesis to deduce +$\verb+Xp[i]+=X_i^{D_{ji}^{c'}}$ and we can conclude. + +\item if $\{0,1\} \subseteq \dom(M_{ij}^{l})$ then $M_{ij}^{l+1}(0)$ is + $M_{ij}^{l}(1)$. Let $M_{ij}^{l}(1)= \left(\verb+Xp[i]+, a_{ij} , c_{ij} + \right)$. By construction $a_{ij}$ is $\min\{t' | t' > D_{ji}^c \land + (\exists k \, .\, k \geq t' \land D_{ji}^k = t')\}$ and $c_{ij}$ is $\min\{k | + D_{ji}^k = a_{ij}\}$. Let us show $c_{ij}$ is equal to $\min\{k | D_{ji}^k > + D_{ji}^{l-1} \}$ further referred as $c'$. First we have $D_{ji}^{c_{ij}} = + a_{ij} > D_{ji}^c$. Since $c$ by definition is greater or equal to $l-1$ , + then $D_{ji}^{c_{ij}}> D_{ji}^{l-1}$ and then $c_{ij} \geq c'$. Next, since + $c$ is $l-1$, $c'$ is $\min\{k | D_{ji}^k > D_{ji}^{c} \}$ and then $a_{ij} + \leq D_{ji}^{c'}$. Thus, $c_{ij} \leq c'$ and we can conclude as in the + previous part. +\end{itemize} + + +The case where the domain $\dom(M^l_{ij})$ is empty but the formula $\exists k +\, .\, k \geq l \land D_{ji}^k = l$ is established is equivalent to the second +case given above and then is omitted. + + +Secondly, let us focus on the formula~(\ref{eq:correct_retrieve}). At iteration +$l+1$, let $c'$ be defined as $\min\{k | D_{ji}^k > D_{ji}^{l-1} \}$. Two cases +have to be considered depending on whether $D_{ji}^{l}$ and $D_{ji}^{l-1}$ are +equal or not. +\begin{itemize} +\item If $D_{ji}^{l} = D_{ji}^{l-1}$, since $D_{ji}^{c'} > D_{ji}^{l-1}$, then + $D_{ji}^{c'} > D_{ji}^{l}$ and then $c'$ is distinct from $l$. Thus, the SPIN + execution detailed above does not modify $Xd_{ji}^{l+1}$. It is obvious to + establish that $Xd_{ji}^{l+1} = Xd_{ji}^{l} = X_i^{D_{ji}^{l-1}} = + X_i^{D_{ji}^{l}}$. +\item Otherwise $D_{ji}^{l}$ is greater than $D_{ji}^{l-1}$ and $c$ is thus $l$. + According to \Equ{eq:Mij0} we have proved, we have + $M_{ij}^{l+1}(0)=(X_i^{D_{ji}^{l}},D_{ji}^{l},l)$. Then the SPIN execution + detailed above assigns $X_i^{D_{ji}^{l}}$ to $Xd_{ji}^{l+1}$, which ends the + proof of (\ref{eq:correct_retrieve}). +\end{itemize} + +We are left to prove the induction of the third part of the lemma. Let $k$, $k +\in S^{l+1}$. % and $\verb+k'+ = k-1$. +At the end of the first execution of the \verb+update_elems+ process, we have +$\verb+Xp[+k\verb+]+= F(\verb+Xd[+k\verb+][0]+, +\ldots,\verb+Xd[+k\verb+][+n\verb+-1]+)+$. By definition of $Xd$, it is equal +to $F(Xd^{l+1}_{k\,0}, \ldots,Xd^{l+1}_{k\,n-1})$. Thanks to +\Equ{eq:correct_retrieve} we have proved, we can conclude the proof. +\end{Proof} + + +\begin{lemma} + Bounding the size of channels to $\textit{max} = \delta_0$ is sufficient when + simulating a DDN where delays are bounded by $\delta_0$. +\end{lemma} + +\begin{Proof} + For any $i$, $j$, at each iteration $t+1$, thanks to bounded delays (by + $\delta_0$), element $i$ has to know at worst $\delta_0$ values that are + $X_j^{t}$, \ldots, $X_j^{t-\delta_0+1}$. They can be stored into any channel + of size $\delta_0$. +\end{Proof} + + +\begin{theorem}[Soundness wrt universal convergence property]\label{Theo:sound} + Let $\phi$ be a DDN model and $\psi$ be its translation. If $\psi$ verifies + the LTL property (\ref{eq:ltl:conv}) under weak fairness property, then + iterations of $\phi$ are universally convergent. +\end{theorem} +\begin{Proof} +% For the case where the strategy is finite, one notice that property +% verification is achieved under weak fairness property. Instructions that +% write or read into \verb+channels[j].sent[i]+ are continuously enabled leading +% to convenient available dates $D_{ji}$. It is then easy to construct +% corresponding iterations of the DDN that are convergent. +% \ANNOT{quel sens donnes-tu a \emph{convenient} ici ?} + + Let us show the contraposition of the theorem. The previous lemmas have shown + that for any sequence of iterations of the DDN, there exists an execution of + the PROMELA model that simulates them. If some iterations of the DDN are + divergent, then they prevent the PROMELA model from stabilizing, \textit{i.e.}, not + verifying the LTL property (\ref{eq:ltl:conv}). +\end{Proof} + + +% \begin{Corol}[Soundness wrt universall convergence property]\label{Theo:sound} +% Let $\phi$ be a DDN model where strategy, $X^(0)$ +% are only constrained to be pseudo-periodic and +% in $E$ respectively. +% Let $\psi$ be its translation. +% If all the executions of $\psi$ converge, +% then iterations of $\phi$ are universally convergent. +% \end{Corol} + + + +\begin{theorem}[Completeness wrt universal convergence property]\label{Theo:completeness} + Let $\phi$ be a DDN model and $\psi$ be its translation. If $\psi$ does not + verify the LTL property (\ref{eq:ltl:conv}) under weak fairness property then + the iterations of $\phi$ are divergent. +\end{theorem} +\begin{Proof} + For models $\psi$ that do not verify the LTL property (\ref{eq:ltl:conv}) it + is easy to construct corresponding iterations of the DDN, whose strategy is + pseudo-periodic since weak fairness property is taken into account. + +% i.e. iterations that are divergent. Executions are +% performed under weak fairness property; we then detail what are continuously +% enabled: +% \begin{itemize} +% \item if the strategy is not defined as periodic, elements $0$, \ldots, $n$ are +% infinitely often updated leading to pseudo-periodic strategy; +% \item instructions that write or read into \verb+channels[j].sent[i]+ are +% continuously enabled leading to convenient available dates $D_{ji}$. +% \end{itemize} +% The simulated DDN does not stabilize and its iterations are divergent. + \end{Proof} + + + +\section{Practical Issues} +\label{sec:spin:practical} +This section first gives some notes about complexity and later presents +experiments. +%\subsection{Complexity Analysis} +%\label{sub:spin:complexity} +\begin{theorem}[Number of states] + Let $\phi$ be a DDN model with $n$ elements, $m$ edges in the incidence graph + and $\psi$ be its translation into PROMELA. The number of configurations of + the $\psi$ SPIN execution is bounded by $2^{m\times(\delta_0+1)+n(n+2)}$. +\end{theorem} +\begin{Proof} + A configuration is a valuation of global variables. Their number only depends + on those that are not constant. + + The variables \verb+Xp+ \verb+X+ lead to $2^{2n}$ states. The variable + \verb+Xs+ leads to $2^{n^2}$ states. Each channel of \verb+array_of_channels+ + may yield $1+2^1+\ldots+2^{\delta_0}= 2^{\delta_0+1}-1$ states. Since the + number of edges in the incidence graph is $m$, there are $m$ non-constant + channels, leading to approximately $2^{m\times(\delta_0+1)}$ states. The + number of configurations is then bounded by $2^{m\times(\delta_0+1)+n(n+2)}$. + Notice that this bound is tractable by SPIN for small values of $n$, + $m$ and $\delta_0$. +\end{Proof} + + + +The method detailed along the line of this article has been applied on the +running example to formally prove its universally convergence. + +First of all, SPIN only considers weak fairness property between processes +whereas above proofs need such a behavior to be established each time a +non-deterministic choice is done. + + +A first attempt has consisted in building the following formula +each time an undeterministic choice between $k$ elements +respectively labeled $l1$, \ldots $lk$ occurs: +$$ +[] <> (l == l0) \Rightarrow +(([] <> (l== l1)) \land \ldots \land ([] <> (l == lk))) +$$ +where label $l0$ denotes the line before the choice. +This formula exactly translates the fairness property. +The negation of such a LTL formula may then be efficiently translated +into a Büchi automata with the tool ltl2ba~\cite{GO01}. +However due to an explosion of the size of the product +between this automata and the automata issued from the PROMELA program +SPIN did not success to verify whether the property is established or not. + +This problem has been practically tackled by leaving spin generating all the (not necessarily fair) computations and verifying convergence property on them. +We are then left to interpret its output with two issues. +If property is established for all the computations, +it is particularly established for fair ones and iterations are convergent. +In the opposite case, when facing to a counter example, an analysis of the SPIN +output is achieved. +\begin{xpl} +Experiments have shown that all the iterations of the running example are +convergent for a delay equal to 1 in less than 10 min. +The example presented in~\cite{abcvs05} with five elements taking boolean +values has been verified with method presented in this article. +Immediately, SPIN computes a counter example, that unfortunately does not +fulfill fairness properties. Fair counter example is obtained +after few minutes. +All the experimentation have been realized in a classic desktop computer. +\end{xpl} + + + + + +%However preliminary experiments have shown the interest of the approach. + + + +% The method detailed along the line of this article has been +% applied on some examples to formally prove their convergence +% (Fig.~\ref{fig:async:exp}). +% In these experiments, Delays are supposed to be bounded by $\delta_0$ set to 10. +% In these arrays, +% $P$ is true ($\top$) provided the uniform convergence property is established, false ($\bot$) otherwise, +% $M$ is the amount of memory usage (in MB) and +% $T$ is the time needed on a Intel Centrino Dual Core 2 Duo @1.8GHz with 2GB of memory, both +% to establish or refute the property. + +% RE is the running example of this article, +% AC2D is a cellular automata with 9 elements taking boolean values +% according their four neighbors +% and BM99 is has been proposed in~\cite{BM99} and consists of 10 process +% modifying their boolean values, but with many connected connection graph. + + + + + +% \begin{figure} +% \begin{center} +% \scriptsize +% \begin{tabular}{|*{13}{c|}} +% \cline{2-13} +% \multicolumn{1}{c|}{ } +% &\multicolumn{6}{|c|}{Mixed Mode} & \multicolumn{6}{|c|}{Only Bounded} \\ +% \cline{2-13} +% \multicolumn{1}{c|}{ } +% &\multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Pseudo-Periodic} & +% \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Pseudo-Periodic} \\ +% \cline{2-13} +% \multicolumn{1}{c|}{ } +% &P & M & T & +% P & M & T & +% P & M & T& +% P & M & T \\ +% \hline %cline{2-13} +% Running Example & +% $\top$ & 409 & 1m11s& +% $\bot$ & 370 & 0.54 & +% $\bot$ & 374 & 7.7s& +% $\bot$ & 370 & 0.51s \\ +% \hline %\cline{2-13} +% AC2D +% &$\bot$ & 2.5 & 0.001s % RC07_async_mixed.spin +% &$\bot$ & 2.5 & 0.01s % RC07_async_mixed_all.spin +% &$\bot$ & 2.5 & 0.01s % RC07_async.spin +% &$\bot$ & 2.5 & 0.01s \\ % RC07_async_all.spin +% \hline %\cline{2-13} +% BM99 +% &$\top$ & & %BM99_mixed_para.spin +% &$\top$ & & % RC07_async_mixed_all.spin +% &$\bot$ & & % RC07_async.spin +% &$\bot$ & & \\ % RC07_async_all.spin +% \hline %\cline{2-13} +% \end{tabular} +% \end{center} +% \caption{Experimentations with Asynchronous Iterations}\label{fig:async:exp} +% \end{figure} + + + +% The example~\cite{RC07} deals with a network composed of two genes taking their +% values into $\{0,1,2\}$. Since parallel iterations is already diverging, +% the same behavior is observed for all other modes. +% The Figure~\ref{fig:RC07CE} gives the trace leading to convergence property +% violation output by SPIN. +% It corresponds to peridic strategy that repeats $\{1,2\};\{1,2\};\{1\};\{1,2\};\{1,2\}$ and starts with $X=(0,0)$. + + +% In the example extracted from~\cite{BM99}, +% we have 10 processors computing a binary value. +% Due to the huge number of dependencies between these calculus, +% $\delta_0$ is reduced to 1. It nevertheless leads to about $2^{100}$ +% configurations in asynchronous iterations. + +% Let us focus on checking universal convergence of asynchronous iterations +% of example~\cite{BCVC10:ir}. +% With a $\delta_0$ set to 5, SPIN generates an out of memory error. +% However, it succeed to prove that the property is not established even +% with $\delta_0$ set to 1 which is then sufficient. + + +% \begin{figure} +% \begin{center} +% \begin{tiny} +% \begin{tabular}{|*{7}{c|}} +% \cline{2-7} +% \multicolumn{1}{c|}{ } +% &\multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Pseudo-Periodic} \\ +% \cline{2-7} +% \multicolumn{1}{c|}{ }& +% P & M & T& +% P & M & T \\ +% \hline %\cline{2-7} +% Running & +% $\top$ & 2.7 & 0.01s & +% $\bot$ & 369.371 & 0.509s \\ +% \hline %\cline{2-7} +% \cite{RC07} example & +% $\bot$ & 2.5 & 0.001s & % RC07_sync.spin +% $\bot$ & 2.5 & 0.01s \\ % RC07_sync_chao_all.spin +% \hline +% \cite{BM99} example & +% $\top$ & 36.7 & 12s & % BM99_sync_para.spin +% $\top$ & & \\ % BM99_sync_chao.spin +% \hline +% \end{tabular} +% \end{tiny} +% \end{center} +% \caption{Experimentations with Synchronous Iterations}\label{fig:sync:exp} +% \end{figure} + + + + + + +% \begin{tabular}{|*{}{c|}} +% % \hline +% % e \\ +% % +% \hline +% & \multicolumn{6}{|c|}{Synchronous} & \multicolumn{12}{|c|}{Asynchronous}\\ +% \cline{8-19} +% Delay & \multicolumn{6}{|c|}{ } +% & \multicolumn{6}{|c|} +% {Only Bounded} +% & \multicolumn{6}{|c|} +% {Bounded+Mixed Mode}\\ +% Strategy& +% \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} & +% \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} & +% \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} \\ + + +% \end{tabular} + + +\section{Conclusion and Future Work} +\label{sec:spin:concl} +Stochastic based prototypes have been implemented to generate both +strategies and delays for asynchronous iterations in first in~\cite{BM99,BCV02}. +However, since these research softwares are not exhaustive, they really give an +formal answer when they found a counterexample. When facing convergence, they only convince +the user about this behavior without exhibiting a proof. + +As far as we know, no implemented formal method tackles the problem of +proving asynchronous iterations convergence. +In the theoretical work~\cite{Cha06} Chandrasekaran shows that asynchronous iterations +are convergent iff we can build a decreasing Lyaponov function, +but does not gives any automated method to compute it. + +In this work, we have shown how convergence proof for any asynchronous +iterations of discrete dynamical networks with bounded delays +can be automatically achieved. +The key idea is to translate the network (map, strategy) into PROMELA and +to leave the SPIN model checker establishing the validity +of the temporal property corresponding to the convergence. +The correctness and completeness of the approach have been proved, notably +by computing a SPIN execution of the PROMELA model that have the same +behaviors than initial network. +The complexity of the problem is addressed. It shows that non trivial example +may be addressed by this technique. + +Among drawbacks of the method, one can argue that bounded delays is only +realistic in practice for close systems. +However, in real large scale distributed systems where bandwidth is weak, +this restriction is too strong. In that case, one should only consider that +matrix $S^{t}$ follows the iterations of the system, \textit{i.e.}, +for all $i$, $j$, $1 \le i \le j \le n$, we have$ +\lim\limits_{t \to \infty} S_{ij}^t = + \infty$. +One challenge of this work should consist in weakening this constraint. +We plan as future work to take into account other automatic approaches +to discharge proofs notably by deductive analysis~\cite{CGK05}. + + + + + + diff --git a/sdd.tex b/sdd.tex new file mode 100644 index 0000000..0bd7629 --- /dev/null +++ b/sdd.tex @@ -0,0 +1,255 @@ + + + +\JFC{Chapeau chapitre à faire} + + + +Cette section énonce quelques notions suffisantes +à la compréhension de ce document. +Elle commence par formaliser ce que sont les systèmes dynamiques booléens +(section \ref{sub:sdd}) +et montre comment en extraire leur graphe d'itérations (section~\ref{sub:grIter}) +et d'interactions (section~\ref{sub:sdd:inter}). +Elle se termine en définissant une distance sur l'espace +$\llbracket 1;n\rrbracket^{\Nats}\times \Bool^n$ (section~\ref{sub:metric}) +qui permet ensuite (section~\ref{sec:charac}) d'établir la chaoticité des +systèmes dynamiques booléens. + + + + + +\section{Système dynamique booléen}\label{sub:sdd} + +Soit $n$ un entier naturel. Un système dynamique booléen est +défini à partir d'une fonction booléenne: +\[ +f:\Bool^n\to\Bool^n,\qquad x=(x_1,\dots,x_n)\mapsto f(x)=(f_1(x),\dots,f_n(x)), +\] +et un {\emph{schéma des itérations}} qui peuvent être +parallèles, séquentielles ou asynchrones \ldots +Le schéma des itérations parallèles est défini comme suit: +à partir d'une configuration initiale $x^0\in\Bool^n$, la suite +$(x^{t})^{t \in \Nats}$ +des configurations du système est construite à partir de la relation de récurrence +$x^{t+1}=f(x^t)$. Tous les $x_i$, $1 \le i \le n$ +sont ainsi mis à jour à chaque itération. +Le schéma qui ne modifie qu'un élément +$i$, $1 \le i \le n$ à chaque itération +est le schéma \emph{asynchrone}. +Plus formellement, à la $t^{\textrm{ème}}$ itération, seul le $s_{t}^{\textrm{ème}}$ +composant (entre 1 et $n$) est mis à jour. +La suite $s = \left(s_t\right)_{t \in \mathds{N}}$ est une séquence d'indices +de $\llbracket 1;n \rrbracket$ appelée \emph{stratégie}. Formellement, dans +ce mode opératoire, +soit $F_f: \llbracket1;n\rrbracket\times \Bool^{n}$ vers $\Bool^n$ définie par +\[ +F_f(i,x)=(x_1,\dots,x_{i-1},f_i(x),x_{i+1},\dots,x_n). +\] + +Dans le schéma des itérations asynchrones pour une configuration initiale +$x^0\in\Bool^n$ et une stratégie $s\in +\llbracket1;n\rrbracket^\Nats$, les configurations $x^t$ +sont définies par la récurrence +\begin{equation}\label{eq:asyn} +x^{t+1}=F_f(s_t,x^t). +\end{equation} + +Soit alors $G_f$ une fonction de $\llbracket1;n\rrbracket^\Nats\times\Bool^n$ +dans lui même définie par +\[ +G_f(s,x)=(\sigma(s),F_f(s_0,x)), +\] +où $\forall t\in\Nats,\sigma(s)_t=s_{t+1}$. +En d'autres termes la fonction $\sigma$ décale +la stratégie fournie en argument d'un élément vers la gauche en supprimant +l'élément de tête. +Les itérations parallèles de $G_f$ depuis un point initial +$X^0=(s,x^0)$ décrivent la même orbite que les +itérations asynchrones de $f$ induites par $x^0$ et la stratégie +$s$. + +\section{Graphe d'itérations}\label{sub:grIter} + +Soit $f$ une fonction de $\Bool^n$ dans lui-même. +Le {\emph{graphe des itérations asynchrones}} associé à $f$ est le +graphe orienté $\Gamma(f)$ défini ainsi: +l'ensemble de ses sommets est $\Bool^n$ et pour chaque $x\in\Bool^n$ et +$i\in \llbracket1;n\rrbracket$, le graphe $\Gamma(f)$ +contient un arc de $x$ vers $F_f(i,x)$. +La relation entre $\Gamma(f)$ et $G_f$ est claire: il existe un +chemin de $x$ à $x'$ dans $\Gamma(f)$ si et seulement s'il existe une +stratégie $s$ telle que les itérations parallèles $G_f$ à partir +du point $(s,x)$ mènent au point $x'$. + + +Dans ce qui suit, et par souci de concision, le terme \emph{graphe des itérations} +est une abréviation de graphe des itérations asynchrones. +La figure~\ref{fig:xplgraphIter} donne deux exemples de graphes d'itérations +pour les fonctions $g$ et $h$ définies dans $\Bool^2$ qui sont reprises tout au long +de ce document. + + + +\begin{figure}% +\centering +\begin{minipage}{0.40\textwidth} + \begin{center} + \includegraphics[height=4cm]{images/g.pdf} + \end{center} +\caption{$g(x_1,x_2)=(\overline{x_1},x_1\overline{x_2}) $}% +\label{fig:g:iter}% +\end{minipage} +\qquad +\begin{minipage}{0.40\textwidth}% + \begin{center} + \includegraphics[height=4cm]{images/h.pdf} + \end{center} +\caption{$h(x_1,x_2)=(\overline{x_1},x_1\overline{x_2}+\overline{x_1}x_2)$}% +\label{fig:h:iter}% +\end{minipage}% +\end{figure}% + +% \begin{figure}%[t] +% \begin{center} +% \subfloat[$g(x_1,x_2)=(\overline{x_1},x_1\overline{x_2}) $]{ +% \begin{minipage}{0.40\textwidth} +% \begin{center} +% \includegraphics[height=4cm]{images/g.pdf} +% \end{center} +% \end{minipage} +% \label{fig:g:iter} +% } +% \subfloat[$h(x_1,x_2)=(\overline{x_1},x_1\overline{x_2}+\overline{x_1}x_2)$]{ +% \begin{minipage}{0.40\textwidth} +% \begin{center} +% \includegraphics[height=4cm]{images/h.pdf} +% \end{center} +% \end{minipage} +% \label{fig:h:iter} +% } \end{center} +% \caption{Graphes d'itérations de fonctions booléennes dans $\Bool^2$} +% \label{fig:xplgraphIter} +% \end{figure} + + + + + + + +\section{Graphe d'interactions}\label{sub:sdd:inter} + +Pour $x\in\Bool^n$ et $i\in\llbracket 1;n\rrbracket$, on nomme +$\overline{x}^i$ la configuration obtenue en niant le +$i^{\textrm{ème}}$ composant de $x$. En d'autres termes +$\overline{x}^i=(x_1,\dots,\overline{x_i},\dots,x_n)$. +Des interactions entre les composants du +système peuvent être mémorisées +dans la {\emph{matrice Jacobienne discrète}} $f'$. +Celle-ci est définie comme étant la fonction qui à chaque +configuration $x\in\Bool^n$ associe la matrice de taille +$n\times n$ +\[ +f'(x)=(f_{ij}(x)),\qquad +f_{ij}(x)=\frac{f_i(\overline{x}^j)-f_i(x)}{\overline{x}^j_j-x_j}\qquad (i,j\in\llbracket1;n\rrbracket). +\] +On note que dans l'équation donnant la valeur de $f_{ij}(x)$, +les termes $f_i(\overline{x}^j)$, $f_i(x)$, +$\overline{x}^j_j$ et $x_j$ sont considérés comme des entiers naturels +égaux à $0$ ou à $1$ et que le calcul est effectué dans $\Z$. + +En outre, les interactions peuvent se représenter à l'aide d'un +graphe $G(f)$ orienté et signé défini ainsi: +l'ensemble des sommets est +$\llbracket1;n\rrbracket$ et il existe un arc de $j$ à $i$ de signe + $s\in\{-1,1\}$, noté $(j,s,i)$, si $f_{ij}(x)=s$ pour au moins +un $x\in\Bool^n$. +On note que la présence de +deux arcs de signes opposés entre deux sommets donnés +est possible. + + + + + +\begin{figure}% +\centering +\begin{minipage}{0.40\textwidth} + \begin{center} + \includegraphics[height=3cm]{images/gp.pdf} + \end{center} +\caption{$g(x_1,x_2)=(\overline{x_1},x_1\overline{x_2}) $}% +\label{fig:g:inter}% +\end{minipage} +\qquad +\begin{minipage}{0.40\textwidth} + \begin{center} + \includegraphics[height=3cm]{images/hp.pdf} + \end{center} +\caption{$h(x_1,x_2)=(\overline{x_1},x_1\overline{x_2}+\overline{x_1}x_2)$}% +\label{fig:h:inter}% +\end{minipage}% +\caption{Graphes d'interactions de fonctions booléennes dans $\Bool^2$} +\label{fig:xplgraphInter} +\end{figure}% + + + + + + + + + +Soit $P$ une suite d'arcs de $G(f)$ de la forme +\[ +(i_1,s_1,i_2),(i_2,s_2,i_3),\ldots,(i_r,s_r,i_{r+1}). +\] +Alors, $P$ est dit un chemin de $G(f)$ de longueur $r$ et de signe +$\Pi_{i=1}^{r}s_i$ et $i_{r+1}$ est dit accessible depuis +$i_1$. +$P$ est un {\emph{circuit}} si $i_{r+1}=i_1$ et si les sommets +$i_1$,\ldots $i_r$ sont deux à deux disjoints. +Un sommet $i$ de $G(f)$ a une {\emph{boucle}} +positive (resp. négative) , si $G(f)$ a un +arc positif (resp. un arc négatif) de $i$ vers lui-même. + + + + + +\section{Distance sur l'espace $\llbracket 1;n\rrbracket^{\Nats}\times \Bool^n$}\label{sub:metric} +On considère l'espace $\mathcal{X}=\llbracket 1;n\rrbracket^{\Nats}\times +\Bool^n$ et +on définit la distance $d$ entre les points $X=(s,x)$ et +$X'=(s',x')$ de $\mathcal{X}$ par +\[ +d(X,X')= d_H(x,x')+d_S(s,s'),~\textrm{où}~ +\left\{ +\begin{array}{l} +\displaystyle{d_H(x,x')=\sum_{i=1}^n |x_i-x'_i|}\\[5mm] +\displaystyle{d_S(s,s')=\frac{9}{n}\sum_{t\in\Nats}\frac{|s_t-s'_t|}{10^{t+1}}}. +\end{array} +\right.\,. +\] +On note que dans le calcul de $d_H(x,x')$-- +appelée \gls{distanceHamming} (cf. glossaire) entre $x$ et $x'$-- +les termes $x_i$ et $x'_i$ sont considérés comme des entiers naturels +égaux à $0$ ou à $1$ et que le calcul est effectué dans $\Z$. +De plus, la \gls{partieentiere} (cf. glossaire) +$\lfloor d(X,X')\rfloor$ est égale à $d_H(x,x')$ soit la distance +de Hamming entre $x$ et $x'$. +%D'autre part, $d(X,X')-\lfloor d(X,X')\rfloor=d_S(s,s')$ +%mesure la différence entre $s$ et $s'$. +On remarque que la partie décimale est inférieure à $10^{-l}$ si +et seulement si les $l$ premiers termes des deux stratégies sont égaux. +De plus, si la +$(l+1)^{\textrm{ème}}$ décimale +de $d_S(s,s')$ +n'est pas nulle, alors $s_l$ est différent de $s'_l$. + +On peut démontrer que pour toute fonction booléenne $f$, +$G_f$ est continue sur $\mathcal{X}$ (cf annexe~\ref{anx:cont}). + diff --git a/spimufchdr-backpage.eps b/spimufchdr-backpage.eps new file mode 120000 index 0000000..2d8bc36 --- /dev/null +++ b/spimufchdr-backpage.eps @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr-backpage.eps \ No newline at end of file diff --git a/spimufchdr-backpage.pdf b/spimufchdr-backpage.pdf new file mode 120000 index 0000000..b0d23e8 --- /dev/null +++ b/spimufchdr-backpage.pdf @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr-backpage.pdf \ No newline at end of file diff --git a/spimufchdr-frontpage.eps b/spimufchdr-frontpage.eps new file mode 120000 index 0000000..d2fa809 --- /dev/null +++ b/spimufchdr-frontpage.eps @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr-frontpage.eps \ No newline at end of file diff --git a/spimufchdr-frontpage.pdf b/spimufchdr-frontpage.pdf new file mode 120000 index 0000000..b43953c --- /dev/null +++ b/spimufchdr-frontpage.pdf @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr-frontpage.pdf \ No newline at end of file diff --git a/spimufchdr-p3-head.eps b/spimufchdr-p3-head.eps new file mode 120000 index 0000000..5058097 --- /dev/null +++ b/spimufchdr-p3-head.eps @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr-p3-head.eps \ No newline at end of file diff --git a/spimufchdr-p3-head.pdf b/spimufchdr-p3-head.pdf new file mode 120000 index 0000000..047ded2 --- /dev/null +++ b/spimufchdr-p3-head.pdf @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr-p3-head.pdf \ No newline at end of file diff --git a/spimufchdr.cls b/spimufchdr.cls new file mode 120000 index 0000000..8c0a812 --- /dev/null +++ b/spimufchdr.cls @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/spimufchdr.cls \ No newline at end of file diff --git a/tente.png b/tente.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b6f2433874731b7406b074431b23641644f61a GIT binary patch literal 40257 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 literal 0 HcmV?d00001 diff --git a/upmext-spimufchdr.cfg b/upmext-spimufchdr.cfg new file mode 120000 index 0000000..cce34c7 --- /dev/null +++ b/upmext-spimufchdr.cfg @@ -0,0 +1 @@ +latexStyle/tex-templates/hdr/spimufchdr/upmext-spimufchdr.cfg \ No newline at end of file -- 2.39.5