2 Copyright (C) 2008-2015 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é à 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é comme un fichier Python ou une chaîne de caractères explicite, ces lignes
75 de script peuvent être associées à chaque variable présente dans le mot-clé
76 "*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.
98 .. index:: single: ValueSeriePrinter (Observer)
100 Modèle **ValueSeriePrinter** :
101 ..............................
103 Imprime sur la sortie standard la série des valeurs de la variable.
109 .. index:: single: ValueSaver (Observer)
111 Modèle **ValueSaver** :
112 .......................
114 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.
119 v=numpy.array(var[-1], ndmin=1)
125 f='/tmp/value_%s_%05i.txt'%(info,istep)
127 print 'Value saved in "%s"'%f
130 .. index:: single: ValueSerieSaver (Observer)
132 Modèle **ValueSerieSaver** :
133 ............................
135 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.
140 v=numpy.array(var[:], ndmin=1)
146 f='/tmp/value_%s_%05i.txt'%(info,istep)
148 print 'Value saved in "%s"'%f
151 .. index:: single: ValuePrinterAndSaver (Observer)
153 Modèle **ValuePrinterAndSaver** :
154 .................................
156 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier la valeur courante de la variable.
161 v=numpy.array(var[-1], ndmin=1)
168 f='/tmp/value_%s_%05i.txt'%(info,istep)
170 print 'Value saved in "%s"'%f
173 .. index:: single: ValueSeriePrinterAndSaver (Observer)
175 Modèle **ValueSeriePrinterAndSaver** :
176 ......................................
178 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier la série des valeurs de la variable.
183 v=numpy.array(var[:], ndmin=1)
190 f='/tmp/value_%s_%05i.txt'%(info,istep)
192 print 'Value saved in "%s"'%f
195 .. index:: single: ValueGnuPlotter (Observer)
197 Modèle **ValueGnuPlotter** :
198 ............................
200 Affiche graphiquement avec Gnuplot la valeur courante de la variable.
204 import numpy, Gnuplot
205 v=numpy.array(var[-1], ndmin=1)
209 gp(' set style data lines')
212 gp = Gnuplot.Gnuplot(persist=1)
213 gp(' set style data lines')
214 gp('set title "%s (Figure %i)"'%(info,ifig))
215 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
217 .. index:: single: ValueSerieGnuPlotter (Observer)
219 Modèle **ValueSerieGnuPlotter** :
220 .................................
222 Affiche graphiquement avec Gnuplot la série des valeurs de la variable.
226 import numpy, Gnuplot
227 v=numpy.array(var[:], ndmin=1)
231 gp(' set style data lines')
234 gp = Gnuplot.Gnuplot(persist=1)
235 gp(' set style data lines')
236 gp('set title "%s (Figure %i)"'%(info,ifig))
237 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
239 .. index:: single: ValuePrinterAndGnuPlotter (Observer)
241 Modèle **ValuePrinterAndGnuPlotter** :
242 ......................................
244 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable.
249 import numpy, Gnuplot
250 v=numpy.array(var[-1], ndmin=1)
254 gp(' set style data lines')
257 gp = Gnuplot.Gnuplot(persist=1)
258 gp(' set style data lines')
259 gp('set title "%s (Figure %i)"'%(info,ifig))
260 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
262 .. index:: single: ValueSeriePrinterAndGnuPlotter (Observer)
264 Modèle **ValueSeriePrinterAndGnuPlotter** :
265 ...........................................
267 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable.
272 import numpy, Gnuplot
273 v=numpy.array(var[:], ndmin=1)
277 gp(' set style data lines')
280 gp = Gnuplot.Gnuplot(persist=1)
281 gp(' set style data lines')
282 gp('set title "%s (Figure %i)"'%(info,ifig))
283 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
285 .. index:: single: ValuePrinterSaverAndGnuPlotter (Observer)
287 Modèle **ValuePrinterSaverAndGnuPlotter** :
288 ...........................................
290 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier et affiche graphiquement la valeur courante de la variable .
296 v=numpy.array(var[-1], ndmin=1)
302 f='/tmp/value_%s_%05i.txt'%(info,istep)
304 print 'Value saved in "%s"'%f
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: ValueSeriePrinterSaverAndGnuPlotter (Observer)
320 Modèle **ValueSeriePrinterSaverAndGnuPlotter** :
321 ................................................
323 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.
329 v=numpy.array(var[:], 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: ValueMean (Observer)
353 Modèle **ValueMean** :
354 ......................
356 Imprime sur la sortie standard la moyenne de la valeur courante de la variable.
361 print info, numpy.nanmean(var[-1])
363 .. index:: single: ValueStandardError (Observer)
365 Modèle **ValueStandardError** :
366 ...............................
368 Imprime sur la sortie standard l'écart-type de la valeur courante de la variable.
373 print info, numpy.nanstd(var[-1])
375 .. index:: single: ValueVariance (Observer)
377 Modèle **ValueVariance** :
378 ..........................
380 Imprime sur la sortie standard la variance de la valeur courante de la variable.
385 print info, numpy.nanvar(var[-1])
387 .. index:: single: ValueRMS (Observer)
389 Modèle **ValueRMS** :
390 .....................
392 Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moyenne quadratique, de la valeur courante de la variable.
397 v = numpy.matrix( numpy.ravel( var[-1] ) )
398 print info, float( numpy.sqrt((1./v.size)*(v*v.T)) )