]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Improvement and documentation of state initialization
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Thu, 11 Feb 2021 20:02:03 +0000 (21:02 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Thu, 11 Feb 2021 20:02:03 +0000 (21:02 +0100)
doc/en/ref_algorithm_3DVAR.rst
doc/en/ref_algorithm_4DVAR.rst
doc/en/snippets/InitializationPoint.rst [new file with mode: 0644]
doc/fr/ref_algorithm_3DVAR.rst
doc/fr/ref_algorithm_4DVAR.rst
doc/fr/snippets/InitializationPoint.rst [new file with mode: 0644]
src/daComposant/daAlgorithms/3DVAR.py
src/daComposant/daAlgorithms/4DVAR.py
src/daComposant/daCore/Aidsm.py

index 1c85c0b0552a6d526973480be16e4b0606476643..ba85aca17a68d9979198e6a06697fe61f69027b0 100644 (file)
@@ -60,6 +60,8 @@ which is usually designed as the "*3D-VAR*" function (see for example
 
 .. include:: snippets/GradientNormTolerance.rst
 
+.. include:: snippets/InitializationPoint.rst
+
 .. include:: snippets/MaximumNumberOfSteps.rst
 
 .. include:: snippets/Minimizer_xDVAR.rst
index 1ae07cf83993b8607075e78041a96cdd49797e8d..f5a0f68682654bd2f9dd6e3dbe75b584078219b3 100644 (file)
@@ -75,6 +75,8 @@ filters, specially the :ref:`section_ref_algorithm_ExtendedKalmanFilter` or the
 
 .. include:: snippets/GradientNormTolerance.rst
 
+.. include:: snippets/InitializationPoint.rst
+
 .. include:: snippets/MaximumNumberOfSteps.rst
 
 .. include:: snippets/Minimizer_xDVAR.rst
diff --git a/doc/en/snippets/InitializationPoint.rst b/doc/en/snippets/InitializationPoint.rst
new file mode 100644 (file)
index 0000000..5a949e7
--- /dev/null
@@ -0,0 +1,8 @@
+.. index:: single: InitializationPoint
+
+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.
index b385f8c0ae086a3acdc55e5c79f1c1bc802bb415..4bb750eb8489e9b3718372ad626d26ed8464efad 100644 (file)
@@ -61,6 +61,8 @@ qui est usuellement désignée comme la fonctionnelle "*3D-VAR*" (voir par exemp
 
 .. include:: snippets/GradientNormTolerance.rst
 
+.. include:: snippets/InitializationPoint.rst
+
 .. include:: snippets/MaximumNumberOfSteps.rst
 
 .. include:: snippets/Minimizer_xDVAR.rst
index 9b25c4c8ce53bf84855d3e08be87ca3139bea2da..052e532050f5dbab5cdff2ad7c975ab20ba8c78b 100644 (file)
@@ -76,6 +76,8 @@ l':ref:`section_ref_algorithm_UnscentedKalmanFilter`.
 
 .. include:: snippets/GradientNormTolerance.rst
 
+.. include:: snippets/InitializationPoint.rst
+
 .. include:: snippets/MaximumNumberOfSteps.rst
 
 .. include:: snippets/Minimizer_xDVAR.rst
diff --git a/doc/fr/snippets/InitializationPoint.rst b/doc/fr/snippets/InitializationPoint.rst
new file mode 100644 (file)
index 0000000..12236bc
--- /dev/null
@@ -0,0 +1,9 @@
+.. index:: single: InitializationPoint
+
+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.
index 7848a37015232faaa3d161ac93b5cfcc70c8f936..3b9c397609b7c9fa98d0fb858f51732fb727fae8 100644 (file)
@@ -138,6 +138,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", "B" ),
             )
@@ -236,9 +241,17 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             GradJ   = numpy.asmatrix( numpy.ravel( GradJb ) + numpy.ravel( GradJo ) ).T
             return GradJ.A1
         #
-        # Point de démarrage de l'optimisation : Xini = Xb
+        # Point de démarrage de l'optimisation
         # ------------------------------------
-        Xini = numpy.ravel(Xb)
+        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)
         #
         # Minimisation de la fonctionnelle
         # --------------------------------
index ef64a6e9866d03a509adc06f138638a605ede3b9..bf7bd8e351de1c8d6195133ccaf0ebdedbd1f612 100644 (file)
@@ -107,6 +107,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", "EM", "R", "B" ),
             optional = ("U", "CM"),
@@ -260,12 +265,17 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             GradJ = numpy.ravel( GradJb ) - numpy.ravel( GradJo )
             return GradJ
         #
-        # Point de démarrage de l'optimisation : Xini = Xb
+        # Point de démarrage de l'optimisation
         # ------------------------------------
-        if isinstance(Xb, type(numpy.matrix([]))):
-            Xini = Xb.A1.tolist()
+        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 = list(Xb)
+            Xini = numpy.ravel(Xb)
         #
         # Minimisation de la fonctionnelle
         # --------------------------------
index 6281c84afb03c8779b69acf7635dcdde5f486625..a981db1b3330e1a1e0e4af1020af85a952e71c4e 100644 (file)
@@ -507,12 +507,14 @@ class Aidsm(object):
             Parameters = None,
             Script     = None):
         "Mise a jour d'un concept de calcul"
-        if "AlgorithmParameters" not in self.__adaoObject or self.__adaoObject["AlgorithmParameters"] is None:
+        Concept = "AlgorithmParameters"
+        if Concept not in self.__adaoObject or self.__adaoObject[Concept] is None:
             raise ValueError("\n\nNo algorithm registred, set one before updating parameters or executing\n")
-        self.__adaoObject["AlgorithmParameters"].updateParameters(
+        self.__adaoObject[Concept].updateParameters(
             asDict        = Parameters,
             asScript      = self.__with_directory(Script),
             )
+        # RaJ du register
         return 0
 
     def setRegulationParameters(self,