From 5e1c47f911c5d5b93cee3674529a0316670e647a Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Tue, 26 Aug 2014 21:43:23 +0200 Subject: [PATCH] Extending sampling test algorithm --- doc/en/ref_algorithm_SamplingTest.rst | 24 ++++++++++--- doc/fr/ref_algorithm_SamplingTest.rst | 26 +++++++++++--- src/daComposant/daAlgorithms/SamplingTest.py | 37 +++++++++++++++++--- 3 files changed, 73 insertions(+), 14 deletions(-) diff --git a/doc/en/ref_algorithm_SamplingTest.rst b/doc/en/ref_algorithm_SamplingTest.rst index aa1910e..6162ad8 100644 --- a/doc/en/ref_algorithm_SamplingTest.rst +++ b/doc/en/ref_algorithm_SamplingTest.rst @@ -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 diff --git a/doc/fr/ref_algorithm_SamplingTest.rst b/doc/fr/ref_algorithm_SamplingTest.rst index cac78f6..11c80c1 100644 --- a/doc/fr/ref_algorithm_SamplingTest.rst +++ b/doc/fr/ref_algorithm_SamplingTest.rst @@ -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 diff --git a/src/daComposant/daAlgorithms/SamplingTest.py b/src/daComposant/daAlgorithms/SamplingTest.py index b14133d..7f2edf4 100644 --- a/src/daComposant/daAlgorithms/SamplingTest.py +++ b/src/daComposant/daAlgorithms/SamplingTest.py @@ -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"]: -- 2.39.2