1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2015 EDF R&D
5 # This file is part of SALOME ADAO module
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License.
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # Lesser General Public License for more details.
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
31 logging.basicConfig(level=logging.WARNING)
33 #----------- Templates Part ---------------#
34 begin_catalog_file = """# -*- coding: utf-8 -*-
36 # --------------------------------------------------------
37 # generated by AdaoCatalogGenerator at ${date}
38 # --------------------------------------------------------
43 JdC = JDC_CATA (code = '%s',
45 regles = ( AU_MOINS_UN ('ASSIMILATION_STUDY','CHECKING_STUDY'), AU_PLUS_UN ('ASSIMILATION_STUDY','CHECKING_STUDY')),
47 VERSION_CATALOGUE='%s'
48 """%(module_version.name,module_version.version)
51 def F_${data_name}(statut) : return FACT(statut = statut,
52 FROM = SIMP(statut = "o", typ = "TXM", into=(${data_into}), defaut=${data_default}),
53 SCRIPT_DATA = BLOC ( condition = " FROM in ( 'Script', ) ",
55 SCRIPT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()), fr="En attente d'un nom de fichier script, avec ou sans le chemin complet pour le trouver, contenant si nécessaire la définition d'une variable interne de même nom que le concept parent", ang="Waiting for a script file name, with or without the full path to find it, containing if necessary the definition of an internal variable of the same name as the parent concept"),
57 STRING_DATA = BLOC ( condition = " FROM in ( 'String', ) ",
59 STRING = SIMP(statut = "o", typ = "TXM", ${ms_default} fr="En attente d'une chaine de caractères entre guillements. Pour construire un vecteur ou une matrice, ce doit être une suite de nombres, utilisant un espace ou une virgule pour séparer deux éléments et un point-virgule pour séparer deux lignes", ang="Waiting for a string in quotes. To build a vector or a matrix, it has to be a float serie, using a space or comma to separate two elements in a line, a semi-colon to separate rows"),
61 SCRIPTWITHFUNCTIONS_DATA = BLOC ( condition = " FROM in ( 'ScriptWithFunctions', ) ",
63 SCRIPTWITHFUNCTIONS_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()), fr="En attente d'un nom de fichier script, avec ou sans le chemin complet pour le trouver, contenant en variables internes trois fonctions de calcul nommées DirectOperator, TangentOperator et AdjointOperator", ang="Waiting for a script file name, with or without the full path to find it, containing as internal variables three computation functions named DirectOperator, TangentOperator and AdjointOperator"),
65 SCRIPTWITHONEFUNCTION_DATA = BLOC ( condition = " FROM in ( 'ScriptWithOneFunction', ) ",
67 SCRIPTWITHONEFUNCTION_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()), fr="En attente d'un nom de fichier script, avec ou sans le chemin complet pour le trouver, contenant en variable interne une seule fonction de calcul nommée DirectOperator", ang="Waiting for a script file name, with or without the full path to find it, containing as internal variable only one function named DirectOperator"),
68 DifferentialIncrement = SIMP(statut="o", typ = "R", val_min=0, val_max=1, defaut=0.01, fr="Incrément de la perturbation dX pour calculer la dérivée, construite en multipliant X par l'incrément en évitant les valeurs nulles", ang="Increment of dX perturbation to calculate the derivative, build multiplying X by the increment avoiding null values"),
69 CenteredFiniteDifference = SIMP(statut="o", typ = "I", into=(0, 1), defaut=0, fr="Formulation centrée (1) ou décentrée (0) pour la méthode des différences finies", ang="Centered (1) or uncentered (0) formulation for the finite differences method"),
70 EnableMultiProcessing = SIMP(statut="f", typ = "I", into=(0, 1), defaut=0, fr="EXPERIMENTAL : Calculs élémentaires effectués en séquentiel (0) ou en parallèle (1) dans la méthode des différences finies", ang="EXPERIMENTAL: Elementary calculations done sequentially (0) or in parallel (1) in the finite differences method"),
72 SCRIPTWITHSWITCH_DATA = BLOC ( condition = " FROM in ( 'ScriptWithSwitch', ) ",
74 SCRIPTWITHSWITCH_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()), fr="En attente d'un nom de fichier script, avec ou sans le chemin complet pour le trouver, contenant un switch pour les calculs direct, tangent et adjoint", ang="Waiting for a script file name, with or without the full path to find it, containing a switch for direct, tangent and adjoint computations"),
76 FUNCTIONDICT_DATA = BLOC ( condition = " FROM in ( 'FunctionDict', ) ",
78 FUNCTIONDICT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()), fr="OBSOLETE : conservé pour compatibilité avec la version 6.5, sera supprimé dans le futur", ang="OBSOLETE: keeped for compatibility with the 6.5 version, will be removed in the future"),
80 TEMPLATE_DATA = BLOC (condition = " FROM in ( 'Template', ) ",
81 Template = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "AnalysisPrinter", into=("AnalysisPrinter", "AnalysisSaver", "AnalysisPrinterAndSaver")),
82 AnalysisPrinter = BLOC (condition = " Template == 'AnalysisPrinter' ",
83 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import numpy\\nxa=numpy.ravel(ADD.get('Analysis')[-1])\\nprint 'Analysis:',xa" ),
85 AnalysisSaver = BLOC (condition = " Template == 'AnalysisSaver' ",
86 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import numpy\\nxa=numpy.ravel(ADD.get('Analysis')[-1])\\nf='/tmp/analysis.txt'\\nprint 'Analysis saved in \\"%s\\"'%f\\nnumpy.savetxt(f,xa)" ),
88 AnalysisPrinterAndSaver = BLOC (condition = " Template == 'AnalysisPrinterAndSaver' ",
89 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "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)" ),
96 def F_InitChoice() : return ("Background",
100 "ObservationOperator",
103 "AlgorithmParameters",
107 def F_Init(statut) : return FACT(statut = statut,
108 INIT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
109 TARGET_LIST = SIMP(statut = "o", typ = "TXM", min=1, max="**", into=F_InitChoice(), validators=(VerifExiste(2))),
113 assim_data_method = """
114 def F_${assim_name}(statut) : return FACT(statut=statut,
116 INPUT_TYPE = SIMP(statut="o", typ = "TXM", into=(${choices}), defaut=${default_choice}),
121 assim_data_choice = """
122 ${choice_name} = BLOC ( condition = " INPUT_TYPE in ( '${choice_name}', ) ",
123 data = F_${choice_name}("o"),
127 observers_choice = """
128 ${var_name} = BLOC (condition=" '${var_name}' in set(SELECTION) ",
129 ${var_name}_data = FACT(statut = "o",
130 Scheduler = SIMP(statut = "f", typ = "TXM"),
131 Info = SIMP(statut = "o", typ = "TXM", defaut = "${var_name}"),
132 NodeType = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "Template", into=("String", "Script", "Template")),
133 PythonScript = BLOC (condition = " NodeType == 'String' ",
134 Value = SIMP(statut = "o", typ = "TXM")
136 UserFile = BLOC (condition = " NodeType == 'Script' ",
137 Value = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()))
139 ObserverTemplate = BLOC (condition = " NodeType == 'Template' ",
140 Template = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "ValuePrinter", into=("ValuePrinter", "ValueSeriePrinter", "ValueSaver", "ValueSerieSaver", "ValuePrinterAndSaver", "ValueSeriePrinterAndSaver", "ValueGnuPlotter", "ValueSerieGnuPlotter")),
141 ValuePrinter = BLOC (condition = " Template == 'ValuePrinter' ",
142 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "print info,var[-1]" ),
144 ValueSeriePrinter = BLOC (condition = " Template == 'ValueSeriePrinter' ",
145 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "print info,var[:]" ),
147 ValueSaver = BLOC (condition = " Template == 'ValueSaver' ",
148 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import numpy,re\\nv=numpy.array((var[-1]))\\nglobal istep\\ntry:\\n istep += 1\\nexcept:\\n istep = 0\\nf='/tmp/value_%s_%05i.txt'%(info,istep)\\nf=re.sub('\\s','_',f)\\nprint 'Value saved in \\"%s\\"'%f\\nnumpy.savetxt(f,v)" ),
150 ValueSerieSaver = BLOC (condition = " Template == 'ValueSerieSaver' ",
151 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import numpy,re\\nv=numpy.array((var[:])) \\nglobal istep\\ntry:\\n istep += 1\\nexcept:\\n istep = 0\\nf='/tmp/value_%s_%05i.txt'%(info,istep)\\nf=re.sub('\\s','_',f)\\nprint 'Value saved in \\"%s\\"'%f\\nnumpy.savetxt(f,v)" ),
153 ValuePrinterAndSaver = BLOC (condition = " Template == 'ValuePrinterAndSaver' ",
154 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import numpy,re\\nv=numpy.array((var[-1]))\\nprint info,v\\nglobal istep\\ntry:\\n istep += 1\\nexcept:\\n istep = 0\\nf='/tmp/value_%s_%05i.txt'%(info,istep)\\nf=re.sub('\\s','_',f)\\nprint 'Value saved in \\"%s\\"'%f\\nnumpy.savetxt(f,v)" ),
156 ValueSeriePrinterAndSaver = BLOC (condition = " Template == 'ValueSeriePrinterAndSaver' ",
157 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import numpy,re\\nv=numpy.array((var[:])) \\nprint info,v\\nglobal istep\\ntry:\\n istep += 1\\nexcept:\\n istep = 0\\nf='/tmp/value_%s_%05i.txt'%(info,istep)\\nf=re.sub('\\s','_',f)\\nprint 'Value saved in \\"%s\\"'%f\\nnumpy.savetxt(f,v)" ),
159 ValueGnuPlotter = BLOC (condition = " Template == 'ValueGnuPlotter' ",
160 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import Gnuplot\\nglobal ifig,gp\\ntry:\\n ifig += 1\\n gp('set style data lines')\\nexcept:\\n ifig = 0\\n gp = Gnuplot.Gnuplot(persist=1)\\n gp('set style data lines')\\ngp('set title \\"%s (Figure %i)\\"'%(info,ifig))\\ngp.plot( Gnuplot.Data( var[-1], with_='lines lw 2' ) )" ),
162 ValueSerieGnuPlotter = BLOC (condition = " Template == 'ValueSerieGnuPlotter' ",
163 ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "import Gnuplot\\nglobal ifig,gp\\ntry:\\n ifig += 1\\n gp('set style data lines')\\nexcept:\\n ifig = 0\\n gp = Gnuplot.Gnuplot(persist=1)\\n gp('set style data lines')\\ngp('set title \\"%s (Figure %i)\\"'%(info,ifig))\\ngp.plot( Gnuplot.Data( var[:], with_='lines lw 2' ) )" ),
170 observers_method = """
171 def F_Observers(statut) : return FACT(statut=statut,
172 SELECTION = SIMP(statut="o", defaut=[], typ="TXM", min=0, max="**", validators=NoRepeat(), into=(${choices})),
179 def F_variables(statut) : return FACT(statut=statut,
180 regles = ( MEME_NOMBRE ('NAMES', 'SIZES')),
181 NAMES = SIMP(statut="o", typ="TXM", max="**", validators=NoRepeat()),
182 SIZES = SIMP(statut="o", typ="I", val_min=1, max="**")
185 ASSIMILATION_STUDY = PROC(nom="ASSIMILATION_STUDY",
188 Study_name = SIMP(statut="o", typ = "TXM", defaut="ADAO Calculation Case"),
189 Study_repertory = SIMP(statut="f", typ = "Repertoire", min=1, max=1),
190 Debug = SIMP(statut="f", typ = "I", into=(0, 1), defaut=0),
191 Algorithm = SIMP(statut="o", typ = "TXM", into=(${algos_names})),
192 Background = F_Background("o"),
193 BackgroundError = F_BackgroundError("o"),
194 Observation = F_Observation("o"),
195 ObservationError = F_ObservationError("o"),
196 ObservationOperator = F_ObservationOperator("o"),
197 EvolutionModel = F_EvolutionModel("f"),
198 EvolutionError = F_EvolutionError("f"),
199 ControlInput = F_ControlInput("f"),
200 AlgorithmParameters = F_AlgorithmParameters("f"),
201 UserDataInit = F_Init("f"),
202 UserPostAnalysis = F_UserPostAnalysis("o"),
203 InputVariables = F_variables("f"),
204 OutputVariables = F_variables("f"),
205 Observers = F_Observers("f")
208 CHECKING_STUDY = PROC(nom="CHECKING_STUDY",
211 Study_name = SIMP(statut="o", typ = "TXM", defaut="ADAO Checking Case"),
212 Study_repertory = SIMP(statut="f", typ = "Repertoire", min=1, max=1),
213 Debug = SIMP(statut="f", typ = "I", into=(0, 1), defaut=0),
214 Algorithm = SIMP(statut="o", typ = "TXM", into=(${check_names})),
215 CheckingPoint = F_CheckingPoint("o"),
216 BackgroundError = F_BackgroundError("f"),
217 Observation = F_Observation("f"),
218 ObservationError = F_ObservationError("f"),
219 ObservationOperator = F_ObservationOperator("o"),
220 AlgorithmParameters = F_AlgorithmParameters("f"),
221 UserDataInit = F_Init("f"),
222 Observers = F_Observers("f")
226 begin_catalog_file = string.Template(begin_catalog_file)
227 data_method = string.Template(data_method)
228 assim_data_method = string.Template(assim_data_method)
229 assim_data_choice = string.Template(assim_data_choice)
230 assim_study = string.Template(assim_study)
231 observers_method = string.Template(observers_method)
232 observers_choice = string.Template(observers_choice)
234 #----------- End of Templates Part ---------------#
238 #----------- Begin generation script -----------#
239 print "-- Starting AdaoCalatogGenerator.py --"
243 import daYacsSchemaCreator
244 import daCore.AssimilationStudy
245 import daYacsSchemaCreator.infos_daComposant as infos
247 logging.fatal("Import of ADAO python modules failed !" +
248 "\n add ADAO python installation directory in your PYTHONPATH")
249 traceback.print_exc()
252 def check_args(args):
253 logging.debug("Arguments are :" + str(args))
255 logging.fatal("Bad number of arguments: you have to provide two arguments (%d given)" % (len(args)))
259 from optparse import OptionParser
260 usage = "usage: %prog [options] catalog_path catalog_name"
262 my_parser = OptionParser(usage=usage, version=version)
263 (options, args) = my_parser.parse_args()
266 catalog_path = args[0]
267 catalog_name = args[1]
269 # Generates into a string
270 mem_file = StringIO.StringIO()
273 from time import strftime
274 mem_file.write(begin_catalog_file.substitute(date=strftime("%Y-%m-%d %H:%M:%S")))
276 # Step 1: A partir des infos, on cree les fonctions qui vont permettre
277 # d'entrer les donnees utilisateur
278 for data_input_name in infos.DataTypeDict.keys():
279 logging.debug('A data input Type is found: ' + data_input_name)
280 data_name = data_input_name
285 # On recupere les differentes facon d'entrer les donnees
286 for basic_type in infos.DataTypeDict[data_input_name]:
287 data_into += "\"" + basic_type + "\", "
289 # On choisit le default
290 data_default = "\"" + infos.DataTypeDefaultDict[data_input_name] + "\""
291 if infos.DataSValueDefaultDict.has_key(data_input_name):
292 ms_default = "defaut=\"" + infos.DataSValueDefaultDict[data_input_name] + "\","
294 mem_file.write(data_method.substitute(data_name = data_name,
295 data_into = data_into,
296 data_default = data_default,
297 ms_default = ms_default))
299 # Step 2: On cree les fonctions qui permettent de rentrer les donnees des algorithmes
300 for assim_data_input_name in infos.AssimDataDict.keys():
301 logging.debug("An assimilation algorithm data input is found: " + assim_data_input_name)
302 assim_name = assim_data_input_name
308 if infos.AssimDataDefaultDict[assim_data_input_name] in infos.StoredAssimData:
309 storage = " Stored = SIMP(statut=\"o\", typ = \"I\", into=(0, 1), defaut=0, fr=\"Choix de stockage interne ou non du concept parent\", ang=\"Choice of the storage or not of the parent concept\"),"
310 for choice in infos.AssimDataDict[assim_data_input_name]:
311 choices += "\"" + choice + "\", "
312 decl_choices += assim_data_choice.substitute(choice_name = choice)
313 if choice in infos.StoredAssimData:
314 storage = " Stored = SIMP(statut=\"o\", typ = \"I\", into=(0, 1), defaut=0, fr=\"Choix de stockage interne ou non du concept parent\", ang=\"Choice of the storage or not of the parent concept\"),"
315 default_choice = "\"" + infos.AssimDataDefaultDict[assim_data_input_name] + "\""
317 mem_file.write(assim_data_method.substitute(assim_name = assim_name,
320 decl_choices = decl_choices,
321 default_choice=default_choice))
323 # Step 3: On ajoute les fonctions representant les options possibles
324 for opt_name in infos.OptDict.keys():
325 logging.debug("An optional node is found: " + opt_name)
331 for choice in infos.OptDict[opt_name]:
332 data_into += "\"" + choice + "\", "
334 # On choisit le default
335 data_default = "\"" + infos.OptDefaultDict[opt_name] + "\""
336 if infos.DataSValueDefaultDict.has_key(opt_name):
337 ms_default = "defaut=\"" + infos.DataSValueDefaultDict[opt_name] + "\","
339 mem_file.write(data_method.substitute(data_name = data_name,
340 data_into = data_into,
341 data_default = data_default,
342 ms_default = ms_default))
344 # Step 4: On ajoute la methode optionnelle init
345 # TODO uniformiser avec le step 3
346 mem_file.write(init_method)
348 # Step 5: Add observers
350 for obs_var in infos.ObserversList:
351 decl_choices += observers_choice.substitute(var_name=obs_var)
352 mem_file.write(observers_method.substitute(choices = infos.ObserversList,
353 decl_choices = decl_choices))
355 # Final step: Add algorithm and assim_study
360 assim_study_object = daCore.AssimilationStudy.AssimilationStudy()
361 algos_list = assim_study_object.get_available_algorithms()
362 for algo_name in algos_list:
363 if algo_name in infos.AssimAlgos:
364 logging.debug("An assimilation algorithm is found: " + algo_name)
365 algos_names += "\"" + algo_name + "\", "
366 elif algo_name in infos.CheckAlgos:
367 logging.debug("A checking algorithm is found: " + algo_name)
368 check_names += "\"" + algo_name + "\", "
370 logging.debug("This algorithm is not considered: " + algo_name)
372 mem_file.write(assim_study.substitute(algos_names=algos_names,
373 check_names=check_names,
374 decl_algos=decl_algos))
376 final_file = open(catalog_path + "/" + catalog_name, "wr")
377 final_file.write(mem_file.getvalue())