2 Copyright (C) 2008-2020 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_ref_observers_requirements:
26 Exigences pour les fonctions décrivant un "*observer*"
27 ------------------------------------------------------
29 .. index:: single: Observer
30 .. index:: single: setObserver
31 .. index:: single: Observer Template
33 Certaines variables spéciales, internes à l'optimisation et utilisées au cours
34 des calculs, peuvent être surveillées durant un calcul ADAO. Ces variables
35 peuvent être affichées, tracées, enregistrées, etc. par l'utilisateur. C'est
36 réalisable en utilisant des "*observer*", parfois aussi appelés des "callback".
37 Ce sont des scripts Python, qui sont chacun associés à une variable donnée, et
38 qui sont automatiquement activés à chaque modification de la variable.
40 Dans l'interface graphique EFICAS d'ADAO, il y a 3 méthodes pratiques pour
41 intégrer un "*observer*" dans un cas ADAO. La méthode est choisie à l'aide du
42 mot-clé "*NodeType*" de chaque entrée de type "*observer*", comme montré dans
45 .. eficas_observer_nodetype:
46 .. image:: images/eficas_observer_nodetype.png
50 **Choisir pour un "*observer*" son type d'entrée**
52 L'"*observer*" peut être fourni sous la forme d'un script explicite (entrée de
53 type "*String*"), d'un script contenu dans un fichier externe (entrée de type
54 "*Script*"), ou en utilisant un modèle (entrée de type "*Template*") fourni par
55 défaut dans ADAO lors de l'usage de l'éditeur graphique EFICAS d'ADAO et
56 détaillé dans la partie :ref:`section_ref_observers_templates` qui suit. Ces
57 derniers sont des scripts simples qui peuvent être adaptés par l'utilisateur,
58 soit dans l'étape d'édition intégrée du cas avec EFICAS d'ADAO, soit dans
59 l'étape d'édition du schéma avant l'exécution, pour améliorer la performance du
60 calcul ADAO dans le superviseur d'exécution de SALOME.
62 Dans l'interface textuelle (TUI) d'ADAO (voir la partie :ref:`section_tui`),
63 les mêmes informations peuvent être données à l'aide de la commande
64 "*setObserver*" appliquée pour une variable données indiquée dans l'argument
65 "*Variable*". Les autres arguments de cette commande permettent de le définir
66 soit comme un template (argument "*Template*") désignant l'un des scripts
67 détaillés dans la partie :ref:`section_ref_observers_templates`, soit comme un
68 script explicite (argument "*String*"), soit comme un script contenu dans un
69 fichier externe (argument "*Script*").
71 Forme générale d'un script permettant de définir un *observer*
72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
74 Pour pouvoir utiliser cette capacité, l'utilisateur doit disposer ou construire
75 des scripts utilisant en entrée standard (i.e. disponible dans l'espace de
76 nommage) les variables ``var`` et ``info``. La variable ``var`` est à utiliser
77 comme un objet de type liste/tuple, contenant la variable d'intérêt indicée par
78 l'étape de mise à jour.
80 A titre d'exemple, voici un script très simple (similaire au modèle
81 "*ValuePrinter*"), utilisable pour afficher la valeur d'une variable
84 print(" --->",info," Value =",var[-1])
86 Stockées comme un fichier Python ou une chaîne de caractères explicite, ces
87 lignes de script peuvent être associées à chaque variable présente dans le
88 mot-clé "*SELECTION*" de la commande "*Observers*" du cas ADAO : "*Analysis*",
89 "*CurrentState*", "*CostFunction*"... La valeur courante de la variable sera
90 affichée à chaque étape de l'algorithme d'optimisation ou d'assimilation. Les
91 "*observer*" peuvent inclure des capacités d'affichage graphique, de stockage,
92 de traitement complexe, d'analyse statistique, etc.
94 On donne ci-après l'identifiant et le contenu de chaque modèle disponible.
96 .. _section_ref_observers_templates:
98 Inventaire des modèles d'*observer* disponibles ("*Template*")
99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
101 .. index:: single: ValuePrinter (Observer)
103 Modèle **ValuePrinter** :
104 .........................
106 Imprime sur la sortie standard la valeur courante de la variable.
110 print(str(info)+" "+str(var[-1]))
112 .. index:: single: ValueAndIndexPrinter (Observer)
114 Modèle **ValueAndIndexPrinter** :
115 .................................
117 Imprime sur la sortie standard la valeur courante de la variable, en ajoutant son index.
121 print(str(info)+(" index %i:"%(len(var)-1))+" "+str(var[-1]))
123 .. index:: single: ValueSeriePrinter (Observer)
125 Modèle **ValueSeriePrinter** :
126 ..............................
128 Imprime sur la sortie standard la série des valeurs de la variable.
132 print(str(info)+" "+str(var[:]))
134 .. index:: single: ValueSaver (Observer)
136 Modèle **ValueSaver** :
137 .......................
139 Enregistre la valeur courante de la variable dans un fichier du répertoire '/tmp' nommé 'value...txt' selon le nom de la variable et l'étape d'enregistrement.
144 v=numpy.array(var[-1], ndmin=1)
150 f='/tmp/value_%s_%05i.txt'%(info,istep)
152 print('Value saved in "%s"'%f)
155 .. index:: single: ValueSerieSaver (Observer)
157 Modèle **ValueSerieSaver** :
158 ............................
160 Enregistre la série des valeurs de la variable dans un fichier du répertoire '/tmp' nommé 'value...txt' selon le nom de la variable et l'étape.
165 v=numpy.array(var[:], ndmin=1)
171 f='/tmp/value_%s_%05i.txt'%(info,istep)
173 print('Value saved in "%s"'%f)
176 .. index:: single: ValuePrinterAndSaver (Observer)
178 Modèle **ValuePrinterAndSaver** :
179 .................................
181 Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur courante de la variable.
186 v=numpy.array(var[-1], ndmin=1)
187 print(str(info)+" "+str(v))
193 f='/tmp/value_%s_%05i.txt'%(info,istep)
195 print('Value saved in "%s"'%f)
198 .. index:: single: ValueIndexPrinterAndSaver (Observer)
200 Modèle **ValueIndexPrinterAndSaver** :
201 ......................................
203 Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur courante de la variable, en ajoutant son index.
208 v=numpy.array(var[-1], ndmin=1)
209 print(str(info)+(" index %i:"%(len(var)-1))+" "+str(v))
215 f='/tmp/value_%s_%05i.txt'%(info,istep)
217 print('Value saved in "%s"'%f)
220 .. index:: single: ValueSeriePrinterAndSaver (Observer)
222 Modèle **ValueSeriePrinterAndSaver** :
223 ......................................
225 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp', la série des valeurs de la variable.
230 v=numpy.array(var[:], ndmin=1)
231 print(str(info)+" "+str(v))
237 f='/tmp/value_%s_%05i.txt'%(info,istep)
239 print('Value saved in "%s"'%f)
242 .. index:: single: ValueGnuPlotter (Observer)
244 Modèle **ValueGnuPlotter** :
245 ............................
247 Affiche graphiquement avec Gnuplot la valeur courante de la variable.
251 import numpy, Gnuplot
252 v=numpy.array(var[-1], ndmin=1)
256 gp(' set style data lines')
259 gp = Gnuplot.Gnuplot(persist=1)
260 gp(' set style data lines')
261 gp('set title "%s (Figure %i)"'%(info,ifig))
262 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
264 .. index:: single: ValueSerieGnuPlotter (Observer)
266 Modèle **ValueSerieGnuPlotter** :
267 .................................
269 Affiche graphiquement avec Gnuplot la série des valeurs de la variable.
273 import numpy, Gnuplot
274 v=numpy.array(var[:], ndmin=1)
278 gp(' set style data lines')
281 gp = Gnuplot.Gnuplot(persist=1)
282 gp(' set style data lines')
283 gp('set title "%s (Figure %i)"'%(info,ifig))
284 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
286 .. index:: single: ValuePrinterAndGnuPlotter (Observer)
288 Modèle **ValuePrinterAndGnuPlotter** :
289 ......................................
291 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable.
295 print(str(info)+" "+str(var[-1]))
296 import numpy, Gnuplot
297 v=numpy.array(var[-1], ndmin=1)
301 gp(' set style data lines')
304 gp = Gnuplot.Gnuplot(persist=1)
305 gp(' set style data lines')
306 gp('set title "%s (Figure %i)"'%(info,ifig))
307 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
309 .. index:: single: ValueSeriePrinterAndGnuPlotter (Observer)
311 Modèle **ValueSeriePrinterAndGnuPlotter** :
312 ...........................................
314 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable.
318 print(str(info)+" "+str(var[:]))
319 import numpy, Gnuplot
320 v=numpy.array(var[:], ndmin=1)
324 gp(' set style data lines')
327 gp = Gnuplot.Gnuplot(persist=1)
328 gp(' set style data lines')
329 gp('set title "%s (Figure %i)"'%(info,ifig))
330 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
332 .. index:: single: ValuePrinterSaverAndGnuPlotter (Observer)
334 Modèle **ValuePrinterSaverAndGnuPlotter** :
335 ...........................................
337 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp' et affiche graphiquement la valeur courante de la variable.
341 print(str(info)+" "+str(var[-1]))
343 v=numpy.array(var[-1], ndmin=1)
349 f='/tmp/value_%s_%05i.txt'%(info,istep)
351 print('Value saved in "%s"'%f)
357 gp(' set style data lines')
360 gp = Gnuplot.Gnuplot(persist=1)
361 gp(' set style data lines')
362 gp('set title "%s (Figure %i)"'%(info,ifig))
363 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
365 .. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer)
367 Modèle **ValueSeriePrinterSaverAndGnuPlotter** :
368 ................................................
370 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp' et affiche graphiquement la série des valeurs de la variable.
374 print(str(info)+" "+str(var[:]))
376 v=numpy.array(var[:], ndmin=1)
382 f='/tmp/value_%s_%05i.txt'%(info,istep)
384 print('Value saved in "%s"'%f)
390 gp(' set style data lines')
393 gp = Gnuplot.Gnuplot(persist=1)
394 gp(' set style data lines')
395 gp('set title "%s (Figure %i)"'%(info,ifig))
396 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
398 .. index:: single: ValueMean (Observer)
400 Modèle **ValueMean** :
401 ......................
403 Imprime sur la sortie standard la moyenne de la valeur courante de la variable.
408 print(str(info)+" "+str(numpy.nanmean(var[-1])))
410 .. index:: single: ValueStandardError (Observer)
412 Modèle **ValueStandardError** :
413 ...............................
415 Imprime sur la sortie standard l'écart-type de la valeur courante de la variable.
420 print(str(info)+" "+str(numpy.nanstd(var[-1])))
422 .. index:: single: ValueVariance (Observer)
424 Modèle **ValueVariance** :
425 ..........................
427 Imprime sur la sortie standard la variance de la valeur courante de la variable.
432 print(str(info)+" "+str(numpy.nanvar(var[-1])))
434 .. index:: single: ValueL2Norm (Observer)
436 Modèle **ValueL2Norm** :
437 ........................
439 Imprime sur la sortie standard la norme L2 de la valeur courante de la variable.
444 v = numpy.ravel( var[-1] )
445 print(str(info)+" "+str(float( numpy.linalg.norm(v) )))
447 .. index:: single: ValueRMS (Observer)
449 Modèle **ValueRMS** :
450 .....................
452 Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moyenne quadratique, de la valeur courante de la variable.
457 v = numpy.ravel( var[-1] )
458 print(str(info)+" "+str(float( numpy.sqrt((1./v.size)*numpy.dot(v,v)) )))