2 Copyright (C) 2008-2023 EDF R&D
4 This file is part of SALOME ADAO module.
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 .. _section_tutorials_in_python:
26 ================================================================================
27 **[DocU]** Tutoriaux sur l'utilisation du module ADAO dans Python
28 ================================================================================
30 .. |eficas_totui| image:: images/eficas_totui.png
34 Cette section présente quelques exemples d'utilisation du module ADAO en
35 Python. Le premier montre comment construire un cas simple d'assimilation de
36 données définissant explicitement toutes les données d'entrée requises à
37 travers l'interface utilisateur textuelle (TUI) décrite en partie
38 :ref:`section_tui`. Le second montre, sur le même cas, comment définir les
39 données d'entrée à partir de sources externes à travers des scripts. On
40 présente ici toujours des scripts Python car ils sont directement insérables
41 dans les définitions de script de l'interface Python, mais les fichiers
42 externes peuvent utiliser d'autres langages.
44 Ces exemples sont intentionnellement décrits de manière semblables aux
45 :ref:`section_tutorials_in_salome` car ils sont similaires à ceux que l'on peut
46 traiter dans l'interface graphique SALOME. On peut d'ailleurs directement
47 obtenir une forme scriptée d'un cas construit dans l'interface graphique à
48 l'aide du bouton d'export TUI |eficas_totui| intégré dans l'interface. Les
49 notations mathématiques utilisées ci-dessous sont expliquées dans la section
50 :ref:`section_theory`.
52 D'autres exemples simples, et leurs illustrations, sont insérés à la fin de la
53 documentation de référence de certains algorithmes. C'est le cas, de manière
54 non limitative, des :ref:`section_ref_algorithm_3DVAR`,
55 :ref:`section_ref_algorithm_KalmanFilter` et
56 :ref:`section_ref_algorithm_ExtendedBlue`.
58 .. _section_tutorials_in_python_explicit:
60 Construire un cas d'estimation avec une définition explicite des données
61 ------------------------------------------------------------------------
63 Cet exemple très simple est un cas de démonstration, et il décrit comment
64 mettre au point un environnement d'estimation par BLUE de manière à obtenir un
65 *état estimé par méthode de moindres carrés pondérés* d'un système à partir
66 d'une observation de l'état et d'une connaissance *a priori* (ou ébauche) de
67 cet état. En d'autres termes, on cherche l'intermédiaire pondéré entre les
68 vecteurs d'observation et d'ébauche. Toutes les valeurs numériques de cet
69 exemple sont arbitraires.
71 Conditions d'expérience
72 +++++++++++++++++++++++
74 On choisit d'opérer dans un espace d'observation à 3 dimensions. La 3D est
75 choisie de manière à restreindre la taille des objets numériques à entrer
76 explicitement par l'utilisateur, mais le problème n'est pas dépendant de la
77 dimension et peut être posé en dimension 10, 100, 1000... L'observation
78 :math:`\mathbf{y}^o` vaut 1 dans chaque direction, donc :
83 L'ébauche :math:`\mathbf{x}^b` de l'état , qui représente une connaissance *a
84 priori* ou une régularisation mathématique, est choisie comme valant 0 dans
85 chaque cas, ce qui donne donc :
90 La mise en oeuvre de l'assimilation de données requiert des informations sur
91 les covariances d'erreur :math:`\mathbf{R}` et :math:`\mathbf{B}`,
92 respectivement pour les variables d'erreur d'observation et d'ébauche. On
93 choisit ici des erreurs décorrélées (c'est-à-dire des matrices diagonales) et
94 d'avoir la même variance de 1 pour toutes les variables (c'est-à-dire des
95 matrices identité). On pose donc :
98 B = R = Id = [1 0 0 ; 0 1 0 ; 0 0 1]
100 Enfin, on a besoin d'un opérateur d'observation :math:`\mathbf{H}` pour
101 convertir l'état d'ébauche dans l'espace des observations. Ici, comme les
102 dimensions d'espace sont les mêmes et que l'on postule un opérateur linéaire de
103 sélection, on peut choisir l'identité comme opérateur d'observation :
106 H = Id = [1 0 0 ; 0 1 0 ; 0 0 1]
108 Avec de tels choix, l'estimateur "Best Linear Unbiased Estimator" (BLUE) sera le
109 vecteur moyen entre :math:`\mathbf{y}^o` et :math:`\mathbf{x}^b`, nommé
110 *analysis*, noté :math:`\mathbf{x}^a`, et valant :
115 Pour étendre cet exemple, on peut modifier les variances représentées par
116 :math:`\mathbf{B}` ou :math:`\mathbf{R}` indépendamment, et l'analyse
117 :math:`\mathbf{x}^a` se déplacera vers :math:`\mathbf{y}^o` ou vers
118 :math:`\mathbf{x}^b`, en proportion inverse des variances dans
119 :math:`\mathbf{B}` et :math:`\mathbf{R}`. Comme autre extension, on peut aussi
120 dire qu'il est équivalent de rechercher l'analyse à l'aide d'un algorithme de
121 "Blue" ou d'un algorithme de "3DVAR".
123 Utiliser l'interface textuelle (TUI) pour construire le cas ADAO
124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126 On va renseigner les variables pour construire le cas ADAO en utilisant les
127 conditions d'expérience décrites ci-dessus. L'ensemble des informations
128 techniques données au-dessus sont à insérer directement dans la définition du
129 cas ADAO, en utilisant au choix une liste, un vecteur ou une chaîne de
130 caractères pour chaque variable. On s'appuie sur la documentation de référence
131 :ref:`section_tui`. On constitue ainsi un cas ADAO, qui peut être enregistré en
132 fichier Python standard.
134 L'entête du fichier doit comporter les déclarations habituelles du cas :
137 from adao import adaoBuilder
138 case = adaoBuilder.New()
139 case.set( 'AlgorithmParameters', Algorithm='Blue' )
141 La définition des observations et des covariances d'erreurs sont les suivantes :
144 case.set( 'Observation', Vector=[1, 1, 1] )
145 case.set( 'ObservationError', Matrix="1 0 0 ; 0 1 0 ; 0 0 1" )
147 De la même manière, l'information *a priori* est définie avec ses covariances
151 case.set( 'Background', Vector=[0, 0, 0] )
152 case.set( 'BackgroundError', Matrix="1 0 0 ; 0 1 0 ; 0 0 1" )
154 L'opérateur d'observation, très simple et ici linéaire, peut être défini par:
157 case.set( 'ObservationOperator', Matrix="1 0 0 ; 0 1 0 ; 0 0 1" )
159 Pour obtenir un affichage automatique de l'état optimal analysé, on peut
160 ajouter une commande d'"*observer*", ou ajouter après l'exécution des commandes de
161 traitement des résultats de l'assimilation de données. On peut se contenter
162 dans ce cas très simple d'ajouter :
165 case.set( 'Observer', Variable="Analysis", Template="ValuePrinter" )
167 La démarche d'exécution est extrêmement simple et consiste à effectuer à la
168 ligne de commande, ou dans le fichier enregistrant le cas, la commande
174 Le résultat de l'exécution de ces commandes (que ce soit en console Python, par
175 la commande "*shell*" de SALOME, dans la console Python de l'interface, ou par
176 le menu d'exécution d'un script) est le suivant :
179 Analysis [0.5 0.5 0.5]
181 comme montré ci-après :
185 Python 3.6.5 (default, Feb 01 2019, 12:12:12)
187 Type "help", "copyright", "credits" or "license" for more information.
189 >>> from adao import adaoBuilder
190 >>> case = adaoBuilder.New()
191 >>> case.set( 'AlgorithmParameters', Algorithm='Blue' )
192 >>> case.set( 'Observation', Vector=[1, 1, 1] )
193 >>> case.set( 'ObservationError', Matrix="1 0 0 ; 0 1 0 ; 0 0 1" )
194 >>> case.set( 'Background', Vector=[0, 0, 0] )
195 >>> case.set( 'BackgroundError', Matrix="1 0 0 ; 0 1 0 ; 0 0 1" )
196 >>> case.set( 'ObservationOperator', Matrix="1 0 0 ; 0 1 0 ; 0 0 1" )
197 >>> case.set( 'Observer', Variable="Analysis", Template="ValuePrinter" )
199 Analysis [0.5 0.5 0.5]
203 Pour étendre cet exemple, on peut remarquer que le même problème résolu par un
204 algorithme de "3DVAR" donne le même résultat. Cet algorithme peut être choisi
205 lors de l'étape de construction du cas ADAO en changeant simplement l'argument
206 "*Algorithm*" en entête. Le reste du cas ADAO en "3DVAR" est alors entièrement
207 similaire au cas algorithmique du "Blue".
209 .. _section_tutorials_in_python_script:
211 Construire un cas d'estimation avec une définition de données externes par scripts
212 ----------------------------------------------------------------------------------
214 Il est utile d'acquérir une partie ou la totalité des données du cas ADAO
215 depuis une définition externe, en utilisant des scripts Python pour donner
216 accès à ces données. À titre d'exemple, on construit ici un cas ADAO présentant
217 le même dispositif expérimental que dans l'exemple ci-dessus
218 :ref:`section_tutorials_in_python_explicit`, mais en utilisant des données
219 issues d'un unique fichier script Python externe.
221 En premier lieu, on écrit le fichier script suivant, utilisant des noms
222 conventionnels pour les variables requises. Ici toutes les variables sont
223 définies dans le même script, mais l'utilisateur peut choisir de séparer le
224 fichier en plusieurs autres, ou de mélanger une définition explicite des
225 données dans l'interface textuelle ADAO et une définition implicite dans des
226 fichiers externes. Le fichier script actuel ressemble à :
231 # Definition of the Background as a vector
232 # ----------------------------------------
233 Background = [0, 0, 0]
235 # Definition of the Observation as a vector
236 # -----------------------------------------
237 Observation = "1 1 1"
239 # Definition of the Background Error covariance as a matrix
240 # ---------------------------------------------------------
241 BackgroundError = numpy.array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
243 # Definition of the Observation Error covariance as a matrix
244 # ----------------------------------------------------------
245 ObservationError = numpy.matrix("1 0 0 ; 0 1 0 ; 0 0 1")
247 # Definition of the Observation Operator as a matrix
248 # --------------------------------------------------
249 ObservationOperator = numpy.identity(3)
251 Les noms des variables Python sont obligatoires, de manière à définir les
252 bonnes variables dans le cas ADAO, mais le script Python peut être plus
253 conséquent et définir des classes, des fonctions, des accès à des fichiers ou
254 des bases de données, etc. avec des noms différents. De plus, le fichier
255 ci-dessus présente différentes manières de définir des vecteurs ou des
256 matrices, utilisant des listes, des chaînes de caractères (comme dans Numpy ou
257 Octave), des types vecteur ou matrice de Numpy, et des fonctions spéciales de
258 Numpy. Toutes ces syntaxes sont valides.
260 Après avoir enregistré ce script dans un fichier (nommé ici "*script.py*" pour
261 l'exemple) à un endroit quelconque dans l'arborescence de l'utilisateur, on
262 utilise l'interface textuelle pour construire le cas ADAO. La procédure pour
263 compléter le cas est similaire à celle de l'exemple précédent à part le fait
264 que, au lieu de choisir l'option "*Vector*" ou "*Matrix*" pour construire
265 chaque variable, on choisit l'option "*Script*" en indiquant simultanément le
266 type "*Vector*" ou "*Matrix*" de la variable. Cela permet d'obtenir les
267 commandes suivantes (que ce soit en console Python, par la commande "*shell*"
268 de SALOME, dans la console Python de l'interface, ou par le menu d'exécution
273 Python 3.6.5 (default, Feb 01 2019, 12:12:12)
275 Type "help", "copyright", "credits" or "license" for more information.
277 >>> from adao import adaoBuilder
278 >>> case = adaoBuilder.New()
279 >>> case.set( 'AlgorithmParameters', Algorithm='Blue' )
280 >>> case.set( 'Observation', Vector=True, Script="script.py" )
281 >>> case.set( 'ObservationError', Matrix=True, Script="script.py" )
282 >>> case.set( 'Background', Vector=True, Script="script.py" )
283 >>> case.set( 'BackgroundError', Matrix=True, Script="script.py" )
284 >>> case.set( 'ObservationOperator', Matrix=True, Script="script.py" )
285 >>> case.set( 'Observer', Variable="Analysis", Template="ValuePrinter" )
287 Analysis [0.5 0.5 0.5]
291 Les autres étapes et résultats sont exactement les mêmes que dans l'exemple
292 précédent :ref:`section_tutorials_in_python_explicit`.
294 Dans la pratique, cette démarche par scripts est la manière la plus facile pour
295 récupérer des informations depuis des calculs en ligne ou préalables, depuis
296 des fichiers statiques, depuis des bases de données ou des flux informatiques,
297 chacun pouvant être dans ou hors SALOME. Cela permet aussi de modifier aisément
298 des données d'entrée, par exemple à des fin de débogage ou pour des traitements
299 répétitifs, et c'est la méthode la plus polyvalente pour paramétrer les données
300 d'entrée. **Mais attention, la méthodologie par scripts n'est pas une procédure
301 "sûre", en ce sens que des données erronées ou des erreurs dans les calculs,
302 peuvent être directement introduites dans l'exécution du cas ADAO.
303 L'utilisateur doit vérifier avec soin le contenu de ses scripts.**