• Aucun résultat trouvé

Les méthodes itératives

A la section 2.3, nous avons montré que le model-checking pour certains opérateurs PCTL consiste à résoudre un système d’équations linéaires. Nous pouvons représenter un tel système sous la forme traditionnelle Ax = b où A est une matrice de réels, b un vecteur de réels et x, le vecteur contenant la solution devant être calculée. Puisque pour les systèmes à résoudre, les matrices et les vecteurs sont indexés selon un ensemble d’état S, nous pouvons affirmer que la matrice A est de taille |S × S| et les vecteurs x et b de taille |S|. Nous utiliserons aussi l’indexation 0, · · · , |S − 1| pour représenter les états du système à l’étude.

Résoudre un système d’équations linéaires est un problème largement documenté. Les mé- thodes pour résoudre un tel problème se divisent en 2 catégories : les méthodes directes et les méthodes itératives. Les méthodes directes calculent la solution exacte (dans les limites de la précision machine) après un nombre fixe d’étapes. Dans cette catégorie, on peut citer notamment l’élimination gaussienne ou méthode de Gauss et la méthode de décomposition L/U. Les méthodes itératives calculent des approximations successives de la solution, l’ité- ration s’arrête lorsque la séquence de solution converge vers une précision donnée. Dans ces méthodes, on peut citer la méthode de Jacobi, la méthode des puissances ainsi que la méthode de Gauss-Seidel [37].

Comme le model-checking produit des systèmes où la matrice A est large et creuse, les mé- thodes directes ne sont pas appropriées pour résoudre de tels systèmes à cause du phénomène dit de fill-in (remplissage) : les modifications faites à la matrice A au fur et à mesure que l’on effectue les calculs augmentent le nombre d’entrées non nulles dans la matrice.

Pour de très grands systèmes, l’accroissement de l’espace de stockage résultant peut rendre les calculs insolubles. Cela n’est pas le cas avec les méthodes itératives. La matrice n’est pas modifiée au cours du processus de calculs et il n’y a pas ainsi d’accroissement dans la consommation de mémoire.

Une autre raison qui fait que les model-checkers utilisent les méthodes itératives est le choix de la structure de données à utiliser pour le stockage de la matrice A. Les modifications effectuées à la matrice lors des calculs étant sans incidence, nous pouvons choisir la structure de données la mieux apte à représenter notre matrice de manière compacte et facile d’accès aux éléments. C’est ce qui est à l’origine du choix des matrices creuses comme structure de données pour le stockage de données et même les MTBDD.

Nous décrivons dans ce qui suit une des méthodes itératives utilisée, à savoir la méthode de Jacobi [37]. Cependant, la procédure générale pour toutes les autres méthodes itératives est identique : en partant d’une estimation initiale de la solution du système d’équations, chaque itération produit une estimation plus précise de la solution du système d’équations linéaires. La solution produite à la k-ème itération est notée x(k). La solution initiale est notée x(0). Chaque solution approximative x(k) est calculée à partir de la solution précédente x(k−1). Le processus d’itération s’arrête quand le vecteur solution est jugé avoir suffisamment convergé. Les critères de convergence varient. Un des critères utilisé est d’arrêter l’itération si la différence entre éléments de vecteurs consécutifs est inférieure à une certaine précision  :

max

i |x

(k)(i) − x(k−1)(i)| < .

Ce critère d’arrêt n’est pas optimal puisque si le vecteur contient des petites valeurs inférieures à , le processus d’itération pourrait s’arrêter prématurément. Une meilleure approche qui est

celle utilisée par PRISM est de considérer la différence relative entre éléments : max i |x(k)(i) − x(k−1)(i)| |x(k)(i)| ! < .

PRISM fixe  par défaut (paramètre qui peut être changé par l’utilisateur) à 10−6.

La méthode de Jacobi

La méthode de Jacobi est basée sur l’observation que la ie équation du système d’équations linéaires Ax = b qui s’écrit comme suit :

|S|−1

X

j=0

A(i, j) · x(j) = b(i)

peut être réécrite de la façon suivante :

x(i) =      b(i) − |S|−1 X j=0 j6=i A(i, j) · x(j)      /A(i, i).

Le ie élément de la ke itération est déterminé à partir du (k − 1)e vecteur comme suit :

xk(i) =      b(i) − |S|−1 X j=0 j6=i A(i, j) · xk−1(j)      /A(i, i).

Pour les systèmes à vérifier pour PCTL, il est à signaler que les entrées A(i, i) ne sont pas nulles.

Soit D − (L + U), une partition de la matrice A avec D, une matrice contenant les éléments diagonaux, L et U sont respectivement la matrice triangulaire inférieure et la matrice trian- gulaire supérieure dérivées de A, i.e., L + U contient les valeurs opposées de toutes les entrées non diagonales.

Comme D(i, i) = A(i, i), nous avons que D−1(i, i) = 1/A(i, i). La précédente équation peut être réécrite comme suit :

xk(i) = D−1(i, i) ·      b(i) − |S|−1 X j=0 j6=i A(i, j) · xk−1(j)     

Sous forme matricielle, la solution approximative x(k)calculée à la ki itération est donnée par :

x(k)= D−1· ((L + U) · x(k−1)+ b).

Il apparaît clairement qu’une itération nécessite une seule multiplication matrice-vecteur. Si k représente le nombre d’itérations nécessaires pour déterminer la solution, l’ensemble du processus nécessite donc k multiplications matrice-vecteur.

Les méthodes itératives sont sources de calculs inexacts car elles calculent une approximation de la solution à  près. De plus, il apparaît que la précision par défaut de 10−6est assez grande pour de larges systèmes, surtout que l’on travaille sur des probabilités comprises entre 0 et 1. La problématique est la même que pour le cas de l’arithmétique à virgule flottante. On souhaite vérifier si un état s donné vérifie une propriété de la forme P∼p(ϕ). Il s’agit de déterminer si

P r(s, ϕ) ∼ p.

Désignons par x(s), la probabilité de s calculée à la fin du processus d’itération. En théorie : x(s) = P r(s, ϕ).

En pratique :

P r(s, ϕ) −  ≤ x(s) ≤ P r(s, ϕ) + .

x(s) est donc égal à : x(s) = P r(s, ϕ) ± δ, avec 0 < δ < . Comme pour l’exemple3.1.1, si P r(s, ϕ) est proche ou égal à p, en fournissant une réponse approximative de P r(s, ϕ), il y’a risque de transformer l’état s en un état qui vérifie (ou pas) la propriété énoncée alors que ce n’est pas le cas.

Les méthodes itératives font passer la précision des réponses fournies de 10−15(précision ma- chine) à 10−6 qui est la valeur par défaut utilisée par PRISM pour les critères de terminaison. PRISM désigne par  de terminaison, la valeur de la précision désirée pour les méthodes itératives.

Si PRISM choisit par défaut une valeur a priori élevée, c’est par souci de gagner en espace mémoire et temps de calcul utilisés. Il s’agit de résoudre le dilemme suivant : si on choisit  de terminaison plus petit, on augmente la chance d’obtenir une réponse plus précise, mais on augmente aussi le nombre d’itérations effectuées et par conséquent l’espace mémoire et le temps de calcul utilisés. Si par contre on choisit une valeur plus grande, on prend le risque d’avoir une réponse moins précise, mais on réduit le nombre d’itérations à faire. Il s’agit de trouver une valeur médiane qui tient compte de ces contraintes et du système à l’étude. De plus, PRISM fixe (paramètre modifiable aussi) un nombre maximal k d’itérations (par défaut k = 10000). Si l’une des 2 conditions est vérifiée (précision obtenue ou nombre d’ité-

rations atteint), l’itération s’arrête. Il est évident qu’en augmentant la précision recherchée, il y’a risque d’atteindre le nombre maximal d’itérations avant la fin des itérations.

L’exemple 3.2.1 qui suit met en évidence le critère de terminaison des méthodes itératives comme source d’erreurs pour les résultats retournés par PRISM. Il s’agit de calculer une probabilité représentable avec la précision machine, mais pas avec la précision du critère de terminaison. Nous montrons que dans ce cas, le model-checker fournit une réponse incorrecte tandis qu’avec une valeur de probabilité représentable avec la précision du critère de termi- naison, le model-checker fournit une réponse correcte.

Figure 3.4: Une chaîne de Markov.

Exemple 3.2.1. Soit le DTMC de la figure 3.1que nous reprenons à la figure3.4. Nous vou- lons savoir si l’état initial s1 satisfait la formule PCTL P≤1/2(a U b). Comme P r(s1, a U b) =

1 = 2 + γ3 avec γ > 0, l’état initial ne satisfait pas la formule PCTL P≤1/2(a U b).

Le tableau de la figure3.5montre les résultats obtenus avec PRISM pour différentes valeurs de γ et  de terminaison. Pour  = 10−6 et γ = 10−5 ou γ = 10−3, PRISM fournit une réponse incorrecte parce que la probabilité à calculer (1/2+γ3 = 10−15ou 1/2+γ3= 10−9) est tronquée avec la précision choisie. Par contre, pour la même valeur de  (10−6) et γ = 10−2, la réponse obtenue est correcte. Il en est de même pour les autres simulations effectuées. L’outil fournit une réponse correcte si la probabilité à calculer est représentable avec la précision choisie. De plus, il est à noter que lorsque l’outil fournit une réponse correcte, le nombre d’itérations est plus grand (5 au lieu de 3), i.e., la réponse obtenue est plus précise.

Documents relatifs