]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Extending sampling test algorithm
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Tue, 26 Aug 2014 19:43:23 +0000 (21:43 +0200)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Tue, 26 Aug 2014 19:43:23 +0000 (21:43 +0200)
doc/en/ref_algorithm_SamplingTest.rst
doc/fr/ref_algorithm_SamplingTest.rst
src/daComposant/daAlgorithms/SamplingTest.py

index aa1910e24d0dbfb8d28b17ea9e2839ed1b8583bb..6162ad838363702238357ae76aae24ab15c5e72f 100644 (file)
@@ -31,11 +31,14 @@ Description
 +++++++++++
 
 This algorithm allows to calculate the values, linked to a :math:`\mathbf{x}`
-state, of the data assimilation error function :math:`J` and of the observation
-operator, for an priori given states sample. This is a useful algorithm to test
-the sensitivity, of the error function :math:`J` in particular, to the state
-:math:`\mathbf{x}` variations. When a state is not observable, a *"NaN"* value
-is returned.
+state, of a general error function :math:`J` of type :math:`L^1`, :math:`L^2` or
+:math:`L^{\infty}`, with or without weights, and of the observation operator,
+for an priori given states sample. The default error function is the augmented
+weighted least squares function, classicaly used in data assimilation.
+
+This is a useful algorithm to test the sensitivity, of the error function
+:math:`J` in particular, to the state :math:`\mathbf{x}` variations. When a
+state is not observable, a *"NaN"* value is returned.
 
 The sampling of the states :math:`\mathbf{x}` can be given explicitly or under
 the form of hypercubes.
@@ -51,6 +54,7 @@ Optional and required commands
 .. index:: single: SampleAsnUplet
 .. index:: single: SampleAsExplicitHyperCube
 .. index:: single: SampleAsMinMaxStepHyperCube
+.. index:: single: QualityCriterion
 .. index:: single: SetDebug
 .. index:: single: StoreSupplementaryCalculations
 
@@ -118,6 +122,16 @@ The options of the algorithm are the following:
 
     Example : ``{"SampleAsMinMaxStepHyperCube":[[0.,1.,0.25],[-1,3,1]]}`` for a state space of dimension 2
 
+  QualityCriterion
+    This key indicates the quality criterion, used to find the state estimate.
+    The default is the usual data assimilation criterion named "DA", the
+    augmented weighted least squares. The possible criteria has to be in the
+    following list, where the equivalent names are indicated by the sign "=":
+    ["AugmentedWeightedLeastSquares"="AWLS"="DA", "WeightedLeastSquares"="WLS",
+    "LeastSquares"="LS"="L2", "AbsoluteValue"="L1", "MaximumError"="ME"].
+
+    Example : ``{"QualityCriterion":"DA"}``
+
   SetDebug
     This key requires the activation, or not, of the debug mode during the
     function evaluation. The default is "True", the choices are "True" or
index cac78f67878836a433965375a41800d27999cc23..11c80c157e4ded6b21d6d4c395a6bb1664559f21 100644 (file)
@@ -31,11 +31,15 @@ Description
 +++++++++++
 
 Cet algorithme permet d'établir les valeurs, liées à un état :math:`\mathbf{x}`,
-de la fonctionnelle d'erreur d'assimilation de données :math:`J` et de
-l'opérateur d'observation, pour un échantillon d'états donné a priori. C'est un
-algorithme utile pour tester la sensibilité, de la fonctionnelle :math:`J` en
-particulier, aux variations de l'état :math:`\mathbf{x}`. Lorsque un état n'est
-pas observable, une value *"NaN"* est retournée.
+d'une fonctionnelle d'erreur :math:`J` quelconque de type :math:`L^1`,
+:math:`L^2` ou :math:`L^{\infty}`, avec ou sans pondérations, et de l'opérateur
+d'observation, pour un échantillon d'états donné a priori. La fonctionnelle
+d'erreur par défaut est celle de moindres carrés pondérés augmentés,
+classiquement utilisée en assimilation de données.
+
+C'est un algorithme utile pour tester la sensibilité, de la fonctionnelle
+:math:`J` en particulier, aux variations de l'état :math:`\mathbf{x}`. Lorsque
+un état n'est pas observable, une value *"NaN"* est retournée.
 
 L'échantillon des états :math:`\mathbf{x}` peut être fourni explicitement ou
 sous la forme d'hypercubes.
@@ -51,6 +55,7 @@ Commandes requises et optionnelles
 .. index:: single: SampleAsnUplet
 .. index:: single: SampleAsExplicitHyperCube
 .. index:: single: SampleAsMinMaxStepHyperCube
+.. index:: single: QualityCriterion
 .. index:: single: SetDebug
 .. index:: single: StoreSupplementaryCalculations
 
@@ -123,6 +128,17 @@ Les options de l'algorithme sont les suivantes:
 
     Exemple : ``{"SampleAsMinMaxStepHyperCube":[[0.,1.,0.25],[-1,3,1]]}`` pour un espace d'état à 2 dimensions
 
+  QualityCriterion
+    Cette clé indique le critère de qualité, qui est utilisé pour trouver
+    l'estimation de l'état. Le défaut est le critère usuel de l'assimilation de
+    données nommé "DA", qui est le critère de moindres carrés pondérés
+    augmentés. Les critères possibles sont dans la liste suivante, dans laquelle
+    les noms équivalents sont indiqués par un signe "=" :
+    ["AugmentedWeightedLeastSquares"="AWLS"="DA", "WeightedLeastSquares"="WLS",
+    "LeastSquares"="LS"="L2", "AbsoluteValue"="L1",  "MaximumError"="ME"].
+
+    Exemple : ``{"QualityCriterion":"DA"}``
+
   SetDebug
     Cette clé requiert l'activation, ou pas, du mode de débogage durant
     l'évaluation de la fonction. La valeur par défaut est "True", les choix sont
index b14133db85b03d5b95a0d4effcb4f61414a6e1e1..7f2edf4ce70cc397e115cb03238169d1e3d62a5a 100644 (file)
@@ -46,6 +46,17 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             typecast = list,
             message  = "Points de calcul définis par un hyper-cube dont on donne la liste des échantillonages de chaque variable par un triplet [min,max,step]",
             )
+        self.defineRequiredParameter(
+            name     = "QualityCriterion",
+            default  = "AugmentedWeightedLeastSquares",
+            typecast = str,
+            message  = "Critère de qualité utilisé",
+            listval  = ["AugmentedWeightedLeastSquares","AWLS","AugmentedPonderatedLeastSquares","APLS","DA",
+                        "WeightedLeastSquares","WLS","PonderatedLeastSquares","PLS",
+                        "LeastSquares","LS","L2",
+                        "AbsoluteValue","L1",
+                        "MaximumError","ME"],
+            )
         self.defineRequiredParameter(
             name     = "SetDebug",
             default  = False,
@@ -90,7 +101,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         # ----------
         BI = B.getI()
         RI = R.getI()
-        def CostFunction(x,HmX):
+        def CostFunction(x,HmX, QualityMeasure="AugmentedWeightedLeastSquares"):
             if numpy.any(numpy.isnan(HmX)):
                 _X  = numpy.nan
                 _HX = numpy.nan
@@ -98,8 +109,26 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             else:
                 _X  = numpy.asmatrix(numpy.ravel( x )).T
                 _HX = numpy.asmatrix(numpy.ravel( HmX )).T
-                Jb  = 0.5 * (_X - Xb).T * BI * (_X - Xb)
-                Jo  = 0.5 * (Y - _HX).T * RI * (Y - _HX)
+                if QualityMeasure in ["AugmentedWeightedLeastSquares","AWLS","AugmentedPonderatedLeastSquares","APLS","DA"]:
+                    if BI is None or RI is None:
+                        raise ValueError("Background and Observation error covariance matrix has to be properly defined!")
+                    Jb  = 0.5 * (_X - Xb).T * BI * (_X - Xb)
+                    Jo  = 0.5 * (Y - _HX).T * RI * (Y - _HX)
+                elif QualityMeasure in ["WeightedLeastSquares","WLS","PonderatedLeastSquares","PLS"]:
+                    if RI is None:
+                        raise ValueError("Observation error covariance matrix has to be properly defined!")
+                    Jb  = 0.
+                    Jo  = 0.5 * (Y - _HX).T * RI * (Y - _HX)
+                elif QualityMeasure in ["LeastSquares","LS","L2"]:
+                    Jb  = 0.
+                    Jo  = 0.5 * (Y - _HX).T * (Y - _HX)
+                elif QualityMeasure in ["AbsoluteValue","L1"]:
+                    Jb  = 0.
+                    Jo  = numpy.sum( numpy.abs(Y - _HX) )
+                elif QualityMeasure in ["MaximumError","ME"]:
+                    Jb  = 0.
+                    Jo  = numpy.max( numpy.abs(Y - _HX) )
+                #
                 J   = float( Jb ) + float( Jo )
             if "CurrentState" in self._parameters["StoreSupplementaryCalculations"]:
                 self.StoredVariables["CurrentState"].store( _X )
@@ -128,7 +157,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             except:
                 Yn = numpy.nan
             #
-            J, Jb, Jo = CostFunction(__Xn,Yn)
+            J, Jb, Jo = CostFunction(__Xn,Yn,self._parameters["QualityCriterion"])
         # ----------
         #
         if self._parameters["SetDebug"]: