From 850ff06673c4f71000caff5555d3cd51f17d5735 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Wed, 15 Sep 2021 20:31:39 +0200 Subject: [PATCH] Documentation improvements and post analysis --- doc/en/snippets/UserPostAnalysis.rst | 8 +++++--- doc/en/tui.rst | 18 ++++++++++++------ doc/fr/snippets/UserPostAnalysis.rst | 12 +++++++----- doc/fr/tui.rst | 23 +++++++++++++++-------- src/daComposant/daCore/Aidsm.py | 23 +++++++++++++++++++++-- src/daComposant/daCore/Templates.py | 6 +++--- 6 files changed, 63 insertions(+), 27 deletions(-) diff --git a/doc/en/snippets/UserPostAnalysis.rst b/doc/en/snippets/UserPostAnalysis.rst index 498267b..64c19dc 100644 --- a/doc/en/snippets/UserPostAnalysis.rst +++ b/doc/en/snippets/UserPostAnalysis.rst @@ -4,6 +4,8 @@ UserPostAnalysis *Multiline string*. This variable allows to process some parameters or data automatically after data assimilation or optimization algorithm processing. - Its value is defined as a script file or a string, allowing to put - post-processing code directly inside the ADAO case. Common templates are - provided to help the user to start or to quickly make his case. + Its value is defined either as a predefined pattern name, or as a script file + name, or as a string, allowing to put post-processing code directly inside + the ADAO case. Common templates are provided to help the user to start or to + quickly make his case. Important note: this processing is only performed when + the case is executed in TUI or exported to YACS. diff --git a/doc/en/tui.rst b/doc/en/tui.rst index d4cd0de..03b4616 100644 --- a/doc/en/tui.rst +++ b/doc/en/tui.rst @@ -37,7 +37,9 @@ graphical interface (GUI). When one wants to elaborate "by hand" the TUI calculation case, it is recommended to extensively use all the ADAO module documentation, and to go back if necessary to the graphical interface (GUI), to get all the elements allowing to correctly set the commands. The general used -notions and terms are defined in :ref:`section_theory`. +notions and terms are defined in :ref:`section_theory`. As in the graphical +interface, we point out that the TUI approach is intended to create and manage +a single calculation case. .. _subsection_tui_creating: @@ -516,7 +518,9 @@ Setting the calculation, outputs, etc. This command disables the detailed information mode when running. .. index:: single: Observer +.. index:: single: Observer Template .. index:: single: setObserver +.. index:: single: setObserver Template **setObserver** (*Variable, Template, String, Script, Info*) This command allows to set an *observer* on the current or final @@ -531,19 +535,21 @@ Setting the calculation, outputs, etc. an information string or can be void. .. index:: single: UserPostAnalysis +.. index:: single: UserPostAnalysis Template .. index:: single: setUserPostAnalysis .. index:: single: setUserPostAnalysis Template **setUserPostAnalysis** (*Template, String, Script*) This command allows to define the treatment of parameters or results after - the calculation algorithm has been performed. Its value is defined as a - predefined pattern name, a script file or a string. This allows to produce - directly post-processing code in an ADAO case. It is possible to use - patterns available by argument "*Template*" (which can be + the calculation algorithm has been performed. Its value is defined either + as a predefined pattern name, or as a script file name, or as a string. + This allows to produce directly post-processing code in an ADAO case. It is + possible to use patterns available by argument "*Template*" (which can be "*AnalysisPrinter*", "*AnalysisSaver*" and "*AnalysisPrinterAndSaver*"). In the case of a definition by "*Script*", the specified file must contain only the commands that could have been put after the execution of the - calculation. + calculation. Important note: this processing is only performed when the + case is executed in TUI or exported to YACS. Perform the calculation +++++++++++++++++++++++ diff --git a/doc/fr/snippets/UserPostAnalysis.rst b/doc/fr/snippets/UserPostAnalysis.rst index f7c6eb2..cb6a5f2 100644 --- a/doc/fr/snippets/UserPostAnalysis.rst +++ b/doc/fr/snippets/UserPostAnalysis.rst @@ -4,8 +4,10 @@ UserPostAnalysis *Chaîne de caractères multi-lignes*. La variable permet de traiter des paramètres ou des résultats après le déroulement de l'algorithme - d'assimilation de données ou d'optimisation. Sa valeur est définie comme un - fichier script ou une chaîne de caractères, permettant de produire - directement du code de post-processing dans un cas ADAO. Des exemples - courants (squelettes ou "templates") sont fournis pour aider l'utilisateur ou - pour faciliter l'élaboration d'un cas. + d'assimilation de données ou d'optimisation. Sa valeur est définie soit par + un nom de patron prédéfini, soit par nom de un fichier script, soit par une + chaîne de caractères, permettant de produire directement du code de + post-processing dans un cas ADAO. Des exemples courants (squelettes ou + "templates") sont fournis pour aider l'utilisateur ou pour faciliter + l'élaboration d'un cas. Remarque importante : ce traitement n'est exécuté que + lorsque le cas est exécuté en TUI ou exporté en YACS. diff --git a/doc/fr/tui.rst b/doc/fr/tui.rst index 6676374..c3df5b8 100644 --- a/doc/fr/tui.rst +++ b/doc/fr/tui.rst @@ -38,7 +38,9 @@ cas de calcul TUI, on recommande de bien s'appuyer sur l'ensemble de la documentation du module ADAO, et de se reporter si nécessaire à l'interface graphique (GUI), pour disposer de l'ensemble des éléments permettant de renseigner correctement les commandes. Les notions générales et termes utilisés -ici sont définis dans :ref:`section_theory`. +ici sont définis dans :ref:`section_theory`. Comme dans l'interface graphique, +on note que la démarche en TUI est destinée à créer et gérer un unique cas de +calcul. .. _subsection_tui_creating: @@ -539,7 +541,9 @@ Paramétrer le calcul, les sorties, etc. l'exécution. .. index:: single: Observer +.. index:: single: Observer Template .. index:: single: setObserver +.. index:: single: setObserver Template **setObserver** (*Variable, Template, String, Script, Info*) Cette commande permet de définir un *observer* sur une variable courante ou @@ -555,19 +559,22 @@ Paramétrer le calcul, les sorties, etc. "*Info*" contient une chaîne de caractère d'information ou une chaine vide. .. index:: single: UserPostAnalysis +.. index:: single: UserPostAnalysis Template .. index:: single: setUserPostAnalysis .. index:: single: setUserPostAnalysis Template **setUserPostAnalysis** (*Template, String, Script*) Cette commande permet de définir le traitement des paramètres ou des résultats après le déroulement de l'algorithme de calcul. Sa valeur est - définie comme nom de patron prédéfini, un fichier script ou une chaîne de - caractères. Cela permet de produire directement du code de post-processing - dans un cas ADAO. On peut d'utiliser les patrons disponibles par l'argument - "*Template*" (qui peut valoir "*AnalysisPrinter*", "*AnalysisSaver*" et - "*AnalysisPrinterAndSaver*"). Dans le cas d'une définition par "*Script*", - le fichier indiqué doit contenir uniquement les commandes que l'on aurait - pu mettre à la suite de l'exécution du calcul. + définie soit par un nom de patron prédéfini, soit par un nom de fichier + script, soit par une chaîne de caractères. Cela permet de produire + directement du code de post-processing dans un cas ADAO. On peut d'utiliser + les patrons disponibles par l'argument "*Template*" (qui peut valoir + "*AnalysisPrinter*", "*AnalysisSaver*" et "*AnalysisPrinterAndSaver*"). + Dans le cas d'une définition par "*Script*", le fichier indiqué doit + contenir uniquement les commandes que l'on aurait pu mettre à la suite de + l'exécution du calcul. Remarque importante : ce traitement n'est exécuté + que lorsque le cas est exécuté en TUI ou exporté en YACS. Effectuer le calcul +++++++++++++++++++ diff --git a/src/daComposant/daCore/Aidsm.py b/src/daComposant/daCore/Aidsm.py index 679587e..f8b0b99 100644 --- a/src/daComposant/daCore/Aidsm.py +++ b/src/daComposant/daCore/Aidsm.py @@ -28,6 +28,7 @@ __all__ = ["Aidsm"] import os import sys +import inspect # from daCore.BasicObjects import State, Covariance, FullOperator, Operator from daCore.BasicObjects import AlgorithmAndParameters, DataObserver @@ -42,7 +43,8 @@ import logging class Aidsm(object): """ ADAO Internal Data Structure Model """ def __init__(self, name = "", addViewers=None): - self.__name = str(name) + self.__name = str(name) + self.__objname = None self.__directory = None self.__case = CaseLogger(self.__name, "case", addViewers) # @@ -759,6 +761,9 @@ class Aidsm(object): if FileName is not None: self.dump( FileName, "TUI") self.__adaoObject["AlgorithmParameters"].executePythonScheme( self.__adaoObject ) + if "UserPostAnalysis" in self.__adaoObject and len(self.__adaoObject["UserPostAnalysis"])>0: + __Upa = eval("\n".join([str(val).replace("ADD.","self.") for val in self.__adaoObject["UserPostAnalysis"]])) + exec(__Upa, {}, {'self':self}) return 0 def __executeYACSScheme(self, FileName=None): @@ -781,7 +786,7 @@ class Aidsm(object): from numpy import array, matrix for __command in __commands: if (__command.find("set")>-1 and __command.find("set_")<0) or 'UserPostAnalysis' in __command: - exec("self."+__command) + exec("self."+__command, {}, locals()) else: self.__PostAnalysis.append(__command) return self @@ -812,6 +817,20 @@ class Aidsm(object): __fullpath = __filename return __fullpath + def __retrieve_objname(self): + "Ne pas utiliser dans le __init__, la variable appelante n'existe pas encore" + __names = [] + for level in reversed(inspect.stack()): + __names += [name for name, value in level.frame.f_locals.items() if value is self] + __names += [name for name, value in globals().items() if value is self] + __names.remove('self') # Devrait toujours être trouvé, donc pas d'erreur + if len(__names) > 0: + logging.debug("Cet objet est appelé par au moins une variable :",__names) + self.__objname = __names[0] + else: + self.__objname = "ADD" + return self.__objname + def __dir__(self): "Clarifie la visibilité des méthodes" return ['set', 'get', 'execute', 'dump', 'load', '__doc__', '__init__', '__module__'] diff --git a/src/daComposant/daCore/Templates.py b/src/daComposant/daCore/Templates.py index 7f9e9f5..e06d714 100644 --- a/src/daComposant/daCore/Templates.py +++ b/src/daComposant/daCore/Templates.py @@ -230,21 +230,21 @@ UserPostAnalysisTemplates = TemplateStorage() UserPostAnalysisTemplates.store( name = "AnalysisPrinter", - content = """import numpy\nxa=numpy.ravel(ADD.get('Analysis')[-1])\nprint('Analysis:',xa)""", + content = """print('# Post-analysis')\nimport numpy\nxa=numpy.ravel(ADD.get('Analysis')[-1])\nprint('Analysis',xa)""", fr_FR = "Imprime sur la sortie standard la valeur optimale", en_EN = "Print on standard output the optimal value", order = "next", ) UserPostAnalysisTemplates.store( name = "AnalysisSaver", - content = """import numpy\nxa=numpy.ravel(ADD.get('Analysis')[-1])\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", + content = """print('# Post-analysis')\nimport numpy\nxa=numpy.ravel(ADD.get('Analysis')[-1])\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", fr_FR = "Enregistre la valeur optimale dans un fichier du répertoire '/tmp' nommé 'analysis.txt'", en_EN = "Save the optimal value in a file of the '/tmp' directory named 'analysis.txt'", order = "next", ) UserPostAnalysisTemplates.store( name = "AnalysisPrinterAndSaver", - content = """import numpy\nxa=numpy.ravel(ADD.get('Analysis')[-1])\nprint 'Analysis:',xa\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", + content = """print('# Post-analysis')\nimport numpy\nxa=numpy.ravel(ADD.get('Analysis')[-1])\nprint 'Analysis',xa\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", fr_FR = "Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur optimale", en_EN = "Print on standard output and, in the same time save in a file of the '/tmp' directory, the optimal value", order = "next", -- 2.39.2