1 #@ MODIF post_dyna_alea_ops Macro DATE 25/04/2008 AUTEUR ZENTNER I.ZENTNER
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2006 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
24 from types import ListType, TupleType
25 from math import pi,sqrt,log,exp
27 EnumTypes = (ListType, TupleType)
30 def post_dyna_alea_ops(self,INTE_SPEC, FRAGILITE,TITRE,INFO,**args):
33 from Utilitai.Utmess import UTMESS
34 from Utilitai.t_fonction import t_fonction
35 from Utilitai.Table import Table
37 commande='POST_DYNA_ALEA'
40 # La macro compte pour 1 dans la numerotation des commandes
43 # Le concept sortant (de type table_sdaster ou dérivé) est tab
44 self.DeclareOut('tabout', self.sd)
46 # On importe les definitions des commandes a utiliser dans la macro
47 # Le nom de la variable doit etre obligatoirement le nom de la commande
48 CREA_TABLE = self.get_cmd('CREA_TABLE')
49 CALC_TABLE = self.get_cmd('CALC_TABLE')
50 IMPR_TABLE = self.get_cmd('IMPR_TABLE')
51 RECU_FONCTION = self.get_cmd('RECU_FONCTION')
52 IMPR_FONCTION = self.get_cmd('IMPR_FONCTION')
53 DEFI_LIST_REEL = self.get_cmd('DEFI_LIST_REEL')
54 DEFI_FONCTION = self.get_cmd('DEFI_FONCTION')
55 CALC_FONCTION = self.get_cmd('CALC_FONCTION')
58 # ------------------------------------------------------------------
59 #---------algorithme d'optimisation pour le maximum de vraisemblance
62 assert am >0.000, 'optimize.py: am negatif'
64 assert am >0.000, 'optimize.py: beta negatif'
66 for k in range(Nbval):
68 xi=float(liste_def[k])
71 f0=pfa**xi*(1.-pfa)**(1-xi)
79 for k in range(Nbval):
80 ai=liste_indic[list_rand[k]]
81 xi=float(liste_def[list_rand[k]])
84 f0=pfa**xi*(1.-pfa)**(1-xi)
88 # ------------------------------------------------------------------
90 # ------------------------------------------------------------------
92 from Utilitai.optimize import fmin
93 from Utilitai.stats import normcdf
95 if FRAGILITE['LIST_PARA'] != None :
96 liste_a = FRAGILITE['LIST_PARA'].VALE.get()
97 elif FRAGILITE['VALE'] != None :
98 liste_a =FRAGILITE['VALE']
103 tab2 = FRAGILITE['TABL_RESU'].EXTR_TABLE()
104 dicta = tab2.values()
106 if dicta.has_key('DEFA') :
107 liste_def = dicta['DEFA']
109 UTMESS('F','TABLE0_1',valk=('DEFA'))
110 if dicta.has_key('PARA_NOCI') :
111 liste_indic = dicta['PARA_NOCI']
113 UTMESS('F','TABLE0_1',valk=('PARA_NOCI'))
115 Nbval=len(liste_indic)
117 test1 = Numeric.equal(None,liste_indic)
118 test2 = Numeric.equal(None,liste_def)
119 if test1 >=1 or test2 >=1:
120 UTMESS('F','TABLE0_15')
122 # estimation paramètres
123 x0 = [FRAGILITE['AM_INI'],FRAGILITE['BETA_INI']]
124 xopt = fmin(vrais,x0)
126 texte='PARAMETRES Am, beta ESTIMES : '+str(xopt)+'\n'
127 aster.affiche('MESSAGE',texte) #print 'parametres Am, beta estimes: ', xopt
130 vec_a=Numeric.array(liste_a)
131 vecval=(Numeric.log(vec_a/xopt[0]))/xopt[1]
133 lpfa.append(normcdf(vecval[m]))
139 mcfact.append(_F(PARA= 'TITRE' , LISTE_K= TITRE ))
141 mcfact.append(_F(PARA= 'AM' ,LISTE_R=xopt[0] ))
142 mcfact.append(_F(PARA= 'BETA' ,LISTE_R=xopt[1] ))
143 mcfact.append(_F(PARA= 'PARA_NOCI' ,LISTE_R =liste_a ))
144 mcfact.append(_F(PARA= 'PFA' ,LISTE_R = lpfa ))
146 #print 'fractiles a calculer par bootstrap : ', FRAGILITE['FRACTILE']
149 # si calcul de fractiles (intervalles de confiance) par bootstrap
151 if FRAGILITE['FRACTILE']!= None :
153 texte='FRACTILES A CALCULER PAR BOOTSTRAP '+ str(FRAGILITE['FRACTILE']) +'\n'
154 aster.affiche('MESSAGE',texte)
155 if FRAGILITE['NB_TIRAGE']!= None :
156 Nboot = FRAGILITE['NB_TIRAGE']
158 UTMESS('F','PROBA0_11') #assert Nboot <= Nbval , 'ERREUR: nombre de tirages demandes trop grand'
163 lfract =FRAGILITE['FRACTILE']
168 for kb in range(Nboot) : #in range(Nbval)
173 for kb2 in range(Nbval) :
174 list_rand.append(random.randint(0,Nbval-1))
176 xopt = fmin(boot_vrais,x0)
178 texte1='BOOTSTRAP TIRAGE '+ str(kb+1)
179 texte2=' PARAMETRES Am, beta ESTIMES : '+str(xopt)+'\n'
180 aster.affiche('MESSAGE',texte1) #print 'bootstrap tirage', kb+1, ', - parametres Am, beta estimes: ', xopt
181 aster.affiche('MESSAGE',texte2)
182 vecval=(Numeric.log(vec_a/xopt[0]))/xopt[1]
184 lpfa.append(normcdf(vecval[m]))
186 __ABS[kb]=DEFI_LIST_REEL( VALE = liste_a );
187 __ORDO[kb]=DEFI_LIST_REEL( VALE = lpfa );
189 __F1[kb]=DEFI_FONCTION( NOM_PARA='PGAZ',
191 VALE_PARA = __ABS[kb],
192 VALE_FONC = __ORDO[kb],);
193 list_fonc.append(__F1[kb],)
196 #__FRACTILE = [None]*len(lfract)
197 liste = [None]*len(lfract)
198 for kb in range(len(lfract)):
199 __FRACTILE=CALC_FONCTION(FRACTILE=_F(FONCTION=(list_fonc),
200 FRACT=lfract[kb]), );
201 liste[kb]= __FRACTILE.Ordo()
202 mcfact.append(_F(PARA= str(lfract[kb]) ,LISTE_R =liste[kb] ))
206 tabout = CREA_TABLE(LISTE=mcfact,TITRE = 'POST_DYNA_ALEA concept : '+self.sd.nom)
208 # ------------------------------------------------------------------
211 # ------------------------------------------------------------------
213 # ------------------------------------------------------------------
214 if INTE_SPEC !=None :
216 TOUT_ORDRE = args['TOUT_ORDRE']
217 NUME_VITE_FLUI=args['NUME_VITE_FLUI']
219 NUME_ORDRE_I=args['NUME_ORDRE_I']
220 NOEUD_I=args['NOEUD_I']
221 OPTION=args['OPTION']
223 MOMENT=args['MOMENT']
225 intespec=INTE_SPEC.EXTR_TABLE()
227 NUME_VITE_FLUI_present = 'NUME_VITE_FLUI' in intespec.para
228 NUME_ORDRE_I_present = 'NUME_ORDRE_I' in intespec.para
229 NOEUD_I_present = 'NOEUD_I' in intespec.para
232 tabres = Table(titr='POST_DYNA_ALEA concept : %s' % self.sd.nom)
234 # ------------------------------------------------------------------
235 # Liste des moments spectraux
236 # repérer le type de l'interspectre et son nom
237 # 1- concept interspectre
238 # 2- table de table d interspectre
240 if NUME_VITE_FLUI_present :
241 if TOUT_ORDRE != None :
242 jvite = list(Set(intespec.NUME_VITE_FLUI.not_none_values()))
245 jvite=[NUME_VITE_FLUI,]
249 # ------------------------------------------------------------------
250 # Repérer les couples d'indices selectionnés
251 # vérification de l'égalité du nombre d indices en i et j
253 if NUME_ORDRE_I!=None :
255 l_ind_j=args['NUME_ORDRE_J']
256 if type(l_ind_i) not in EnumTypes : l_ind_i=[l_ind_i]
257 if type(l_ind_j) not in EnumTypes : l_ind_j=[l_ind_j]
258 if len(l_ind_i)!=len(l_ind_j) :
259 UTMESS('F','PROBA0_8')
260 # paramètres fixes de la table
261 tabres.add_para(['NUME_ORDRE_I','NUME_ORDRE_J'], 'I')
264 l_ind_j=args['NOEUD_J']
265 l_cmp_i=args['NOM_CMP_I']
266 l_cmp_j=args['NOM_CMP_J']
267 if type(l_cmp_i) not in EnumTypes : l_cmp_i=[l_cmp_i]
268 if type(l_cmp_j) not in EnumTypes : l_cmp_j=[l_cmp_j]
269 if type(l_ind_i) not in EnumTypes : l_ind_i=[l_ind_i]
270 if type(l_ind_j) not in EnumTypes : l_ind_j=[l_ind_j]
271 if len(l_ind_i)!=len(l_ind_j) :
272 UTMESS('F','PROBA0_8')
273 if len(l_cmp_i)!=len(l_cmp_j) :
274 UTMESS('F','PROBA0_9')
275 if len(l_ind_i)!=len(l_cmp_i) :
276 UTMESS('F','PROBA0_10')
277 # paramètres fixes de la table
278 tabres.add_para(['NOEUD_I','NOEUD_J','NOM_CMP_I','NOM_CMP_J'], 'K8')
280 # ------------------------------------------------------------------
281 # Cas de tous les indices centraux
284 if NUME_VITE_FLUI_present :
285 intespec = intespec.NUME_VITE_FLUI == jvite[0]
287 if NUME_ORDRE_I_present :
288 imode = list(Set(intespec.NUME_ORDRE_I.not_none_values()))
291 # paramètres fixes de la table
292 tabres.add_para(['NUME_ORDRE_I','NUME_ORDRE_J'], 'I')
294 l_ind_i = intespec.NOEUD_I.values()
295 l_ind_j = intespec.NOEUD_J.values()
296 if len(l_ind_i) != len(l_ind_j) :
297 UTMESS('F','PROBA0_8')
298 l_cmp_i = intespec.NOM_CMP_I.values()
299 l_cmp_j = intespec.NOM_CMP_J.values()
300 if (len(l_ind_i) != len(l_cmp_i) or len(l_ind_j) != len(l_cmp_j)) :
301 UTMESS('F','PROBA0_10')
302 l_l=zip(zip(l_ind_i,l_cmp_i),zip(l_ind_j,l_cmp_j))
309 l_ind_i.append(ai[0])
310 l_ind_j.append(aj[0])
311 l_cmp_i.append(ai[1])
312 l_cmp_j.append(aj[1])
313 # paramètres fixes de la table
314 tabres.add_para(['NOEUD_I','NOEUD_J','NOM_CMP_I','NOM_CMP_J'], 'K8')
317 tabres.add_para('NUME_VITE_FLUI', 'I')
320 # ------------------------------------------------------------------
321 # Liste des moments spectraux
323 l_moments=[0,1,2,3,4]
325 l_moments.extend(list(MOMENT))
326 l_moments=list(Set(l_moments))
328 # ------------------------------------------------------------------
329 # Boucle sur les fonctions
332 l_ind=zip(l_ind_i,l_ind_j, l_cmp_i,l_cmp_j)
334 l_ind=zip(l_ind_i, l_ind_j )
337 # pour la présentation de la table finale, on stocke le nbre de paramètres "initiaux"
338 nbpara0 = len(tabres.para)
342 texte='POUR LA MATRICE INTERSPECTRALE '+INTE_SPEC.nom+'\n'
343 aster.affiche('MESSAGE',texte)
348 dlign['NUME_VITE_FLUI'] = vite
349 mcfact.append(_F(NOM_PARA='NUME_VITE_FLUI',VALE_I=vite))
351 i_foncstat = ind[0] == ind[1] and ind[2] == ind[3]
352 dlign['NOEUD_I'], dlign['NOEUD_J'], dlign['NOM_CMP_I'], dlign['NOM_CMP_J'] = \
353 ind[0], ind[1], ind[2], ind[3]
354 mcfact.append(_F(NOM_PARA='NOEUD_I',VALE_K=ind[0]))
355 mcfact.append(_F(NOM_PARA='NOEUD_J',VALE_K=ind[1]))
356 mcfact.append(_F(NOM_PARA='NOM_CMP_I',VALE_K=ind[2]))
357 mcfact.append(_F(NOM_PARA='NOM_CMP_J',VALE_K=ind[3]))
359 aster.affiche('MESSAGE','INDICES :'+ind[0]+' - '+ind[1])
360 aster.affiche('MESSAGE','INDICES :'+ind[2]+' - '+ind[3]+'\n')
362 i_foncstat = ind[0] == ind[1]
363 dlign['NUME_ORDRE_I'], dlign['NUME_ORDRE_J'] = ind[0], ind[1]
364 mcfact.append(_F(NOM_PARA='NUME_ORDRE_I',VALE_I=ind[0]))
365 mcfact.append(_F(NOM_PARA='NUME_ORDRE_J',VALE_I=ind[1]))
367 aster.affiche('MESSAGE','INDICES :'+str(ind[0])+' - '\
370 __fon1=RECU_FONCTION(TABLE = INTE_SPEC,
371 NOM_PARA_TABL= 'FONCTION_C',
374 val = __fon1.Valeurs()
375 fvalx= Numeric.array(val[0])
376 fvaly= Numeric.array(val[1])
379 # -- moments spectraux
382 for i_mom in l_moments :
383 trapz = Numeric.zeros(len(fvaly),Numeric.Float)
385 valy = fvaly*(2*pi*fvalx)**i_mom
386 trapz[1:] = (valy[1:]+valy[:-1])/2*(fvalx[1:]-fvalx[:-1])
387 prim_y = Numeric.cumsum(trapz)
388 val_mom[i_mom] = prim_y[-1]
389 for i_mom in l_moments :
390 chmo='LAMBDA_'+str(i_mom).zfill(2)
391 dlign[chmo] = val_mom[i_mom]
393 #--- si auto-spectre:
395 # test si le spectre est bien à valeurs positives
396 if min(fvaly) < 0.0 :
397 aster.affiche('MESSAGE', str(ind)+'\n')
398 UTMESS('F','MODELISA9_95')
399 # -- fonctions statistiques
400 if NUME_VITE_FLUI or frez >= 0. :
401 # -- cas NUME_VITE_FLUI, seule la partie positive du spectre est utilisée
402 # -- Il faut donc doubler lambda pour calculer le bon écart type
403 dlign['ECART'] = sqrt(val_mom[0]*2.)
405 dlign['ECART'] = sqrt(val_mom[0])
406 if abs(val_mom[2])>=1e-20 :
407 dlign['NB_EXTREMA_P_S'] = 1./pi*sqrt(val_mom[4]/val_mom[2])
408 if abs(val_mom[0])>=1e-20 :
409 dlign['NB_PASS_ZERO_P_S'] = 1./pi*sqrt(val_mom[2]/val_mom[0])
410 dlign['FREQ_APPAR'] = 0.5*dlign['NB_PASS_ZERO_P_S']
411 if abs(val_mom[4])>=1e-20 :
412 dlign['FACT_IRRE'] = sqrt( val_mom[2]*val_mom[2]/val_mom[0]/val_mom[4])
414 # ajoute la ligne à la Table
417 #--- construction de la table produite
420 ord_para = tabres.para[nbpara0:]
422 ord_para = tabres.para[:nbpara0] + ord_para
423 dprod = tabres[ord_para].dict_CREA_TABLE()
425 tabout = CREA_TABLE(**dprod)