From 3f20d37f8c58f8852b750c5fcb22e903d1920364 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Wed, 11 Jul 2012 10:39:51 +0200 Subject: [PATCH] Adding a flag to avoid storing internal variables --- src/daComposant/daAlgorithms/3DVAR.py | 29 ++++++++++++++----- .../daAlgorithms/NonLinearLeastSquares.py | 23 +++++++++++---- src/daComposant/daCore/AssimilationStudy.py | 1 + src/daComposant/daCore/Persistence.py | 24 +++++++-------- 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/src/daComposant/daAlgorithms/3DVAR.py b/src/daComposant/daAlgorithms/3DVAR.py index 896bced..9cdced7 100644 --- a/src/daComposant/daAlgorithms/3DVAR.py +++ b/src/daComposant/daAlgorithms/3DVAR.py @@ -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 ) diff --git a/src/daComposant/daAlgorithms/NonLinearLeastSquares.py b/src/daComposant/daAlgorithms/NonLinearLeastSquares.py index 03cf56b..3709224 100644 --- a/src/daComposant/daAlgorithms/NonLinearLeastSquares.py +++ b/src/daComposant/daAlgorithms/NonLinearLeastSquares.py @@ -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)) diff --git a/src/daComposant/daCore/AssimilationStudy.py b/src/daComposant/daCore/AssimilationStudy.py index 70ec582..d1aa281 100644 --- a/src/daComposant/daCore/AssimilationStudy.py +++ b/src/daComposant/daCore/AssimilationStudy.py @@ -827,6 +827,7 @@ class AssimilationStudy: self.__algorithmFile = None self.__diagnosticFile = None self.__H = {} + self.__M = {} # ============================================================================== if __name__ == "__main__": diff --git a/src/daComposant/daCore/Persistence.py b/src/daComposant/daCore/Persistence.py index eed3626..1e83433 100644 --- a/src/daComposant/daCore/Persistence.py +++ b/src/daComposant/daCore/Persistence.py @@ -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", -- 2.39.2