Salome HOME
Updating copyright date information (1)
[modules/adao.git] / doc / fr / ref_observers_requirements.rst
1 ..
2    Copyright (C) 2008-2018 EDF R&D
3
4    This file is part of SALOME ADAO module.
5
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.
10
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.
15
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
19
20    See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21
22    Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
23
24 .. _ref_observers_requirements:
25
26 Exigences pour les fonctions décrivant un "*observer*"
27 ------------------------------------------------------
28
29 .. index:: single: Observer
30 .. index:: single: Observer Template
31
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.
38
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 :
42
43   .. eficas_observer_nodetype:
44   .. image:: images/eficas_observer_nodetype.png
45     :align: center
46     :width: 100%
47   .. centered::
48     **Choisir pour un "*observer*" son type d'entrée**
49
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.
58
59 Forme générale d'un script permettant de définir un *observer*
60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
61
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.
67
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
70 surveillée::
71
72     print "    --->",info," Value =",var[-1]
73
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.
81
82 On donne ci-après l'identifiant et le contenu de chaque modèle disponible.
83
84 Inventaire des modèles d'*observer* disponibles ("*Template*")
85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
86
87 .. index:: single: ValuePrinter (Observer)
88
89 Modèle **ValuePrinter** :
90 ..........................
91
92 Imprime sur la sortie standard la valeur courante de la variable.
93
94 ::
95
96     print(str(info)+" "+str(var[-1]))
97
98 .. index:: single: ValueAndIndexPrinter (Observer)
99
100 Modèle **ValueAndIndexPrinter** :
101 ..................................
102
103 Imprime sur la sortie standard la valeur courante de la variable, en ajoutant son index.
104
105 ::
106
107     print(str(info)+(" index %i:"%(len(var)-1))+" "+str(var[-1]))
108
109 .. index:: single: ValueSeriePrinter (Observer)
110
111 Modèle **ValueSeriePrinter** :
112 ...............................
113
114 Imprime sur la sortie standard la série des valeurs de la variable.
115
116 ::
117
118     print(str(info)+" "+str(var[:]))
119
120 .. index:: single: ValueSaver (Observer)
121
122 Modèle **ValueSaver** :
123 ........................
124
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.
126
127 ::
128
129     import numpy, re
130     v=numpy.array(var[-1], ndmin=1)
131     global istep
132     try:
133         istep += 1
134     except:
135         istep = 0
136     f='/tmp/value_%s_%05i.txt'%(info,istep)
137     f=re.sub('\s','_',f)
138     print('Value saved in "%s"'%f)
139     numpy.savetxt(f,v)
140
141 .. index:: single: ValueSerieSaver (Observer)
142
143 Modèle **ValueSerieSaver** :
144 .............................
145
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.
147
148 ::
149
150     import numpy, re
151     v=numpy.array(var[:],  ndmin=1)
152     global istep
153     try:
154         istep += 1
155     except:
156         istep = 0
157     f='/tmp/value_%s_%05i.txt'%(info,istep)
158     f=re.sub('\s','_',f)
159     print('Value saved in "%s"'%f)
160     numpy.savetxt(f,v)
161
162 .. index:: single: ValuePrinterAndSaver (Observer)
163
164 Modèle **ValuePrinterAndSaver** :
165 ..................................
166
167 Imprime sur la sortie standard et, en même temps enregistre dans un fichier, la valeur courante de la variable.
168
169 ::
170
171     import numpy, re
172     v=numpy.array(var[-1], ndmin=1)
173     print(str(info)+" "+str(v))
174     global istep
175     try:
176         istep += 1
177     except:
178         istep = 0
179     f='/tmp/value_%s_%05i.txt'%(info,istep)
180     f=re.sub('\s','_',f)
181     print('Value saved in "%s"'%f)
182     numpy.savetxt(f,v)
183
184 .. index:: single: ValueIndexPrinterAndSaver (Observer)
185
186 Modèle **ValueIndexPrinterAndSaver** :
187 .......................................
188
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.
190
191 ::
192
193     import numpy, re
194     v=numpy.array(var[-1], ndmin=1)
195     print(str(info)+(" index %i:"%(len(var)-1))+" "+str(v))
196     global istep
197     try:
198         istep += 1
199     except:
200         istep = 0
201     f='/tmp/value_%s_%05i.txt'%(info,istep)
202     f=re.sub('\s','_',f)
203     print('Value saved in "%s"'%f)
204     numpy.savetxt(f,v)
205
206 .. index:: single: ValueSeriePrinterAndSaver (Observer)
207
208 Modèle **ValueSeriePrinterAndSaver** :
209 .......................................
210
211 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier la série des valeurs de la variable.
212
213 ::
214
215     import numpy, re
216     v=numpy.array(var[:],  ndmin=1)
217     print(str(info)+" "+str(v))
218     global istep
219     try:
220         istep += 1
221     except:
222         istep = 0
223     f='/tmp/value_%s_%05i.txt'%(info,istep)
224     f=re.sub('\s','_',f)
225     print('Value saved in "%s"'%f)
226     numpy.savetxt(f,v)
227
228 .. index:: single: ValueGnuPlotter (Observer)
229
230 Modèle **ValueGnuPlotter** :
231 .............................
232
233 Affiche graphiquement avec Gnuplot la valeur courante de la variable.
234
235 ::
236
237     import numpy, Gnuplot
238     v=numpy.array(var[-1], ndmin=1)
239     global ifig, gp
240     try:
241         ifig += 1
242         gp(' set style data lines')
243     except:
244         ifig = 0
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' ) )
249
250 .. index:: single: ValueSerieGnuPlotter (Observer)
251
252 Modèle **ValueSerieGnuPlotter** :
253 ..................................
254
255 Affiche graphiquement avec Gnuplot la série des valeurs de la variable.
256
257 ::
258
259     import numpy, Gnuplot
260     v=numpy.array(var[:],  ndmin=1)
261     global ifig, gp
262     try:
263         ifig += 1
264         gp(' set style data lines')
265     except:
266         ifig = 0
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' ) )
271
272 .. index:: single: ValuePrinterAndGnuPlotter (Observer)
273
274 Modèle **ValuePrinterAndGnuPlotter** :
275 .......................................
276
277 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable.
278
279 ::
280
281     print(str(info)+" "+str(var[-1]))
282     import numpy, Gnuplot
283     v=numpy.array(var[-1], ndmin=1)
284     global ifig,gp
285     try:
286         ifig += 1
287         gp(' set style data lines')
288     except:
289         ifig = 0
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' ) )
294
295 .. index:: single: ValueSeriePrinterAndGnuPlotter (Observer)
296
297 Modèle **ValueSeriePrinterAndGnuPlotter** :
298 ............................................
299
300 Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable.
301
302 ::
303
304     print(str(info)+" "+str(var[:]))
305     import numpy, Gnuplot
306     v=numpy.array(var[:],  ndmin=1)
307     global ifig,gp
308     try:
309         ifig += 1
310         gp(' set style data lines')
311     except:
312         ifig = 0
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' ) )
317
318 .. index:: single: ValuePrinterSaverAndGnuPlotter (Observer)
319
320 Modèle **ValuePrinterSaverAndGnuPlotter** :
321 ............................................
322
323 Imprime sur la sortie standard et, en même temps, enregistre dans un fichier et affiche graphiquement la valeur courante de la variable .
324
325 ::
326
327     print(str(info)+" "+str(var[-1]))
328     import numpy, re
329     v=numpy.array(var[-1], ndmin=1)
330     global istep
331     try:
332         istep += 1
333     except:
334         istep = 0
335     f='/tmp/value_%s_%05i.txt'%(info,istep)
336     f=re.sub('\s','_',f)
337     print('Value saved in "%s"'%f)
338     numpy.savetxt(f,v)
339     import Gnuplot
340     global ifig,gp
341     try:
342         ifig += 1
343         gp(' set style data lines')
344     except:
345         ifig = 0
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' ) )
350
351 .. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer)
352
353 Modèle **ValueSeriePrinterSaverAndGnuPlotter** :
354 .................................................
355
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.
357
358 ::
359
360     print(str(info)+" "+str(var[:]))
361     import numpy, re
362     v=numpy.array(var[:],  ndmin=1)
363     global istep
364     try:
365         istep += 1
366     except:
367         istep = 0
368     f='/tmp/value_%s_%05i.txt'%(info,istep)
369     f=re.sub('\s','_',f)
370     print('Value saved in "%s"'%f)
371     numpy.savetxt(f,v)
372     import Gnuplot
373     global ifig,gp
374     try:
375         ifig += 1
376         gp(' set style data lines')
377     except:
378         ifig = 0
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' ) )
383
384 .. index:: single: ValueMean (Observer)
385
386 Modèle **ValueMean** :
387 .......................
388
389 Imprime sur la sortie standard la moyenne de la valeur courante de la variable.
390
391 ::
392
393     import numpy
394     print(str(info)+" "+str(numpy.nanmean(var[-1])))
395
396 .. index:: single: ValueStandardError (Observer)
397
398 Modèle **ValueStandardError** :
399 ................................
400
401 Imprime sur la sortie standard l'écart-type de la valeur courante de la variable.
402
403 ::
404
405     import numpy
406     print(str(info)+" "+str(numpy.nanstd(var[-1])))
407
408 .. index:: single: ValueVariance (Observer)
409
410 Modèle **ValueVariance** :
411 ...........................
412
413 Imprime sur la sortie standard la variance de la valeur courante de la variable.
414
415 ::
416
417     import numpy
418     print(str(info)+" "+str(numpy.nanvar(var[-1])))
419
420 .. index:: single: ValueL2Norm (Observer)
421
422 Modèle **ValueL2Norm** :
423 .........................
424
425 Imprime sur la sortie standard la norme L2 de la valeur courante de la variable.
426
427 ::
428
429     import numpy
430     v = numpy.matrix( numpy.ravel( var[-1] ) )
431     print(str(info)+" "+str(float( numpy.linalg.norm(v) )))
432
433 .. index:: single: ValueRMS (Observer)
434
435 Modèle **ValueRMS** :
436 ......................
437
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.
439
440 ::
441
442     import numpy
443     v = numpy.matrix( numpy.ravel( var[-1] ) )
444     print(str(info)+" "+str(float( numpy.sqrt((1./v.size)*(v*v.T)) )))