..
- Copyright (C) 2008-2022 EDF R&D
+ Copyright (C) 2008-2023 EDF R&D
This file is part of SALOME ADAO module.
Certaines variables spéciales, internes à l'optimisation et utilisées au cours
des calculs, peuvent être surveillées durant un calcul ADAO. Ces variables
peuvent être affichées, tracées, enregistrées, etc. par l'utilisateur. C'est
-réalisable en utilisant des "*observer*", parfois aussi appelés des "callback"
+réalisable en utilisant des "*observer*", parfois aussi appelés des "callback",
sur une variable. Ce sont des fonctions Python spéciales, qui sont chacune
associées à une variable donnée, comme décrit conceptuellement dans la figure
suivante :
Une fonction "*observer*" peut être fourni sous la forme d'un script explicite
(entrée de type "*String*"), d'un script contenu dans un fichier externe
(entrée de type "*Script*"), ou en utilisant un modèle (entrée de type
-"*Template*"). Les modèles sont fournis par défaut dans ADAO lors de l'usage de
-l'éditeur graphique EFICAS d'ADAO ou de l'interface TUI, et sont détaillés dans
-la partie :ref:`section_ref_observers_templates` qui suit. Ces derniers sont
-des scripts simples qui peuvent être adaptés par l'utilisateur, soit dans
+"*Template*"). Les modèles sont fournis par défaut dans ADAO, lors de l'usage
+de l'éditeur graphique EFICAS d'ADAO ou de l'interface TUI, et sont détaillés
+dans la partie :ref:`section_ref_observers_templates` qui suit. Ces derniers
+sont des scripts simples qui peuvent être adaptés par l'utilisateur, soit dans
l'étape d'édition intégrée du cas avec EFICAS d'ADAO, soit dans l'étape
d'édition du schéma avant l'exécution, pour améliorer la performance du calcul
ADAO dans le superviseur d'exécution de SALOME.
doit utiliser ou construire un script utilisant en entrée standard (i.e.
disponible dans l'espace de nommage) les variables ``var`` et ``info``. La
variable ``var`` est à utiliser comme un objet de type liste/tuple, contenant
-l'historique de la variable d'intérêt, indicé par les pas d'itérations. Seul le
-corps de la fonction "*observer*" doit être spécifié par l'utilisateur, pas
-l'appel de fonction lui-même.
+l'historique de la variable d'intérêt, indicé par les pas d'itérations et/ou de
+temps. Seul le corps de la fonction "*observer*" doit être spécifié par
+l'utilisateur, pas l'appel Python ``def`` de fonction lui-même.
A titre d'exemple, voici un script très simple (similaire au modèle
"*ValuePrinter*"), utilisable pour afficher la valeur d'une variable
print(" --->",info," Value =",var[-1])
-Stockées comme un fichier Python ou une chaîne de caractères explicite, ces
-lignes de script peuvent être associées à chaque variable présente dans le
-mot-clé "*SELECTION*" de la commande "*Observers*" du cas ADAO : "*Analysis*",
-"*CurrentState*", "*CostFunction*"... La valeur courante de la variable sera
-par exemple affichée à chaque étape de l'algorithme d'optimisation ou
-d'assimilation. Les "*observer*" peuvent inclure des capacités d'affichage
-graphique, de stockage, de traitement complexe, d'analyse statistique, etc. Si
-une variable, à laquelle est lié un "*observer*", n'est pas requise dans le
-calcul et par l'utilisateur, l'exécution de cet "*observer*" n'est tout
-simplement jamais activée.
+Stockées comme un fichier Python ou une chaîne de caractères explicite, cette
+ou ces lignes de script peuvent être associées à chaque variable présente dans
+le mot-clé "*SELECTION*" de la commande "*Observers*" du cas ADAO :
+"*Analysis*", "*CurrentState*", "*CostFunction*"... La valeur courante de la
+variable sera par exemple affichée à chaque étape de l'algorithme
+d'optimisation ou d'assimilation. Les "*observer*" peuvent inclure des
+capacités d'affichage graphique, de stockage, de traitement complexe, d'analyse
+statistique, etc. Si une variable, à laquelle est lié un "*observer*", n'est
+pas requise dans le calcul et par l'utilisateur, l'exécution de cet
+"*observer*" n'est tout simplement jamais activée.
.. warning::
comme une fonction "*observer*". Le débogage peut sinon être vraiment
difficile !
+Certains "*observer*" permettent de créer des fichiers ou des figures
+successives, qui sont numérotées de manière unique et, le cas échéant,
+enregistrées par défaut dans le répertoire standard ``/tmp``. Dans le cas où
+ces informations sont à modifier (comme par exemple lorsque le répertoire
+``/tmp`` est un dossier virtuel ou local non pérenne, ou lorsque l'on désire
+une numérotation en fonction de l'itération), l'utilisateur est invité à
+s'inspirer d'un modèle lui convenant pour le modifier en spécifiant
+différemment ces informations communes. Ensuite, la fonction modifiée peut être
+utilisée dans une entrée de type "*String*" ou de type "*Script*".
+
+.. note::
+
+ Une partie des "*observer*" permet de créer des figures en utilisant le
+ module Python intégré Gnuplot.py [Gnuplot.py]_, qui est une interface de
+ contrôle et transmission d'arguments à l'utilitaire classique de tracé
+ graphique Gnuplot [Gnuplot]_. Disponible sous la grande majorité des
+ environnements, ce dernier est indépendant et doit être correctement
+ préinstallé. Gnuplot.py est ici mis à jour pour supporter Python 3
+
On donne ci-après l'identifiant et le contenu de tous les modèles "*observer*"
disponibles.
v=numpy.array(var[-1], ndmin=1)
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
::
import numpy, re
- v=numpy.array(var[:], ndmin=1)
+ v=numpy.array(var[:], ndmin=1)
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
print(str(info)+" "+str(v))
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
print(str(info)+(" index %i:"%(len(var)-1))+" "+str(v))
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
::
import numpy, re
- v=numpy.array(var[:], ndmin=1)
+ v=numpy.array(var[:], ndmin=1)
print(str(info)+" "+str(v))
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
v=numpy.array(var[-1], ndmin=1)
global ifig, gp
try:
- ifig += 1
- gp(' set style data lines')
+ ifig+=1
+ gp('set style data lines')
except:
- ifig = 0
- gp = Gnuplot.Gnuplot(persist=1)
- gp(' set style data lines')
- gp('set title "%s (Figure %i)"'%(info,ifig))
+ ifig=0
+ gp=Gnuplot.Gnuplot(persist=1)
+ gp('set style data lines')
+ gp('set title "%s (Figure %i)"'%(info,ifig))
gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
.. index:: single: ValueSerieGnuPlotter (Observer)
::
import numpy, Gnuplot
- v=numpy.array(var[:], ndmin=1)
+ v=numpy.array(var[:], ndmin=1)
global ifig, gp
try:
- ifig += 1
- gp(' set style data lines')
+ ifig+=1
+ gp('set style data lines')
except:
- ifig = 0
- gp = Gnuplot.Gnuplot(persist=1)
- gp(' set style data lines')
- gp('set title "%s (Figure %i)"'%(info,ifig))
+ ifig=0
+ gp=Gnuplot.Gnuplot(persist=1)
+ gp('set style data lines')
+ gp('set title "%s (Figure %i)"'%(info,ifig))
gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
.. index:: single: ValuePrinterAndGnuPlotter (Observer)
::
- print(str(info)+" "+str(var[-1]))
+ print(str(info)+' '+str(var[-1]))
import numpy, Gnuplot
v=numpy.array(var[-1], ndmin=1)
global ifig,gp
try:
- ifig += 1
- gp(' set style data lines')
+ ifig+=1
+ gp('set style data lines')
except:
- ifig = 0
- gp = Gnuplot.Gnuplot(persist=1)
- gp(' set style data lines')
- gp('set title "%s (Figure %i)"'%(info,ifig))
+ ifig=0
+ gp=Gnuplot.Gnuplot(persist=1)
+ gp('set style data lines')
+ gp('set title "%s (Figure %i)"'%(info,ifig))
gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
.. index:: single: ValueSeriePrinterAndGnuPlotter (Observer)
::
- print(str(info)+" "+str(var[:]))
+ print(str(info)+' '+str(var[:]))
import numpy, Gnuplot
- v=numpy.array(var[:], ndmin=1)
+ v=numpy.array(var[:], ndmin=1)
global ifig,gp
try:
- ifig += 1
- gp(' set style data lines')
+ ifig+=1
+ gp('set style data lines')
except:
- ifig = 0
- gp = Gnuplot.Gnuplot(persist=1)
- gp(' set style data lines')
- gp('set title "%s (Figure %i)"'%(info,ifig))
+ ifig=0
+ gp=Gnuplot.Gnuplot(persist=1)
+ gp('set style data lines')
+ gp('set title "%s (Figure %i)"'%(info,ifig))
gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
.. index:: single: ValuePrinterSaverAndGnuPlotter (Observer)
::
- print(str(info)+" "+str(var[-1]))
+ print(str(info)+' '+str(var[-1]))
import numpy, re
v=numpy.array(var[-1], ndmin=1)
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
import Gnuplot
global ifig,gp
try:
- ifig += 1
- gp(' set style data lines')
+ ifig+=1
+ gp('set style data lines')
except:
- ifig = 0
- gp = Gnuplot.Gnuplot(persist=1)
- gp(' set style data lines')
- gp('set title "%s (Figure %i)"'%(info,ifig))
+ ifig=0
+ gp=Gnuplot.Gnuplot(persist=1)
+ gp('set style data lines')
+ gp('set title "%s (Figure %i)"'%(info,ifig))
gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
.. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer)
::
- print(str(info)+" "+str(var[:]))
+ print(str(info)+' '+str(var[:]))
import numpy, re
- v=numpy.array(var[:], ndmin=1)
+ v=numpy.array(var[:], ndmin=1)
global istep
try:
- istep += 1
+ istep+=1
except:
- istep = 0
+ istep=0
f='/tmp/value_%s_%05i.txt'%(info,istep)
f=re.sub('\s','_',f)
print('Value saved in "%s"'%f)
import Gnuplot
global ifig,gp
try:
- ifig += 1
- gp(' set style data lines')
+ ifig+=1
+ gp('set style data lines')
except:
- ifig = 0
- gp = Gnuplot.Gnuplot(persist=1)
- gp(' set style data lines')
- gp('set title "%s (Figure %i)"'%(info,ifig))
+ ifig=0
+ gp=Gnuplot.Gnuplot(persist=1)
+ gp('set style data lines')
+ gp('set title "%s (Figure %i)"'%(info,ifig))
gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )
.. index:: single: ValueMean (Observer)
::
import numpy
- print(str(info)+" "+str(numpy.nanmean(var[-1])))
+ print(str(info)+' '+str(numpy.nanmean(var[-1])))
.. index:: single: ValueStandardError (Observer)
::
import numpy
- print(str(info)+" "+str(numpy.nanstd(var[-1])))
+ print(str(info)+' '+str(numpy.nanstd(var[-1])))
.. index:: single: ValueVariance (Observer)
::
import numpy
- print(str(info)+" "+str(numpy.nanvar(var[-1])))
+ print(str(info)+' '+str(numpy.nanvar(var[-1])))
.. index:: single: ValueL2Norm (Observer)
import numpy
v = numpy.ravel( var[-1] )
- print(str(info)+" "+str(float( numpy.linalg.norm(v) )))
+ print(str(info)+' '+str(float( numpy.linalg.norm(v) )))
.. index:: single: ValueRMS (Observer)
import numpy
v = numpy.ravel( var[-1] )
- print(str(info)+" "+str(float( numpy.sqrt((1./v.size)*numpy.dot(v,v)) )))
+ print(str(info)+' '+str(float( numpy.sqrt((1./v.size)*numpy.dot(v,v)) )))