From e0df7ad24741bbb61ab02b5dee952b180192b138 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Tue, 9 Sep 2014 13:19:52 +0200 Subject: [PATCH] Extending sampling test algorithm --- doc/en/ref_algorithm_SamplingTest.rst | 45 +++++++++++++---- doc/fr/ref_algorithm_SamplingTest.rst | 53 ++++++++++++++------ src/daComposant/daAlgorithms/SamplingTest.py | 31 ++++++++++-- 3 files changed, 101 insertions(+), 28 deletions(-) diff --git a/doc/en/ref_algorithm_SamplingTest.rst b/doc/en/ref_algorithm_SamplingTest.rst index 6162ad8..d29e58a 100644 --- a/doc/en/ref_algorithm_SamplingTest.rst +++ b/doc/en/ref_algorithm_SamplingTest.rst @@ -36,12 +36,14 @@ state, of a general error function :math:`J` of type :math:`L^1`, :math:`L^2` or 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. +It is useful 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. +the form of hyper-cubes, explicit or sampled. Be careful to the size of the +hyper-cube (and then to the number of calculations) that can be reached, it can +be big very quickly. Optional and required commands ++++++++++++++++++++++++++++++ @@ -54,8 +56,10 @@ Optional and required commands .. index:: single: SampleAsnUplet .. index:: single: SampleAsExplicitHyperCube .. index:: single: SampleAsMinMaxStepHyperCube +.. index:: single: SampleAsIndependantRandomVariables .. index:: single: QualityCriterion .. index:: single: SetDebug +.. index:: single: SetSeed .. index:: single: StoreSupplementaryCalculations The general required commands, available in the editing user interface, are the @@ -109,19 +113,32 @@ The options of the algorithm are the following: Example : ``{"SampleAsnUplet":[[0,1,2,3],[4,3,2,1],[-2,3,-4,5]]}`` for 3 points in a state space of dimension 4 SampleAsExplicitHyperCube - This key describes the calculations points as an hypercube, from which one - gives the list of sampling of each variable as a list. That is then a list - of lists, each of them being potentially of different size. + This key describes the calculations points as an hyper-cube, from a given + list of explicit sampling of each variable as a list. That is then a list of + lists, each of them being potentially of different size. Example : ``{"SampleAsExplicitHyperCube":[[0.,0.25,0.5,0.75,1.],[-2,2,1]]}`` for a state space of dimension 2 SampleAsMinMaxStepHyperCube - This key describes the calculations points as an hypercube from which one - the sampling of each variable by a triplet *[min,max,step]*. That is then a - list of the same size than the one of the state. The bounds are included. + This key describes the calculations points as an hyper-cube, from a given + list of implicit sampling of each variable by a triplet *[min,max,step]*. + That is then a list of the same size than the one of the state. The bounds + are included. Example : ``{"SampleAsMinMaxStepHyperCube":[[0.,1.,0.25],[-1,3,1]]}`` for a state space of dimension 2 + SampleAsIndependantRandomVariables + This key describes the calculations points as an hyper-cube, for which the + points on each axis come from a independant random sampling of the axis + variable, under the specification of the distribution, its parameters and + the number of points in the sample, as a list ``['distribution', + [parametres], nombre]`` for each axis. The possible distributions are + 'normal' of parameters (mean,std), 'lognormal' of parameters (mean,sigma), + 'uniform' of parameters (low,high), or 'weibull' of parameter (shape). That + is then a list of the same size than the one of the state. + + Example : ``{"SampleAsIndependantRandomVariables":[['normal',[0.,1.],3],['uniform',[-2,2],4]]`` 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 @@ -139,6 +156,14 @@ The options of the algorithm are the following: Example : ``{"SetDebug":False}`` + SetSeed + This key allow to give an integer in order to fix the seed of the random + generator used to generate the ensemble. A convenient value is for example + 1000. By default, the seed is left uninitialized, and so use the default + initialization from the computer. + + Example : ``{"SetSeed":1000}`` + StoreSupplementaryCalculations This list indicates the names of the supplementary variables that can be available at the end of the algorithm. It involves potentially costly diff --git a/doc/fr/ref_algorithm_SamplingTest.rst b/doc/fr/ref_algorithm_SamplingTest.rst index 11c80c1..73c0dd0 100644 --- a/doc/fr/ref_algorithm_SamplingTest.rst +++ b/doc/fr/ref_algorithm_SamplingTest.rst @@ -37,12 +37,14 @@ d'observation, pour un 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. +Il est 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 valeur *"NaN"* est retournée. L'échantillon des états :math:`\mathbf{x}` peut être fourni explicitement ou -sous la forme d'hypercubes. +sous la forme d'hyper-cubes, explicites ou échantillonnés. Attention à la taille +de l'hyper-cube (et donc au nombre de calculs) qu'il est possible d'atteindre, +elle peut rapidement devenir importante. Commandes requises et optionnelles ++++++++++++++++++++++++++++++++++ @@ -55,8 +57,10 @@ Commandes requises et optionnelles .. index:: single: SampleAsnUplet .. index:: single: SampleAsExplicitHyperCube .. index:: single: SampleAsMinMaxStepHyperCube +.. index:: single: SampleAsIndependantRandomVariables .. index:: single: QualityCriterion .. index:: single: SetDebug +.. index:: single: SetSeed .. index:: single: StoreSupplementaryCalculations Les commandes requises générales, disponibles dans l'interface en édition, sont @@ -114,19 +118,32 @@ Les options de l'algorithme sont les suivantes: SampleAsExplicitHyperCube Cette clé décrit les points de calcul sous la forme d'un hyper-cube, dont on - donne la liste des échantillonages de chaque variable comme une liste. C'est - donc une liste de listes, chacune étant de taille potentiellement - différente. + donne la liste des échantillonnages explicites de chaque variable comme une + liste. C'est donc une liste de listes, chacune étant de taille + potentiellement différente. - Exemple : ``{"SampleAsExplicitHyperCube":[[0.,0.25,0.5,0.75,1.],[-2,2,1]]}`` pour un espace d'état à 2 dimensions + Exemple : ``{"SampleAsExplicitHyperCube":[[0.,0.25,0.5,0.75,1.],[-2,2,1]]}`` pour un espace d'état de dimension 2 SampleAsMinMaxStepHyperCube - Cette clé décrit les points de calcul sous la forme d'un hyper-cube dont on - donne la liste des échantillonages de chaque variable par un triplet - *[min,max,step]*. C'est donc une liste de la même taille que celle de - l'état. Les bornes sont incluses. - - Exemple : ``{"SampleAsMinMaxStepHyperCube":[[0.,1.,0.25],[-1,3,1]]}`` pour un espace d'état à 2 dimensions + Cette clé décrit les points de calcul sous la forme d'un hyper-cube, dont on + donne la liste des échantillonnages implicites de chaque variable par un + triplet *[min,max,step]*. C'est donc une liste de la même taille que celle + de l'état. Les bornes sont incluses. + + Exemple : ``{"SampleAsMinMaxStepHyperCube":[[0.,1.,0.25],[-1,3,1]]}`` pour un espace d'état de dimension 2 + + SampleAsIndependantRandomVariables + Cette clé décrit les points de calcul sous la forme d'un hyper-cube, dont + les points sur chaque axe proviennent de l'échantillonnage aléatoire + indépendant de la variable d'axe, selon la spécification de la + distribution, de ses paramètres et du nombre de points de l'échantillon, + sous la forme d'une liste ``['distribution', [parametres], nombre]`` pour + chaque axe. Les distributions possibles sont 'normal' de paramètres + (mean,std), 'lognormal' de paramètres (mean,sigma), 'uniform' de paramètres + (low,high), ou 'weibull' de paramètre (shape). C'est donc une liste de la + même taille que celle de l'état. + + Exemple : ``{"SampleAsIndependantRandomVariables":[['normal',[0.,1.],3],['uniform',[-2,2],4]]`` pour un espace d'état de dimension 2 QualityCriterion Cette clé indique le critère de qualité, qui est utilisé pour trouver @@ -146,6 +163,14 @@ Les options de l'algorithme sont les suivantes: Exemple : ``{"SetDebug":False}`` + SetSeed + Cette clé permet de donner un nombre entier pour fixer la graine du + générateur aléatoire utilisé pour générer l'ensemble. Un valeur pratique est + par exemple 1000. Par défaut, la graine est laissée non initialisée, et elle + utilise ainsi l'initialisation par défaut de l'ordinateur. + + Exemple : ``{"SetSeed":1000}`` + StoreSupplementaryCalculations Cette liste indique les noms des variables supplémentaires qui peuvent être disponibles à la fin de l'algorithme. Cela implique potentiellement des diff --git a/src/daComposant/daAlgorithms/SamplingTest.py b/src/daComposant/daAlgorithms/SamplingTest.py index 7f2edf4..034b28e 100644 --- a/src/daComposant/daAlgorithms/SamplingTest.py +++ b/src/daComposant/daAlgorithms/SamplingTest.py @@ -31,21 +31,27 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): self.defineRequiredParameter( name = "SampleAsnUplet", default = [], - typecast = list, + typecast = tuple, message = "Points de calcul définis par une liste de n-uplet", ) self.defineRequiredParameter( name = "SampleAsExplicitHyperCube", default = [], - typecast = list, + typecast = tuple, message = "Points de calcul définis par un hyper-cube dont on donne la liste des échantillonages de chaque variable comme une liste", ) self.defineRequiredParameter( name = "SampleAsMinMaxStepHyperCube", default = [], - typecast = list, + typecast = tuple, 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 = "SampleAsIndependantRandomVariables", + default = [], + typecast = tuple, + message = "Points de calcul définis par un hyper-cube dont les points sur chaque axe proviennent de l'échantillonage indépendant de la variable selon la spécification ['distribution',[parametres],nombre]", + ) self.defineRequiredParameter( name = "QualityCriterion", default = "AugmentedWeightedLeastSquares", @@ -70,6 +76,11 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): message = "Liste de calculs supplémentaires à stocker et/ou effectuer", listval = ["CostFunctionJ","CurrentState","Innovation","ObservedState"] ) + self.defineRequiredParameter( + name = "SetSeed", + typecast = numpy.random.seed, + message = "Graine fixée pour le générateur aléatoire", + ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): self._pre_run() @@ -92,10 +103,22 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): coordinatesList = [] for i,dim in enumerate(self._parameters["SampleAsMinMaxStepHyperCube"]): if len(dim) != 3: - raise ValueError("For dimension %i, the variable definition %s is incorrect, it should be [min,max,step]."%(i,dim)) + raise ValueError("For dimension %i, the variable definition \"%s\" is incorrect, it should be [min,max,step]."%(i,dim)) else: coordinatesList.append(numpy.linspace(*dim)) sampleList = itertools.product(*coordinatesList) + elif len(self._parameters["SampleAsIndependantRandomVariables"]) > 0: + coordinatesList = [] + for i,dim in enumerate(self._parameters["SampleAsIndependantRandomVariables"]): + if len(dim) != 3: + raise ValueError("For dimension %i, the variable definition \"%s\" is incorrect, it should be ('distribution',(parameters),length) with distribution in ['normal'(mean,std),'lognormal'(mean,sigma),'uniform'(low,high),'weibull'(shape)]."%(i,dim)) + elif not( str(dim[0]) in ['normal','lognormal','uniform','weibull'] and hasattr(numpy.random,dim[0]) ): + raise ValueError("For dimension %i, the distribution name \"%s\" is not allowed, please choose in ['normal'(mean,std),'lognormal'(mean,sigma),'uniform'(low,high),'weibull'(shape)]"%(i,dim[0])) + else: + distribution = getattr(numpy.random,str(dim[0]),'normal') + parameters = dim[1] + coordinatesList.append(distribution(*dim[1], size=max(1,int(dim[2])))) + sampleList = itertools.product(*coordinatesList) else: sampleList = iter([Xn,]) # ---------- -- 2.39.2