]> SALOME platform Git repositories - modules/adao.git/blob - bin/AdaoCatalogGenerator.py
Salome HOME
Updating copyright date information and version
[modules/adao.git] / bin / AdaoCatalogGenerator.py
1 #-*-coding:iso-8859-1-*-
2 #
3 # Copyright (C) 2008-2015 EDF R&D
4 #
5 # This file is part of SALOME ADAO module
6 #
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.
11 #
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.
16 #
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
20 #
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
22
23 import logging
24 import traceback
25 import sys
26 import string
27 import StringIO
28
29 import module_version
30
31 logging.basicConfig(level=logging.WARNING)
32
33 #----------- Templates Part ---------------#
34 begin_catalog_file = """# -*- coding: utf-8 -*-
35
36 # --------------------------------------------------------
37 # generated by AdaoCatalogGenerator at ${date}
38 # --------------------------------------------------------
39
40 import Accas
41 from Accas import *
42
43 JdC = JDC_CATA (code = '%s',
44                 execmodul = None,
45                 regles = ( AU_MOINS_UN ('ASSIMILATION_STUDY','CHECKING_STUDY'), AU_PLUS_UN ('ASSIMILATION_STUDY','CHECKING_STUDY')),
46                )
47 VERSION_CATALOGUE='%s'
48 """%(module_version.name,module_version.version)
49
50 data_method = """
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', ) ",
54
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"),
56                                                      ),
57                                          STRING_DATA = BLOC ( condition = " FROM in ( 'String', ) ",
58
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"),
60                                                      ),
61                                          SCRIPTWITHFUNCTIONS_DATA = BLOC ( condition = " FROM in ( 'ScriptWithFunctions', ) ",
62
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"),
64                                                      ),
65                                          SCRIPTWITHONEFUNCTION_DATA = BLOC ( condition = " FROM in ( 'ScriptWithOneFunction', ) ",
66
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"),
71                                                      ),
72                                          SCRIPTWITHSWITCH_DATA = BLOC ( condition = " FROM in ( 'ScriptWithSwitch', ) ",
73
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"),
75                                                      ),
76                                          FUNCTIONDICT_DATA = BLOC ( condition = " FROM in ( 'FunctionDict', ) ",
77
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"),
79                                                      ),
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" ),
84                                              ),
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)" ),
87                                              ),
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)" ),
90                                              ),
91                                          ),
92                                     )
93 """
94
95 init_method = """
96 def F_InitChoice() : return  ("Background",
97                               "BackgroundError",
98                               "Observation",
99                               "ObservationError",
100                               "ObservationOperator",
101                               "EvolutionModel",
102                               "EvolutionError",
103                               "AlgorithmParameters",
104                               "UserPostAnalysis",
105                              )
106
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))),
110                                 )
111 """
112
113 assim_data_method = """
114 def F_${assim_name}(statut) : return FACT(statut=statut,
115 ${storage}
116                                           INPUT_TYPE = SIMP(statut="o", typ = "TXM", into=(${choices}), defaut=${default_choice}),
117 ${decl_choices}
118                                                 )
119 """
120
121 assim_data_choice = """
122                                                  ${choice_name} = BLOC ( condition = " INPUT_TYPE in ( '${choice_name}', ) ",
123                                                  data = F_${choice_name}("o"),
124                                                  ),
125 """
126
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")
135                                                ),
136                                                UserFile = BLOC (condition = " NodeType == 'Script' ",
137                                                    Value = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()))
138                                                ),
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]" ),
143                                                    ),
144                                                    ValueSeriePrinter = BLOC (condition = " Template == 'ValueSeriePrinter' ",
145                                                        ValueTemplate = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "print info,var[:]" ),
146                                                    ),
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)" ),
149                                                    ),
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)" ),
152                                                    ),
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)" ),
155                                                    ),
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)" ),
158                                                    ),
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' ) )" ),
161                                                    ),
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' ) )" ),
164                                                    ),
165                                                ),
166                                            ),
167                                        ),
168 """
169
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})),
173 ${decl_choices}
174                                      )
175 """
176
177 assim_study = """
178
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="**")
183                                       )
184
185 ASSIMILATION_STUDY = PROC(nom="ASSIMILATION_STUDY",
186                           op=None,
187                           repetable           = "n",
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")
206                          )
207
208 CHECKING_STUDY = PROC(nom="CHECKING_STUDY",
209                           op=None,
210                           repetable           = "n",
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")
223                          )
224 """
225
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)
233
234 #----------- End of Templates Part ---------------#
235
236
237
238 #----------- Begin generation script -----------#
239 print "-- Starting AdaoCalatogGenerator.py --"
240
241 try:
242   import daEficas
243   import daYacsSchemaCreator
244   import daCore.AssimilationStudy
245   import daYacsSchemaCreator.infos_daComposant as infos
246 except:
247   logging.fatal("Import of ADAO python modules failed !" +
248                 "\n add ADAO python installation directory in your PYTHONPATH")
249   traceback.print_exc()
250   sys.exit(1)
251
252 def check_args(args):
253   logging.debug("Arguments are :" + str(args))
254   if len(args) != 2:
255     logging.fatal("Bad number of arguments: you have to provide two arguments (%d given)" % (len(args)))
256     sys.exit(1)
257
258 # Parse arguments
259 from optparse import OptionParser
260 usage = "usage: %prog [options] catalog_path catalog_name"
261 version="%prog 0.1"
262 my_parser = OptionParser(usage=usage, version=version)
263 (options, args) = my_parser.parse_args()
264 check_args(args)
265
266 catalog_path =  args[0]
267 catalog_name =  args[1]
268
269 # Generates into a string
270 mem_file = StringIO.StringIO()
271
272 # Start file
273 from time import strftime
274 mem_file.write(begin_catalog_file.substitute(date=strftime("%Y-%m-%d %H:%M:%S")))
275
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
281   data_into = ""
282   data_default = ""
283   ms_default = ""
284
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 + "\", "
288
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] + "\","
293
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))
298
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
303   storage = ""
304   choices = ""
305   default_choice = ""
306   decl_choices = ""
307   decl_opts = ""
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] + "\""
316
317   mem_file.write(assim_data_method.substitute(assim_name = assim_name,
318                                               storage = storage,
319                                               choices = choices,
320                                               decl_choices = decl_choices,
321                                               default_choice=default_choice))
322
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)
326   data_name = opt_name
327   data_into = ""
328   data_default = ""
329   ms_default = ""
330
331   for choice in infos.OptDict[opt_name]:
332     data_into += "\"" + choice + "\", "
333
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] + "\","
338
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))
343
344 # Step 4: On ajoute la methode optionnelle init
345 # TODO uniformiser avec le step 3
346 mem_file.write(init_method)
347
348 # Step 5: Add observers
349 decl_choices = ""
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))
354
355 # Final step: Add algorithm and assim_study
356 algos_names = ""
357 check_names = ""
358 decl_algos  = ""
359
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 + "\", "
369   else:
370     logging.debug("This algorithm is not considered: " + algo_name)
371
372 mem_file.write(assim_study.substitute(algos_names=algos_names,
373                                       check_names=check_names,
374                                       decl_algos=decl_algos))
375 # Write file
376 final_file = open(catalog_path + "/" + catalog_name, "wr")
377 final_file.write(mem_file.getvalue())
378 mem_file.close()
379 final_file.close()
380