]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Adding a flag to avoid storing internal variables
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 11 Jul 2012 08:39:51 +0000 (10:39 +0200)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 11 Jul 2012 08:39:51 +0000 (10:39 +0200)
src/daComposant/daAlgorithms/3DVAR.py
src/daComposant/daAlgorithms/NonLinearLeastSquares.py
src/daComposant/daCore/AssimilationStudy.py
src/daComposant/daCore/Persistence.py

index 896bceddf2ca7c7da2486477e1a88d322de61bba..9cdced7d0b1910aef90f71a8c492fa53da07a41d 100644 (file)
@@ -78,6 +78,12 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             typecast = bool,
             message  = "Calcul de la covariance a posteriori",
             )
+        self.defineRequiredParameter(
+            name     = "StoreInternalVariables",
+            default  = False,
+            typecast = bool,
+            message  = "Stockage des variables internes ou intermédiaires du calcul",
+            )
 
     def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
         """
@@ -96,6 +102,10 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         else:
             Bounds = None
         #
+        # Correction pour pallier a un bug de TNC sur le retour du Minimum
+        if self._parameters.has_key("Minimizer") is "TNC":
+            self.setParameterValue("StoreInternalVariables",True)
+        #
         # Opérateur d'observation
         # -----------------------
         Hm = H["Direct"].appliedTo
@@ -149,7 +159,8 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             logging.debug("%s CostFunction Jb = %s"%(self._name, Jb))
             logging.debug("%s CostFunction Jo = %s"%(self._name, Jo))
             logging.debug("%s CostFunction J  = %s"%(self._name, J))
-            self.StoredVariables["CurrentState"].store( _X.A1 )
+            if self._parameters["StoreInternalVariables"]:
+                self.StoredVariables["CurrentState"].store( _X.A1 )
             self.StoredVariables["CostFunctionJb"].store( Jb )
             self.StoredVariables["CostFunctionJo"].store( Jo )
             self.StoredVariables["CostFunctionJ" ].store( J )
@@ -240,11 +251,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         else:
             raise ValueError("Error in Minimizer name: %s"%self._parameters["Minimizer"])
         #
-        # Correction pour pallier a un bug de TNC sur le retour du Minimum
-        # ----------------------------------------------------------------
         StepMin = numpy.argmin( self.StoredVariables["CostFunctionJ"].valueserie() )
         MinJ    = self.StoredVariables["CostFunctionJ"].valueserie(step = StepMin)
-        Minimum = self.StoredVariables["CurrentState"].valueserie(step = StepMin)
+        #
+        # Correction pour pallier a un bug de TNC sur le retour du Minimum
+        # ----------------------------------------------------------------
+        if self._parameters["StoreInternalVariables"]:
+            Minimum = self.StoredVariables["CurrentState"].valueserie(step = StepMin)
         #
         logging.debug("%s %s Step of min cost  = %s"%(self._name, self._parameters["Minimizer"], StepMin))
         logging.debug("%s %s Minimum cost      = %s"%(self._name, self._parameters["Minimizer"], MinJ))
@@ -266,9 +279,11 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             Hessienne = []
             nb = len(Xini)
             for i in range(nb):
-                ee = numpy.matrix(numpy.zeros(nb)).T
-                ee[i] = 1.
-                Hessienne.append( ( BI*ee + Ha((Xa,RI*Hm(ee))) ).A1 )
+                _ee    = numpy.matrix(numpy.zeros(nb)).T
+                _ee[i] = 1.
+                _HmEE  = Hm(_ee)
+                _HmEE  = numpy.asmatrix(_HmEE).flatten().T
+                Hessienne.append( ( BI*_ee + Ha((Xa,RI*_HmEE)) ).A1 )
             Hessienne = numpy.matrix( Hessienne )
             A = Hessienne.I
             self.StoredVariables["APosterioriCovariance"].store( A )
index 03cf56bf7202fef2a074a7120c6596cc14104a33..370922478831debc531c946bbf448072b279e5df 100644 (file)
@@ -51,7 +51,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             default  = 15000,
             typecast = int,
             message  = "Nombre maximal de pas d'optimisation",
-            minval   = -1
+            minval   = -1,
             )
         self.defineRequiredParameter(
             name     = "CostDecrementTolerance",
@@ -72,6 +72,12 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             typecast = float,
             message  = "Maximum des composantes du gradient lors de l'arrêt",
             )
+        self.defineRequiredParameter(
+            name     = "StoreInternalVariables",
+            default  = False,
+            typecast = bool,
+            message  = "Stockage des variables internes ou intermédiaires du calcul",
+            )
 
     def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
         """
@@ -91,6 +97,10 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         else:
             Bounds = None
         #
+        # Correction pour pallier a un bug de TNC sur le retour du Minimum
+        if self._parameters.has_key("Minimizer") is "TNC":
+            self.setParameterValue("StoreInternalVariables",True)
+        #
         # Opérateur d'observation
         # -----------------------
         Hm = H["Direct"].appliedTo
@@ -144,7 +154,8 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             logging.debug("%s CostFunction Jb = %s"%(self._name, Jb))
             logging.debug("%s CostFunction Jo = %s"%(self._name, Jo))
             logging.debug("%s CostFunction J  = %s"%(self._name, J))
-            self.StoredVariables["CurrentState"].store( _X.A1 )
+            if self._parameters["StoreInternalVariables"]:
+                self.StoredVariables["CurrentState"].store( _X.A1 )
             self.StoredVariables["CostFunctionJb"].store( Jb )
             self.StoredVariables["CostFunctionJo"].store( Jo )
             self.StoredVariables["CostFunctionJ" ].store( J )
@@ -235,11 +246,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         else:
             raise ValueError("Error in Minimizer name: %s"%self._parameters["Minimizer"])
         #
-        # Correction pour pallier a un bug de TNC sur le retour du Minimum
-        # ----------------------------------------------------------------
         StepMin = numpy.argmin( self.StoredVariables["CostFunctionJ"].valueserie() )
         MinJ    = self.StoredVariables["CostFunctionJ"].valueserie(step = StepMin)
-        Minimum = self.StoredVariables["CurrentState"].valueserie(step = StepMin)
+        #
+        # Correction pour pallier a un bug de TNC sur le retour du Minimum
+        # ----------------------------------------------------------------
+        if self._parameters["StoreInternalVariables"]:
+            Minimum = self.StoredVariables["CurrentState"].valueserie(step = StepMin)
         #
         logging.debug("%s %s Step of min cost  = %s"%(self._name, self._parameters["Minimizer"], StepMin))
         logging.debug("%s %s Minimum cost      = %s"%(self._name, self._parameters["Minimizer"], MinJ))
index 70ec582c4c343df31bca976760f409476ae5965e..d1aa281d779147a10f88c22b6600488501aa76e0 100644 (file)
@@ -827,6 +827,7 @@ class AssimilationStudy:
         self.__algorithmFile = None
         self.__diagnosticFile = None
         self.__H  = {}
+        self.__M  = {}
 
 # ==============================================================================
 if __name__ == "__main__":
index eed3626f7c6abf1e7eede67d6521fc2749c1f573..1e83433ffc75d2b4b10c5de63a06363eb6ed5d9b 100644 (file)
@@ -93,7 +93,7 @@ class Persistence:
         self.__tags.append(   dict(tags))
         self.__tagkeys.update(dict(tags))
         #
-        if self.__dynamic: self.__replot()
+        if self.__dynamic: self.__replots()
         for hook, parameters, scheduler in self.__dataobservers:
             if self.__step in scheduler:
                 hook( self, parameters )
@@ -373,7 +373,7 @@ class Persistence:
         except:
             raise TypeError("Base type is incompatible with numpy")
 
-    def __preplot(self,
+    def __preplots(self,
             title    = "",
             xlabel   = "",
             ylabel   = "",
@@ -409,7 +409,7 @@ class Persistence:
         self.__ltitle = ltitle
         self.__pause  = pause
 
-    def plot(self, item=None, step=None,
+    def plots(self, item=None, step=None,
             steps    = None,
             title    = "",
             xlabel   = "",
@@ -446,9 +446,9 @@ class Persistence:
                          qui est automatiquement complétée par le numéro du
                          fichier calculé par incrément simple de compteur
             - dynamic  : effectue un affichage des valeurs à chaque stockage
-                         (au-delà du second) La méthode "plot" permet de déclarer
-                         l'affichage dynamique, et c'est la méthode "__replot"
-                         qui est utilisée pour l'effectuer
+                         (au-delà du second). La méthode "plots" permet de
+                         déclarer l'affichage dynamique, et c'est la méthode
+                         "__replots" qui est utilisée pour l'effectuer
             - persist  : booléen indiquant que la fenêtre affichée sera
                          conservée lors du passage au dessin suivant
                          Par défaut, persist = False
@@ -458,7 +458,7 @@ class Persistence:
         """
         import os
         if not self.__dynamic:
-            self.__preplot(title, xlabel, ylabel, ltitle, geometry, persist, pause )
+            self.__preplots(title, xlabel, ylabel, ltitle, geometry, persist, pause )
             if dynamic:
                 self.__dynamic = True
                 if len(self.__values) == 0: return 0
@@ -491,7 +491,7 @@ class Persistence:
             if self.__pause:
                 raw_input('Please press return to continue...\n')
 
-    def __replot(self):
+    def __replots(self):
         """
         Affichage dans le cas du suivi dynamique de la variable
         """
@@ -584,7 +584,7 @@ class Persistence:
     # On pourrait aussi utiliser les autres attributs d'une "matrix", comme
     # "tofile", "min"...
 
-    def stepplot(self,
+    def plot(self,
             steps    = None,
             title    = "",
             xlabel   = "",
@@ -1164,7 +1164,7 @@ if __name__ == "__main__":
     D.store(vect2)
     D.store(vect3)
     print "Affichage graphique de l'ensemble du stockage sur une même image"
-    D.stepplot(
+    D.plot(
         title = "Tous les vecteurs",
         filename="vecteurs.ps",
         xlabel = "Axe X",
@@ -1173,7 +1173,7 @@ if __name__ == "__main__":
     print "Stockage d'un quatrième vecteur de longueur différente"
     D.store(vect4)
     print "Affichage graphique séparé du dernier stockage"
-    D.plot(
+    D.plots(
         item  = 3,
         title = "Vecteurs",
         filename = "vecteur",
@@ -1189,7 +1189,7 @@ if __name__ == "__main__":
     print "======> Affichage graphique dynamique d'objets"
     OBJET_DE_TEST = Persistence("My object", unit="", basetype=float)
     D = OBJET_DE_TEST
-    D.plot(
+    D.plots(
         dynamic = True,
         title   = "Valeur suivie",
         xlabel  = "Pas",