2 Copyright (C) 2008-2019 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 .. _ref_observers_requirements:
26 Exigences pour les fonctions décrivant un "*observer*"
27 ------------------------------------------------------
29 .. index:: single: Observer
30 .. index:: single: Observer Template
32 Certaines variables spéciales, internes à l'optimisation, utilisées au cours des
33 calculs, peuvent être surveillées durant un calcul ADAO. Ces variables peuvent
34 être affichées, tracées, enregistrées, etc. C'est réalisable en utilisant des
35 "*observer*", parfois aussi appelés des "callback". Ce sont des scripts Python,
36 qui sont chacun associés à une variable donnée. Ils sont activés à chaque
37 modification de la variable.
39 Il y a 3 méthodes pratiques pour intégrer un "*observer*" dans un cas ADAO. La
40 méthode est choisie à l'aide du mot-clé "*NodeType*" de chaque entrée de type
41 "*observer*", comme montré dans la figure qui suit :
43 .. eficas_observer_nodetype:
44 .. image:: images/eficas_observer_nodetype.png
48 **Choisir pour un "*observer*" son type d'entrée**
50 L'"*observer*" peut être fourni sous la forme d'un script explicite (entrée de
51 type "*String*"), d'un script contenu dans un fichier externe (entrée de type
52 "*Script*"), ou en utilisant un modèle (entrée de type "*Template*") fourni par
53 défaut dans ADAO lors de l'usage de l'éditeur graphique. Ces derniers sont des
54 scripts simples qui peuvent être adaptés par l'utilisateur, soit dans l'étape
55 d'édition intégrée du cas, soit dans l'étape d'édition du schéma avant
56 l'exécution, pour améliorer la performance du calcul ADAO dans le superviseur
57 d'exécution de SALOME.
59 Forme générale d'un script permettant de définir un *observer*
60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
62 Pour pouvoir utiliser cette capacité, l'utilisateur doit disposer ou construire
63 des scripts utilisant en entrée standard (i.e. disponible dans l'espace de
64 nommage) les variables ``var`` et ``info``. La variable ``var`` est à utiliser
65 comme un objet de type liste/tuple, contenant la variable d'intérêt indicée par
66 l'étape de mise à jour.
68 A titre d'exemple, voici un script très simple (similaire au modèle
69 "*ValuePrinter*"), utilisable pour afficher la valeur d'une variable
72 print(" --->",info," Value =",var[-1])
74 Stockées comme un fichier Python ou une chaîne de caractères explicite, ces
75 lignes de script peuvent être associées à chaque variable présente dans le
76 mot-clé "*SELECTION*" de la commande "*Observers*" du cas ADAO : "*Analysis*",
77 "*CurrentState*", "*CostFunction*"... La valeur courante de la variable sera
78 affichée à chaque étape de l'algorithme d'optimisation ou d'assimilation. Les
79 "*observer*" peuvent inclure des capacités d'affichage graphique, de stockage,
80 de traitement complexe, d'analyse statistique, etc.
82 On donne ci-après l'identifiant et le contenu de chaque modèle disponible.
84 Inventaire des modèles d'*observer* disponibles ("*Template*")
85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
87 .. index:: single: ValuePrinter (Observer)
89 Modèle **ValuePrinter** :
90 ..........................
92 Imprime sur la sortie standard la valeur courante de la variable.
96 print(str(info)+" "+str(var[-1]))
98 .. index:: single: ValueAndIndexPrinter (Observer)
100 Modèle **ValueAndIndexPrinter** :
101 ..................................
103 Imprime sur la sortie standard la valeur courante de la variable, en ajoutant son index.
107 print(str(info)+(" index %i:"%(len(var)-1))+" "+str(var[-1]))
109 .. index:: single: ValueSeriePrinter (Observer)
111 Modèle **ValueSeriePrinter** :
112 ...............................
114 Imprime sur la sortie standard la série des valeurs de la variable.
118 print(str(info)+" "+str(var[:]))
120 .. index:: single: ValueSaver (Observer)
122 Modèle **ValueSaver** :
123 ........................
125 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.
130 v=numpy.array(var[-1], ndmin=1)
136 f='/tmp/value_%s_%05i.txt'%(info,istep)
138 print('Value saved in "%s"'%f)
141 .. index:: single: ValueSerieSaver (Observer)
143 Modèle **ValueSerieSaver** :
144 .............................
146 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.
151 v=numpy.array(var[:], ndmin=1)
157 f='/tmp/value_%s_%05i.txt'%(info,istep)
159 print('Value saved in "%s"'%f)
162 .. index:: single: ValuePrinterAndSaver (Observer)
164 Modèle **ValuePrinterAndSaver** :
165 ..................................
167 Imprime sur la sortie standard et, en même temps enregistre dans un fichier, la valeur courante de la variable.
172 v=numpy.array(var[-1], ndmin=1)
173 print(str(info)+" "+str(v))
179 f='/tmp/value_%s_%05i.txt'%(info,istep)
181 print('Value saved in "%s"'%f)
184 .. index:: single: ValueIndexPrinterAndSaver (Observer)
186 Modèle **ValueIndexPrinterAndSaver** :
187 .......................................
189 Imprime sur la sortie standard et, en même temps enregistre dans un fichier, la valeur courante de la variable, en ajoutant son index.
194 v=numpy.array(var[-1], ndmin=1)
195 print(str(info)+(" index %i:"%(len(var)-1))+" "+str(v))
201 f='/tmp/value_%s_%05i.txt'%(info,istep)
203 print('Value saved in "%s"'%f)
206 .. index:: single: ValueSeriePrinterAndSaver (Observer)
208 Modèle **ValueSeriePrinterAndSaver** :
209 .......................................
211 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier la série des valeurs de la variable.
216 v=numpy.array(var[:], ndmin=1)
217 print(str(info)+" "+str(v))
223 f='/tmp/value_%s_%05i.txt'%(info,istep)
225 print('Value saved in "%s"'%f)
228 .. index:: single: ValueGnuPlotter (Observer)
230 Modèle **ValueGnuPlotter** :
231 .............................
233 Affiche graphiquement avec Gnuplot la valeur courante de la variable.
237 import numpy, Gnuplot
238 v=numpy.array(var[-1], ndmin=1)
242 gp(' set style data lines')
245 gp = Gnuplot.Gnuplot(persist=1)
246 gp(' set style data lines')
247 gp('set title "%s (Figure %i)"'%(info,ifig))
248 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
250 .. index:: single: ValueSerieGnuPlotter (Observer)
252 Modèle **ValueSerieGnuPlotter** :
253 ..................................
255 Affiche graphiquement avec Gnuplot la série des valeurs de la variable.
259 import numpy, Gnuplot
260 v=numpy.array(var[:], ndmin=1)
264 gp(' set style data lines')
267 gp = Gnuplot.Gnuplot(persist=1)
268 gp(' set style data lines')
269 gp('set title "%s (Figure %i)"'%(info,ifig))
270 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
272 .. index:: single: ValuePrinterAndGnuPlotter (Observer)
274 Modèle **ValuePrinterAndGnuPlotter** :
275 .......................................
277 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable.
281 print(str(info)+" "+str(var[-1]))
282 import numpy, Gnuplot
283 v=numpy.array(var[-1], ndmin=1)
287 gp(' set style data lines')
290 gp = Gnuplot.Gnuplot(persist=1)
291 gp(' set style data lines')
292 gp('set title "%s (Figure %i)"'%(info,ifig))
293 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
295 .. index:: single: ValueSeriePrinterAndGnuPlotter (Observer)
297 Modèle **ValueSeriePrinterAndGnuPlotter** :
298 ............................................
300 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable.
304 print(str(info)+" "+str(var[:]))
305 import numpy, Gnuplot
306 v=numpy.array(var[:], ndmin=1)
310 gp(' set style data lines')
313 gp = Gnuplot.Gnuplot(persist=1)
314 gp(' set style data lines')
315 gp('set title "%s (Figure %i)"'%(info,ifig))
316 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
318 .. index:: single: ValuePrinterSaverAndGnuPlotter (Observer)
320 Modèle **ValuePrinterSaverAndGnuPlotter** :
321 ............................................
323 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier et affiche graphiquement la valeur courante de la variable .
327 print(str(info)+" "+str(var[-1]))
329 v=numpy.array(var[-1], ndmin=1)
335 f='/tmp/value_%s_%05i.txt'%(info,istep)
337 print('Value saved in "%s"'%f)
343 gp(' set style data lines')
346 gp = Gnuplot.Gnuplot(persist=1)
347 gp(' set style data lines')
348 gp('set title "%s (Figure %i)"'%(info,ifig))
349 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
351 .. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer)
353 Modèle **ValueSeriePrinterSaverAndGnuPlotter** :
354 .................................................
356 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier et affiche graphiquement la série des valeurs de la variable.
360 print(str(info)+" "+str(var[:]))
362 v=numpy.array(var[:], ndmin=1)
368 f='/tmp/value_%s_%05i.txt'%(info,istep)
370 print('Value saved in "%s"'%f)
376 gp(' set style data lines')
379 gp = Gnuplot.Gnuplot(persist=1)
380 gp(' set style data lines')
381 gp('set title "%s (Figure %i)"'%(info,ifig))
382 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
384 .. index:: single: ValueMean (Observer)
386 Modèle **ValueMean** :
387 .......................
389 Imprime sur la sortie standard la moyenne de la valeur courante de la variable.
394 print(str(info)+" "+str(numpy.nanmean(var[-1])))
396 .. index:: single: ValueStandardError (Observer)
398 Modèle **ValueStandardError** :
399 ................................
401 Imprime sur la sortie standard l'écart-type de la valeur courante de la variable.
406 print(str(info)+" "+str(numpy.nanstd(var[-1])))
408 .. index:: single: ValueVariance (Observer)
410 Modèle **ValueVariance** :
411 ...........................
413 Imprime sur la sortie standard la variance de la valeur courante de la variable.
418 print(str(info)+" "+str(numpy.nanvar(var[-1])))
420 .. index:: single: ValueL2Norm (Observer)
422 Modèle **ValueL2Norm** :
423 .........................
425 Imprime sur la sortie standard la norme L2 de la valeur courante de la variable.
430 v = numpy.matrix( numpy.ravel( var[-1] ) )
431 print(str(info)+" "+str(float( numpy.linalg.norm(v) )))
433 .. index:: single: ValueRMS (Observer)
435 Modèle **ValueRMS** :
436 ......................
438 Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moyenne quadratique, de la valeur courante de la variable.
443 v = numpy.matrix( numpy.ravel( var[-1] ) )
444 print(str(info)+" "+str(float( numpy.sqrt((1./v.size)*(v*v.T)) )))