Salome HOME
Code and documentation update for ControledFunctionTest
[modules/adao.git] / doc / fr / ref_observers_requirements.rst
index 504a6fb52dee12404b2368cf54a068407a91b025..ea1178444b75ea167e1d4764b1295fe2483a93cb 100644 (file)
@@ -1,5 +1,5 @@
 ..
-   Copyright (C) 2008-2021 EDF R&D
+   Copyright (C) 2008-2023 EDF R&D
 
    This file is part of SALOME ADAO module.
 
@@ -23,8 +23,8 @@
 
 .. _section_ref_observers_requirements:
 
-Exigences pour les fonctions décrivant un "*observer*"
-------------------------------------------------------
+Conditions requises pour les fonctions décrivant un "*observer*"
+----------------------------------------------------------------
 
 .. index:: single: Observer
 .. index:: single: setObserver
@@ -33,7 +33,7 @@ Exigences pour les fonctions décrivant un "*observer*"
 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 :
@@ -65,10 +65,10 @@ montré dans la figure qui suit :
 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.
@@ -96,9 +96,9 @@ Pour pouvoir utiliser directement cette capacité "*observer*", l'utilisateur
 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
@@ -107,24 +107,44 @@ surveillée :
 
     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::
+
     Si les modèles disponibles par défaut ne sont pas utilisés, il revient à
     l'utilisateur de faire des scripts de fonctions soigneusement établis ou
     des programmes externes qui ne se plantent pas avant d'être enregistrés
     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.
 
@@ -179,9 +199,9 @@ Enregistre la valeur courante de la variable dans un fichier du répertoire '/tm
     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)
@@ -197,12 +217,12 @@ Enregistre la série des valeurs de la variable dans un fichier du répertoire '
 ::
 
     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)
@@ -222,9 +242,9 @@ Imprime sur la sortie standard et, en même temps enregistre dans un fichier du
     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)
@@ -244,9 +264,9 @@ Imprime sur la sortie standard et, en même temps enregistre dans un fichier du
     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)
@@ -262,13 +282,13 @@ Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du
 ::
 
     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)
@@ -287,13 +307,13 @@ Affiche graphiquement avec Gnuplot la valeur courante de la variable.
     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)
@@ -306,16 +326,16 @@ Affiche graphiquement avec Gnuplot la série des valeurs de la variable.
 ::
 
     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)
@@ -327,18 +347,18 @@ Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gn
 
 ::
 
-    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)
@@ -350,18 +370,18 @@ Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gn
 
 ::
 
-    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)
@@ -373,14 +393,14 @@ Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du
 
 ::
 
-    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)
@@ -388,13 +408,13 @@ Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du
     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)
@@ -406,14 +426,14 @@ Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du
 
 ::
 
-    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)
@@ -421,13 +441,13 @@ Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du
     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)
@@ -440,7 +460,7 @@ Imprime sur la sortie standard la moyenne de la valeur courante de la variable.
 ::
 
     import numpy
-    print(str(info)+" "+str(numpy.nanmean(var[-1])))
+    print(str(info)+' '+str(numpy.nanmean(var[-1])))
 
 .. index:: single: ValueStandardError (Observer)
 
@@ -452,7 +472,7 @@ Imprime sur la sortie standard l'écart-type de la valeur courante de la variabl
 ::
 
     import numpy
-    print(str(info)+" "+str(numpy.nanstd(var[-1])))
+    print(str(info)+' '+str(numpy.nanstd(var[-1])))
 
 .. index:: single: ValueVariance (Observer)
 
@@ -464,7 +484,7 @@ Imprime sur la sortie standard la variance de la valeur courante de la variable.
 ::
 
     import numpy
-    print(str(info)+" "+str(numpy.nanvar(var[-1])))
+    print(str(info)+' '+str(numpy.nanvar(var[-1])))
 
 .. index:: single: ValueL2Norm (Observer)
 
@@ -477,7 +497,7 @@ Imprime sur la sortie standard la norme L2 de la valeur courante de la variable.
 
     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)
 
@@ -490,4 +510,4 @@ Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moy
 
     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)) )))