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: ValueGnuPlotter (Observer)
89 Modèle **ValueGnuPlotter** :
90 ............................
92 Affiche graphiquement avec Gnuplot la valeur courante de la variable.
97 v=numpy.array(var[-1], ndmin=1)
101 gp('set style data lines')
104 gp = Gnuplot.Gnuplot(persist=1)
105 gp('set style data lines')
106 gp('set title "%s (Figure %i)"'%(info,ifig))
107 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
109 .. index:: single: ValueMean (Observer)
111 Modèle **ValueMean** :
112 ......................
114 Imprime sur la sortie standard la moyenne de la valeur courante de la variable.
119 print info, numpy.nanmean(var[-1])
121 .. index:: single: ValuePrinter (Observer)
123 Modèle **ValuePrinter** :
124 .........................
126 Imprime sur la sortie standard la valeur courante de la variable.
132 .. index:: single: ValuePrinterAndGnuPlotter (Observer)
134 Modèle **ValuePrinterAndGnuPlotter** :
135 ......................................
137 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable.
142 import numpy, Gnuplot
143 v=numpy.array(var[-1], ndmin=1)
147 gp('set style data lines')
150 gp = Gnuplot.Gnuplot(persist=1)
151 gp('set style data lines')
152 gp('set title "%s (Figure %i)"'%(info,ifig))
153 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
155 .. index:: single: ValuePrinterAndSaver (Observer)
157 Modèle **ValuePrinterAndSaver** :
158 .................................
160 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier la valeur courante de la variable.
165 v=numpy.array(var[-1], ndmin=1)
172 f='/tmp/value_%s_%05i.txt'%(info,istep)
174 print 'Value saved in "%s"'%f
177 .. index:: single: ValuePrinterSaverAndGnuPlotter (Observer)
179 Modèle **ValuePrinterSaverAndGnuPlotter** :
180 ...........................................
182 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier et affiche graphiquement la valeur courante de la variable .
188 v=numpy.array(var[-1], ndmin=1)
194 f='/tmp/value_%s_%05i.txt'%(info,istep)
196 print 'Value saved in "%s"'%f
202 gp('set style data lines')
205 gp = Gnuplot.Gnuplot(persist=1)
206 gp('set style data lines')
207 gp('set title "%s (Figure %i)"'%(info,ifig))
208 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
210 .. index:: single: ValueRMS (Observer)
212 Modèle **ValueRMS** :
213 .....................
215 Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moyenne quadratique, de la valeur courante de la variable.
220 v = numpy.matrix( numpy.ravel( var[-1] ) )
221 print info, float( numpy.sqrt((1./v.size)*(v*v.T)) )
223 .. index:: single: ValueSaver (Observer)
225 Modèle **ValueSaver** :
226 .......................
228 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.
233 v=numpy.array(var[-1], ndmin=1)
239 f='/tmp/value_%s_%05i.txt'%(info,istep)
241 print 'Value saved in "%s"'%f
244 .. index:: single: ValueSerieGnuPlotter (Observer)
246 Modèle **ValueSerieGnuPlotter** :
247 .................................
249 Affiche graphiquement avec Gnuplot la série des valeurs de la variable.
253 import numpy, Gnuplot
254 v=numpy.array(var[:], ndmin=1)
258 gp('set style data lines')
261 gp = Gnuplot.Gnuplot(persist=1)
262 gp('set style data lines')
263 gp('set title "%s (Figure %i)"'%(info,ifig))
264 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
266 .. index:: single: ValueSeriePrinter (Observer)
268 Modèle **ValueSeriePrinter** :
269 ..............................
271 Imprime sur la sortie standard la série des valeurs de la variable.
277 .. index:: single: ValueSeriePrinterAndGnuPlotter (Observer)
279 Modèle **ValueSeriePrinterAndGnuPlotter** :
280 ...........................................
282 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable.
287 import numpy, Gnuplot
288 v=numpy.array(var[:], ndmin=1)
292 gp('set style data lines')
295 gp = Gnuplot.Gnuplot(persist=1)
296 gp('set style data lines')
297 gp('set title "%s (Figure %i)"'%(info,ifig))
298 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
300 .. index:: single: ValueSeriePrinterAndSaver (Observer)
302 Modèle **ValueSeriePrinterAndSaver** :
303 ......................................
305 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier la série des valeurs de la variable.
310 v=numpy.array(var[:], ndmin=1)
317 f='/tmp/value_%s_%05i.txt'%(info,istep)
319 print 'Value saved in "%s"'%f
322 .. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer)
324 Modèle **ValueSeriePrinterSaverAndGnuPlotter** :
325 ................................................
327 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.
333 v=numpy.array(var[:], ndmin=1)
339 f='/tmp/value_%s_%05i.txt'%(info,istep)
341 print 'Value saved in "%s"'%f
347 gp('set style data lines')
350 gp = Gnuplot.Gnuplot(persist=1)
351 gp('set style data lines')
352 gp('set title "%s (Figure %i)"'%(info,ifig))
353 gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
355 .. index:: single: ValueSerieSaver (Observer)
357 Modèle **ValueSerieSaver** :
358 ............................
360 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.
365 v=numpy.array(var[:], ndmin=1)
371 f='/tmp/value_%s_%05i.txt'%(info,istep)
373 print 'Value saved in "%s"'%f
376 .. index:: single: ValueStandardError (Observer)
378 Modèle **ValueStandardError** :
379 ...............................
381 Imprime sur la sortie standard l'écart-type de la valeur courante de la variable.
386 print info, numpy.nanstd(var[-1])
388 .. index:: single: ValueVariance (Observer)
390 Modèle **ValueVariance** :
391 ..........................
393 Imprime sur la sortie standard la variance de la valeur courante de la variable.
398 print info, numpy.nanvar(var[-1])