• Aucun résultat trouvé

Implémentation des méthodes incrémentales et duales dans YAO

Lorsque le graphe modulaire d’une application est spécifié et généré par YAO, la mise en œuvre des différentes formules de calcul, qui, selon le modèle, peuvent être de complexité importante, est facilement implémentable dans YAO. Afin d’illustrer ceci, nous présentons sous des formes algorithmiques le calcul de l’adjoint et l’implémentation des méthodes incrémentale et duale.

Le calcul de l’adjoint de la formule (2.2), consiste à :

– Appliquer d’abord l’algorithme forward, qui permet de calculer tous les vecteurs d’entrées des modules du graphe, ainsi que les vecteurs de sorties yi en chaque temps ti et point de mesure.

– Calculer B−1(x(t0) − xb).

– Calculer pour chaque temps ti, le produit mi= R−1i (yi− yo i).

– Initialiser pour chaque temps ti, par les vecteurs mi, les points de mesure qui sont les output

data points du graphe modulaire.

– Appliquer l’algorithme backward (algorithme 3), qui permet alors de calculer aux points d’entrées input data point le premier terme du gradient de la formule (2.2).

– Ajouter au calcul précédent le terme B−1(x(t0) − xb) pour obtenir le gradient.

Les différents algorithmes ward de YAO permettent aussi une mise en œuvre simple de la méthode incrémentale. L’algorithme de la méthode incrémentale de la section 2.3 se présente, dans le formalisme de YAO, de la manière suivante :

Initialisation :

– Prendre xg(t0) = xbet δx= 0

Boucle externe :

– Remplacer xg(t0) par xg(t0) + δx.

– Initialiser les input data points du graphe par xg(t0) et appliquer l’algorithme forward qui

permet de calculer yi= Hi(Mi(xg(t0))), puis calculer les vecteurs di= yo i − yi. – Initialiser pour la boucle interne δx= 0.

Boucle interne :

– Initialiser les entrées du graphe modulaire par le vecteur δx, puis appliquer l’algorithme

3.8. IMPLÉMENTATION DES MÉTHODES INCRÉMENTALES ET DUALES DANS YAO

mi = HiMi(xg(t0))δx − di qui seront affectés aux points de mesure output data points du graphe.

– Appliquer l’algorithme backward, ce qui permet de calculer le premier terme de la formule (2.5).

– Calculer le gradient en ajoutant le second terme de (2.5).

– Corriger δx avec une méthode de minimisation adéquate (la boucle interne calcule une nouvelle valeur de δx).

Il est possible aussi de présenter l’algorithme dual dans le formalisme de YAO en utilisant les notations de la section 2.4.2. Nous définissons pour cela deux vecteurs p(ti) et δx(ti) qui sont

définis pour tout point de l’espace de calcul. Ces deux vecteurs sont définis par les formules de récurrence :

– p(ti) = MT(ti)p(ti+ 1) + HT

i mipour i= 0, 1, . . . , n − 1.

– δxi= M(ti−1)δxi−1+ Qip(ti) pour i = 0, 1, . . . , n.

Initialisation :

– Prendre, pour tout temps ti= 0, ηii étant un vecteur défini en tout point de la grille de calcul).

– Initialiser les points d’entrée du graphe (input data points) par le vecteur xb, appliquer la procédure forward afin de calculer yipuis calculer di= yo

i − yi.

– Faire quelques itérations de la méthode incrémentale, ce qui permet de calculer un vecteur

δx.

– Initialiser les input data points du graphe modulaire par le vecteur δx. Appliquer la procé-dure linward afin de calculer δyi = HiM(ti) . . . M(t0)δx, calculer ensuite mi = Ri−1(yo

i

δyi) (c’est une manière d’initialiser le vecteur miqui est défini en tout point d’observation). – Prendre p(tn) = 0.

Itérer les étapes suivantes :

– Initialiser, pour tout temps ti les points de sortie (output data points) par le vecteur mi, appliquer l’algorithme backward en conservant les valeurs intermédiaires des vecteurs αs

(définis à l’algorithme 3) des différents modules. Ces vecteurs permettent de calculer les vecteurs p(ti) pour i = 0, 1, . . . , n − 1.

– Calculer le produit δx= Bp(t0) (ce qui correspond à l’application de la formule (2.9)).

– Calculer, pour tout i> 0, le produit ηi= QT

i p(ti) (formule (2.10)).

– En modifiant légèrement la procédure linward, on suppose que les entrées du graphe ne se limitent pas aux points de l’espace de calcul E0 au temps t0, mais s’étendent à tous les espaces de calcul Ei pour tout temps ti. On initialise les input data points de la méthode

linward de la manière suivante : les points de l’espace E0sont initialisés par δx, et les points de l’espace Ei sont initialisés par ηi, puis on lance la procédure linward. Avec cette légère modification, la procédure linward, en chaque point de Ei, cumule la valeur courante ηiavec le résultat du calcul déjà réalisé en ce point lors de la propagation de l’algorithme. On note

δxile vecteur calculé par cette procédure sur les points de l’espace Ei.

– Calculer le gradient∇miG= Hi(δxi) + Rimi− di (ce qui correspond à l’application de la formule (2.12)).

3.9 Conclusion

Nous avons présenté dans ce chapitre le graphe modulaire, qui est la structure de base du lo-giciel YAO. Nous avons montré comment cette structure de graphe modulaire, qui correspond à un flot de calcul, permet de modéliser des fonctions complexes représentées par des modèles nu-mériques discrétisés. Nous avons aussi montré que le modèle direct, le tangent linéaire et l’adjoint se calculent par des algorithmes de traversée du graphe modulaire et de son graphe inverse. Cet aspect algorithmique donne à YAO une flexibilité importante, il lui permet d’implémenter des mé-thodes comme la méthode incrémentale, pour la minimisation de la fonction de coût, et la méthode duale, pour la prise en compte des erreurs du modèle. Nous avons présenté, à la fin de ce chapitre, deux algorithmes permettant d’illustrer la façon d’implémenter, dans YAO, ces deux méthodes, qui manipulent des formules de calcul de complexités importantes. Ainsi, YAO constitue aussi une plateforme complète pour le lancement de sessions d’assimilation de données. D’autre part, il constitue un logiciel de simulation, puisqu’il met à la disposition de l’utilisateur les outils et les méthodes lui permettant de lancer plusieurs sessions d’assimilation de données, de tester les différentes méthodes de calcul des matrices de variance-covariance, de faire appel à des méthodes complexes, afin de tester l’apport quelles pourraient apporter à son problème.

Comme nous l’avons signalé, YAO n’est donc pas un différentiateur automatique du pro-gramme d’un modèle direct déjà écrit. En effet, quand il dispose d’un tel propro-gramme, l’utilisa-teur doit le transcrire dans le langage de description de YAO. Il doit donc analyser les différents calculs aux points de grilles, afin de pouvoir écrire les différentes directives ctin. Il doit aussi ana-lyser les différentes boucles du programme, afin de pouvoir écrire les directives order qui leur correspondent. Parfois, quand il s’agit de modèles directs complexes, ces programmes pourraient contenir des anomalies, notamment au niveau des boucles de calculs, qui pourraient présenter des incohérences avec les dépendances des calculs, entre modules, en chaque point de grille. L’objectif du chapitre qui suit est de proposer un algorithme qui permet la détection des anomalies possibles entre les directives ctin et les directives order, afin que celles-ci puissent garantir la traversée com-plète du graphe modulaire et le lancement du calcul de tous les modules du graphe.

Chapitre 4

Cohérence dans l’ordre de calcul

4.1 Introduction

Les directives ctin et order sont à la base du langage de description YAO. Les ctin décrivent les dépendances dans le graphe modulaire et l’order génère les boucles imbriquées, qui permettent de traverser en même temps les espaces et d’appeler les fonctions de base dans un ordre particulier. Un espace peut être traversé de plusieurs façons et les directives order permettent à l’utilisateur de définir facilement une telle traversée. Parfois le choix de ce parcours s’avère assez difficile et, dans des applications YAO de grandes dimensions, l’utilisateur peut faire des erreurs dans la définition des directives order. Mal définir un parcours du graphe modulaire signifie que lorsqu’un module est calculé, ses entrées ne sont pas prêtes parce que ses prédécesseurs n’ont pas encore été tous calculés. La répercussion de ces erreurs affecte directement les résultats numériques du processus d’assimilation de données.

Une directive ctin est représentée par un couple de fonctions de base Fs(source) et Fd (des-tination ou cible). Si S et S sont les espaces respectivement associés à Fs et Fd, nous notons L l’ensemble des axes de l’espace S et L celui de S1; nous savons que S est un sous-espace de

S, dans le sens L ⊂ L. Ainsi si (I,t) est une position courante de Fd, nous notons(I,t) la

po-sition correspondante de Fs. On note d le vecteur distance qui est défini par d= I− ˆI, où ˆI est

la projection de I sur les axes de L. Ainsi, d a la même dimension que I et on note dl ∈ Z sa

composante suivant un axe l de Let par dt = t−t (≤ 0) le retard entre les pas de temps tet t. Ces notations omettent le numéro de l’entrée de Fdet de la sortie de Fs, numéros qui sont spécifiés lors de l’écriture de la directive ctin (section 3.6.4). Vérifier que toutes les connexions, définies par les directives ctin, peuvent être correctement calculées est l’objectif de ce chapitre. Afin de vérifier la validité de la directive order, nous vérifions la cohérence de chaque directive ctin par rapport aux directives order définies par l’utilisateur. Cette vérification de cohérence n’a pas besoin du numéro 1Le vecteur itération I peut être défini à une (I= (i)), deux (I = (i, j)) ou trois dimensions (I = (i, j, k)) en fonction

de l’espace. De même le vecteur Iqui est respectivement I= (i+di), I= (i+di, j +dj) et I= (i+di, j +dj, k +dk) en

fonction de l’espace S. Le vecteur distance d aura une dimension qui correspond au nombre de composantes communes entre S et S. Si par exemple Sest 2D et S est 3D, le vecteur distance sera 2D égal à(di, dj).

d’entrée et de sortie, définis dans le ctin, ainsi la notation Fs(I,t) → Fd(I,t) est convenablement

utilisée dans la suite. Le concept de cohérence d’une directive ctin est défini comme suit.

Définition 1. Soit Fs(I,t) → Fd(I,t) une directive ctin où les fonctions de base Fs et Fd sont déclarées dans un même bloc de directives order. On dit que cette directive ctin est cohérente si, pour chaque(I,t), les directives order assurent que la fonction de base Fs a déjà été calculée au point de grille(I,t). Autrement, la connexion est dite incohérente2.

La figure 4.1 montre un exemple de graphe modulaire composé de 4 fonctions de base (A, B,

C, et D). Les flèches en pointillés représentent les connexions qui viennent de et qui vont vers

l’extérieur de la grille. La figure 4.2a montre deux directives order imbriquées, qui rendent cohé-rentes chacune des connexions définies en figure 4.1. On peut vérifier que, pour chaque connexion, et pour chaque vecteur d’itération I, l’ordre de calcul donné par les boucles imbriquées est tou-jours satisfait. Dans le cas où la connexion vient de l’extérieur de la grille vers un module Fd(I,t)

(les flèches en pointillés de la figure 4.1), YAO considère que le module Fd(I,t) est correctement

alimenté par cette connexion. La cohérence de ce type de connexion est donc toujours vérifiée. La figure 4.2b, en revanche, montre deux directives order imbriquées, qui rendent au moins une connexion définie en figure 4.1 incohérente. La seule différence entre 4.2a et 4.2b est le sens de la seconde boucle qui est, dans le premier cas, ascendante et, dans le second, descendante. Cette diffé-rence rend la connexion B(i, j − 1,t) → D(i, j,t) incohérente, c’est-à-dire que le module D(1,2,t)

est alimenté par B(1, 1,t) qui n’est pas encore calculé par cette traversée particulière. Le lecteur

peut considérer la grille et la traversée imposée par les directives order, et ainsi immédiatement visualiser cette situation d’incohérence.

A(i-1, j, t) A(i, j, t) A(i+1, j, t) B(i, j, t) B(i, j-1, t) D(i, j, t) C(i, j-1, t) C(i, j, t) C(i, j+1, t) D(i, j, t) Module A Module B Module C Module D i = 1 i = 2 j = 1 j = 2

FIG. 4.1 – Graphe modulaire 2D (grille 2× 2) avec 4 fonctions de base (A, B, C et D) et 5

connexions. Les flèches en pointillés représentent les connexions qui viennent de et qui vont vers l’extérieur de la grille.

Nous présentons dans ce chapitre les règles permettant de tester la cohérence d’une directive

ctin. Le cas où les deux fonctions de base Fs et Fd sont calculées au même pas de temps (t= t) 2L’abus de langage cohérence et incohérence des directives order est parfois utilisé dans ce texte.