]> SALOME platform Git repositories - modules/adao.git/blob - src/daComposant/daAlgorithms/QuantileRegression.py
Salome HOME
Documentation and code update for PSO
[modules/adao.git] / src / daComposant / daAlgorithms / QuantileRegression.py
1 # -*- coding: utf-8 -*-
2 #
3 # Copyright (C) 2008-2023 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 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
22
23 import numpy
24 from daCore import BasicObjects, NumericObjects
25 from daAlgorithms.Atoms import mmqr
26
27 # ==============================================================================
28 class ElementaryAlgorithm(BasicObjects.Algorithm):
29     def __init__(self):
30         BasicObjects.Algorithm.__init__(self, "QUANTILEREGRESSION")
31         self.defineRequiredParameter(
32             name     = "Quantile",
33             default  = 0.5,
34             typecast = float,
35             message  = "Quantile pour la regression de quantile",
36             minval   = 0.,
37             maxval   = 1.,
38             )
39         self.defineRequiredParameter(
40             name     = "Minimizer",
41             default  = "MMQR",
42             typecast = str,
43             message  = "Minimiseur utilisé",
44             listval  = ["MMQR",],
45             )
46         self.defineRequiredParameter(
47             name     = "MaximumNumberOfIterations",
48             default  = 15000,
49             typecast = int,
50             message  = "Nombre maximal de pas d'optimisation",
51             minval   = 1,
52             oldname  = "MaximumNumberOfSteps",
53             )
54         self.defineRequiredParameter(
55             name     = "CostDecrementTolerance",
56             default  = 1.e-6,
57             typecast = float,
58             message  = "Maximum de variation de la fonction d'estimation lors de l'arrêt",
59             )
60         self.defineRequiredParameter(
61             name     = "StoreInternalVariables",
62             default  = False,
63             typecast = bool,
64             message  = "Stockage des variables internes ou intermédiaires du calcul",
65             )
66         self.defineRequiredParameter(
67             name     = "StoreSupplementaryCalculations",
68             default  = [],
69             typecast = tuple,
70             message  = "Liste de calculs supplémentaires à stocker et/ou effectuer",
71             listval  = [
72                 "Analysis",
73                 "BMA",
74                 "CostFunctionJ",
75                 "CostFunctionJb",
76                 "CostFunctionJo",
77                 "CurrentIterationNumber",
78                 "CurrentState",
79                 "Innovation",
80                 "OMA",
81                 "OMB",
82                 "SimulatedObservationAtBackground",
83                 "SimulatedObservationAtCurrentState",
84                 "SimulatedObservationAtOptimum",
85                 ]
86             )
87         self.defineRequiredParameter( # Pas de type
88             name     = "Bounds",
89             message  = "Liste des valeurs de bornes",
90             )
91         self.defineRequiredParameter(
92             name     = "InitializationPoint",
93             typecast = numpy.ravel,
94             message  = "État initial imposé (par défaut, c'est l'ébauche si None)",
95             )
96         self.requireInputArguments(
97             mandatory= ("Xb", "Y", "HO" ),
98             )
99         self.setAttributes(tags=(
100             "Optimization",
101             "Risk",
102             "Variational",
103             ))
104
105     def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
106         self._pre_run(Parameters, Xb, Y, U, HO, EM, CM, R, B, Q)
107         self._parameters["Bounds"] = NumericObjects.ForceNumericBounds( self._parameters["Bounds"] )
108         #
109         Hm = HO["Direct"].appliedTo
110         #
111         def CostFunction(x):
112             _X = numpy.asarray(x).reshape((-1,1))
113             if self._parameters["StoreInternalVariables"] or \
114                 self._toStore("CurrentState"):
115                 self.StoredVariables["CurrentState"].store( _X )
116             _HX = numpy.asarray(Hm( _X )).reshape((-1,1))
117             if self._toStore("SimulatedObservationAtCurrentState"):
118                 self.StoredVariables["SimulatedObservationAtCurrentState"].store( _HX )
119             Jb  = 0.
120             Jo  = 0.
121             J   = Jb + Jo
122             #
123             self.StoredVariables["CurrentIterationNumber"].store( len(self.StoredVariables["CostFunctionJ"]) )
124             self.StoredVariables["CostFunctionJb"].store( Jb )
125             self.StoredVariables["CostFunctionJo"].store( Jo )
126             self.StoredVariables["CostFunctionJ" ].store( J )
127             return _HX
128         #
129         def GradientOfCostFunction(x):
130             _X = numpy.asarray(x).reshape((-1,1))
131             Hg = HO["Tangent"].asMatrix( _X )
132             return Hg
133         #
134         Xini = self._parameters["InitializationPoint"]
135         #
136         # Minimisation de la fonctionnelle
137         # --------------------------------
138         if self._parameters["Minimizer"] == "MMQR":
139             Minimum, J_optimal, Informations = mmqr.mmqr(
140                 func        = CostFunction,
141                 x0          = Xini,
142                 fprime      = GradientOfCostFunction,
143                 bounds      = self._parameters["Bounds"],
144                 quantile    = self._parameters["Quantile"],
145                 maxfun      = self._parameters["MaximumNumberOfIterations"],
146                 toler       = self._parameters["CostDecrementTolerance"],
147                 y           = Y,
148                 )
149         else:
150             raise ValueError("Error in minimizer name: %s is unkown"%self._parameters["Minimizer"])
151         #
152         # Obtention de l'analyse
153         # ----------------------
154         Xa = Minimum
155         #
156         self.StoredVariables["Analysis"].store( Xa )
157         #
158         # Calculs et/ou stockages supplémentaires
159         # ---------------------------------------
160         if self._toStore("OMA") or \
161             self._toStore("SimulatedObservationAtOptimum"):
162             HXa = Hm(Xa).reshape((-1,1))
163         if self._toStore("Innovation") or \
164             self._toStore("OMB") or \
165             self._toStore("SimulatedObservationAtBackground"):
166             HXb = Hm(Xb).reshape((-1,1))
167             Innovation = Y - HXb
168         if self._toStore("Innovation"):
169             self.StoredVariables["Innovation"].store( Innovation )
170         if self._toStore("OMB"):
171             self.StoredVariables["OMB"].store( Innovation )
172         if self._toStore("BMA"):
173             self.StoredVariables["BMA"].store( numpy.ravel(Xb) - numpy.ravel(Xa) )
174         if self._toStore("OMA"):
175             self.StoredVariables["OMA"].store( Y - HXa )
176         if self._toStore("SimulatedObservationAtBackground"):
177             self.StoredVariables["SimulatedObservationAtBackground"].store( HXb )
178         if self._toStore("SimulatedObservationAtOptimum"):
179             self.StoredVariables["SimulatedObservationAtOptimum"].store( HXa )
180         #
181         self._post_run(HO)
182         return 0
183
184 # ==============================================================================
185 if __name__ == "__main__":
186     print('\n AUTODIAGNOSTIC\n')