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

index 6162ad838363702238357ae76aae24ab15c5e72f..d29e58a34bf6c150b8325767e5feb6b76422105c 100644 (file)
@@ -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
index 11c80c157e4ded6b21d6d4c395a6bb1664559f21..73c0dd0d19bb88b7f46d3e16da1b383225392c87 100644 (file)
@@ -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
index 7f2edf4ce70cc397e115cb03238169d1e3d62a5a..034b28ee88ead65b361a37cf25d6a4c352f9ff1c 100644 (file)
@@ -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,])
         # ----------