1 #@ MODIF post_dyna_alea_ops Macro DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS
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 # ======================================================================
22 from types import ListType, TupleType
23 from math import pi,sqrt,log,exp
25 EnumTypes = (ListType, TupleType)
28 def post_dyna_alea_ops(self,INTE_SPEC, FRAGILITE,TITRE,INFO,**args):
32 from Utilitai.Utmess import UTMESS
33 from Cata_Utils.t_fonction import t_fonction
34 from Utilitai.Table import Table
36 commande='POST_DYNA_ALEA'
39 # La macro compte pour 1 dans la numerotation des commandes
42 # Le concept sortant (de type table_sdaster ou dérivé) est tab
43 self.DeclareOut('tabout', self.sd)
45 # On importe les definitions des commandes a utiliser dans la macro
46 # Le nom de la variable doit etre obligatoirement le nom de la commande
47 CREA_TABLE = self.get_cmd('CREA_TABLE')
48 CALC_TABLE = self.get_cmd('CALC_TABLE')
49 IMPR_TABLE = self.get_cmd('IMPR_TABLE')
50 RECU_FONCTION = self.get_cmd('RECU_FONCTION')
51 IMPR_FONCTION = self.get_cmd('IMPR_FONCTION')
52 DEFI_LIST_REEL = self.get_cmd('DEFI_LIST_REEL')
53 DEFI_FONCTION = self.get_cmd('DEFI_FONCTION')
54 CALC_FONCTION = self.get_cmd('CALC_FONCTION')
57 # ------------------------------------------------------------------
58 #---------algorithme d'optimisation pour le maximum de vraisemblance
62 # assert am >0.000, 'optimize.py: beta negatif'
63 # assert am >0.000, 'optimize.py: am negatif'
69 for k in range(Nbval):
71 xi=float(liste_def[k])
74 f0=pfa**xi*(1.-pfa)**(1-xi)
82 for k in range(Nbval):
83 ai=liste_indic[list_rand[k]]
84 xi=float(liste_def[list_rand[k]])
87 f0=pfa**xi*(1.-pfa)**(1-xi)
91 # ------------------------------------------------------------------
93 # ------------------------------------------------------------------
95 from Utilitai.optimize import fmin
96 from Utilitai.stats import normcdf
98 if FRAGILITE['LIST_PARA'] != None :
99 liste_a = FRAGILITE['LIST_PARA'].VALE.get()
100 elif FRAGILITE['VALE'] != None :
101 liste_a =FRAGILITE['VALE']
106 tab2 = FRAGILITE['TABL_RESU'].EXTR_TABLE()
107 dicta = tab2.values()
109 if dicta.has_key('DEFA') :
110 liste_def = dicta['DEFA']
112 UTMESS('F','TABLE0_1',valk=('DEFA'))
113 if dicta.has_key('PARA_NOCI') :
114 liste_indic = dicta['PARA_NOCI']
116 UTMESS('F','TABLE0_1',valk=('PARA_NOCI'))
118 Nbval=len(liste_indic)
120 test1 = NP.equal(None,liste_indic)
121 test2 = NP.equal(None,liste_def)
122 if test1.any() or test2.any():
123 UTMESS('F','TABLE0_15')
125 # estimation paramètres
126 x0 = [FRAGILITE['AM_INI'],FRAGILITE['BETA_INI']]
127 xopt = fmin(vrais,x0)
129 texte='PARAMETRES Am, beta ESTIMES : '+str(xopt)+'\n'
130 aster.affiche('MESSAGE',texte) #print 'parametres Am, beta estimes: ', xopt
133 vec_a=NP.array(liste_a)
134 vecval=(NP.log(vec_a/xopt[0]))/xopt[1]
136 lpfa.append(normcdf(vecval[m]))
142 mcfact.append(_F(PARA= 'TITRE' , LISTE_K= TITRE ))
144 mcfact.append(_F(PARA= 'AM' ,LISTE_R=xopt[0] ))
145 mcfact.append(_F(PARA= 'BETA' ,LISTE_R=xopt[1] ))
146 mcfact.append(_F(PARA= 'PARA_NOCI' ,LISTE_R =liste_a ))
147 mcfact.append(_F(PARA= 'PFA' ,LISTE_R = lpfa ))
150 # si calcul de fractiles (intervalles de confiance) par bootstrap
153 if FRAGILITE['FRACTILE']!= None :
155 texte='FRACTILES A CALCULER PAR BOOTSTRAP '+ str(FRAGILITE['FRACTILE']) +'\n'
156 aster.affiche('MESSAGE',texte)
157 if FRAGILITE['NB_TIRAGE']!= None :
158 Nboot = FRAGILITE['NB_TIRAGE']
160 UTMESS('F','PROBA0_11') #assert Nboot <= Nbval , 'ERREUR: nombre de tirages demandes trop grand'
165 lfract =FRAGILITE['FRACTILE']
170 for kb in range(Nboot) : #in range(Nbval)
175 for kb2 in range(Nbval) :
176 list_rand.append(random.randint(0,Nbval-1))
178 xopt = fmin(boot_vrais,x0)
180 texte1='BOOTSTRAP TIRAGE '+ str(kb+1)
181 texte2=' PARAMETRES Am, beta ESTIMES : '+str(xopt)+'\n'
182 aster.affiche('MESSAGE',texte1)
183 aster.affiche('MESSAGE',texte2)
184 vecval=(NP.log(vec_a/xopt[0]))/xopt[1]
186 lpfa.append(normcdf(vecval[m]))
188 __ABS[kb]=DEFI_LIST_REEL( VALE = liste_a );
189 __ORDO[kb]=DEFI_LIST_REEL( VALE = lpfa );
191 __F1[kb]=DEFI_FONCTION( NOM_PARA='PGAZ',
193 VALE_PARA = __ABS[kb],
194 VALE_FONC = __ORDO[kb],);
195 list_fonc.append(__F1[kb],)
198 #__FRACTILE = [None]*len(lfract)
199 liste = [None]*len(lfract)
200 for kb in range(len(lfract)):
201 __FRACTILE=CALC_FONCTION(FRACTILE=_F(FONCTION=(list_fonc),
202 FRACT=lfract[kb]), );
203 liste[kb]= __FRACTILE.Ordo()
204 mcfact.append(_F(PARA= str(lfract[kb]) ,LISTE_R =liste[kb] ))
208 tabout = CREA_TABLE(LISTE=mcfact,TITRE = 'POST_DYNA_ALEA concept : '+self.sd.nom)
210 # ------------------------------------------------------------------
213 # ------------------------------------------------------------------
215 # ------------------------------------------------------------------
216 if INTE_SPEC !=None :
218 TOUT_ORDRE = args['TOUT_ORDRE']
219 NUME_VITE_FLUI=args['NUME_VITE_FLUI']
221 NUME_ORDRE_I=args['NUME_ORDRE_I']
222 NOEUD_I=args['NOEUD_I']
223 OPTION=args['OPTION']
225 MOMENT=args['MOMENT']
227 intespec=INTE_SPEC.EXTR_TABLE()
229 NUME_VITE_FLUI_present = 'NUME_VITE_FLUI' in intespec.para
230 NUME_ORDRE_I_present = 'NUME_ORDRE_I' in intespec.para
231 NOEUD_I_present = 'NOEUD_I' in intespec.para
234 tabres = Table(titr='POST_DYNA_ALEA concept : %s' % self.sd.nom)
236 # ------------------------------------------------------------------
237 # Liste des moments spectraux
238 # repérer le type de l'interspectre et son nom
239 # 1- concept interspectre
240 # 2- table de table d interspectre
242 if NUME_VITE_FLUI_present :
243 if TOUT_ORDRE != None :
244 jvite = list(set(intespec.NUME_VITE_FLUI.not_none_values()))
247 jvite=[NUME_VITE_FLUI,]
251 # ------------------------------------------------------------------
252 # Repérer les couples d'indices selectionnés
253 # vérification de l'égalité du nombre d indices en i et j
255 if NUME_ORDRE_I!=None :
257 l_ind_j=args['NUME_ORDRE_J']
258 if type(l_ind_i) not in EnumTypes : l_ind_i=[l_ind_i]
259 if type(l_ind_j) not in EnumTypes : l_ind_j=[l_ind_j]
260 if len(l_ind_i)!=len(l_ind_j) :
261 UTMESS('F','PROBA0_8')
262 # paramètres fixes de la table
263 tabres.add_para(['NUME_ORDRE_I','NUME_ORDRE_J'], 'I')
266 l_ind_j=args['NOEUD_J']
267 l_cmp_i=args['NOM_CMP_I']
268 l_cmp_j=args['NOM_CMP_J']
269 if type(l_cmp_i) not in EnumTypes : l_cmp_i=[l_cmp_i]
270 if type(l_cmp_j) not in EnumTypes : l_cmp_j=[l_cmp_j]
271 if type(l_ind_i) not in EnumTypes : l_ind_i=[l_ind_i]
272 if type(l_ind_j) not in EnumTypes : l_ind_j=[l_ind_j]
273 if len(l_ind_i)!=len(l_ind_j) :
274 UTMESS('F','PROBA0_8')
275 if len(l_cmp_i)!=len(l_cmp_j) :
276 UTMESS('F','PROBA0_9')
277 if len(l_ind_i)!=len(l_cmp_i) :
278 UTMESS('F','PROBA0_10')
279 # paramètres fixes de la table
280 tabres.add_para(['NOEUD_I','NOEUD_J','NOM_CMP_I','NOM_CMP_J'], 'K8')
282 # ------------------------------------------------------------------
283 # Cas de tous les indices centraux
286 if NUME_VITE_FLUI_present :
287 intespec = intespec.NUME_VITE_FLUI == jvite[0]
289 if NUME_ORDRE_I_present :
290 imode = list(set(intespec.NUME_ORDRE_I.not_none_values()))
293 # paramètres fixes de la table
294 tabres.add_para(['NUME_ORDRE_I','NUME_ORDRE_J'], 'I')
296 l_ind_i = intespec.NOEUD_I.values()
297 l_ind_j = intespec.NOEUD_J.values()
298 if len(l_ind_i) != len(l_ind_j) :
299 UTMESS('F','PROBA0_8')
300 l_cmp_i = intespec.NOM_CMP_I.values()
301 l_cmp_j = intespec.NOM_CMP_J.values()
302 if (len(l_ind_i) != len(l_cmp_i) or len(l_ind_j) != len(l_cmp_j)) :
303 UTMESS('F','PROBA0_10')
304 l_l=zip(zip(l_ind_i,l_cmp_i),zip(l_ind_j,l_cmp_j))
311 l_ind_i.append(ai[0])
312 l_ind_j.append(aj[0])
313 l_cmp_i.append(ai[1])
314 l_cmp_j.append(aj[1])
315 # paramètres fixes de la table
316 tabres.add_para(['NOEUD_I','NOEUD_J','NOM_CMP_I','NOM_CMP_J'], 'K8')
319 tabres.add_para('NUME_VITE_FLUI', 'I')
322 # ------------------------------------------------------------------
323 # Liste des moments spectraux
325 l_moments=[0,1,2,3,4]
327 l_moments.extend(list(MOMENT))
328 l_moments=list(set(l_moments))
330 # ------------------------------------------------------------------
331 # Boucle sur les fonctions
334 l_ind=zip(l_ind_i,l_ind_j, l_cmp_i,l_cmp_j)
336 l_ind=zip(l_ind_i, l_ind_j )
339 # pour la présentation de la table finale, on stocke le nbre de paramètres "initiaux"
340 nbpara0 = len(tabres.para)
344 texte='POUR LA MATRICE INTERSPECTRALE '+INTE_SPEC.nom+'\n'
345 aster.affiche('MESSAGE',texte)
350 dlign['NUME_VITE_FLUI'] = vite
351 mcfact.append(_F(NOM_PARA='NUME_VITE_FLUI',VALE_I=vite))
353 i_foncstat = ind[0] == ind[1] and ind[2] == ind[3]
354 dlign['NOEUD_I'], dlign['NOEUD_J'], dlign['NOM_CMP_I'], dlign['NOM_CMP_J'] = \
355 ind[0], ind[1], ind[2], ind[3]
356 mcfact.append(_F(NOM_PARA='NOEUD_I',VALE_K=ind[0]))
357 mcfact.append(_F(NOM_PARA='NOEUD_J',VALE_K=ind[1]))
358 mcfact.append(_F(NOM_PARA='NOM_CMP_I',VALE_K=ind[2]))
359 mcfact.append(_F(NOM_PARA='NOM_CMP_J',VALE_K=ind[3]))
361 aster.affiche('MESSAGE','INDICES :'+ind[0]+' - '+ind[1])
362 aster.affiche('MESSAGE','INDICES :'+ind[2]+' - '+ind[3]+'\n')
364 i_foncstat = ind[0] == ind[1]
365 dlign['NUME_ORDRE_I'], dlign['NUME_ORDRE_J'] = ind[0], ind[1]
366 mcfact.append(_F(NOM_PARA='NUME_ORDRE_I',VALE_I=ind[0]))
367 mcfact.append(_F(NOM_PARA='NUME_ORDRE_J',VALE_I=ind[1]))
369 aster.affiche('MESSAGE','INDICES :'+str(ind[0])+' - '\
372 __fon1=RECU_FONCTION(TABLE = INTE_SPEC,
373 NOM_PARA_TABL= 'FONCTION_C',
376 val = __fon1.Valeurs()
377 fvalx= NP.array(val[0])
378 fvaly= NP.array(val[1])
381 # -- moments spectraux
384 for i_mom in l_moments :
388 valy = fvaly*(2*pi*fvalx)**i_mom
389 trapz[1:n] = (valy[1:n]+valy[:-1])/2*(fvalx[1:n]-fvalx[:-1])
390 prim_y = NP.cumsum(trapz)
391 val_mom[i_mom] = prim_y[-1]
392 for i_mom in l_moments :
393 chmo='LAMBDA_'+str(i_mom).zfill(2)
394 dlign[chmo] = val_mom[i_mom]
396 #--- si auto-spectre:
398 # test si le spectre est bien à valeurs positives
399 if min(fvaly) < 0.0 :
400 aster.affiche('MESSAGE', str(ind)+'\n')
401 UTMESS('F','MODELISA9_95')
402 # -- fonctions statistiques
403 if NUME_VITE_FLUI or frez >= 0. :
404 # -- cas NUME_VITE_FLUI, seule la partie positive du spectre est utilisée
405 # -- Il faut donc doubler lambda pour calculer le bon écart type
406 dlign['ECART'] = sqrt(val_mom[0]*2.)
408 dlign['ECART'] = sqrt(val_mom[0])
409 if abs(val_mom[2])>=1e-20 :
410 dlign['NB_EXTREMA_P_S'] = 1./pi*sqrt(val_mom[4]/val_mom[2])
411 if abs(val_mom[0])>=1e-20 :
412 dlign['NB_PASS_ZERO_P_S'] = 1./pi*sqrt(val_mom[2]/val_mom[0])
413 dlign['FREQ_APPAR'] = 0.5*dlign['NB_PASS_ZERO_P_S']
414 if abs(val_mom[4])>=1e-20 :
415 dlign['FACT_IRRE'] = sqrt( val_mom[2]*val_mom[2]/val_mom[0]/val_mom[4])
417 # ajoute la ligne à la Table
420 #--- construction de la table produite
423 ord_para = tabres.para[nbpara0:]
425 ord_para = tabres.para[:nbpara0] + ord_para
426 dprod = tabres[ord_para].dict_CREA_TABLE()
428 tabout = CREA_TABLE(**dprod)