Salome HOME
Regression AnalysisFile
[modules/adao.git] / src / daComposant / daDiagnostics / HomogeneiteKhi2.py
1 #-*-coding:iso-8859-1-*-
2 #
3 #  Copyright (C) 2008-2010  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 qui effectue le test du Khi2 pour juger de l'homogénéite entre
23     les distributions de 2 vecteurs quelconques.
24         - entrée : la tolerance (tolerance) et le nombre de classes (nbclasse),
25           sous forme de paramètres dans le dictionnaire Par
26         - sortie : le resultat du diagnostic est une reponse booleenne au test :
27           True si l homogeneite est valide au sens du test du Khi2,
28           False dans le cas contraire.
29 """
30 __author__ = "Sophie RICCI - Juillet 2008"
31
32 import numpy
33 from daCore import BasicObjects, Persistence
34 from ComputeKhi2 import ComputeKhi2_Homogen
35 import logging
36
37 # ==============================================================================
38 class ElementaryDiagnostic(BasicObjects.Diagnostic,Persistence.OneScalar):
39     def __init__(self, name="", unit="", basetype = None, parameters = {} ):
40         BasicObjects.Diagnostic.__init__(self, name, parameters)
41         Persistence.OneScalar.__init__( self, name, unit, basetype = bool )
42         for key in ["tolerance", "dxclasse", "nbclasses"]:
43             if not self.parameters.has_key(key):
44                 raise ValueError("A parameter named \"%s\" is required."%key)
45
46     def _formula(self, V1, V2):
47         """
48         Effectue le calcul de la p-value pour deux vecteurs et un nombre de 
49         classes donne en parametre du diagnostic. 
50         """
51         [classes, eftheo, efobs, valeurKhi2, areaKhi2, message] = ComputeKhi2_Homogen(
52             vectorV1 = V1,
53             vectorV2 = V2,
54             dx = self.parameters["dxclasse"],
55             nbclasses = self.parameters["nbclasses"],
56             SuppressEmptyClasses = True)
57         #
58         logging.info( message )
59         logging.info( "(si <%.2f %s on refuse effectivement l'homogeneite)"%(100.*self.parameters["tolerance"],"%") )
60         #
61         answerKhisquareTest = False
62         if (areaKhi2 < (100.*self.parameters["tolerance"])) :
63             answerKhisquareTest = False
64         else:
65             answerKhisquareTest = True
66         #
67         return answerKhisquareTest
68
69     def calculate(self, vector1 = None, vector2 = None,  step = None):
70         """
71         Active la formule de calcul
72         """
73         if (vector1 is None) or (vector2 is None) :
74             raise ValueError("Two vectors must be given to calculate the Khi2 value")
75         V1 = numpy.array(vector1)
76         V2 = numpy.array(vector2)
77         if (V1.size < 1) or (V2.size < 1):
78             raise ValueError("The given vectors must not be empty")
79         if V1.size != V2.size:
80             raise ValueError("The two given vectors must have the same size")
81         #
82         value = self._formula( V1, V2 )
83         #
84         self.store( value = value, step = step )
85
86 # ==============================================================================
87 if __name__ == "__main__":
88     print "\n AUTODIAGNOSTIC \n"
89
90     print " Test d'homogeneite du Khi-2 pour deux vecteurs de taille 10,"
91     print " issus d'une distribution gaussienne normale"
92     print
93     #
94     # Initialisation des inputs et appel du diagnostic
95     # --------------------------------------------------------------------
96     tolerance = 0.05
97     dxclasse = 0.5
98     D = ElementaryDiagnostic("HomogeneiteKhi2", parameters = {
99         "tolerance":tolerance,
100         "dxclasse":dxclasse,
101         "nbclasses":None,
102         })
103     #
104     # Tirage de l'echantillon aleatoire 
105     # --------------------------------------------------------------------
106     numpy.random.seed(4000)
107     x1 = numpy.random.normal(50.,1.5,10000)
108     numpy.random.seed(2490)
109     x2 = numpy.random.normal(50.,1.5,10000)
110     #
111     # Calcul 
112     # --------------------------------------------------------------------
113     D.calculate(x1, x2)
114     #
115     print " La reponse du test est \"%s\" pour une tolerance de %.2e et une largeur de classe de %.2e "%(D.valueserie(0), tolerance, dxclasse)
116     print