Salome HOME
7ebe03a460a0a477dccc4de5713b2c8c0ae93cda
[modules/adao.git] / src / daComposant / daDiagnostics / StopReductionVariance.py
1 #-*-coding:iso-8859-1-*-
2 #
3 #  Copyright (C) 2008-2009  EDF R&D
4 #
5 #  This library is free software; you can redistribute it and/or
6 #  modify it under the terms of the GNU Lesser General Public
7 #  License as published by the Free Software Foundation; either
8 #  version 2.1 of the License.
9 #
10 #  This library is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 #  Lesser General Public License for more details.
14 #
15 #  You should have received a copy of the GNU Lesser General Public
16 #  License along with this library; if not, write to the Free Software
17 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21 __doc__ = """
22     Diagnostic sur l'arrêt (ou le ralentissement) de la réduction de la variance 
23     au fil des pas (ou itérations) de l'analyse.
24     Ce diagnostic s'applique typiquement au vecteur de différence entre la 
25     variance de OMB et la variance de OMA au fil du temps ou des itérations:
26     V[i] = vecteur des VAR(OMB)[i] - VAR(OMA)[i] au temps ou itération i.
27 """
28 __author__ = "Sophie Ricci - Septembre 2008"
29
30 import sys ; sys.path.insert(0, "../daCore")
31
32 import numpy
33 import Persistence
34 from BasicObjects import Diagnostic
35 from AssimilationStudy import AssimilationStudy
36
37 # ==============================================================================
38 class ElementaryDiagnostic(Diagnostic,Persistence.OneScalar):
39     def __init__(self, name = "", unit = "", basetype = None, parameters = {}):
40         Diagnostic.__init__(self, name, parameters)
41         Persistence.OneScalar.__init__( self, name, unit, basetype = int )
42
43     def _formula(self, V, CutOffSlope, MultiSlope0):
44         """
45         Recherche du pas de temps ou iteration pour laquelle la reduction 
46         de la variance est 
47         - inferieure a la valeur seuil CutOffSlope 
48           (si une valeure est donnee a CutOffSlope)
49         - inferieure a MultiSlope0 * la pente a la premiere iteration 
50           (si une valeure est donnee a MultiSlope0)
51         V[i] = vecteur des VAR(OMB)[i] - VAR(OMA)[i] au temps ou iteration i.
52         """
53         N = V.size
54         pente = numpy.matrix(numpy.zeros((N,))).T
55         iterstopreduction = 0.
56         for i in range (1, N) :
57             pente[i] = V[i]- V[i-1]
58             if pente[i] > 0.0  :
59                raise ValueError("The analysis is INCREASING the variance a l iteration ", i)
60             if CutOffSlope is not None:     
61                 if  numpy.abs(pente[i]) < CutOffSlope  :
62                     iterstopreduction = i
63                     break
64             if MultiSlope0 is not None:
65                 if  numpy.abs(pente[i]) < MultiSlope0 * numpy.abs(pente[1])  :
66                     iterstopreduction = i
67                     break
68         #
69         return iterstopreduction
70
71     def calculate(self, vector = None, CutOffSlope = None, MultiSlope0 = None, step = None) :
72         """
73         Teste les arguments, active la formule de calcul et stocke le resultat
74         Arguments :
75             - vector : vecteur des VAR(OMB) - VAR(OMA) au fil des iterations
76             - CutOffSlope : valeur minimale de la pente 
77             - MultiSlope0 : Facteur multiplicatif de la pente initiale pour comparaison
78         """
79         if  (vector is None) :
80             raise ValueError("One vector must be given to test the convergence of the variance after analysis")
81         V = numpy.array(vector)
82         if V.size < 1  :
83             raise ValueError("The given vector must not be empty")
84         if (MultiSlope0 is None) and (CutOffSlope is None) :
85             raise ValueError("You must set the value of ONE of the CutOffSlope of MultiSlope0 key word")
86         #
87         value = self._formula( V, CutOffSlope, MultiSlope0 )
88         #
89         self.store( value = value,  step = step )
90
91 #===============================================================================
92 if __name__ == "__main__":
93     print "\n AUTODIAGNOSTIC \n"
94
95     # Instanciation de l'objet diagnostic
96     # ------------------------------------------------
97     D = ElementaryDiagnostic("Mon StopReductionVariance")
98
99     # Vecteur de reduction VAR(OMB)-VAR(OMA)
100     # ------------------------------------------------
101     x = numpy.array(([0.60898111,  0.30449056,  0.15224528,  0.07612264,  0.03806132,  0.01903066, 0.00951533,  0.00475766,  0.00237883,  0.00118942]))
102     print " Le vecteur choisi est :", x
103     print " Sur ce vecteur, la reduction a l iteration N =  7 est inferieure a 0.005"
104     print " Sur ce vecteur, la reduction a l iteration N =  8 est inferieure a 0.01 * la reduction a l iteration 1"
105     
106     # Comparaison a la valeur seuil de la reduction
107     # ------------------------------------------------
108     D.calculate( vector = x,  CutOffSlope = 0.005, MultiSlope0 = None)
109     if (D.valueserie(0) - 7.) < 1.e-15 :
110         print " Test : La comparaison a la valeur seuil de la reduction est juste"
111     else :
112         print " Test : La comparaison a la valeur seuil de la reduction est fausse"
113
114     # Comparaison a alpha* la reduction a la premiere iteration
115     # ------------------------------------------------
116     D.calculate( vector = x,  CutOffSlope = None, MultiSlope0 = 0.01)
117     if (D.valueserie(1) - 8.) < 1.e-15 :
118         print " Test : La comparaison a la reduction a la premiere iteration est juste"
119     else :
120         print " Test : La comparaison a la reduction a la premiere iteration est fausse"
121     print