From 645aebaf1aeb203ec7c72edbdaf39cb12e4fca0e Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Thu, 29 Jun 2017 23:48:06 +0200 Subject: [PATCH] Internal tests improvements and version update --- bin/module_version.py | 2 +- resources/SalomeApp.xml | 4 +-- src/daComposant/daAlgorithms/3DVAR.py | 2 +- src/daComposant/daAlgorithms/4DVAR.py | 2 +- src/daComposant/daAlgorithms/AdjointTest.py | 2 +- src/daComposant/daAlgorithms/Blue.py | 2 +- .../DerivativeFreeOptimization.py | 2 +- src/daComposant/daAlgorithms/EnsembleBlue.py | 2 +- src/daComposant/daAlgorithms/ExtendedBlue.py | 2 +- .../daAlgorithms/ExtendedKalmanFilter.py | 2 +- src/daComposant/daAlgorithms/FunctionTest.py | 2 +- src/daComposant/daAlgorithms/GradientTest.py | 2 +- src/daComposant/daAlgorithms/KalmanFilter.py | 2 +- .../daAlgorithms/LinearLeastSquares.py | 4 +-- src/daComposant/daAlgorithms/LinearityTest.py | 4 +-- .../daAlgorithms/NonLinearLeastSquares.py | 2 +- src/daComposant/daAlgorithms/ObserverTest.py | 2 +- .../daAlgorithms/ParticleSwarmOptimization.py | 2 +- .../daAlgorithms/QuantileRegression.py | 2 +- src/daComposant/daAlgorithms/SamplingTest.py | 2 +- src/daComposant/daAlgorithms/TabuSearch.py | 2 +- src/daComposant/daAlgorithms/TangentTest.py | 2 +- .../daAlgorithms/UnscentedKalmanFilter.py | 2 +- src/daComposant/daCore/BasicObjects.py | 26 ++++++++++++++----- src/daComposant/daCore/version.py | 4 +-- 25 files changed, 47 insertions(+), 35 deletions(-) diff --git a/bin/module_version.py b/bin/module_version.py index bb12920..362dbc6 100644 --- a/bin/module_version.py +++ b/bin/module_version.py @@ -23,6 +23,6 @@ # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D name = "ADAO" -version = "V8_3_0" # Version pour catalogue, avec des "_" entre les numeros +version = "V8_4_0" # Version pour catalogue, avec des "_" entre les numeros date = "" year = "2017" # Annee de copyright diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index 66533b1..198b61e 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com - + Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D --> @@ -28,7 +28,7 @@ - +
diff --git a/src/daComposant/daAlgorithms/3DVAR.py b/src/daComposant/daAlgorithms/3DVAR.py index 1424005..852a2a0 100644 --- a/src/daComposant/daAlgorithms/3DVAR.py +++ b/src/daComposant/daAlgorithms/3DVAR.py @@ -110,7 +110,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # # Correction pour pallier a un bug de TNC sur le retour du Minimum if "Minimizer" in self._parameters and self._parameters["Minimizer"] == "TNC": diff --git a/src/daComposant/daAlgorithms/4DVAR.py b/src/daComposant/daAlgorithms/4DVAR.py index ebeea0b..ca35410 100644 --- a/src/daComposant/daAlgorithms/4DVAR.py +++ b/src/daComposant/daAlgorithms/4DVAR.py @@ -98,7 +98,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # # Correction pour pallier a un bug de TNC sur le retour du Minimum if "Minimizer" in self._parameters and self._parameters["Minimizer"] == "TNC": diff --git a/src/daComposant/daAlgorithms/AdjointTest.py b/src/daComposant/daAlgorithms/AdjointTest.py index 888e1c5..3801641 100644 --- a/src/daComposant/daAlgorithms/AdjointTest.py +++ b/src/daComposant/daAlgorithms/AdjointTest.py @@ -82,7 +82,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Direct"].appliedTo Ht = HO["Tangent"].appliedInXTo diff --git a/src/daComposant/daAlgorithms/Blue.py b/src/daComposant/daAlgorithms/Blue.py index d621343..8ffcdfb 100644 --- a/src/daComposant/daAlgorithms/Blue.py +++ b/src/daComposant/daAlgorithms/Blue.py @@ -73,7 +73,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Tangent"].asMatrix(Xb) Hm = Hm.reshape(Y.size,Xb.size) # ADAO & check shape diff --git a/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py b/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py index 4781070..548c25f 100644 --- a/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py +++ b/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py @@ -94,7 +94,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # if not PlatformInfo.has_nlopt and not self._parameters["Minimizer"] in ["COBYLA", "POWELL", "SIMPLEX"]: logging.debug("%s Absence de NLopt, utilisation forcee du minimiseur SIMPLEX"%(self._name,)) diff --git a/src/daComposant/daAlgorithms/EnsembleBlue.py b/src/daComposant/daAlgorithms/EnsembleBlue.py index 7c085a3..1cc80cd 100644 --- a/src/daComposant/daAlgorithms/EnsembleBlue.py +++ b/src/daComposant/daAlgorithms/EnsembleBlue.py @@ -51,7 +51,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # # Précalcul des inversions de B et R # ---------------------------------- diff --git a/src/daComposant/daAlgorithms/ExtendedBlue.py b/src/daComposant/daAlgorithms/ExtendedBlue.py index 9271629..5dbfd80 100644 --- a/src/daComposant/daAlgorithms/ExtendedBlue.py +++ b/src/daComposant/daAlgorithms/ExtendedBlue.py @@ -73,7 +73,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Tangent"].asMatrix(Xb) Hm = Hm.reshape(Y.size,Xb.size) # ADAO & check shape diff --git a/src/daComposant/daAlgorithms/ExtendedKalmanFilter.py b/src/daComposant/daAlgorithms/ExtendedKalmanFilter.py index 66a6fcd..0282920 100644 --- a/src/daComposant/daAlgorithms/ExtendedKalmanFilter.py +++ b/src/daComposant/daAlgorithms/ExtendedKalmanFilter.py @@ -65,7 +65,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # if self._parameters["EstimationOf"] == "Parameters": self._parameters["StoreInternalVariables"] = True diff --git a/src/daComposant/daAlgorithms/FunctionTest.py b/src/daComposant/daAlgorithms/FunctionTest.py index 4b1adbd..4b80e28 100644 --- a/src/daComposant/daAlgorithms/FunctionTest.py +++ b/src/daComposant/daAlgorithms/FunctionTest.py @@ -70,7 +70,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Direct"].appliedTo # diff --git a/src/daComposant/daAlgorithms/GradientTest.py b/src/daComposant/daAlgorithms/GradientTest.py index 109088e..03a4352 100644 --- a/src/daComposant/daAlgorithms/GradientTest.py +++ b/src/daComposant/daAlgorithms/GradientTest.py @@ -107,7 +107,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Direct"].appliedTo if self._parameters["ResiduFormula"] in ["Taylor", "TaylorOnNorm"]: diff --git a/src/daComposant/daAlgorithms/KalmanFilter.py b/src/daComposant/daAlgorithms/KalmanFilter.py index 50546eb..d2ec3f1 100644 --- a/src/daComposant/daAlgorithms/KalmanFilter.py +++ b/src/daComposant/daAlgorithms/KalmanFilter.py @@ -54,7 +54,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # if self._parameters["EstimationOf"] == "Parameters": self._parameters["StoreInternalVariables"] = True diff --git a/src/daComposant/daAlgorithms/LinearLeastSquares.py b/src/daComposant/daAlgorithms/LinearLeastSquares.py index e2525dd..31234e6 100644 --- a/src/daComposant/daAlgorithms/LinearLeastSquares.py +++ b/src/daComposant/daAlgorithms/LinearLeastSquares.py @@ -42,11 +42,11 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): listval = ["OMA", "CurrentState", "CostFunctionJ", "CostFunctionJb", "CostFunctionJo", "SimulatedObservationAtCurrentState", "SimulatedObservationAtOptimum"] ) self.requireInputArguments( - mandatory= ("Xb", "Y", "HO", "R"), + mandatory= ("Y", "HO", "R"), ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Tangent"].asMatrix(None) Hm = Hm.reshape(Y.size,-1) # ADAO & check shape diff --git a/src/daComposant/daAlgorithms/LinearityTest.py b/src/daComposant/daAlgorithms/LinearityTest.py index c2464c2..5d59a64 100644 --- a/src/daComposant/daAlgorithms/LinearityTest.py +++ b/src/daComposant/daAlgorithms/LinearityTest.py @@ -85,11 +85,11 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): listval = ["CurrentState", "Residu", "SimulatedObservationAtCurrentState"] ) self.requireInputArguments( - mandatory= ("Xb", "Y", "HO"), + mandatory= ("Xb", "HO"), ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # def RMS(V1, V2): import math diff --git a/src/daComposant/daAlgorithms/NonLinearLeastSquares.py b/src/daComposant/daAlgorithms/NonLinearLeastSquares.py index 5ea90cf..7cd98ae 100644 --- a/src/daComposant/daAlgorithms/NonLinearLeastSquares.py +++ b/src/daComposant/daAlgorithms/NonLinearLeastSquares.py @@ -83,7 +83,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # # Correction pour pallier a un bug de TNC sur le retour du Minimum if "Minimizer" in self._parameters and self._parameters["Minimizer"] == "TNC": diff --git a/src/daComposant/daAlgorithms/ObserverTest.py b/src/daComposant/daAlgorithms/ObserverTest.py index 4ae19ed..cc69237 100644 --- a/src/daComposant/daAlgorithms/ObserverTest.py +++ b/src/daComposant/daAlgorithms/ObserverTest.py @@ -30,7 +30,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): BasicObjects.Algorithm.__init__(self, "OBSERVERTEST") def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) print("Results of observer check on all potential variables or commands,") print(" only activated on selected ones by explicit association.") print("") diff --git a/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py b/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py index 6440817..4103b85 100644 --- a/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py +++ b/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py @@ -102,7 +102,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # if ("BoxBounds" in self._parameters) and isinstance(self._parameters["BoxBounds"], (list, tuple)) and (len(self._parameters["BoxBounds"]) > 0): BoxBounds = self._parameters["BoxBounds"] diff --git a/src/daComposant/daAlgorithms/QuantileRegression.py b/src/daComposant/daAlgorithms/QuantileRegression.py index 0d0cf2a..076f4c2 100644 --- a/src/daComposant/daAlgorithms/QuantileRegression.py +++ b/src/daComposant/daAlgorithms/QuantileRegression.py @@ -78,7 +78,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Direct"].appliedTo # diff --git a/src/daComposant/daAlgorithms/SamplingTest.py b/src/daComposant/daAlgorithms/SamplingTest.py index c94c97a..58c16b1 100644 --- a/src/daComposant/daAlgorithms/SamplingTest.py +++ b/src/daComposant/daAlgorithms/SamplingTest.py @@ -86,7 +86,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Direct"].appliedTo # diff --git a/src/daComposant/daAlgorithms/TabuSearch.py b/src/daComposant/daAlgorithms/TabuSearch.py index 49183b0..46e0424 100644 --- a/src/daComposant/daAlgorithms/TabuSearch.py +++ b/src/daComposant/daAlgorithms/TabuSearch.py @@ -114,7 +114,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # if self._parameters["NoiseDistribution"] == "Uniform": nrange = numpy.ravel(self._parameters["NoiseHalfRange"]) # Vecteur diff --git a/src/daComposant/daAlgorithms/TangentTest.py b/src/daComposant/daAlgorithms/TangentTest.py index bff1e73..9419d05 100644 --- a/src/daComposant/daAlgorithms/TangentTest.py +++ b/src/daComposant/daAlgorithms/TangentTest.py @@ -89,7 +89,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # Hm = HO["Direct"].appliedTo Ht = HO["Tangent"].appliedInXTo diff --git a/src/daComposant/daAlgorithms/UnscentedKalmanFilter.py b/src/daComposant/daAlgorithms/UnscentedKalmanFilter.py index 19bc20d..276e4fb 100644 --- a/src/daComposant/daAlgorithms/UnscentedKalmanFilter.py +++ b/src/daComposant/daAlgorithms/UnscentedKalmanFilter.py @@ -94,7 +94,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): ) def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None): - self._pre_run(Parameters, R, B, Q) + self._pre_run(Parameters, Xb, Y, R, B, Q) # if self._parameters["EstimationOf"] == "Parameters": self._parameters["StoreInternalVariables"] = True diff --git a/src/daComposant/daCore/BasicObjects.py b/src/daComposant/daCore/BasicObjects.py index f8e7040..05e9943 100644 --- a/src/daComposant/daCore/BasicObjects.py +++ b/src/daComposant/daCore/BasicObjects.py @@ -405,7 +405,7 @@ class FullOperator(object): self.__FO["Tangent"] = Operator( fromMethod = __Function["Tangent"], avoidingRedundancy = avoidRC ) self.__FO["Adjoint"] = Operator( fromMethod = __Function["Adjoint"], avoidingRedundancy = avoidRC ) elif asMatrix is not None: - __matrice = numpy.matrix( asMatrix, numpy.float ) + __matrice = numpy.matrix( __Matrix, numpy.float ) self.__FO["Direct"] = Operator( fromMatrix = __matrice, avoidingRedundancy = avoidRC ) self.__FO["Tangent"] = Operator( fromMatrix = __matrice, avoidingRedundancy = avoidRC ) self.__FO["Adjoint"] = Operator( fromMatrix = __matrice.T, avoidingRedundancy = avoidRC ) @@ -527,7 +527,7 @@ class Algorithm(object): self.StoredVariables["SimulationQuantiles"] = Persistence.OneMatrix(name = "SimulationQuantiles") self.StoredVariables["Residu"] = Persistence.OneScalar(name = "Residu") - def _pre_run(self, Parameters, R=None, B=None, Q=None ): + def _pre_run(self, Parameters, Xb=None, Y=None, R=None, B=None, Q=None ): "Pré-calcul" logging.debug("%s Lancement", self._name) logging.debug("%s Taille mémoire utilisée de %.0f Mio", self._name, self._m.getUsedMemory("Mio")) @@ -536,6 +536,18 @@ class Algorithm(object): self.__setParameters(Parameters) # # Corrections et complements + def __test_vvalue( argument, variable, argname): + if argument is None: + if variable in self.__required_inputs["RequiredInputValues"]["mandatory"]: + raise ValueError("%s %s vector %s has to be properly defined!"%(self._name,argname,variable)) + elif variable in self.__required_inputs["RequiredInputValues"]["optional"]: + logging.debug("%s %s vector %s is not set, but is optional."%(self._name,argname,variable)) + else: + logging.debug("%s %s vector %s is not set, but is not required."%(self._name,argname,variable)) + else: + logging.debug("%s %s vector %s is set, and its size is %i."%(self._name,argname,variable,numpy.array(argument).size)) + __test_vvalue( Xb, "Xb", "Background or initial state" ) + __test_vvalue( Y, "Y", "Observation" ) def __test_cvalue( argument, variable, argname): if argument is None: if variable in self.__required_inputs["RequiredInputValues"]["mandatory"]: @@ -1873,20 +1885,20 @@ class ImportFromScript(object): "Verifie l'existence et importe le script" self.__filename = __filename.rstrip(".py") if self.__filename is None: - raise ValueError("The name of the file containing the variable to be imported has to be specified.") + raise ValueError("The name of the file, containing the variable to be read, has to be specified.") if not os.path.isfile(str(self.__filename)+".py"): - raise ValueError("The file containing the variable to be imported doesn't seem to exist. The given file name is:\n \"%s\""%self.__filename) + raise ValueError("The file containing the variable to be imported doesn't seem to exist. Please check the file. The given file name is:\n \"%s\""%self.__filename) self.__scriptfile = __import__(self.__filename, globals(), locals(), []) self.__scriptstring = open(self.__filename+".py",'r').read() def getvalue(self, __varname=None, __synonym=None ): "Renvoie la variable demandee" if __varname is None: - raise ValueError("The name of the variable to be imported has to be specified.") + raise ValueError("The name of the variable to be read has to be specified. Please check the content of the file and the syntax.") if not hasattr(self.__scriptfile, __varname): if __synonym is None: - raise ValueError("The imported script file \"%s\" doesn't contain the specified variable \"%s\"."%(str(self.__filename)+".py",__varname)) + raise ValueError("The imported script file \"%s\" doesn't contain the mandatory variable \"%s\" to be read. Please check the content of the file and the syntax."%(str(self.__filename)+".py",__varname)) elif not hasattr(self.__scriptfile, __synonym): - raise ValueError("The imported script file \"%s\" doesn't contain the specified variable \"%s\"."%(str(self.__filename)+".py",__synonym)) + raise ValueError("The imported script file \"%s\" doesn't contain the mandatory variable \"%s\" to be read. Please check the content of the file and the syntax."%(str(self.__filename)+".py",__synonym)) else: return getattr(self.__scriptfile, __synonym) else: diff --git a/src/daComposant/daCore/version.py b/src/daComposant/daCore/version.py index 20b8246..6b182f0 100644 --- a/src/daComposant/daCore/version.py +++ b/src/daComposant/daCore/version.py @@ -27,5 +27,5 @@ __author__ = "Jean-Philippe ARGAUD" __all__ = [] name = "Data Assimilation Package" -version = "17.04.30" -date = "samedi 30 avril 2017, 12:12:12 (UTC+0100)" +version = "2017.09.30" +date = "samedi 30 septembre 2017, 12:12:12 (UTC+0100)" -- 2.39.2