• Aucun résultat trouvé

Une fois les contraintes relatives à une ou plusieurs chaînes fonctionnelles déterminées, il est envisa- geable d’utiliser un solveur pour rechercher le pire ou meilleur cas d’une exigence. Il est alors nécessaire de préciser au solveur le domaine de définition des variables du système de contraintes. En outre, certaines contraintes apparaissant dans le système nécessitent une ré-écriture pour être utilisées dans un solveur. Finalement, nous introduisons la notion de fonction objectif du problème. La section 8.2 sera consacrée à la définition des fonctions objectifs par type d’exigence.

8.1.1

Domaine de définition des variables

Le système de contraintes constitué pour une exigence est composé d’un ensemble de variables discrètes et continues. Toutes les variable discrètes sont par défaut dans N et toutes les variables continues sont par défaut dansR+. Ces variables peuvent alors être contraintes pour ne pas dépasser certaines valeurs.

Pour les variables discrètes :

– les indices d’événements n’ont pas de limites particulières,

– le nombre de bag c subi dans un lisseur de trafic vl est limité par : c Nvl 1. Pour les variables continues :

– le temps d’exécutionδf d’une fonctionf est limité par : δf Cf ,

– le temps de traverséeδC d’un canal temporiséC est limité par : aC δC et δC bC,

– la phaseφM d’un moduleM est limitée par : φM HP(M), avec HP(M) l’hyperpériode du module, – la phaseφS d’un capteurS est limitée par φS TS, avecTS la période du capteur,

– les estampilles sont contraintes par une valeur minimale que nous détaillons dans la suite.

En effet, les estampilles des événements ne doivent pas être choisies complètement arbitrairement, car nous cherchons un ensemble d’événements représentatif du système en fonctionnement et non pas représentatif de sa phase d’initialisation. La figure 8.1 donne deux mesures de la fraîcheur pire cas sur un exemple élémentaire : un capteurS produit une variable consommée par une fonction f qui s’exécute

avec la fonction g sur le module M . Le chronogramme du haut représente le pire cas de fraîcheur F qui est mesuré au niveau de l’instant initial. Le chronogramme du bas illustre le pire cas d’un autre comportement (φS et φM sont donc différents du comportement précédent) si l’on ne considère pas le cas particulier de l’initialisation. On peut constater que ces deux fraîcheurs ne sont pas égales. Seule la fraîcheur pire cas en fonctionnement est pertinente pour notre analyse.

0 M S f g f f g Tg Tf φM= HP(M) = Tg φS F = φM− φS+ Cf= Tg− (TS+ bS) + Cf M S f g f f g Tg Tf F = Tf+ Cf+ bS |φS− φM| f

Figure 8.1 – Fraîcheur pire cas à l’initialisation et en fonctionnement

Pour éviter que le résultat de l’analyse ne considère le cas particulier de l’instant initial, on ajoute des contraintes sur les estampilles des événements considérés. Les événements considérés en entrée des chaînes fonctionnelles doivent survenir après l’initialisation de tous les modules et tous les capteurs. Dans un système de contraintes, tel que défini au chapitre précédent et dédié à l’analyse d’une exigence ϕ, toute estampilletu_Si en entrée d’une chaîne fonctionnelle doit respecter :

tu_Si max 

max

m2Modules(ϕ)fHP(m)g;s2Sensors(ϕ)max fTsg 

(8.1)

avec :

– M odules(ϕ) l’ensemble des modules intervenant dans l’exigence ϕ et HP(m) l’hyper-période du modulem,

– Sensors(ϕ) l’ensemble des capteurs intervenant dans l’exigence ϕ et Ts la période du capteurs, Le maximum des hyper-périodes des modules et des périodes des capteurs n’étant pas une variable du système de contraintes, il est utilisé comme un paramètre du problème, c’est-à-dire qu’il est calculé en amont de la résolution.

8.1.2

Particularité pour la cohérence

Le système de contraintes constitué dans le cadre d’une exigence de cohérence nécessite quelques aménagements pour son utilisation avec un solveur. Ces particularités concernent les contraintes sur les temps de traitement d’une fonction et les lisseurs de trafic. Dans la suite, nous considérons deux chaînes fonctionnelles se croisant au niveau d’une fonction f , telles que représentées sur la figure 8.2, avec les dépendances des variables (u, v) et (u0, v0). Ces chaînes sont impliquées dans une même exigence de cohérence (divergente ou convergente).

f u u0

v v0

Figure 8.2 – Croisement de chaînes fonctionnelles au niveau de f

Temps de traitement de la fonction

Lors de la construction d’un système de contraintes pour ces chaînes fonctionnelles, les deux contraintes suivantes, issues du processusPf de la fonction f , apparaissent :

9δ 2 [0, Cf] t.q. tu_fi = t f k + δ 9δ02 [0, Cf] t.q. t u0_f i0 = t f k0+ δ0 (8.2) ainsi qu’une contrainte supplémentaire garantissant que lors d’une exécution, toutes les sorties d’une fonction sont produites à une même date :

sik = k0 alorsδ = δ0 (8.3)

Cependant, cette dernière contrainte, conditionnelle, n’est pas directement utilisable dans un sol- veur de programmes linéaires. L’implémentation de cette contrainte se fait alors à l’aide des contraintes suivantes :                    k k0+ b1 M (1) k0 k + b1 M (2) δ δ0+ b1 M (3) δ0 δ + b1 M (4) k < k0+ b2 M + (1 b1) M (5) k0 < k + (1 b2) M + (1 b1) M (6) (8.4)

Deux variables booléennes b1 et b2 sont utilisées ainsi que M un grand entier représentant l’infini. Le choix deM sera discuté ultérieurement (c.f. sous-section 8.1.3). Si le solveur choisit b1 = 0, alors les contraintes(1) à (4) forcent k = k0 etδ = δ0, et les contraintes (5) et (6) sont alors inhibées, c’est-à-dire qu’elles sont toujours vraies quels que soient k, k0 et b2. En revanche, si le solveur choisit b1 = 1, cela revient à inhiber les contraintes (1) à (4) et à activer les contraintes (5) et (6). Dans ce cas, les valeurs deδ et δ0 ne sont plus contraintes l’une par rapport à l’autre et, nécessairement,k6= k0. En effet, suivant la valeur deb2, on obtient soit k < k0, soit k0< k. La contrainte (8.3) est ainsi bien implémentée. Lisseur de tra c

Considérons également que les variablesv et v0 sont transmises au travers d’un même lisseur de trafic vl en sortie de f . Alors, les contraintes suivantes, issues du processus abstrait Avl (c.f. définition (7.5) page 112), font partie du système de contraintes :

     9c 2 0..(Nvl 1) t.q. t u_vl i = t u_f i + c bag 9c02 0..(Nvl 1) t.q. tu0_vl i0 = t u0_f i + c0 bag tu_vli 6= tui00_vl (8.5) La contraintetu_vli 6= t u0_vl

i0 n’est pas directement utilisable par un solveur. Nous la remplaçons donc par les contraintes suivantes :

( tu_vli < t u0_vl i0 + bvl M tui00_vl < t u_vl i + (1 bvl) M (8.6) avec bvl une variable booléenne et M un grand entier représentant l’infini. Avec ces contraintes, pour toutes valeurs debvl, on a nécessairementtu_vli 6= tui00_vl.

8.1.3

Représentation de l’infini

Nous avons vu dans la sous-section précédente que nous utilisons un grand entier M pour inhiber certaines contraintes. Par exemple, la contrainte x y + b M est inhibée si le booléen b = 1 et elle est activée sinon. Il pourrait être tentant de choisir pour valeur de M un entier tel que 1030, mais comme précisé dans la documentation du solveur lp_solve, ce choix pourrait amener à des résultats erronés. En effet, lors de la résolution du programme, la valeur utilisée pour un booléen b à zéro peut ne pas être 0, mais plutôt une valeur très faible comme 10 20 par exemple. Multiplié par M , le résultat n’est plus zéro mais 1010, ce qui change le sens de la contrainte. En pratique, il faut donc choisir un entier « réaliste », c’est-à-dire grand par rapport à la ou les contraintes contrôlées à l’aide deM . Prenons par exemple la contraintetu_vli < tui00_vl+ bvl M issue du processus d’un lisseur de trafic (c.f. équation (8.6)). Les estampilles tu_vli et tui00_vl représentent les instants de sortie d’occurrences de variables qui ont été produites lors d’une même exécution. Ainsi, quelle que soit la valeur des estampilles, elles ne peuvent être distantes de plus de (Nvl 1) bag, Nvlétant le nombre maximal d’occurrences traitées par le lisseur de trafic lors d’une exécution. Si M est strictement plus grand que Nvl bag, alors il est possible d’inhiber ou d’activer la contrainte avec bvl M . Pour l’étude de cas, nous utilisons, pour l’infini, la valeur sûre M = 107.

8.1.4

Fonction objectif

La fonction objectif sert à préciser au solveur son objectif d’optimisation. Pour un programme linéaire mixte, elle s’exprime sous la forme suivante :

min ou max : a1 x1+ a2 x2+ . . . + an xn (8.7)

avec :

fa1, . . . , ang 2 Rn un ensemble de coefficients,

fx1, . . . , xng un ensemble de variables du problème continues ou discrètes, – max un objectif de maximisation,

– min un objectif de minimisation.

Dans le section suivante, nous donnons les fonctions objectifs exprimant les pires et meilleurs cas des exigences latence, fraîcheur et cohérence.