Salome HOME
*** empty log message ***
[tools/eficas.git] / generator / OpenturnsXML.py
1 #@ AJOUT OpenturnsSolver Macro
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE
4
5 """
6 Ce module contient le generateur XML pour Openturns
7 """
8 import sys
9 print sys.path
10 import openturns
11
12 # Dictionnaires de conversion des valeurs lues dans EFICAS
13 # en valeurs reconnues par Open TURNS
14 # Les clefs 'None' sont les valeurs par defaut
15
16 VariableTypeByName = {
17   "in"  : openturns.WrapperDataVariableType.IN,
18   "out" : openturns.WrapperDataVariableType.OUT,
19   None  :  openturns.WrapperDataVariableType.IN,
20   }
21
22 FileTypeByName = {
23   "in"  : openturns.WrapperDataFileType.IN,
24   "out" : openturns.WrapperDataFileType.OUT,
25   None  : openturns.WrapperDataFileType.IN,
26   }
27
28 SymbolProvidedByName = {
29   "no"  : openturns.WrapperSymbolProvided.NO,
30   "yes" : openturns.WrapperSymbolProvided.YES,
31   None  : openturns.WrapperSymbolProvided.NO,
32   }
33
34 WrapperStateByName = {
35   "shared"   : openturns.WrapperState.SHARED,
36   "specific" : openturns.WrapperState.SPECIFIC,
37   None       : openturns.WrapperState.SPECIFIC,
38   }
39
40 WrapperModeByName = {
41   "static-link"  : openturns.WrapperMode.STATICLINK,
42   "dynamic-link" : openturns.WrapperMode.DYNAMICLINK,
43   "fork"         : openturns.WrapperMode.FORK,
44   None           : openturns.WrapperMode.FORK,
45   }
46
47 WrapperDataTransferByName = {
48   "files"     : openturns.WrapperDataTransfer.FILES,
49   "pipe"      : openturns.WrapperDataTransfer.PIPE,
50   "arguments" : openturns.WrapperDataTransfer.ARGUMENTS,
51   "socket"    : openturns.WrapperDataTransfer.SOCKET,
52   "corba"     : openturns.WrapperDataTransfer.CORBA,
53   None        : openturns.WrapperDataTransfer.FILES,
54   }
55
56 #==========================
57 # La classe de creation XML 
58 #==========================
59
60 class XMLGenerateur :
61
62   '''
63   Generation du fichier XML
64   '''
65   def __init__ (self, appli, DictMCVal, DictVariables ) :
66     self.DictMCVal = DictMCVal
67     self.DictVariables = DictVariables
68     self.appli = appli
69
70   def CreeXML (self) :
71     '''
72     Pilotage general de la creation du fichier XML
73     '''
74     data = openturns.WrapperData()
75     data.setLibraryPath( self.GetMCVal('WrapperPath','') )
76     data.setVariableList( self.VariableList() )
77     data.setFunctionDescription( self.FunctionDefinition() )
78     data.setGradientDescription( self.GradientDefinition() )
79     data.setHessianDescription(  self.HessianDefinition()  )
80     data.setFileList( self.FileList() )
81     data.setParameters( self.Parameters() )
82     data.setFrameworkData( self.FrameworkData() )
83     
84     wrapper=openturns.WrapperFile()
85     wrapper.setWrapperData( data )
86     
87     return wrapper
88
89
90   class __variable_ordering:
91     def __init__ (self, dictVar) :
92       self.dictVar = dictVar
93       
94     def __call__(self, a, b):
95       return self.dictVar[a]['numOrdre'] - self.dictVar[b]['numOrdre']
96   
97   def VariableList (self) :
98     '''
99     Ecrit la liste des variables
100     '''
101     varList = openturns.WrapperDataVariableList()
102     for var in sorted( self.DictVariables.keys(), self.__variable_ordering( self.DictVariables ) ) :
103       varList.add( self.Variable( var, self.DictVariables[var] ) )
104     return varList
105
106   def Variable (self, var, dictVar) :
107     '''
108     Ecrit le parametrage d une variable
109     '''
110     variable = openturns.WrapperDataVariable()
111     variable.id_ = var
112     if dictVar[ 'Type' ] in VariableTypeByName.keys() :
113       variable.type_ = VariableTypeByName[ dictVar[ 'Type' ] ]
114     if dictVar.has_key('Comment')   : variable.comment_ = dictVar[ 'Comment' ]
115     if dictVar.has_key('Unit')      : variable.unit_    = dictVar[ 'Unit'    ]
116     if dictVar.has_key('Regexp')    : variable.regexp_  = dictVar[ 'Regexp'  ]
117     if dictVar.has_key('Format')    : variable.format_  = dictVar[ 'Format'  ]
118     return variable
119
120   def FunctionDefinition (self) :
121     '''
122     Ecrit la description de la Fonction
123     '''
124     func = openturns.WrapperFunctionDescription()
125     func.name_ = self.GetMCVal( 'FunctionName', '' )
126     if (len(func.name_) != 0) : func.provided_ = SymbolProvidedByName[ 'yes' ]
127     return func
128   
129   def GradientDefinition (self) :
130     '''
131     Ecrit la description du Gradient
132     '''
133     grad = openturns.WrapperFunctionDescription()
134     grad.name_ = self.GetMCVal( 'GradientName', '' )
135     if (len(grad.name_) != 0) : grad.provided_ = SymbolProvidedByName[ 'yes' ]
136     return grad
137   
138   def HessianDefinition (self) :
139     '''
140     Ecrit la description de la Hessienne
141     '''
142     hess = openturns.WrapperFunctionDescription()
143     hess.name_ = self.GetMCVal( 'HessianName', '' )
144     if (len(hess.name_) != 0) : hess.provided_ = SymbolProvidedByName[ 'yes' ]
145     return hess
146   
147
148
149   def FileList (self) :
150     '''
151     Ecrit la liste des fichiers
152     '''
153     fileList = openturns.WrapperDataFileList()
154     for dictFile in self.GetMCVal('Files', []) :
155       fileList.add( self.File( dictFile ) )
156     return fileList
157
158   def File (self, dictFile ) :
159     '''
160     Ecrit le parametrage d un fichier
161     '''
162     fich = openturns.WrapperDataFile()
163     fich.id_ = dictFile[ 'Id' ]
164     if dictFile[ 'Type' ] in FileTypeByName.keys() :
165       fich.type_ = FileTypeByName[ dictFile[ 'Type' ] ]
166     if dictFile.has_key('Name')   : fich.name_  = dictFile[ 'Name' ]
167     if dictFile.has_key('Path')   : fich.path_  = dictFile[ 'Path' ]
168     if dictFile.has_key('Subst')  :
169       import string
170       fich.subst_ = string.join( dictFile[ 'Subst' ], ',' )
171     return fich
172
173   def Parameters (self) :
174     '''
175     Ecrit les parametres de couplage au code externe
176     '''
177     parameters = openturns.WrapperParameter()
178     parameters.mode_  = WrapperModeByName[ self.GetMCVal('WrapCouplingMode') ]
179     parameters.state_ = WrapperStateByName[ self.GetMCVal('State') ]
180     parameters.in_    = WrapperDataTransferByName[ self.GetMCVal('InDataTransfer') ]
181     parameters.out_   = WrapperDataTransferByName[ self.GetMCVal('OutDataTransfer') ]
182     return parameters
183   
184   def FrameworkData (self) :
185     '''
186     Ecrit les donnees liees a l utilisation d un framework englobant
187     '''
188     framework = openturns.WrapperFrameworkData()
189     #framework.studycase_ = "12:23:34"
190     framework.componentname_ = self.GetMCVal('SolverComponentName')
191     return framework
192
193
194   # ---------------------------------------------------------------------------------
195
196
197   def GetTag (self, tag) :
198     '''
199     Recupere la chaine associee au tag dans la table dictTagsXML.
200     Leve une exception si le tag n est pas trouve
201     '''
202     if ( dictTagsXML.has_key(tag) ) :
203       return dictTagsXML[tag]
204     else :
205       raise KeyError, "Tag '%s' is undefined. This is an internal bug. Report bug to developers" % tag 
206     pass
207   
208   def GetMCVal (self, MC, default = None, mandatory = False) :
209     '''
210     Recupere la chaine associee au MC dans la table DictMCVal.
211     Leve une exception si le MC n est pas trouve et mandatory vaut True
212     '''
213     if ( self.DictMCVal.has_key(MC) and self.DictMCVal[MC] != None ) :
214       return self.DictMCVal[MC]
215     else :
216       if ( mandatory ) :
217         raise KeyError, "Keyword '%s' is mandatory" % MC
218       else :
219         return default
220     pass