1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2009 EDF R&D
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.
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.
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
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
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.
28 __author__ = "Sophie Ricci - Septembre 2008"
30 import sys ; sys.path.insert(0, "../daCore")
34 from BasicObjects import Diagnostic
35 from AssimilationStudy import AssimilationStudy
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 )
43 def _formula(self, V, CutOffSlope, MultiSlope0):
45 Recherche du pas de temps ou iteration pour laquelle la reduction
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.
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]
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 :
64 if MultiSlope0 is not None:
65 if numpy.abs(pente[i]) < MultiSlope0 * numpy.abs(pente[1]) :
69 return iterstopreduction
71 def calculate(self, vector = None, CutOffSlope = None, MultiSlope0 = None, step = None) :
73 Teste les arguments, active la formule de calcul et stocke le resultat
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
80 raise ValueError("One vector must be given to test the convergence of the variance after analysis")
81 V = numpy.array(vector)
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")
87 value = self._formula( V, CutOffSlope, MultiSlope0 )
89 self.store( value = value, step = step )
91 #===============================================================================
92 if __name__ == "__main__":
93 print "\n AUTODIAGNOSTIC \n"
95 # Instanciation de l'objet diagnostic
96 # ------------------------------------------------
97 D = ElementaryDiagnostic("Mon StopReductionVariance")
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"
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"
112 print " Test : La comparaison a la valeur seuil de la reduction est fausse"
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"
120 print " Test : La comparaison a la reduction a la premiere iteration est fausse"