From bf5c8dc1676b3da6698d835eb5cb1aa5e896b2da Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Thu, 6 May 2021 07:26:01 +0200 Subject: [PATCH] Documentation convergence for bounds --- doc/en/ref_algorithm_3DVAR.rst | 2 ++ doc/en/ref_algorithm_Blue.rst | 2 ++ doc/en/ref_algorithm_ExtendedBlue.rst | 2 ++ doc/en/snippets/BoundsWithExtremes.rst | 10 +++++----- doc/en/snippets/BoundsWithNone.rst | 11 ++++++----- doc/en/snippets/BoxBounds.rst | 8 ++++---- .../StateBoundsForQuantilesWithNone.rst | 17 +++++++++++++++++ doc/fr/ref_algorithm_3DVAR.rst | 2 ++ doc/fr/ref_algorithm_Blue.rst | 2 ++ doc/fr/ref_algorithm_ExtendedBlue.rst | 2 ++ doc/fr/snippets/BoundsWithExtremes.rst | 6 +++--- doc/fr/snippets/BoundsWithNone.rst | 6 +++--- doc/fr/snippets/BoxBounds.rst | 14 +++++++------- .../StateBoundsForQuantilesWithNone.rst | 19 +++++++++++++++++++ src/daComposant/daAlgorithms/3DVAR.py | 9 +-------- src/daComposant/daAlgorithms/Blue.py | 9 +-------- src/daComposant/daAlgorithms/ExtendedBlue.py | 9 +-------- src/daComposant/daCore/BasicObjects.py | 10 +++++----- src/daComposant/daCore/NumericObjects.py | 12 ++++++++---- 19 files changed, 92 insertions(+), 60 deletions(-) create mode 100644 doc/en/snippets/StateBoundsForQuantilesWithNone.rst create mode 100644 doc/fr/snippets/StateBoundsForQuantilesWithNone.rst diff --git a/doc/en/ref_algorithm_3DVAR.rst b/doc/en/ref_algorithm_3DVAR.rst index b196e3b..6d893a2 100644 --- a/doc/en/ref_algorithm_3DVAR.rst +++ b/doc/en/ref_algorithm_3DVAR.rst @@ -95,6 +95,8 @@ initialization point for the minimization, but it is not recommended. .. include:: snippets/SimulationForQuantiles.rst +.. include:: snippets/StateBoundsForQuantilesWithNone.rst + StoreSupplementaryCalculations .. index:: single: StoreSupplementaryCalculations diff --git a/doc/en/ref_algorithm_Blue.rst b/doc/en/ref_algorithm_Blue.rst index 11d2c8d..55d4fe7 100644 --- a/doc/en/ref_algorithm_Blue.rst +++ b/doc/en/ref_algorithm_Blue.rst @@ -79,6 +79,8 @@ these reasons, this method is not proposed nor recommended. .. include:: snippets/SimulationForQuantiles.rst +.. include:: snippets/StateBoundsForQuantilesWithNone.rst + StoreSupplementaryCalculations .. index:: single: StoreSupplementaryCalculations diff --git a/doc/en/ref_algorithm_ExtendedBlue.rst b/doc/en/ref_algorithm_ExtendedBlue.rst index eb9b9a8..7e78238 100644 --- a/doc/en/ref_algorithm_ExtendedBlue.rst +++ b/doc/en/ref_algorithm_ExtendedBlue.rst @@ -65,6 +65,8 @@ without being entirely equivalent. .. include:: snippets/SimulationForQuantiles.rst +.. include:: snippets/StateBoundsForQuantilesWithNone.rst + StoreSupplementaryCalculations .. index:: single: StoreSupplementaryCalculations diff --git a/doc/en/snippets/BoundsWithExtremes.rst b/doc/en/snippets/BoundsWithExtremes.rst index 5ebe572..5ea268b 100644 --- a/doc/en/snippets/BoundsWithExtremes.rst +++ b/doc/en/snippets/BoundsWithExtremes.rst @@ -1,11 +1,11 @@ .. index:: single: Bounds Bounds - *List of pairs of real values*. This key allows to define upper and lower - bounds for every state variable being optimized. Bounds have to be given by a - list of list of pairs of lower/upper bounds for each variable, with extreme - values every time there is no bound (``None`` is not allowed when there is no - bound). + *List of pairs of real values*. This key allows to define pairs of upper and + lower bounds for every state variable being optimized. Bounds have to be + given by a list of list of pairs of lower/upper bounds for each variable, + with extreme values every time there is no bound (``None`` is not allowed + when there is no bound). Example: ``{"Bounds":[[2.,5.],[1.e-2,10.],[-30.,1.e99],[-1.e99,1.e99]]}`` diff --git a/doc/en/snippets/BoundsWithNone.rst b/doc/en/snippets/BoundsWithNone.rst index e956182..52904a6 100644 --- a/doc/en/snippets/BoundsWithNone.rst +++ b/doc/en/snippets/BoundsWithNone.rst @@ -1,11 +1,12 @@ .. index:: single: Bounds Bounds - *List of pairs of real values*. This key allows to define upper and lower - bounds for every state variable being optimized. Bounds have to be given by a - list of list of pairs of lower/upper bounds for each variable, with possibly - ``None`` every time there is no bound. The bounds can always be specified, - but they are taken into account only by the constrained optimizers. + *List of pairs of real values*. This key allows to define pairs of upper and + lower bounds for every state variable being optimized. Bounds have to be + given by a list of list of pairs of lower/upper bounds for each variable, + with possibly ``None`` every time there is no bound. The bounds can always be + specified, but they are taken into account only by the constrained + optimizers. Example: ``{"Bounds":[[2.,5.],[1.e-2,10.],[-30.,None],[None,None]]}`` diff --git a/doc/en/snippets/BoxBounds.rst b/doc/en/snippets/BoxBounds.rst index c358810..03731e8 100644 --- a/doc/en/snippets/BoxBounds.rst +++ b/doc/en/snippets/BoxBounds.rst @@ -1,10 +1,10 @@ .. index:: single: BoxBounds BoxBounds - *List of pairs of real values*. This key allows to define upper and lower - bounds for *increments* on every state variable being optimized (and not on - state variables themselves). Bounds have to be given by a list of list of - pairs of lower/upper bounds for each increment on variable, with extreme + *List of pairs of real values*. This key allows to define pairs of upper and + lower bounds for *increments* on every state variable being optimized (and + not on state variables themselves). Bounds have to be given by a list of list + of pairs of lower/upper bounds for each increment on variable, with extreme values every time there is no bound (``None`` is not allowed when there is no bound). This key is required and there is no default values. diff --git a/doc/en/snippets/StateBoundsForQuantilesWithNone.rst b/doc/en/snippets/StateBoundsForQuantilesWithNone.rst new file mode 100644 index 0000000..9369825 --- /dev/null +++ b/doc/en/snippets/StateBoundsForQuantilesWithNone.rst @@ -0,0 +1,17 @@ +.. index:: single: StateBoundsForQuantiles + +StateBoundsForQuantiles + *List of pairs of real values*. This key allows to define pairs of upper and + lower bounds for every state variable used for quantile simulations. Bounds + have to be given by a list of list of pairs of lower/upper bounds for each + variable, with possibly ``None`` every time there is no bound. + + If these bounds are not defined for quantile simulation and if optimization + bounds are defined, they are used for quantile simulation. If these bounds + for quantile simulation are defined, they are used regardless of the + optimization bounds defined. If this variable is set to ``None``, then no + bounds are used for the states used in the quantile simulation regardless of + the optimization bounds defined. + + Exemple : + ``{"StateBoundsForQuantiles":[[2.,5.],[1.e-2,10.],[-30.,None],[None,None]]}`` diff --git a/doc/fr/ref_algorithm_3DVAR.rst b/doc/fr/ref_algorithm_3DVAR.rst index 608e32d..faf5b49 100644 --- a/doc/fr/ref_algorithm_3DVAR.rst +++ b/doc/fr/ref_algorithm_3DVAR.rst @@ -97,6 +97,8 @@ initial de leur minimisation, mais ce n'est pas recommandé. .. include:: snippets/SimulationForQuantiles.rst +.. include:: snippets/StateBoundsForQuantilesWithNone.rst + StoreSupplementaryCalculations .. index:: single: StoreSupplementaryCalculations diff --git a/doc/fr/ref_algorithm_Blue.rst b/doc/fr/ref_algorithm_Blue.rst index 161d1a5..308d8dd 100644 --- a/doc/fr/ref_algorithm_Blue.rst +++ b/doc/fr/ref_algorithm_Blue.rst @@ -80,6 +80,8 @@ pas proposée. .. include:: snippets/SimulationForQuantiles.rst +.. include:: snippets/StateBoundsForQuantilesWithNone.rst + StoreSupplementaryCalculations .. index:: single: StoreSupplementaryCalculations diff --git a/doc/fr/ref_algorithm_ExtendedBlue.rst b/doc/fr/ref_algorithm_ExtendedBlue.rst index b40211c..0d76628 100644 --- a/doc/fr/ref_algorithm_ExtendedBlue.rst +++ b/doc/fr/ref_algorithm_ExtendedBlue.rst @@ -65,6 +65,8 @@ lui être entièrement équivalent. .. include:: snippets/SimulationForQuantiles.rst +.. include:: snippets/StateBoundsForQuantilesWithNone.rst + StoreSupplementaryCalculations .. index:: single: StoreSupplementaryCalculations diff --git a/doc/fr/snippets/BoundsWithExtremes.rst b/doc/fr/snippets/BoundsWithExtremes.rst index 5788a4d..4ba54b0 100644 --- a/doc/fr/snippets/BoundsWithExtremes.rst +++ b/doc/fr/snippets/BoundsWithExtremes.rst @@ -1,9 +1,9 @@ .. index:: single: Bounds Bounds - *Liste de paires de valeurs réelles*. Cette clé permet de définir des bornes - supérieure et inférieure pour chaque variable d'état optimisée. Les bornes - doivent être données par une liste de liste de paires de bornes + *Liste de paires de valeurs réelles*. Cette clé permet de définir des paires + de bornes supérieure et inférieure pour chaque variable d'état optimisée. Les + bornes doivent être données par une liste de liste de paires de bornes inférieure/supérieure pour chaque variable, avec une valeur extrême chaque fois qu'il n'y a pas de borne (``None`` n'est pas une valeur autorisée lorsqu'il n'y a pas de borne). diff --git a/doc/fr/snippets/BoundsWithNone.rst b/doc/fr/snippets/BoundsWithNone.rst index 340c560..3dac7cf 100644 --- a/doc/fr/snippets/BoundsWithNone.rst +++ b/doc/fr/snippets/BoundsWithNone.rst @@ -1,9 +1,9 @@ .. index:: single: Bounds Bounds - *Liste de paires de valeurs réelles*. Cette clé permet de définir des bornes - supérieure et inférieure pour chaque variable d'état optimisée. Les bornes - doivent être données par une liste de liste de paires de bornes + *Liste de paires de valeurs réelles*. Cette clé permet de définir des paires + de bornes supérieure et inférieure pour chaque variable d'état optimisée. Les + bornes doivent être données par une liste de liste de paires de bornes inférieure/supérieure pour chaque variable, avec une valeur ``None`` chaque fois qu'il n'y a pas de borne. Les bornes peuvent toujours être spécifiées, mais seuls les optimiseurs sous contraintes les prennent en compte. diff --git a/doc/fr/snippets/BoxBounds.rst b/doc/fr/snippets/BoxBounds.rst index 068f46f..45c4ef0 100644 --- a/doc/fr/snippets/BoxBounds.rst +++ b/doc/fr/snippets/BoxBounds.rst @@ -1,13 +1,13 @@ .. index:: single: BoxBounds BoxBounds - *Liste de paires de valeurs réelles*. Cette clé permet de définir des bornes - supérieure et inférieure pour chaque incrément de variable d'état optimisée - (et non pas chaque variable d'état elle-même). Les bornes doivent être - données par une liste de liste de paires de bornes inférieure/supérieure pour - chaque incrément de variable, avec une valeur extrême chaque fois qu'il n'y a - pas de borne (``None`` n'est pas une valeur autorisée lorsqu'il n'y a pas de - borne). Cette clé est requise et il n'y a pas de valeurs par défaut. + *Liste de paires de valeurs réelles*. Cette clé permet de définir des paires + de bornes supérieure et inférieure pour chaque incrément de variable d'état + optimisée (et non pas chaque variable d'état elle-même). Les bornes doivent + être données par une liste de liste de paires de bornes inférieure/supérieure + pour chaque incrément de variable, avec une valeur extrême chaque fois qu'il + n'y a pas de borne (``None`` n'est pas une valeur autorisée lorsqu'il n'y a + pas de borne). Cette clé est requise et il n'y a pas de valeurs par défaut. Exemple : ``{"BoxBounds":[[-0.5,0.5], [0.01,2.], [0.,1.e99], [-1.e99,1.e99]]}`` diff --git a/doc/fr/snippets/StateBoundsForQuantilesWithNone.rst b/doc/fr/snippets/StateBoundsForQuantilesWithNone.rst new file mode 100644 index 0000000..45b3829 --- /dev/null +++ b/doc/fr/snippets/StateBoundsForQuantilesWithNone.rst @@ -0,0 +1,19 @@ +.. index:: single: StateBoundsForQuantiles + +StateBoundsForQuantiles + *Liste de paires de valeurs réelles*. Cette clé permet de définir des paires + de bornes supérieure et inférieure pour chaque variable d'état utilisée dans + la simulation des quantiles. Les bornes doivent être données par une liste de + liste de paires de bornes inférieure/supérieure pour chaque variable, avec + une valeur ``None`` chaque fois qu'il n'y a pas de borne. + + En l'absence de définition de ces bornes pour la simulation des quantiles et + si des bornes d'optimisation sont définies, ce sont ces dernières qui sont + utilisées pour la simulation des quantiles. Si ces bornes pour la simulation + des quantiles sont définies, elles sont utilisées quelles que soient les + bornes d'optimisation définies. Si cette variable est définie à ``None``, + alors aucune borne n'est utilisée pour les états utilisés dans la simulation + des quantiles quelles que soient les bornes d'optimisation définies. + + Exemple : + ``{"StateBoundsForQuantiles":[[2.,5.],[1.e-2,10.],[-30.,None],[None,None]]}`` diff --git a/src/daComposant/daAlgorithms/3DVAR.py b/src/daComposant/daAlgorithms/3DVAR.py index 3879f39..cdc2aee 100644 --- a/src/daComposant/daAlgorithms/3DVAR.py +++ b/src/daComposant/daAlgorithms/3DVAR.py @@ -170,16 +170,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): message = "Liste des paires de bornes", ) self.defineRequiredParameter( # Pas de type - name = "QBounds", + name = "StateBoundsForQuantiles", message = "Liste des paires de bornes pour les états utilisés en estimation des quantiles", ) - self.defineRequiredParameter( - name = "ConstrainedBy", - default = "EstimateProjection", - typecast = str, - message = "Prise en compte des contraintes", - listval = ["EstimateProjection"], - ) self.defineRequiredParameter( name = "InitializationPoint", typecast = numpy.ravel, diff --git a/src/daComposant/daAlgorithms/Blue.py b/src/daComposant/daAlgorithms/Blue.py index 006873e..e14ef3f 100644 --- a/src/daComposant/daAlgorithms/Blue.py +++ b/src/daComposant/daAlgorithms/Blue.py @@ -96,16 +96,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): listval = ["Linear", "NonLinear"] ) self.defineRequiredParameter( # Pas de type - name = "QBounds", + name = "StateBoundsForQuantiles", message = "Liste des paires de bornes pour les états utilisés en estimation des quantiles", ) - self.defineRequiredParameter( - name = "ConstrainedBy", - default = "EstimateProjection", - typecast = str, - message = "Prise en compte des contraintes", - listval = ["EstimateProjection"], - ) self.requireInputArguments( mandatory= ("Xb", "Y", "HO", "R", "B"), ) diff --git a/src/daComposant/daAlgorithms/ExtendedBlue.py b/src/daComposant/daAlgorithms/ExtendedBlue.py index 60aa9a4..5b1deee 100644 --- a/src/daComposant/daAlgorithms/ExtendedBlue.py +++ b/src/daComposant/daAlgorithms/ExtendedBlue.py @@ -96,16 +96,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): listval = ["Linear", "NonLinear"] ) self.defineRequiredParameter( # Pas de type - name = "QBounds", + name = "StateBoundsForQuantiles", message = "Liste des paires de bornes pour les états utilisés en estimation des quantiles", ) - self.defineRequiredParameter( - name = "ConstrainedBy", - default = "EstimateProjection", - typecast = str, - message = "Prise en compte des contraintes", - listval = ["EstimateProjection"], - ) self.requireInputArguments( mandatory= ("Xb", "Y", "HO", "R", "B"), ) diff --git a/src/daComposant/daCore/BasicObjects.py b/src/daComposant/daCore/BasicObjects.py index 80d682d..1761666 100644 --- a/src/daComposant/daCore/BasicObjects.py +++ b/src/daComposant/daCore/BasicObjects.py @@ -768,7 +768,7 @@ class Algorithm(object): logging.debug("%s Bounds taken into account"%(self._name,)) else: self._parameters["Bounds"] = None - if ("QBounds" in self._parameters) and isinstance(self._parameters["QBounds"], (list, tuple)) and (len(self._parameters["QBounds"]) > 0): + if ("StateBoundsForQuantiles" in self._parameters) and isinstance(self._parameters["StateBoundsForQuantiles"], (list, tuple)) and (len(self._parameters["StateBoundsForQuantiles"]) > 0): logging.debug("%s Bounds for quantiles states taken into account"%(self._name,)) # Attention : contrairement à Bounds, pas de défaut à None, sinon on ne peut pas être sans bornes # @@ -1398,11 +1398,11 @@ class AlgorithmAndParameters(object): raise ValueError("The number \"%s\" of bound pairs for the state (X) components is different of the size \"%s\" of the state itself." \ %(len(self.__P["Bounds"]),max(__Xb_shape))) # - if ("QBounds" in self.__P) \ - and (isinstance(self.__P["QBounds"], list) or isinstance(self.__P["QBounds"], tuple)) \ - and (len(self.__P["QBounds"]) != max(__Xb_shape)): + if ("StateBoundsForQuantiles" in self.__P) \ + and (isinstance(self.__P["StateBoundsForQuantiles"], list) or isinstance(self.__P["StateBoundsForQuantiles"], tuple)) \ + and (len(self.__P["StateBoundsForQuantiles"]) != max(__Xb_shape)): raise ValueError("The number \"%s\" of bound pairs for the quantile state (X) components is different of the size \"%s\" of the state itself." \ - %(len(self.__P["QBounds"]),max(__Xb_shape))) + %(len(self.__P["StateBoundsForQuantiles"]),max(__Xb_shape))) # return 1 diff --git a/src/daComposant/daCore/NumericObjects.py b/src/daComposant/daCore/NumericObjects.py index 737180a..be1b8b9 100644 --- a/src/daComposant/daCore/NumericObjects.py +++ b/src/daComposant/daCore/NumericObjects.py @@ -650,8 +650,12 @@ def QuantilesEstimations(selfA, A, Xa, HXa = None, Hm = None, HtM = None): nbsamples = selfA._parameters["NumberOfSamplesForQuantiles"] # # Traitement des bornes - if "QBounds" in selfA._parameters: LBounds = selfA._parameters["QBounds"] # Prioritaire - else: LBounds = selfA._parameters["Bounds"] # Défaut raisonnable + if "StateBoundsForQuantiles" in selfA._parameters: + LBounds = selfA._parameters["StateBoundsForQuantiles"] # Prioritaire + elif "Bounds" in selfA._parameters: + LBounds = selfA._parameters["Bounds"] # Défaut raisonnable + else: + LBounds = None if LBounds is not None: def NoneRemove(paire): bmin, bmax = paire @@ -668,7 +672,7 @@ def QuantilesEstimations(selfA, A, Xa, HXa = None, Hm = None, HtM = None): for i in range(nbsamples): if selfA._parameters["SimulationForQuantiles"] == "Linear" and HtM is not None: dXr = numpy.matrix(numpy.random.multivariate_normal(numpy.ravel(Xa),A) - numpy.ravel(Xa)).T - if LBounds is not None and selfA._parameters["ConstrainedBy"] == "EstimateProjection": + if LBounds is not None: # "EstimateProjection" par défaut dXr = numpy.max(numpy.hstack((dXr,LBounds[:,0]) - Xa),axis=1) dXr = numpy.min(numpy.hstack((dXr,LBounds[:,1]) - Xa),axis=1) dYr = numpy.matrix(numpy.ravel( HtM * dXr )).T @@ -676,7 +680,7 @@ def QuantilesEstimations(selfA, A, Xa, HXa = None, Hm = None, HtM = None): if selfA._toStore("SampledStateForQuantiles"): Xr = Xa + dXr elif selfA._parameters["SimulationForQuantiles"] == "NonLinear" and Hm is not None: Xr = numpy.matrix(numpy.random.multivariate_normal(numpy.ravel(Xa),A)).T - if LBounds is not None and selfA._parameters["ConstrainedBy"] == "EstimateProjection": + if LBounds is not None: # "EstimateProjection" par défaut Xr = numpy.max(numpy.hstack((Xr,LBounds[:,0])),axis=1) Xr = numpy.min(numpy.hstack((Xr,LBounds[:,1])),axis=1) Yr = numpy.matrix(numpy.ravel( Hm( Xr ) )).T -- 2.39.2