]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Improvement and documentation of state initialization
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Sun, 28 Feb 2021 12:13:43 +0000 (13:13 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Sun, 28 Feb 2021 12:14:45 +0000 (13:14 +0100)
doc/en/snippets/InitializationPoint.rst
doc/fr/snippets/InitializationPoint.rst
src/daComposant/daAlgorithms/4DVAR.py
src/daComposant/daAlgorithms/NonLinearLeastSquares.py
src/daComposant/daAlgorithms/QuantileRegression.py
src/daComposant/daCore/BasicObjects.py
src/daComposant/daCore/NumericObjects.py
src/daComposant/daCore/Persistence.py

index 3c8f35620aee8e4d74a669c829eefb7507f72c31..e9b1594b07f256338552db863002cdc390e092a2 100644 (file)
@@ -3,9 +3,9 @@
 InitializationPoint
   *Vector*. The variable specifies one vector to be used as the initial state
   around which an iterative algorithm starts. By default, this initial state is
-  not required and is equal to the background :math:`\mathbf{x}^b`. If
-  provided, it replaces the background only for initialization. Its value must
-  allow to build a vector of the same size as the background.
+  not required and is equal to the background :math:`\mathbf{x}^b`. Its value
+  must allow to build a vector of the same size as the background. If provided,
+  it replaces the background only for initialization.
 
   Example :
   ``{"InitializationPoint":[1, 2, 3, 4, 5]}``
index 385df56d93e676a2a6c5556885d0e028e31c326e..054826f094ceb64f05fdb4bd3f11d690d0f7d219 100644 (file)
@@ -4,9 +4,9 @@ InitializationPoint
   *Vecteur*. La variable désigne un vecteur à utiliser comme l'état initial
   autour duquel démarre un algorithme itératif. Par défaut, cet état initial
   n'a pas besoin d'être fourni et il est égal à l'ébauche :math:`\mathbf{x}^b`.
-  Dans le cas où il est fourni, il ne remplace l'ébauche que pour
-  l'initialisation. Sa valeur doit permettre de construire un vecteur de taille
-  identique à l'ébauche.
+  Sa valeur doit permettre de construire un vecteur de taille identique à
+  l'ébauche. Dans le cas où il est fourni, il ne remplace l'ébauche que pour
+  l'initialisation.
 
   Exemple :
   ``{"InitializationPoint":[1, 2, 3, 4, 5]}``
index bf7bd8e351de1c8d6195133ccaf0ebdedbd1f612..75aeff340f96ccf3e7e379f72dc690d2cfa8f6ec 100644 (file)
@@ -267,15 +267,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Point de démarrage de l'optimisation
         # ------------------------------------
-        if self._parameters["InitializationPoint"] is not None:
-            __ipt = numpy.ravel(self._parameters["InitializationPoint"])
-            if __ipt.size != numpy.ravel(Xb).size:
-                raise ValueError("Incompatible size %i of forced initial point to replace the Xb of size %i" \
-                    %(__ipt.size,numpy.ravel(Xb).size))
-            else:
-                Xini = __ipt
-        else:
-            Xini = numpy.ravel(Xb)
+        Xini = self._parameters["InitializationPoint"]
         #
         # Minimisation de la fonctionnelle
         # --------------------------------
index 54c03361a700b13140350270a4ec107a2455e0f7..65b6fe413a172577856cf1f3915cc16aac453ba5 100644 (file)
@@ -101,6 +101,11 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             name     = "Bounds",
             message  = "Liste des valeurs de bornes",
             )
+        self.defineRequiredParameter(
+            name     = "InitializationPoint",
+            typecast = numpy.ravel,
+            message  = "État initial imposé (par défaut, c'est l'ébauche si None)",
+            )
         self.requireInputArguments(
             mandatory= ("Xb", "Y", "HO", "R"),
             )
@@ -223,7 +228,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Point de démarrage de l'optimisation : Xini = Xb
         # ------------------------------------
-        Xini = numpy.ravel(Xb)
+        Xini = self._parameters["InitializationPoint"]
         #
         # Minimisation de la fonctionnelle
         # --------------------------------
index 36f4e061e2637814283eeb7f763322f70b20faac..37ea503c12e8fdd1dd2a61e0a86715b38bd46dc3 100644 (file)
@@ -147,15 +147,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Point de démarrage de l'optimisation
         # ------------------------------------
-        if self._parameters["InitializationPoint"] is not None:
-            __ipt = numpy.ravel(self._parameters["InitializationPoint"])
-            if __ipt.size != numpy.ravel(Xb).size:
-                raise ValueError("Incompatible size %i of forced initial point to replace the Xb of size %i" \
-                    %(__ipt.size,numpy.ravel(Xb).size))
-            else:
-                Xini = __ipt
-        else:
-            Xini = numpy.ravel(Xb)
+        Xini = self._parameters["InitializationPoint"]
         #
         # Minimisation de la fonctionnelle
         # --------------------------------
index 3143c8bfc6e0cde402b52b8028af930992872d83..66e9ab9bee1baf7767e5c0ee234dd47e9057fc49 100644 (file)
@@ -764,6 +764,19 @@ class Algorithm(object):
         else:
             self._parameters["Bounds"] = None
         #
+        # Corrections et compléments de l'initialisation en X
+        if  "InitializationPoint" in self._parameters:
+            if Xb is not None:
+                if self._parameters["InitializationPoint"] is not None and hasattr(self._parameters["InitializationPoint"],'size'):
+                    if self._parameters["InitializationPoint"].size != numpy.ravel(Xb).size:
+                        raise ValueError("Incompatible size %i of forced initial point that have to replace the background of size %i" \
+                            %(self._parameters["InitializationPoint"].size,numpy.ravel(Xb).size))
+                    # Obtenu par typecast : numpy.ravel(self._parameters["InitializationPoint"])
+                else:
+                    self._parameters["InitializationPoint"] = numpy.ravel(Xb)
+            else:
+                if self._parameters["InitializationPoint"] is None:
+                    raise ValueError("Forced initial point can not be set without any given Background or required value")
         if logging.getLogger().level < logging.WARNING:
             self._parameters["optiprint"], self._parameters["optdisp"] = 1, 1
             if PlatformInfo.has_scipy:
index 253e382460817ffade92a9039cca09d6a3cd347c..ba218365f0a14a2b0474b874b81dda1b4714ec8a 100644 (file)
@@ -684,13 +684,7 @@ def std3dvar(selfA, Xb, Y, U, HO, EM, CM, R, B, Q):
     #
     # Point de démarrage de l'optimisation
     # ------------------------------------
-    if selfA._parameters["InitializationPoint"] is not None:
-        Xini = numpy.ravel(selfA._parameters["InitializationPoint"])
-        if Xini.size != numpy.ravel(Xb).size:
-            raise ValueError("Incompatible size %i of forced initial point to replace the Xb of size %i" \
-                %(Xini.size,numpy.ravel(Xb).size))
-    else:
-        Xini = numpy.ravel(Xb)
+    Xini = selfA._parameters["InitializationPoint"]
     #
     # Définition de la fonction-coût
     # ------------------------------
@@ -1235,13 +1229,7 @@ def incr3dvar(selfA, Xb, Y, U, HO, EM, CM, R, B, Q):
     RI = R.getI()
     #
     # Point de démarrage de l'optimisation
-    if selfA._parameters["InitializationPoint"] is not None:
-        Xini = numpy.ravel(selfA._parameters["InitializationPoint"])
-        if Xini.size != numpy.ravel(Xb).size:
-            raise ValueError("Incompatible size %i of forced initial point to replace the Xb of size %i" \
-                %(Xini.size,numpy.ravel(Xb).size))
-    else:
-        Xini = numpy.ravel(Xb)
+    Xini = selfA._parameters["InitializationPoint"]
     #
     HXb = numpy.asmatrix(numpy.ravel( Hm( Xb ) )).T
     Innovation = Y - HXb
@@ -1251,7 +1239,7 @@ def incr3dvar(selfA, Xb, Y, U, HO, EM, CM, R, B, Q):
     iOuter = 0
     J      = 1./mpr
     DeltaJ = 1./mpr
-    Xr     = Xini[:,None]
+    Xr     = Xini.reshape((-1,1))
     while abs(DeltaJ) >= selfA._parameters["CostDecrementTolerance"] and iOuter <= selfA._parameters["MaximumNumberOfSteps"]:
         #
         # Inner Loop
index 0cf2b71631b76e717b9ddcd5044afdc8e9a50b10..08a3a63673bb678f8b2e349de4acba747f237e43 100644 (file)
@@ -718,8 +718,8 @@ class OneMatrix(Persistence):
 
 class OneList(Persistence):
     """
-    Classe de stockage d'une liste de valeurs hétérogènes (list) par pas. Ne pas
-    utiliser cette classe pour des données numériques homogènes, mais
+    Classe de stockage d'une liste de valeurs hétérogènes (list) par pas. Ne
+    pas utiliser cette classe pour des données numériques homogènes, mais
     "OneVector".
     """
     def __init__(self, name="", unit="", basetype = list):
@@ -733,8 +733,8 @@ class OneNoType(Persistence):
     """
     Classe de stockage d'un objet sans modification (cast) de type. Attention,
     selon le véritable type de l'objet stocké à chaque pas, les opérations
-    arithmétiques à base de numpy peuvent être invalides ou donner des résultats
-    inattendus. Cette classe n'est donc à utiliser qu'à bon escient
+    arithmétiques à base de numpy peuvent être invalides ou donner des
+    résultats inattendus. Cette classe n'est donc à utiliser qu'à bon escient
     volontairement, et pas du tout par défaut.
     """
     def __init__(self, name="", unit="", basetype = NoType):
@@ -753,9 +753,9 @@ class CompositePersistence(object):
         """
         name : nom courant
 
-        La gestion interne des données est exclusivement basée sur les variables
-        initialisées ici (qui ne sont pas accessibles depuis l'extérieur des
-        objets comme des attributs) :
+        La gestion interne des données est exclusivement basée sur les
+        variables initialisées ici (qui ne sont pas accessibles depuis
+        l'extérieur des objets comme des attributs) :
         __StoredObjects : objets de type persistence collectés dans cet objet
         """
         self.__name = str(name)
@@ -791,8 +791,8 @@ class CompositePersistence(object):
 
     def add_object(self, name=None, persistenceType=Persistence, basetype=None ):
         """
-        Ajoute dans les objets stockables un nouvel objet défini par son nom, son
-        type de Persistence et son type de base à chaque pas.
+        Ajoute dans les objets stockables un nouvel objet défini par son nom,
+        son type de Persistence et son type de base à chaque pas.
         """
         if name is None: raise ValueError("Object name is required for adding an object.")
         if name in self.__StoredObjects.keys():