]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Improving and simplifying result variables access methods
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Sat, 2 Feb 2013 15:56:10 +0000 (16:56 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Sat, 2 Feb 2013 15:56:10 +0000 (16:56 +0100)
27 files changed:
doc/advanced.rst
doc/examples.rst
doc/using.rst
examples/daSalome/test004_ADAO_JDC_using_scripts.comm.in
examples/daSalome/test005_ADAO_Operators.comm.in
examples/daSalome/test006_Observers.comm.in
examples/daSalome/test006_Observers_observer_with_file.py
examples/daSkeletons/External_data_definition_by_scripts/Script_UserPostAnalysis.py
src/daComposant/daAlgorithms/3DVAR.py
src/daComposant/daAlgorithms/AdjointTest.py
src/daComposant/daAlgorithms/Blue.py
src/daComposant/daAlgorithms/EnsembleBlue.py
src/daComposant/daAlgorithms/GradientTest.py
src/daComposant/daAlgorithms/KalmanFilter.py
src/daComposant/daAlgorithms/LinearLeastSquares.py
src/daComposant/daAlgorithms/NonLinearLeastSquares.py
src/daComposant/daAlgorithms/ParticleSwarmOptimization.py
src/daComposant/daAlgorithms/QuantileRegression.py
src/daComposant/daCore/AssimilationStudy.py
src/daComposant/daCore/Persistence.py
src/daComposant/daDiagnostics/RMS.py
src/daComposant/daDiagnostics/ReduceVariance.py
src/daComposant/daNumerics/ApproximatedDerivatives.py
src/tests/daSalome/test000_Blue.py
src/tests/daSalome/test000_Blue_AnalysisCode.py
src/tests/daSalome/test017.comm.in
src/tests/daSalome/test_aster_zzzz159a_LBFGSB.comm.in

index e16a843e5233f5a1d283187032e90b329889fe5c..b5cc3618f1f947409212f04eb078594df7d8b55e 100644 (file)
@@ -108,12 +108,12 @@ This can be done using "*observers*", that are scripts associated with one
 variable. In order to use this feature, one has to build scripts using as
 standard inputs (available in the namespace) the variables ``var`` and ``info``.
 The variable ``var`` is to be used in the same way as for the final ADD object,
-that is as a list object through its "*valueserie*" method.
+that is as a list/tuple object.
 
 As an example, here is one very simple script used to print the value of one
 monitored variable::
 
-    print "    --->",info," Value =",var.valueserie(-1)
+    print "    --->",info," Value =",var[-1]
 
 Stored in a python file, this script can be associated to each variable
 available in the "*SELECTION*" keyword of the "*Observers*" command:
index 0dd0baf9362fc016ec2a5ff3f59ea4656dcfa519..6125a57e2bd952b818c999c287e2fece1a6e5c03 100644 (file)
@@ -153,7 +153,7 @@ To obtain this, the in-line script node need to have an input port of type
 the "*algoResults*" output port of the computation bloc. Then the code to fill
 in the script node is::
 
-    Xa = results.ADD.get("Analysis").valueserie(-1)
+    Xa = results.ADD.get("Analysis")[-1]
 
     print
     print "Analysis =",Xa
@@ -522,9 +522,9 @@ illustrates the fact::
     import numpy
     #
     xt, names   = True_state()
-    xa          = ADD.get("Analysis").valueserie(-1)
-    x_series    = ADD.get("CurrentState").valueserie()
-    J           = ADD.get("CostFunctionJ").valueserie()
+    xa          = ADD.get("Analysis")[-1]
+    x_series    = ADD.get("CurrentState")[:]
+    J           = ADD.get("CostFunctionJ")[:]
     #
     # Verifying the results by printing
     # ---------------------------------
index a10c7e33efc32fbd9b3951af4caec749c0775baa..f63e06b3a1eadfea5f74856a74fa65c1d06ab61a 100644 (file)
@@ -159,15 +159,14 @@ variables stored along the calculation. The main is the "*Analysis*" one, that
 can be obtained by the python command (for example in an in-line script node or
 a script provided through the "*UserPostAnalysis*" keyword)::
 
-    ADD = algoResults.getAssimilationStudy()
-    Analysis = ADD.get("Analysis").valueserie()
+    Analysis = ADD.get("Analysis")[:]
 
 "*Analysis*" is a complex object, similar to a list of values calculated at each
 step of data assimilation calculation. In order to get and print the optimal
 data assimilation state evaluation, in script provided through the
 "*UserPostAnalysis*" keyword, one can use::
 
-    Xa = ADD.get("Analysis").valueserie(-1)
+    Xa = ADD.get("Analysis")[-1]
     print "Optimal state:", Xa
     print
 
index 26b9341d6cb84c9f060363f521ffdb5bb3111c3c..f400c523a36fb66b4012442807f3fd4ba27a04c5 100644 (file)
@@ -26,7 +26,7 @@ ASSIMILATION_STUDY(Study_name='Test',
                    UserPostAnalysis=_F(FROM='String',
                                        STRING=
 """import numpy
-Xa = ADD.get("Analysis").valueserie(-1)
+Xa = ADD.get("Analysis")[-1]
 print
 print "Size of Analysis = %i"%len(Xa)
 print "Min, mean, max   = %8.3f, %8.3f, %8.3f"%(min(Xa),numpy.mean(Xa),max(Xa))
index 2c60c85a02d73c9dc47314717328e0a4a31e9d77..76f2c94a27b0bb2419afb0f73d63ba500f329dde 100644 (file)
@@ -27,7 +27,7 @@ ASSIMILATION_STUDY(Study_name='Test',
                                        STRING=
 """import numpy
 Xb = Study.getBackground()
-Xa = ADD.get("Analysis").valueserie(-1)
+Xa = ADD.get("Analysis")[-1]
 print
 print "Size of Background...........= %i"%len(Xb.A1)
 print "Size of Analysis.............= %i"%len(Xa)
index 365a06450c64c577dd6dff03f691a59777a58bd3..26d95db78588be1b907b794cb1f74bbf43a4b8c3 100644 (file)
@@ -34,7 +34,7 @@ ASSIMILATION_STUDY(Study_name='test_observers',
                                 CostFunctionJ_data=_F(NodeType='String',
                                                       Value=
 """print "  ---> observerCost"
-print "       var  =",var.valueserie()
+print "       var  =",var[:]
 print "       info =",info
 #
 import Gnuplot
@@ -46,7 +46,7 @@ except NameError:
 gp = Gnuplot.Gnuplot()
 gp('set style data lines')
 gp('set title  "'+str(info)+'"')
-gp.plot( Gnuplot.Data( var.valueserie() ) )
+gp.plot( Gnuplot.Data( var[:] ) )
 filename = os.path.join("/tmp", "imageCost_%02i.ps"%numero)
 print "       imageCost %s"%filename
 gp.hardcopy(filename=filename, color=1)
index c85e5bcb0c6dc716e46b1cebd154309afe81db90..1ca883d14f8a29efca6ff56427e331a930826287 100644 (file)
@@ -1,5 +1,5 @@
 print "  ---> observerState"
-print "       var  =",var.valueserie(-1)
+print "       var  =",var[-1]
 print "       info =",info
 #
 import Gnuplot
@@ -13,7 +13,7 @@ except NameError:
 gp = Gnuplot.Gnuplot()
 gp('set style data lines')
 gp('set title  "'+str(info)+'"')
-gp.plot( Gnuplot.Data( var.valueserie(-1) ) )
+gp.plot( Gnuplot.Data( var[-1] ) )
 
 filename = os.path.join("/tmp", "imageState_%02i.ps"%numero)
 print "       imageState \"%s\""%filename
index a5bf58c0f517168dfb9a5883c1b723548fc2f0c4..b0534cd7fd67222575ad305e2746bd91ec3f5422 100644 (file)
@@ -34,9 +34,9 @@ from Physical_data_and_covariance_matrices import True_state
 import numpy
 #
 xt, names   = True_state()
-xa          = ADD.get("Analysis").valueserie(-1)
-x_series    = ADD.get("CurrentState").valueserie()
-J           = ADD.get("CostFunctionJ").valueserie()
+xa          = ADD.get("Analysis")[-1]
+x_series    = ADD.get("CurrentState")[:]
+J           = ADD.get("CostFunctionJ")[:]
 #
 # Verifying the results by printing
 # ---------------------------------
index 78ca36e5d8f989a3ab53a4207abb1ce2e939f113..9b638493b6ff1cea5c8f8c79f6a4d1fbaa760783 100644 (file)
@@ -87,7 +87,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["APosterioriCovariance", "BMA", "OMA", "OMB", "Innovation", "SigmaObs2", "MahalanobisConsistency"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -107,13 +107,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Direct"].appliedTo
-        Ha = H["Adjoint"].appliedInXTo
+        Hm = HO["Direct"].appliedTo
+        Ha = HO["Adjoint"].appliedInXTo
         #
         # Utilisation éventuelle d'un vecteur H(Xb) précalculé
         # ----------------------------------------------------
-        if H["AppliedToX"] is not None and H["AppliedToX"].has_key("HXb"):
-            HXb = H["AppliedToX"]["HXb"]
+        if HO["AppliedToX"] is not None and HO["AppliedToX"].has_key("HXb"):
+            HXb = HO["AppliedToX"]["HXb"]
         else:
             HXb = Hm( Xb )
         HXb = numpy.asmatrix(numpy.ravel( HXb )).T
@@ -240,13 +240,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         else:
             raise ValueError("Error in Minimizer name: %s"%self._parameters["Minimizer"])
         #
-        StepMin = numpy.argmin( self.StoredVariables["CostFunctionJ"].valueserie()[nbPreviousSteps:] ) + nbPreviousSteps
-        MinJ    = self.StoredVariables["CostFunctionJ"].valueserie(step = StepMin)
+        IndexMin = numpy.argmin( self.StoredVariables["CostFunctionJ"][nbPreviousSteps:] ) + nbPreviousSteps
+        MinJ     = self.StoredVariables["CostFunctionJ"][IndexMin]
         #
         # Correction pour pallier a un bug de TNC sur le retour du Minimum
         # ----------------------------------------------------------------
         if self._parameters["StoreInternalVariables"]:
-            Minimum = self.StoredVariables["CurrentState"].valueserie(step = StepMin)
+            Minimum = self.StoredVariables["CurrentState"][IndexMin]
         #
         # Obtention de l'analyse
         # ----------------------
@@ -257,9 +257,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         # Calcul de la covariance d'analyse
         # ---------------------------------
         if "APosterioriCovariance" in self._parameters["StoreSupplementaryCalculations"]:
-            HtM = H["Tangent"].asMatrix(ValueForMethodForm = Xa)
+            HtM = HO["Tangent"].asMatrix(ValueForMethodForm = Xa)
             HtM = HtM.reshape(Y.size,Xa.size) # ADAO & check shape
-            HaM = H["Adjoint"].asMatrix(ValueForMethodForm = Xa)
+            HaM = HO["Adjoint"].asMatrix(ValueForMethodForm = Xa)
             HaM = HaM.reshape(Xa.size,Y.size) # ADAO & check shape
             HessienneI = []
             nb = Xa.size
index 77849fdcbb0aa840928e8ce95700a47e0f56be77..7276b7b33ca38b55dfc0d54d514dc97599ee0410 100644 (file)
@@ -69,7 +69,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             message  = "Titre du tableau et de la figure",
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -79,9 +79,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Direct"].appliedTo
-        Ht = H["Tangent"].appliedInXTo
-        Ha = H["Adjoint"].appliedInXTo
+        Hm = HO["Direct"].appliedTo
+        Ht = HO["Tangent"].appliedInXTo
+        Ha = HO["Adjoint"].appliedInXTo
         #
         # Construction des perturbations
         # ------------------------------
index 1a5278f9a2fdf90cc16d9c71f040e39b0ec0689a..46130cfb969a385962aace279220dfc8441e5441 100644 (file)
@@ -38,7 +38,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["APosterioriCovariance", "BMA", "OMA", "OMB", "Innovation", "SigmaBck2", "SigmaObs2", "MahalanobisConsistency"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -48,13 +48,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Tangent"].asMatrix(None)
-        Ha = H["Adjoint"].asMatrix(None)
+        Hm = HO["Tangent"].asMatrix(None)
+        Ha = HO["Adjoint"].asMatrix(None)
         #
         # Utilisation éventuelle d'un vecteur H(Xb) précalculé
         # ----------------------------------------------------
-        if H["AppliedToX"] is not None and H["AppliedToX"].has_key("HXb"):
-            HXb = H["AppliedToX"]["HXb"]
+        if HO["AppliedToX"] is not None and HO["AppliedToX"].has_key("HXb"):
+            HXb = HO["AppliedToX"]["HXb"]
         else:
             HXb = Hm * Xb
         HXb = numpy.asmatrix(numpy.ravel( HXb )).T
index c50f2e19d7dee075eba9a5a0cb2ed21c93cdd9bb..8643cf19b0e23804142b5f44c5e128d4a4443447 100644 (file)
@@ -36,7 +36,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             message  = "Graine fixée pour le générateur aléatoire",
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None ):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -77,12 +77,12 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Initialisation des opérateurs d'observation et de la matrice gain
         # -----------------------------------------------------------------
-        Hm = H["Tangent"].asMatrix(None)
-        Ha = H["Adjoint"].asMatrix(None)
+        Hm = HO["Tangent"].asMatrix(None)
+        Ha = HO["Adjoint"].asMatrix(None)
         #
         # Calcul de la matrice de gain dans l'espace le plus petit et de l'analyse
         # ------------------------------------------------------------------------
-        if Y.size <= Xb.valueserie(0).size:
+        if Y.size <= Xb[0].size:
             if self._parameters["R_scalar"] is not None:
                 R = self._parameters["R_scalar"] * numpy.eye(Y.size, dtype=numpy.float)
             K  = B * Ha * (Hm * B * Ha + R).I
@@ -92,15 +92,15 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         # Calcul du BLUE pour chaque membre de l'ensemble
         # -----------------------------------------------
         for iens in range(nb_ens):
-            d  = EnsembleY[:,iens] - Hm * Xb.valueserie(iens)
-            Xa = Xb.valueserie(iens) + K*d
+            d  = EnsembleY[:,iens] - Hm * Xb[iens]
+            Xa = Xb[iens] + K*d
             
             self.StoredVariables["CurrentState"].store( Xa.A1 )
             self.StoredVariables["Innovation"].store( d.A1 )
         #
         # Fabrication de l'analyse
         # ------------------------
-        Members = self.StoredVariables["CurrentState"].valueserie()[-nb_ens:]
+        Members = self.StoredVariables["CurrentState"][-nb_ens:]
         Xa = numpy.matrix( Members ).mean(axis=0)
         self.StoredVariables["Analysis"].store( Xa.A1 )
         #
index 1e574cb8487a29687955e7498f21daf8f9f4a960..aa547a75b9a4d9cf1ba49bb03c850d82f275a184 100644 (file)
@@ -87,7 +87,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             message  = "Label de la courbe tracée dans la figure",
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -97,9 +97,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Direct"].appliedTo
+        Hm = HO["Direct"].appliedTo
         if self._parameters["ResiduFormula"] is "Taylor":
-            Ht = H["Tangent"].appliedInXTo
+            Ht = HO["Tangent"].appliedInXTo
         #
         # Construction des perturbations
         # ------------------------------
@@ -231,7 +231,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             f.write(msgs)
             f.close()
             #
-            Residus = self.StoredVariables["CostFunctionJ"].valueserie()[-len(Perturbations):]
+            Residus = self.StoredVariables["CostFunctionJ"][-len(Perturbations):]
             if self._parameters["ResiduFormula"] is "Taylor":
                 PerturbationsCarre = [ 10**(2*i) for i in xrange(-len(NormesdFXGdX)+1,1) ]
                 PerturbationsCarre.reverse()
index 3cfd1f05d8466a356bc3d6de47904e4aca03191f..a6a1514a399b1ebe8549893a3bb37d0135e381fa 100644 (file)
@@ -23,6 +23,7 @@
 import logging
 from daCore import BasicObjects, PlatformInfo
 m = PlatformInfo.SystemUsage()
+import numpy
 
 # ==============================================================================
 class ElementaryAlgorithm(BasicObjects.Algorithm):
@@ -36,7 +37,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["APosterioriCovariance", "Innovation"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -44,20 +45,20 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         # ----------------------
         self.setParameters(Parameters)
         #
-        # Opérateur d'observation
-        # -----------------------
-        Hm = H["Tangent"].asMatrix(None)
-        Ha = H["Adjoint"].asMatrix(None)
-        #
+        # Opérateurs
+        # ----------
         if B is None:
             raise ValueError("Background error covariance matrix has to be properly defined!")
         if R is None:
             raise ValueError("Observation error covariance matrix has to be properly defined!")
+        Hm = HO["Tangent"].asMatrix(None)
+        Ha = HO["Adjoint"].asMatrix(None)
+        #
+        Mm = EM["Tangent"].asMatrix(None)
+        Mt = EM["Adjoint"].asMatrix(None)
         #
-        # Opérateur d'évolution
-        # ---------------------
-        Mm = M["Tangent"].asMatrix(None)
-        Mt = M["Adjoint"].asMatrix(None)
+        if CM is not None and U is not None:
+            Cm = CM["Tangent"].asMatrix(None)
         #
         # Nombre de pas du Kalman identique au nombre de pas d'observations
         # -----------------------------------------------------------------
@@ -72,10 +73,18 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             self.StoredVariables["APosterioriCovariance"].store( Pn )
         #
         for step in range(duration-1):
-            Xn_predicted = Mm * Xn
+            if CM is not None and U is not None:
+                if hasattr(U,"store") and len(U)>1:
+                    Xn_predicted = Mm * Xn + Cm * numpy.asmatrix(numpy.ravel( U[step] )).T
+                elif hasattr(U,"store") and len(U)==1:
+                    Xn_predicted = Mm * Xn + Cm * numpy.asmatrix(numpy.ravel( U[0] )).T
+                else:
+                    Xn_predicted = Mm * Xn + Cm * numpy.asmatrix(numpy.ravel( U )).T
+            else:
+                Xn_predicted = Mm * Xn
             Pn_predicted = Mm * Pn * Mt + Q
             #
-            d  = Y.valueserie(step+1) - Hm * Xn_predicted
+            d  = numpy.asmatrix(numpy.ravel( Y[step+1] )).T - Hm * Xn_predicted
             K  = Pn_predicted * Ha * (Hm * Pn_predicted * Ha + R).I
             Xn = Xn_predicted + K * d
             Pn = Pn_predicted - K * Hm * Pn_predicted
index 3d59e9e4734dc3eda4b0836688adfc1a95aad0fc..5ef5e6812f371e4a8bf6f8b3390b40e32757db26 100644 (file)
@@ -38,7 +38,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["OMA"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -48,8 +48,8 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Tangent"].asMatrix(None)
-        Ha = H["Adjoint"].asMatrix(None)
+        Hm = HO["Tangent"].asMatrix(None)
+        Ha = HO["Adjoint"].asMatrix(None)
         #
         if R is not None:
             RI = R.I
index c325988a5aa6283b208748cb540ebea5eb894919..634c36c665617ba18868393ddeaae4941a9a7060 100644 (file)
@@ -87,7 +87,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["BMA", "OMA", "OMB", "Innovation"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -107,13 +107,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Direct"].appliedTo
-        Ha = H["Adjoint"].appliedInXTo
+        Hm = HO["Direct"].appliedTo
+        Ha = HO["Adjoint"].appliedInXTo
         #
         # Utilisation éventuelle d'un vecteur H(Xb) précalculé
         # ----------------------------------------------------
-        if H["AppliedToX"] is not None and H["AppliedToX"].has_key("HXb"):
-            HXb = H["AppliedToX"]["HXb"]
+        if HO["AppliedToX"] is not None and HO["AppliedToX"].has_key("HXb"):
+            HXb = HO["AppliedToX"]["HXb"]
         else:
             HXb = Hm( Xb )
         HXb = numpy.asmatrix(numpy.ravel( HXb )).T
@@ -194,7 +194,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             GradJb  = 0.
             GradJo  = - Ha( (_X, RI * (Y - _HX)) )
             GradJ   = numpy.asmatrix( numpy.ravel( GradJb ) + numpy.ravel( GradJo ) ).T
-            return - RdemiI*H["Tangent"].asMatrix( _X )
+            return - RdemiI*HO["Tangent"].asMatrix( _X )
         #
         # Point de démarrage de l'optimisation : Xini = Xb
         # ------------------------------------
@@ -281,13 +281,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         else:
             raise ValueError("Error in Minimizer name: %s"%self._parameters["Minimizer"])
         #
-        StepMin = numpy.argmin( self.StoredVariables["CostFunctionJ"].valueserie()[nbPreviousSteps:] ) + nbPreviousSteps
-        MinJ    = self.StoredVariables["CostFunctionJ"].valueserie(step = StepMin)
+        IndexMin = numpy.argmin( self.StoredVariables["CostFunctionJ"][nbPreviousSteps:] ) + nbPreviousSteps
+        MinJ    = self.StoredVariables["CostFunctionJ"][IndexMin]
         #
         # Correction pour pallier a un bug de TNC sur le retour du Minimum
         # ----------------------------------------------------------------
         if self._parameters["StoreInternalVariables"]:
-            Minimum = self.StoredVariables["CurrentState"].valueserie(step = StepMin)
+            Minimum = self.StoredVariables["CurrentState"][IndexMin]
         #
         # Obtention de l'analyse
         # ----------------------
index 1c9b86934ec0eba5e52596e3c888c489daeffcc9..5558da51f0b8851a57a3fd2897970e567f5fdbd7 100644 (file)
@@ -90,7 +90,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["BMA", "OMA", "OMB", "Innovation"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -113,7 +113,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Direct"].appliedTo
+        Hm = HO["Direct"].appliedTo
         #
         # Précalcul des inversions de B et R
         # ----------------------------------
index 76743ec3372016c8c2b1129f97e99c39780b05ba..620072189501f83aa47dc3d583fb77e10d37f833 100644 (file)
@@ -72,7 +72,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = ["BMA", "OMA", "OMB", "Innovation"]
             )
 
-    def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
         logging.debug("%s Lancement"%self._name)
         logging.debug("%s Taille mémoire utilisée de %.1f Mo"%(self._name, m.getUsedMemory("M")))
         #
@@ -82,12 +82,12 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Opérateur d'observation
         # -----------------------
-        Hm = H["Direct"].appliedTo
+        Hm = HO["Direct"].appliedTo
         #
         # Utilisation éventuelle d'un vecteur H(Xb) précalculé
         # ----------------------------------------------------
-        if H["AppliedToX"] is not None and H["AppliedToX"].has_key("HXb"):
-            HXb = H["AppliedToX"]["HXb"]
+        if HO["AppliedToX"] is not None and HO["AppliedToX"].has_key("HXb"):
+            HXb = HO["AppliedToX"]["HXb"]
         else:
             HXb = Hm( Xb )
         HXb = numpy.asmatrix(numpy.ravel( HXb )).T
@@ -118,7 +118,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         def GradientOfCostFunction(x):
             _X      = numpy.asmatrix(numpy.ravel( x )).T
-            Hg = H["Tangent"].asMatrix( _X )
+            Hg = HO["Tangent"].asMatrix( _X )
             return Hg
         #
         # Point de démarrage de l'optimisation : Xini = Xb
index b415835bf1d1d1704b872e10cc79bdc0363313c7..05a0abe7e01e20cca5717af1a2b04620d22786ef 100644 (file)
@@ -66,13 +66,15 @@ class AssimilationStudy:
         de covariance est B.
         """
         self.__name = str(name)
-        self.__Xb = None
-        self.__Y  = None
-        self.__B  = None
-        self.__R  = None
-        self.__Q  = None
-        self.__H  = {}
-        self.__M  = {}
+        self.__Xb  = None
+        self.__Y   = None
+        self.__U   = None
+        self.__B   = None
+        self.__R   = None
+        self.__Q   = None
+        self.__HO  = {}
+        self.__EM  = {}
+        self.__CM  = {}
         #
         self.__X  = Persistence.OneVector()
         self.__Parameters        = {}
@@ -129,7 +131,7 @@ class AssimilationStudy:
             else:
                 self.__Xb = asPersistentVector
         else:
-            raise ValueError("Error: improperly defined background")
+            raise ValueError("Error: improperly defined background, it requires at minima either a vector, a list/tuple of vectors or a persistent object")
         if toBeStored:
            self.__StoredInputs["Background"] = self.__Xb
         return 0
@@ -200,7 +202,7 @@ class AssimilationStudy:
             else:
                 self.__Y = asPersistentVector
         else:
-            raise ValueError("Error: improperly defined observations")
+            raise ValueError("Error: improperly defined observations, it requires at minima either a vector, a list/tuple of vectors or a persistent object")
         if toBeStored:
             self.__StoredInputs["Observation"] = self.__Y
         return 0
@@ -287,45 +289,45 @@ class AssimilationStudy:
                 centeredDF = asFunction["withCenteredDF"],
                 increment  = asFunction["withIncrement"],
                 dX         = asFunction["withdX"] )
-            self.__H["Direct"]  = Operator( fromMethod = FDA.DirectOperator  )
-            self.__H["Tangent"] = Operator( fromMethod = FDA.TangentOperator )
-            self.__H["Adjoint"] = Operator( fromMethod = FDA.AdjointOperator )
+            self.__HO["Direct"]  = Operator( fromMethod = FDA.DirectOperator  )
+            self.__HO["Tangent"] = Operator( fromMethod = FDA.TangentOperator )
+            self.__HO["Adjoint"] = Operator( fromMethod = FDA.AdjointOperator )
         elif (type(asFunction) is type({})) and \
                 asFunction.has_key("Tangent") and asFunction.has_key("Adjoint") and \
                 (asFunction["Tangent"] is not None) and (asFunction["Adjoint"] is not None):
             if not asFunction.has_key("Direct") or (asFunction["Direct"] is None):
-                self.__H["Direct"] = Operator( fromMethod = asFunction["Tangent"] )
+                self.__HO["Direct"] = Operator( fromMethod = asFunction["Tangent"] )
             else:
-                self.__H["Direct"] = Operator( fromMethod = asFunction["Direct"]  )
-            self.__H["Tangent"]    = Operator( fromMethod = asFunction["Tangent"] )
-            self.__H["Adjoint"]    = Operator( fromMethod = asFunction["Adjoint"] )
+                self.__HO["Direct"] = Operator( fromMethod = asFunction["Direct"]  )
+            self.__HO["Tangent"]    = Operator( fromMethod = asFunction["Tangent"] )
+            self.__HO["Adjoint"]    = Operator( fromMethod = asFunction["Adjoint"] )
         elif asMatrix is not None:
             matrice = numpy.matrix( asMatrix, numpy.float )
-            self.__H["Direct"]  = Operator( fromMatrix = matrice )
-            self.__H["Tangent"] = Operator( fromMatrix = matrice )
-            self.__H["Adjoint"] = Operator( fromMatrix = matrice.T )
+            self.__HO["Direct"]  = Operator( fromMatrix = matrice )
+            self.__HO["Tangent"] = Operator( fromMatrix = matrice )
+            self.__HO["Adjoint"] = Operator( fromMatrix = matrice.T )
             del matrice
         else:
             raise ValueError("Improperly defined observation operator, it requires at minima either a matrix, a Direct for approximate derivatives or a Tangent/Adjoint pair.")
         #
         if appliedToX is not None:
-            self.__H["AppliedToX"] = {}
+            self.__HO["AppliedToX"] = {}
             if type(appliedToX) is not dict:
                 raise ValueError("Error: observation operator defined by \"appliedToX\" need a dictionary as argument.")
             for key in appliedToX.keys():
                 if type( appliedToX[key] ) is type( numpy.matrix([]) ):
                     # Pour le cas où l'on a une vraie matrice
-                    self.__H["AppliedToX"][key] = numpy.matrix( appliedToX[key].A1, numpy.float ).T
+                    self.__HO["AppliedToX"][key] = numpy.matrix( appliedToX[key].A1, numpy.float ).T
                 elif type( appliedToX[key] ) is type( numpy.array([]) ) and len(appliedToX[key].shape) > 1:
                     # Pour le cas où l'on a un vecteur représenté en array avec 2 dimensions
-                    self.__H["AppliedToX"][key] = numpy.matrix( appliedToX[key].reshape(len(appliedToX[key]),), numpy.float ).T
+                    self.__HO["AppliedToX"][key] = numpy.matrix( appliedToX[key].reshape(len(appliedToX[key]),), numpy.float ).T
                 else:
-                    self.__H["AppliedToX"][key] = numpy.matrix( appliedToX[key],    numpy.float ).T
+                    self.__HO["AppliedToX"][key] = numpy.matrix( appliedToX[key],    numpy.float ).T
         else:
-            self.__H["AppliedToX"] = None
+            self.__HO["AppliedToX"] = None
         #
         if toBeStored:
-            self.__StoredInputs["ObservationOperator"] = self.__H
+            self.__StoredInputs["ObservationOperator"] = self.__HO
         return 0
 
     # -----------------------------------------------------------
@@ -371,29 +373,29 @@ class AssimilationStudy:
                 centeredDF = asFunction["withCenteredDF"],
                 increment  = asFunction["withIncrement"],
                 dX         = asFunction["withdX"] )
-            self.__M["Direct"]  = Operator( fromMethod = FDA.DirectOperator  )
-            self.__M["Tangent"] = Operator( fromMethod = FDA.TangentOperator )
-            self.__M["Adjoint"] = Operator( fromMethod = FDA.AdjointOperator )
+            self.__EM["Direct"]  = Operator( fromMethod = FDA.DirectOperator  )
+            self.__EM["Tangent"] = Operator( fromMethod = FDA.TangentOperator )
+            self.__EM["Adjoint"] = Operator( fromMethod = FDA.AdjointOperator )
         elif (type(asFunction) is type({})) and \
                 asFunction.has_key("Tangent") and asFunction.has_key("Adjoint") and \
                 (asFunction["Tangent"] is not None) and (asFunction["Adjoint"] is not None):
             if not asFunction.has_key("Direct") or (asFunction["Direct"] is None):
-                self.__M["Direct"] = Operator( fromMethod = asFunction["Tangent"]  )
+                self.__EM["Direct"] = Operator( fromMethod = asFunction["Tangent"]  )
             else:
-                self.__M["Direct"] = Operator( fromMethod = asFunction["Direct"]  )
-            self.__M["Tangent"]    = Operator( fromMethod = asFunction["Tangent"] )
-            self.__M["Adjoint"]    = Operator( fromMethod = asFunction["Adjoint"] )
+                self.__EM["Direct"] = Operator( fromMethod = asFunction["Direct"]  )
+            self.__EM["Tangent"]    = Operator( fromMethod = asFunction["Tangent"] )
+            self.__EM["Adjoint"]    = Operator( fromMethod = asFunction["Adjoint"] )
         elif asMatrix is not None:
             matrice = numpy.matrix( asMatrix, numpy.float )
-            self.__M["Direct"]  = Operator( fromMatrix = matrice )
-            self.__M["Tangent"] = Operator( fromMatrix = matrice )
-            self.__M["Adjoint"] = Operator( fromMatrix = matrice.T )
+            self.__EM["Direct"]  = Operator( fromMatrix = matrice )
+            self.__EM["Tangent"] = Operator( fromMatrix = matrice )
+            self.__EM["Adjoint"] = Operator( fromMatrix = matrice.T )
             del matrice
         else:
-            raise ValueError("Improperly defined evolution operator, it requires at minima either a matrix, a Direct for approximate derivatives or a Tangent/Adjoint pair.")
+            raise ValueError("Improperly defined evolution model, it requires at minima either a matrix, a Direct for approximate derivatives or a Tangent/Adjoint pair.")
         #
         if toBeStored:
-            self.__StoredInputs["EvolutionModel"] = self.__M
+            self.__StoredInputs["EvolutionModel"] = self.__EM
         return 0
 
     def setEvolutionError(self,
@@ -432,6 +434,108 @@ class AssimilationStudy:
             self.__StoredInputs["EvolutionError"] = self.__Q
         return 0
 
+    # -----------------------------------------------------------
+    def setControlModel(self,
+            asFunction = {"Direct":None, "Tangent":None, "Adjoint":None,
+                          "useApproximatedDerivatives":False,
+                          "withCenteredDF"            :False,
+                          "withIncrement"             :0.01,
+                          "withdX"                    :None,
+                         },
+            asMatrix   = None,
+            Scheduler  = None,
+            toBeStored = False,
+            ):
+        """
+        Permet de définir un opérateur de controle C. L'ordre de priorité des
+        définitions et leur sens sont les suivants :
+        - si asFunction["Tangent"] et asFunction["Adjoint"] ne sont pas None
+          alors on définit l'opérateur à l'aide de fonctions. Si la fonction
+          "Direct" n'est pas définie, on prend la fonction "Tangent".
+          Si "useApproximatedDerivatives" est vrai, on utilise une approximation
+          des opérateurs tangents et adjoints. On utilise par défaut des
+          différences finies non centrées ou centrées (si "withCenteredDF" est
+          vrai) avec un incrément multiplicatif "withIncrement" de 1% autour
+          du point courant ou sur le point fixe "withdX".
+        - si les fonctions ne sont pas disponibles et si asMatrix n'est pas
+          None, alors on définit l'opérateur "Direct" et "Tangent" à l'aide de
+          la matrice, et l'opérateur "Adjoint" à l'aide de la transposée. La
+          matrice fournie doit être sous une forme compatible avec le
+          constructeur de numpy.matrix.
+        - toBeStored : booléen indiquant si la donnée d'entrée est sauvée pour
+          être rendue disponible au même titre que les variables de calcul
+        """
+        if (type(asFunction) is type({})) and \
+                asFunction.has_key("useApproximatedDerivatives") and bool(asFunction["useApproximatedDerivatives"]) and \
+                asFunction.has_key("Direct") and (asFunction["Direct"] is not None):
+            if not asFunction.has_key("withCenteredDF"): asFunction["withCenteredDF"] = False
+            if not asFunction.has_key("withIncrement"):  asFunction["withIncrement"]  = 0.01
+            if not asFunction.has_key("withdX"):         asFunction["withdX"]         = None
+            from daNumerics.ApproximatedDerivatives import FDApproximation
+            FDA = FDApproximation(
+                Function   = asFunction["Direct"],
+                centeredDF = asFunction["withCenteredDF"],
+                increment  = asFunction["withIncrement"],
+                dX         = asFunction["withdX"] )
+            self.__CM["Direct"]  = Operator( fromMethod = FDA.DirectOperator  )
+            self.__CM["Tangent"] = Operator( fromMethod = FDA.TangentOperator )
+            self.__CM["Adjoint"] = Operator( fromMethod = FDA.AdjointOperator )
+        elif (type(asFunction) is type({})) and \
+                asFunction.has_key("Tangent") and asFunction.has_key("Adjoint") and \
+                (asFunction["Tangent"] is not None) and (asFunction["Adjoint"] is not None):
+            if not asFunction.has_key("Direct") or (asFunction["Direct"] is None):
+                self.__CM["Direct"] = Operator( fromMethod = asFunction["Tangent"]  )
+            else:
+                self.__CM["Direct"] = Operator( fromMethod = asFunction["Direct"]  )
+            self.__CM["Tangent"]    = Operator( fromMethod = asFunction["Tangent"] )
+            self.__CM["Adjoint"]    = Operator( fromMethod = asFunction["Adjoint"] )
+        elif asMatrix is not None:
+            matrice = numpy.matrix( asMatrix, numpy.float )
+            self.__CM["Direct"]  = Operator( fromMatrix = matrice )
+            self.__CM["Tangent"] = Operator( fromMatrix = matrice )
+            self.__CM["Adjoint"] = Operator( fromMatrix = matrice.T )
+            del matrice
+        else:
+            raise ValueError("Improperly defined input control model, it requires at minima either a matrix, a Direct for approximate derivatives or a Tangent/Adjoint pair.")
+        #
+        if toBeStored:
+            self.__StoredInputs["ControlModel"] = self.__CM
+        return 0
+
+    def setControlInput(self,
+            asVector           = None,
+            asPersistentVector = None,
+            Scheduler          = None,
+            toBeStored         = False,
+            ):
+        """
+        Permet de définir le controle en entree :
+        - asVector : entrée des données, comme un vecteur compatible avec le
+          constructeur de numpy.matrix
+        - asPersistentVector : entrée des données, comme un vecteur de type
+          persistent contruit avec la classe ad-hoc "Persistence"
+        - Scheduler est le contrôle temporel des données disponibles
+        - toBeStored : booléen indiquant si la donnée d'entrée est sauvée pour
+          être rendue disponible au même titre que les variables de calcul
+        """
+        if asVector is not None:
+            if isinstance(asVector,numpy.matrix):
+                self.__U = numpy.matrix( asVector.A1, numpy.float ).T
+            else:
+                self.__U = numpy.matrix( asVector,    numpy.float ).T
+        elif asPersistentVector is not None:
+            if isinstance(asPersistentVector,list) or isinstance( asPersistentVector,tuple):
+                self.__U = Persistence.OneVector("ControlInput", basetype=numpy.array)
+                for y in asPersistentVector:
+                    self.__U.store( y )
+            else:
+                self.__U = asPersistentVector
+        else:
+            raise ValueError("Error: improperly defined control input, it requires at minima either a vector, a list/tuple of vectors or a persistent object")
+        if toBeStored:
+            self.__StoredInputs["ControlInput"] = self.__U
+        return 0
+
     # -----------------------------------------------------------
     def setControls (self,
             asVector = None,
@@ -568,6 +672,12 @@ class AssimilationStudy:
             else:                             __Y_shape = self.__Y.shape()
         else: raise TypeError("Y has no attribute of shape: problem !")
         #
+        if self.__U is None:                  __U_shape = (0,)
+        elif hasattr(self.__U,"shape"):
+            if type(self.__U.shape) is tuple: __U_shape = self.__U.shape
+            else:                             __U_shape = self.__U.shape()
+        else: raise TypeError("U has no attribute of shape: problem !")
+        #
         if self.__B is None and self.__B_scalar is None:
             __B_shape = (0,0)
         elif self.__B is None and self.__B_scalar is not None:
@@ -592,19 +702,26 @@ class AssimilationStudy:
             else:                             __Q_shape = self.__Q.shape()
         else: raise TypeError("Q has no attribute of shape: problem !")
         #
-        if len(self.__H) == 0:                          __H_shape = (0,0)
-        elif type(self.__H) is type({}):                __H_shape = (0,0)
-        elif hasattr(self.__H["Direct"],"shape"):
-            if type(self.__H["Direct"].shape) is tuple: __H_shape = self.__H["Direct"].shape
-            else:                                       __H_shape = self.__H["Direct"].shape()
+        if len(self.__HO) == 0:                          __HO_shape = (0,0)
+        elif type(self.__HO) is type({}):                __HO_shape = (0,0)
+        elif hasattr(self.__HO["Direct"],"shape"):
+            if type(self.__HO["Direct"].shape) is tuple: __HO_shape = self.__HO["Direct"].shape
+            else:                                       __HO_shape = self.__HO["Direct"].shape()
         else: raise TypeError("H has no attribute of shape: problem !")
         #
-        if len(self.__M) == 0:                          __M_shape = (0,0)
-        elif type(self.__M) is type({}):                __M_shape = (0,0)
-        elif hasattr(self.__M["Direct"],"shape"):
-            if type(self.__M["Direct"].shape) is tuple: __M_shape = self.__M["Direct"].shape
-            else:                                       __M_shape = self.__M["Direct"].shape()
-        else: raise TypeError("M has no attribute of shape: problem !")
+        if len(self.__EM) == 0:                          __EM_shape = (0,0)
+        elif type(self.__EM) is type({}):                __EM_shape = (0,0)
+        elif hasattr(self.__EM["Direct"],"shape"):
+            if type(self.__EM["Direct"].shape) is tuple: __EM_shape = self.__EM["Direct"].shape
+            else:                                       __EM_shape = self.__EM["Direct"].shape()
+        else: raise TypeError("EM has no attribute of shape: problem !")
+        #
+        if len(self.__CM) == 0:                          __CM_shape = (0,0)
+        elif type(self.__CM) is type({}):                __CM_shape = (0,0)
+        elif hasattr(self.__CM["Direct"],"shape"):
+            if type(self.__CM["Direct"].shape) is tuple: __CM_shape = self.__CM["Direct"].shape
+            else:                                       __CM_shape = self.__CM["Direct"].shape()
+        else: raise TypeError("CM has no attribute of shape: problem !")
         #
         # Vérification des conditions
         # ---------------------------
@@ -619,17 +736,17 @@ class AssimilationStudy:
             raise ValueError("Shape characteristic of R is incorrect: \"%s\""%(__R_shape,))
         if not( min(__Q_shape) == max(__Q_shape) ):
             raise ValueError("Shape characteristic of Q is incorrect: \"%s\""%(__Q_shape,))
-        if not( min(__M_shape) == max(__M_shape) ):
-            raise ValueError("Shape characteristic of M is incorrect: \"%s\""%(__M_shape,))
-        #
-        if len(self.__H) > 0 and not(type(self.__H) is type({})) and not( __H_shape[1] == max(__Xb_shape) ):
-            raise ValueError("Shape characteristic of H \"%s\" and X \"%s\" are incompatible"%(__H_shape,__Xb_shape))
-        if len(self.__H) > 0 and not(type(self.__H) is type({})) and not( __H_shape[0] == max(__Y_shape) ):
-            raise ValueError("Shape characteristic of H \"%s\" and Y \"%s\" are incompatible"%(__H_shape,__Y_shape))
-        if len(self.__H) > 0 and not(type(self.__H) is type({})) and len(self.__B) > 0 and not( __H_shape[1] == __B_shape[0] ):
-            raise ValueError("Shape characteristic of H \"%s\" and B \"%s\" are incompatible"%(__H_shape,__B_shape))
-        if len(self.__H) > 0 and not(type(self.__H) is type({})) and len(self.__R) > 0 and not( __H_shape[0] == __R_shape[1] ):
-            raise ValueError("Shape characteristic of H \"%s\" and R \"%s\" are incompatible"%(__H_shape,__R_shape))
+        if not( min(__EM_shape) == max(__EM_shape) ):
+            raise ValueError("Shape characteristic of EM is incorrect: \"%s\""%(__EM_shape,))
+        #
+        if len(self.__HO) > 0 and not(type(self.__HO) is type({})) and not( __HO_shape[1] == max(__Xb_shape) ):
+            raise ValueError("Shape characteristic of H \"%s\" and X \"%s\" are incompatible"%(__HO_shape,__Xb_shape))
+        if len(self.__HO) > 0 and not(type(self.__HO) is type({})) and not( __HO_shape[0] == max(__Y_shape) ):
+            raise ValueError("Shape characteristic of H \"%s\" and Y \"%s\" are incompatible"%(__HO_shape,__Y_shape))
+        if len(self.__HO) > 0 and not(type(self.__HO) is type({})) and len(self.__B) > 0 and not( __HO_shape[1] == __B_shape[0] ):
+            raise ValueError("Shape characteristic of H \"%s\" and B \"%s\" are incompatible"%(__HO_shape,__B_shape))
+        if len(self.__HO) > 0 and not(type(self.__HO) is type({})) and len(self.__R) > 0 and not( __HO_shape[0] == __R_shape[1] ):
+            raise ValueError("Shape characteristic of H \"%s\" and R \"%s\" are incompatible"%(__HO_shape,__R_shape))
         #
         if self.__B is not None and len(self.__B) > 0 and not( __B_shape[1] == max(__Xb_shape) ):
             if self.__StoredInputs["AlgorithmName"] in ["EnsembleBlue",]:
@@ -644,8 +761,11 @@ class AssimilationStudy:
         if self.__R is not None and len(self.__R) > 0 and not( __R_shape[1] == max(__Y_shape) ):
             raise ValueError("Shape characteristic of R \"%s\" and Y \"%s\" are incompatible"%(__R_shape,__Y_shape))
         #
-        if self.__M is not None and len(self.__M) > 0 and not(type(self.__M) is type({})) and not( __M_shape[1] == max(__Xb_shape) ):
-            raise ValueError("Shape characteristic of M \"%s\" and X \"%s\" are incompatible"%(__M_shape,__Xb_shape))
+        if self.__EM is not None and len(self.__EM) > 0 and not(type(self.__EM) is type({})) and not( __EM_shape[1] == max(__Xb_shape) ):
+            raise ValueError("Shape characteristic of EM \"%s\" and X \"%s\" are incompatible"%(__EM_shape,__Xb_shape))
+        #
+        if self.__CM is not None and len(self.__CM) > 0 and not(type(self.__CM) is type({})) and not( __CM_shape[1] == max(__U_shape) ):
+            raise ValueError("Shape characteristic of CM \"%s\" and U \"%s\" are incompatible"%(__CM_shape,__U_shape))
         #
         return 1
 
@@ -664,8 +784,10 @@ class AssimilationStudy:
         self.__algorithm.run(
             Xb         = self.__Xb,
             Y          = self.__Y,
-            H          = self.__H,
-            M          = self.__M,
+            U          = self.__U,
+            HO         = self.__HO,
+            EM         = self.__EM,
+            CM         = self.__CM,
             R          = self.__R,
             B          = self.__B,
             Q          = self.__Q,
@@ -885,8 +1007,9 @@ class AssimilationStudy:
     def prepare_to_pickle(self):
         self.__algorithmFile = None
         self.__diagnosticFile = None
-        self.__H  = {}
-        self.__M  = {}
+        self.__HO  = {}
+        self.__EM  = {}
+        self.__CM  = {}
 
 # ==============================================================================
 if __name__ == "__main__":
@@ -909,7 +1032,7 @@ if __name__ == "__main__":
     print "Observation        :", [0.5, 1.5, 2.5]
     print "Demi-somme         :", list((numpy.array([0, 1, 2])+numpy.array([0.5, 1.5, 2.5]))/2)
     print "  qui doit être identique à :"
-    print "Analyse résultante :", ADD.get("Analysis").valueserie(0)
+    print "Analyse résultante :", ADD.get("Analysis")[0]
     print
     
     print "Algorithmes disponibles.......................:", ADD.get_available_algorithms()
@@ -937,7 +1060,7 @@ if __name__ == "__main__":
     print "Exemple de mise en place d'un observeur :"
     def obs(var=None,info=None):
         print "  ---> Mise en oeuvre de l'observer"
-        print "       var  =",var.valueserie(-1)
+        print "       var  =",var[-1]
         print "       info =",info
     ADD.setDataObserver( 'Analysis', HookFunction=obs, Scheduler = [2, 4], HookParameters = "Second observer")
     # Attention, il faut décaler le stockage de 1 pour suivre le pas interne
index a2a36c2d87b63ed8acd48faddfe0c968d4aecaa0..1ddd4f64f37acf0aafaa491683adf32990d676b6 100644 (file)
@@ -26,7 +26,7 @@ __doc__ = """
 """
 __author__ = "Jean-Philippe ARGAUD"
 
-import numpy
+import numpy, copy
 
 from PlatformInfo import PathManagement ; PathManagement()
 
@@ -45,22 +45,17 @@ class Persistence:
         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) :
-        __step   : numérotation par défaut du pas courant
         __basetype : le type de base de chaque valeur, sous la forme d'un type
                      permettant l'instanciation ou le casting Python 
-        __steps  : les pas de stockage. Par défaut, c'est __step
         __values : les valeurs de stockage. Par défaut, c'est None
         """
         self.__name = str(name)
         self.__unit = str(unit)
         #
-        self.__step     = -1
         self.__basetype = basetype
         #
-        self.__steps    = []
-        self.__values   = []
-        self.__tags     = []
-        self.__tagkeys  = {}
+        self.__values = []
+        self.__tags   = []
         #
         self.__dynamic  = False
         #
@@ -75,51 +70,34 @@ class Persistence:
         else:
             self.__basetype = basetype
 
-    def store(self, value=None, step=None, tags={}):
+    def store(self, value=None, **kwargs):
         """
-        Stocke une valeur à un pas. Une instanciation est faite avec le type de
-        base pour stocker l'objet. Si le pas n'est pas fournit, on utilise
-        l'étape de stockage comme valeur de pas.
+        Stocke une valeur avec ses informations de filtrage.
         """
         if value is None: raise ValueError("Value argument required")
-        self.__step += 1
-        if step is not None:
-            self.__steps.append(step)
-        else:
-            self.__steps.append(self.__step)
         #
         self.__values.append(self.__basetype(value))
-        #
-        self.__tags.append(   dict(tags))
-        self.__tagkeys.update(dict(tags))
+        self.__tags.append(kwargs)
         #
         if self.__dynamic: self.__replots()
+        __step = len(self.__values) - 1
         for hook, parameters, scheduler in self.__dataobservers:
-            if self.__step in scheduler:
+            if __step in scheduler:
                 hook( self, parameters )
 
-    def pop(self, item=None, step=None):
+    def pop(self, item=None):
         """
-        Retire une valeur enregistree. Par defaut, retire par le numero d'item,
-        sinon cherche le step demande et le retire s'il existe. Sans argument,
+        Retire une valeur enregistree par son index de stockage. Sans argument,
         retire le dernier objet enregistre.
-        Attention, la liste des cles "tagkeys" n'est pas mise a jour.
         """
         if item is not None:
-            index = int(item)
-            self.__steps.pop(index)
-            self.__values.pop(index)
-            self.__tags.pop(index)
-        elif step is not None:
-            index = int(self.__steps.index(int(step)))
-            self.__steps.pop(index)
-            self.__values.pop(index)
-            self.__tags.pop(index)
+            __index = int(item)
+            self.__values.pop(__index)
+            self.__tags.pop(__index)
         else:
-            self.__steps.pop()
             self.__values.pop()
             self.__tags.pop()
-
+    
     def shape(self):
         """
         Renvoie la taille sous forme numpy du dernier objet stocké. Si c'est un
@@ -128,7 +106,7 @@ class Persistence:
         longueur. Par défaut, renvoie 1.
         """
         if len(self.__values) > 0:
-            if self.__basetype in [numpy.matrix, numpy.array]:
+            if self.__basetype in [numpy.matrix, numpy.array, numpy.ravel]:
                 return self.__values[-1].shape
             elif self.__basetype in [int, float]:
                 return (1,)
@@ -139,162 +117,96 @@ class Persistence:
         else:
             raise ValueError("Object has no shape before its first storage")
 
+    # ---------------------------------------------------------
+    def __str__(self):
+        msg  = "   Index        Value   Tags\n"
+        for i,v in enumerate(self.__values):
+            msg += "  i=%05i  %10s   %s\n"%(i,v,self.__tags[i])
+        return msg
+    
     def __len__(self):
-        """
-        Renvoie le nombre d'éléments dans un séquence ou la plus grande
-        dimension d'une matrice
-        """
-        return max( self.shape() )
+        return len(self.__values)
+    
+    def __getitem__(self, index=None ):
+        return copy.copy(self.__values[index])
+    
+    def count(self, value):
+        return self.__values.count(value)
+    
+    def index(self, value, start=0, stop=None):
+        if stop is None : stop = len(self.__values)
+        return self.__values.index(value, start, stop)
 
     # ---------------------------------------------------------
-    def itemserie(self, item=None, step=None, tags=None,
-                        allSteps=False):
-        """
-        Les "item" sont les index de la liste des pas de "step". Ils sont
-        renvoyés par cette fonction selon les filtres définis par les mots-clés.
-        
-        Les comportements sont les suivants :
-            - Renvoie par défaut toute la liste des index.
-            - Si l'argument "item" est valide, renvoie uniquement cet index.
-            - Si l'argument "step" existe dans la liste des pas de stockage,
-              renvoie le premier index (si allSteps=False) ou tous les index
-              (si allSteps=True) de ce "step" dans les pas de stockage.
-            - Si l'argument "tags" est un dictionnaire correct, renvoie les
-              index des pas caractérisés par toutes les paires "tag/valeur" des
-              tags indiqués, ou rien sinon.
-        
-        Cette méthode est à vocation interne pour simplifier les accès aux pas
-        par la méthode "stepserie", aux attributs par la méthode "tagserie" et
-        aux valeurs par la méthode "valueserie".
-        """
-        #
-        # Cherche l'item demandé
-        if item is not None and item < len(self.__steps):
-            return [item,]
-        #
-        # Cherche le ou les items dont le "step" est demandé
-        elif step is not None and step in self.__steps:
-            if allSteps:
-                allIndexes = []
-                searchFrom = 0
-                try:
-                    while self.__steps.index(step,searchFrom) >= 0:
-                        searchFrom = self.__steps.index(step,searchFrom)
-                        allIndexes.append( searchFrom )
-                        searchFrom +=1
-                except ValueError, e:
-                    pass
-                return allIndexes
-            else:
-                return [self.__steps.index(step),]
-        #
-        # Cherche le ou les items dont les "tags" sont demandés
-        elif tags is not None and type(tags) is dict :
-            allIndexes = []
-            for i, attributs in enumerate(self.__tags):           # Boucle sur les attributs de chaque pas
-                selection = True                                  # Booleen permettant de traiter la combinaison "ET" des tags
-                for key in tags.keys():                           # Boucle sur tous les tags de filtrage
-                    if key not in self.__tagkeys.keys(): continue # Passe au suivant s'il n'existe nulle part
-                    if not( key in attributs.keys() and attributs[key] == tags[key] ):
-                        selection = False
-                if selection:
-                    allIndexes.append(i)
-            allIndexes = list(set(allIndexes))
-            allIndexes.sort()
-            return allIndexes
-        #
-        # Renvoie par défaut tous les items valides
-        else:
-            return range(len(self.__steps))
-
-    def stepserie(self, item=None, step=None, tags=None):
-        """
-        Les "step" sont les pas nommés de stockage. Par défaut, s'il ne sont pas
-        définis explicitement, ils sont identiques aux index de stockage. Ils
-        sont renvoyés par cette fonction selon les filtres définis par les
-        mots-clés.
-        
-        Les comportements sont les suivants :
-            - Renvoie par défaut toute la liste des pas.
-            - Si l'argument "item" est valide, renvoie le pas à cet index.
-            - Si l'argument "step" existe dans la liste des pas, le renvoie.
-            - Si l'argument "tags" est un dictionnaire correct, renvoie les pas
-              caractérisés par toutes les paires "tag/valeur" des tags indiqués,
-              ou rien sinon.
-        """
-        if item is not None and item < len(self.__steps):
-            return self.__steps[item]
-        elif step is not None and step in self.__steps:
-            return step
-        elif tags is not None:
-            allIndexes = self.itemserie(tags = tags)
-            return [self.__steps[index] for index in allIndexes]
-        else:
-            return self.__steps
+    def __filteredIndexes(self, **kwargs):
+        __indexOfFilteredItems = range(len(self.__tags))
+        __filteringKwTags = kwargs.keys()
+        if len(__filteringKwTags) > 0:
+            for tagKey in __filteringKwTags:
+                __tmp = []
+                for i in __indexOfFilteredItems:
+                    if self.__tags[i].has_key(tagKey):
+                        if self.__tags[i][tagKey] == kwargs[tagKey]:
+                            __tmp.append( i )
+                        elif isinstance(kwargs[tagKey],(list,tuple)) and self.__tags[i][tagKey] in kwargs[tagKey]:
+                            __tmp.append( i )
+                __indexOfFilteredItems = __tmp
+                if len(__indexOfFilteredItems) == 0: break
+        return __indexOfFilteredItems
 
-    def valueserie(self, item=None, step=None, tags=None,
-                         allSteps=False):
-        """
-        Les valeurs stockées sont renvoyées par cette fonction selon les filtres
-        définis par les mots-clés.
-        
-        Les comportements sont les suivants :
-            - Renvoie par défaut toute la liste des valeurs.
-            - Si l'argument "item" est valide, renvoie la valeur à cet index.
-            - Si l'argument "step" existe dans la liste des pas de stockage,
-              renvoie la première valeur (si allSteps=False) ou toutes les
-              valeurs (si allSteps=True).
-            - Si l'argument "tags" est un dictionnaire correct, renvoie les
-              valeurs aux pas caractérisés par toutes les paires "tag/valeur"
-              des tags indiqués, ou rien sinon.
-        """
-        if item is not None and item < len(self.__values):
-            return self.__values[item]
-        elif step is not None:
-            allIndexes = self.itemserie(step = step, allSteps = allSteps)
-            if allSteps:
-                return [self.__values[index] for index in allIndexes]
+    # ---------------------------------------------------------
+    def values(self, **kwargs):
+        __indexOfFilteredItems = self.__filteredIndexes(**kwargs)
+        return [self.__values[i] for i in __indexOfFilteredItems]
+
+    def keys(self, keyword=None , **kwargs):
+        __indexOfFilteredItems = self.__filteredIndexes(**kwargs)
+        __keys = []
+        for i in __indexOfFilteredItems:
+            if self.__tags[i].has_key( keyword ):
+                __keys.append( self.__tags[i][keyword] )
+            else:
+                __keys.append( None )
+        return __keys
+
+    def items(self, keyword=None , **kwargs):
+        __indexOfFilteredItems = self.__filteredIndexes(**kwargs)
+        __pairs = []
+        for i in __indexOfFilteredItems:
+            if self.__tags[i].has_key( keyword ):
+                __pairs.append( [self.__tags[i][keyword], self.__values[i]] )
             else:
-                return self.__values[allIndexes[0]]
-        elif tags is not None:
-            allIndexes = self.itemserie(tags = tags)
-            return [self.__values[index] for index in allIndexes]
+                __pairs.append( [None, self.__values[i]] )
+        return __pairs
+
+    def tagkeys(self):
+        __allKeys = []
+        for dicotags in self.__tags:
+            __allKeys.extend( dicotags.keys() )
+        __allKeys = list(set(__allKeys))
+        __allKeys.sort()
+        return __allKeys
+
+    # def valueserie(self, item=None, allSteps=True, **kwargs):
+    #     if item is not None:
+    #         return self.__values[item]
+    #     else:
+    #         __indexOfFilteredItems = self.__filteredIndexes(**kwargs)
+    #         if not allSteps and len(__indexOfFilteredItems) > 0:
+    #             return self.__values[__indexOfFilteredItems[0]]
+    #         else:
+    #             return [self.__values[i] for i in __indexOfFilteredItems]
+
+    def tagserie(self, item=None, withValues=False, outputTag=None, **kwargs):
+        if item is None:
+            __indexOfFilteredItems = self.__filteredIndexes(**kwargs)
         else:
-            return self.__values
-    
-    def tagserie(self, item=None, step=None, tags=None,
-                       allSteps=False, withValues=False,
-                       outputTag=None):
-        """
-        Les "tag" sont les attributs nommés, sous forme de paires "clé/valeur",
-        qu'il est possible d'associer avec chaque pas de stockage. Par défaut,
-        s'il ne sont pas définis explicitement, il n'y en a pas. Ils sont
-        renvoyés par cette fonction selon les filtres définis par les mots-clés.
-        On obtient uniquement la liste des clés de tags avec "withValues=False"
-        ou la liste des paires "clé/valeurs" avec "withValues=True".
-        
-        On peut aussi obtenir les valeurs d'un tag satisfaisant aux conditions
-        de filtrage en "item/step/tags" en donnant le nom du tag dans
-        "outputTag".
-
-        Les comportements sont les suivants :
-            - Renvoie par défaut toute la liste des tags.
-            - Si l'argument "item" est valide, renvoie le tag à cet index.
-            - Si l'argument "step" existe dans la liste des pas de stockage,
-              renvoie les tags du premier pas (si allSteps=False) ou la liste
-              des tags de tous les pas (si allSteps=True).
-            - Si l'argument "tags" est un dictionnaire correct, renvoie les
-              valeurs aux pas caractérisés par toutes les paires "tag/valeur"
-              des tags indiqués, ou rien sinon.
-        """
-        #
-        # Cherche tous les index satisfaisant les conditions
-        allIndexes = self.itemserie(item = item, step = step, tags = tags, allSteps = allSteps)
+            __indexOfFilteredItems = [item,]
         #
         # Dans le cas où la sortie donne les valeurs d'un "outputTag"
         if outputTag is not None and type(outputTag) is str :
             outputValues = []
-            for index in allIndexes:
+            for index in __indexOfFilteredItems:
                 if outputTag in self.__tags[index].keys():
                     outputValues.append( self.__tags[index][outputTag] )
             outputValues = list(set(outputValues))
@@ -304,34 +216,24 @@ class Persistence:
         # Dans le cas où la sortie donne les tags satisfaisants aux conditions
         else:
             if withValues:
-                return [self.__tags[index] for index in allIndexes]
+                return [self.__tags[index] for index in __indexOfFilteredItems]
             else:
                 allTags = {}
-                for index in allIndexes:
+                for index in __indexOfFilteredItems:
                     allTags.update( self.__tags[index] )
                 allKeys = allTags.keys()
                 allKeys.sort()
                 return allKeys
 
-    def stepnumber(self):
-        """
-        Renvoie le nombre de pas de stockage.
-        """
-        return len(self.__steps)
-
     # ---------------------------------------------------------
-    # Méthodes d'accès de type dictionnaire
-    def keys(self):
-        return self.stepserie()
-
-    def values(self):
-        return self.valueserie()
+    # Pour compatibilite
+    def stepnumber(self):
+        return len(self.__values)
 
-    def items(self):
-        pairs = []
-        for i in xrange(self.stepnumber()):
-            pairs.append( (self.stepserie(item=i), self.valueserie(item=i)) )
-        return pairs
+    # Pour compatibilite
+    def stepserie(self, **kwargs):
+        __indexOfFilteredItems = self.__filteredIndexes(**kwargs)
+        return __indexOfFilteredItems
 
     # ---------------------------------------------------------
     def means(self):
@@ -486,8 +388,8 @@ class Persistence:
         #
         # Tracé du ou des vecteurs demandés
         indexes = []
-        if step is not None and step in self.__steps:
-            indexes.append(self.__steps.index(step))
+        if step is not None and step < len(self.__values):
+            indexes.append(step)
         elif item is not None and item < len(self.__values):
             indexes.append(item)
         else:
@@ -828,16 +730,16 @@ class CompositePersistence:
             self.__StoredObjects["RmsBMA"]           = OneScalar("RmsBMA")
         #
 
-    def store(self, name=None, value=None, step=None, tags={}):
+    def store(self, name=None, value=None, **kwargs):
         """
         Stockage d'une valeur "value" pour le "step" dans la variable "name".
         """
         if name is None: raise ValueError("Storable object name is required for storage.")
         if name not in self.__StoredObjects.keys():
             raise ValueError("No such name '%s' exists in storable objects."%name)
-        self.__StoredObjects[name].store( value=value, step=step, tags=tags )
+        self.__StoredObjects[name].store( value=value, **kwargs )
 
-    def add_object(self, name=None, persistenceType=Persistence, basetype=numpy.array ):
+    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.
@@ -845,7 +747,10 @@ class CompositePersistence:
         if name is None: raise ValueError("Object name is required for adding an object.")
         if name in self.__StoredObjects.keys():
             raise ValueError("An object with the same name '%s' already exists in storable objects. Choose another one."%name)
-        self.__StoredObjects[name] = persistenceType( name=str(name), basetype=basetype )
+        if basetype is None:
+            self.__StoredObjects[name] = persistenceType( name=str(name) )
+        else:
+            self.__StoredObjects[name] = persistenceType( name=str(name), basetype=basetype )
 
     def get_object(self, name=None ):
         """
@@ -974,15 +879,82 @@ class CompositePersistence:
 if __name__ == "__main__":
     print '\n AUTODIAGNOSTIC \n'
 
+    OBJ = Persistence()                                                                                                
+    OBJ.store( 2)
+    OBJ.store( 3, Campagne="GR514")
+    OBJ.store( 4, Campagne="GR514")
+    OBJ.store( 5, Campagne="GR514")
+    OBJ.store( 6, Campagne="CA206", CDF="c020")
+    OBJ.store( 7, Campagne="GR514")
+    OBJ.store( 8, Campagne="GR514", CDF="c020")
+    OBJ.store( 9, Campagne="GR514", CDF="c020", BU=100.5)
+    print
+    print OBJ
+    print
+    print "Nombre d'items stockés..........................:", len(OBJ)
+    print
+    print "Mots-clé utilisés...............................:", OBJ.tagkeys()
+    print
+    print "Obtention de valeurs, clefs, items en fonction du filtrage"
+    print """  OBJ.values()................................:""", OBJ.values()
+    print """  OBJ.values(Campagne="GR514")................:""", OBJ.values(Campagne="GR514")
+    print """  OBJ.values(Campagne="c020").................:""", OBJ.values(Campagne="c020")
+    print """  OBJ.values(CDF="c020")......................:""", OBJ.values(CDF="c020")
+    print """  OBJ.values(Campagne="GR514",CDF="c020").....:""", OBJ.values(Campagne="GR514",CDF="c020")
+    print """  OBJ.values(Campagne=("GR514","CA206").......:""", OBJ.values(Campagne=("GR514","CA206"))
+    print
+    print """  OBJ.keys()..................................:""", OBJ.keys()
+    print """  OBJ.keys(Campagne="GR514")..................:""", OBJ.keys(Campagne="GR514")
+    print """  OBJ.keys(Campagne="c020")...................:""", OBJ.keys(Campagne="c020")
+    print """  OBJ.keys(CDF="c020")........................:""", OBJ.keys(CDF="c020")
+    print """  OBJ.keys(Campagne="GR514",CDF="c020").......:""", OBJ.keys(Campagne="GR514",CDF="c020")
+    print """  OBJ.keys(Campagne=("GR514","CA206").........:""", OBJ.keys(Campagne=("GR514","CA206"))
+    print
+    print """  OBJ.items().................................:""", OBJ.items()
+    print """  OBJ.items(Campagne="GR514").................:""", OBJ.items(Campagne="GR514")
+    print """  OBJ.items(Campagne="c020")..................:""", OBJ.items(Campagne="c020")
+    print """  OBJ.items(CDF="c020").......................:""", OBJ.items(CDF="c020")
+    print """  OBJ.items(Campagne="GR514",CDF="c020")......:""", OBJ.items(Campagne="GR514",CDF="c020")
+    print """  OBJ.items(Campagne=("GR514","CA206")........:""", OBJ.items(Campagne=("GR514","CA206"))
+    print
+    print "Obtention de valeurs de clefs particulières en fonction du filtrage"
+    print """  OBJ.keys("Campagne")........................:""", OBJ.keys("Campagne")
+    print """  OBJ.keys("CDF").............................:""", OBJ.keys("CDF")
+    print """  OBJ.keys("CDF",Campagne="GR514")............:""", OBJ.keys("CDF",Campagne="GR514")
+    print """  OBJ.keys("Campagne",CDF="c020").............:""", OBJ.keys("Campagne",CDF="c020")
+    print """  OBJ.keys("CDF",CDF="c020")..................:""", OBJ.keys("CDF",CDF="c020")
+    print """  OBJ.keys("BU")..............................:""", OBJ.keys("BU")
+    print """  OBJ.keys("CDF",Campagne=("GR514","CA206")...:""", OBJ.keys("CDF",Campagne=("GR514","CA206"))
+    print
+    print """  OBJ.items("Campagne").......................:""", OBJ.items("Campagne")
+    print """  OBJ.items("CDF")............................:""", OBJ.items("CDF")
+    print """  OBJ.items("CDF",Campagne="GR514")...........:""", OBJ.items("CDF",Campagne="GR514")
+    print """  OBJ.items("Campagne",CDF="c020")............:""", OBJ.items("Campagne",CDF="c020")
+    print """  OBJ.items("CDF",CDF="c020").................:""", OBJ.items("CDF",CDF="c020")
+    print """  OBJ.items("BU").............................:""", OBJ.items("BU")
+    print """  OBJ.items("CDF",Campagne=("GR514","CA206")..:""", OBJ.items("CDF",Campagne=("GR514","CA206"))
+    print
+    print "Obtention de valeurs comme dans une liste"
+    print """  OBJ[0]......................................:""", OBJ[0]
+    print """  OBJ[1]......................................:""", OBJ[1]
+    print """  OBJ[-1].....................................:""", OBJ[-1]
+    print """  OBJ[2:4]....................................:""", OBJ[2:4]
+    print """  OBJ[:]......................................:""", OBJ[:]
+    print """  len(OBJ)....................................:""", len(OBJ)
+    print """  OBJ.count(4)................................:""", OBJ.count("4")
+    print """  OBJ.index(4)................................:""", OBJ.index("4")
+    print """  OBJ.index(9)................................:""", OBJ.index("9")
+    print
+
     print "======> Un flottant"
     OBJET_DE_TEST = OneScalar("My float", unit="cm")
     OBJET_DE_TEST.store( 5.)
     OBJET_DE_TEST.store(-5.)
     OBJET_DE_TEST.store( 1.)
     print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
     print "Valeurs par pas :"
     print "  La moyenne        :", OBJET_DE_TEST.means()
     print "  L'écart-type      :", OBJET_DE_TEST.stds()
@@ -1000,7 +972,7 @@ if __name__ == "__main__":
     print "Taille \"len\"        :", len(OBJET_DE_TEST)
     del OBJET_DE_TEST
     print
-
+    
     print "======> Un flottant"
     OBJET_DE_TEST = OneScalar("My float", unit="cm")
     OBJET_DE_TEST.store( 5., step="azerty")
@@ -1010,14 +982,12 @@ if __name__ == "__main__":
     OBJET_DE_TEST.store( 5., step="poiuyt")
     OBJET_DE_TEST.store(-5., step="azerty")
     OBJET_DE_TEST.store( 1., step="poiuyt")
-    print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
-    print "Premier index       :", OBJET_DE_TEST.valueserie( step = "azerty", allSteps = False )
-    print "Valeurs identiques  :", OBJET_DE_TEST.valueserie( step = "azerty", allSteps = True )
-    print "Premier index       :", OBJET_DE_TEST.valueserie( step = "poiuyt", allSteps = False )
-    print "Valeurs identiques  :", OBJET_DE_TEST.valueserie( step = "poiuyt", allSteps = True )
+    print "Les noms de pas     :", OBJET_DE_TEST.keys("step")
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
+    print "Valeurs identiques  :", OBJET_DE_TEST.values( step = "azerty" )
+    print "Valeurs identiques  :", OBJET_DE_TEST.values( step = "poiuyt" )
     del OBJET_DE_TEST
     print
 
@@ -1027,9 +997,9 @@ if __name__ == "__main__":
     OBJET_DE_TEST.store(-5 )
     OBJET_DE_TEST.store( 1.)
     print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
     print "Valeurs par pas :"
     print "  La moyenne        :", OBJET_DE_TEST.means()
     print "  L'écart-type      :", OBJET_DE_TEST.stds()
@@ -1054,9 +1024,9 @@ if __name__ == "__main__":
     OBJET_DE_TEST.store( False )
     OBJET_DE_TEST.store( True  )
     print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
     print "Taille \"shape\"      :", OBJET_DE_TEST.shape()
     print "Taille \"len\"        :", len(OBJET_DE_TEST)
     del OBJET_DE_TEST
@@ -1068,9 +1038,9 @@ if __name__ == "__main__":
     OBJET_DE_TEST.store( (-5, 5 ) )
     OBJET_DE_TEST.store( (1., 1.) )
     print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
     print "Valeurs par pas :"
     print "  La moyenne        :", OBJET_DE_TEST.means()
     print "  L'écart-type      :", OBJET_DE_TEST.stds()
@@ -1095,9 +1065,9 @@ if __name__ == "__main__":
     OBJET_DE_TEST.store( (False,  5 ) )
     OBJET_DE_TEST.store( (True ,  1.) )
     print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
     print "Valeurs par pas : attention, on peut les calculer car True=1, False=0, mais cela n'a pas de sens"
     print "  La moyenne        :", OBJET_DE_TEST.means()
     print "  L'écart-type      :", OBJET_DE_TEST.stds()
@@ -1122,9 +1092,9 @@ if __name__ == "__main__":
     OBJET_DE_TEST.store( 3 )
     OBJET_DE_TEST.store( 7  )
     print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST.valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST.valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST.valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
     print "Taille \"shape\"      :", OBJET_DE_TEST.shape()
     print "Taille \"len\"        :", len(OBJET_DE_TEST)
     del OBJET_DE_TEST
@@ -1135,10 +1105,10 @@ if __name__ == "__main__":
     for i in range(5):
         OBJET_DE_TEST.store( 7+i )
     print "Taille \"len\"        :", len(OBJET_DE_TEST)
-    print "Les pas de stockage :", OBJET_DE_TEST.keys()
+    print "Les clés absentes   :", OBJET_DE_TEST.keys()
     print "Les valeurs         :", OBJET_DE_TEST.values()
     print "Les paires          :", OBJET_DE_TEST.items()
-    OBJET_DE_TEST.pop(step=1)
+    OBJET_DE_TEST.pop(1)
     print "Les valeurs sans la 1:", OBJET_DE_TEST.values()
     OBJET_DE_TEST.pop(item=2)
     print "Les valeurs sans la 2:", OBJET_DE_TEST.values()
@@ -1164,9 +1134,9 @@ if __name__ == "__main__":
     OBJET_DE_TEST.add_object("ValeursStr", persistenceType=Persistence, basetype=str )
     OBJET_DE_TEST.store("ValeursStr","IGN3")
     OBJET_DE_TEST.store("ValeursStr","c021")
-    print "Les valeurs       :", OBJET_DE_TEST.get_object("ValeursStr").valueserie()
+    print "Les valeurs       :", OBJET_DE_TEST.get_object("ValeursStr")[:]
     print "Acces comme dict  :", OBJET_DE_TEST["ValeursStr"].stepserie()
-    print "Acces comme dict  :", OBJET_DE_TEST["ValeursStr"].valueserie()
+    print "Acces comme dict  :", OBJET_DE_TEST["ValeursStr"][:]
     print "Objets actifs     :", OBJET_DE_TEST.get_stored_objects( hideVoidObjects = True )
     print "--> Suppression d'un objet"
     OBJET_DE_TEST.del_object("ValeursVectorielles")
@@ -1222,15 +1192,14 @@ if __name__ == "__main__":
     for i in range(1,11):
         D.store( i*i )
     print "Taille \"shape\" du dernier objet stocké",OBJET_DE_TEST.shape()
-    print "Taille \"len\" du dernier objet stocké",len(OBJET_DE_TEST)
-    print "Nombre d'objets stockés",OBJET_DE_TEST.stepnumber()
+    print "Nombre d'objets stockés",len(OBJET_DE_TEST)
     del OBJET_DE_TEST
     print
 
     print "======> Affectation simple d'observateurs dynamiques"
     def obs(var=None,info=None):
         print "  ---> Mise en oeuvre de l'observer"
-        print "       var  =",var.valueserie(-1)
+        print "       var  =",var[-1]
         print "       info =",info
     OBJET_DE_TEST = Persistence("My object", unit="", basetype=list)
     D = OBJET_DE_TEST
@@ -1245,11 +1214,11 @@ if __name__ == "__main__":
     print "======> Affectation multiple d'observateurs dynamiques"
     def obs(var=None,info=None):
         print "  ---> Mise en oeuvre de l'observer"
-        print "       var  =",var.valueserie(-1)
+        print "       var  =",var[-1]
         print "       info =",info
     def obs_bis(var=None,info=None):
         print "  ---> Mise en oeuvre de l'observer"
-        print "       var  =",var.valueserie(-1)
+        print "       var  =",var[-1]
         print "       info =",info
     OBJET_DE_TEST = Persistence("My object", unit="", basetype=list)
     D = OBJET_DE_TEST
@@ -1284,44 +1253,40 @@ if __name__ == "__main__":
     OBJET_DE_TEST = CompositePersistence("My CompositePersistence", defaults=False)
     OBJET_DE_TEST.add_object("My ecarts", basetype = numpy.array)
 
-    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5),   tags = {"Camp":"Base","Carte":"IGN3","Niveau":1024,"Palier":"Premier"} )
-    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5)+1, tags = {"Camp":"Base","Carte":"IGN4","Niveau": 210,"Palier":"Premier"} )
-    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5)+2, tags = {"Camp":"Base","Carte":"IGN1","Niveau":1024} )
-    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5)+3, tags = {"Camp":"Sommet","Carte":"IGN2","Niveau":4024,"Palier":"Second","FullMap":True} )
+    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5),   Camp="Base",   Carte="IGN3", Niveau=1024, Palier="Premier" )
+    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5)+1, Camp="Base",   Carte="IGN4", Niveau= 210, Palier="Premier" )
+    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5)+2, Camp="Base",   Carte="IGN1", Niveau=1024 )
+    OBJET_DE_TEST.store( "My ecarts", numpy.arange(1,5)+3, Camp="Sommet", Carte="IGN2", Niveau=4024, Palier="Second", FullMap=True )
 
     print "Les pas de stockage :", OBJET_DE_TEST["My ecarts"].stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST["My ecarts"].valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST["My ecarts"].valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST["My ecarts"].valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST["My ecarts"][:]
+    print "La 2ème valeur      :", OBJET_DE_TEST["My ecarts"][1]
+    print "La dernière valeur  :", OBJET_DE_TEST["My ecarts"][-1]
     print "Liste des attributs :", OBJET_DE_TEST["My ecarts"].tagserie()
     print "Taille \"shape\"      :", OBJET_DE_TEST["My ecarts"].shape()
     print "Taille \"len\"        :", len(OBJET_DE_TEST["My ecarts"])
     print
 
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Palier":"Premier"} )
-    print "Valeurs pour tag    :", OBJET_DE_TEST["My ecarts"].valueserie( tags={"Palier":"Premier"} )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Palier="Premier" )
+    print "Valeurs pour tag    :", OBJET_DE_TEST["My ecarts"].values( Palier="Premier" )
     print
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Carte":"IGN1"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Niveau":1024} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"Base"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"TOTO"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Toto":"Premier"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Carte":"IGN1"} )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Carte="IGN1" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Niveau=1024 )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Camp="Base" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Camp="TOTO" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Toto="Premier" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Carte="IGN1" )
     print
 
     print "Combinaison 'ET' de plusieurs Tags"
-    print "Attendu : [0, 1],    trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"Base", "Palier":"Premier"} )
-    print "Attendu : [],        trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"Sommet", "Palier":"Premier"} )
-    # Attention : {"Camp":"Sommet", "Camp":"Base"} == {"Camp":"Base"}
-    print "Attendu : [0, 1, 2], trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"Sommet", "Camp":"Base"} )
-    print "Attendu : [2],       trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( tags={"Carte":"IGN1", "Niveau":1024} )
+    print "Attendu : [0, 1],    trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( Camp="Base",   Palier="Premier" )
+    print "Attendu : [],        trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( Camp="Sommet", Palier="Premier" )
+    print "Attendu : [3],       trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( Camp="Sommet" )
+    print "Attendu : [2],       trouvé :",OBJET_DE_TEST["My ecarts"].stepserie( Carte="IGN1",  Niveau=1024 )
     print
       
     print "Liste des tags pour le pas (item) 1  :",OBJET_DE_TEST["My ecarts"].tagserie(item = 1)
     print "Liste des tags pour le pas (item) 2  :",OBJET_DE_TEST["My ecarts"].tagserie(item = 2)
-    print "Comme le step et l'item sont identiques par défaut, on doit avoir la même chose :"
-    print "Liste des tags pour le pas (step) 1  :",OBJET_DE_TEST["My ecarts"].tagserie(step = 1)
-    print "Liste des tags pour le pas (step) 2  :",OBJET_DE_TEST["My ecarts"].tagserie(step = 2)
     print
     print "Liste des tags/valeurs pour le pas 1 :",OBJET_DE_TEST["My ecarts"].tagserie(item = 1, withValues=True)
     print "Liste des tags/valeurs pour le pas 2 :",OBJET_DE_TEST["My ecarts"].tagserie(item = 2, withValues=True)
@@ -1333,10 +1298,10 @@ if __name__ == "__main__":
     print
 
     OBJET_DE_TEST.add_object("My other ecarts", basetype = numpy.array)
-    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5),   tags = {"Camp":"Base","Carte":"IGN3","Niveau":1024,"Palier":"Premier"} )
-    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5)+1, tags = {"Camp":"Base","Carte":"IGN4","Niveau": 210,"Palier":"Premier"} )
-    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5)+2, tags = {"Camp":"Base","Carte":"IGN1","Niveau":1024} )
-    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5)+3, tags = {"Camp":"Sommet","Carte":"IGN2","Niveau":4024,"Palier":"Second"} )
+    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5),   Camp="Base",  Carte="IGN3",Niveau=1024,Palier="Premier" )
+    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5)+1, Camp="Base",  Carte="IGN4",Niveau= 210,Palier="Premier" )
+    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5)+2, Camp="Base",  Carte="IGN1",Niveau=1024 )
+    OBJET_DE_TEST.store( "My other ecarts", numpy.arange(-1,5)+3, Camp="Sommet",Carte="IGN2",Niveau=4024,Palier="Second" )
 
     print "Objets présents dans le composite :",OBJET_DE_TEST.get_stored_objects()
     fichier = "composite.pkl.gz"
@@ -1352,41 +1317,83 @@ if __name__ == "__main__":
     print "Objets présents dans le composite :",OBJET_DE_TEST.get_stored_objects()
     print "Taille des objets contenus :"
     for name in OBJET_DE_TEST.get_stored_objects():
-        print "  Objet \"%s\" : taille unitaire de %i"%(name,len(OBJET_DE_TEST[name]))
+        print "  Objet \"%s\" : taille unitaire de %i"%(name,len(OBJET_DE_TEST[name][-1]))
 
     print
     print "Les pas de stockage :", OBJET_DE_TEST["My ecarts"].stepserie()
-    print "Les valeurs         :", OBJET_DE_TEST["My ecarts"].valueserie()
-    print "La 2ème valeur      :", OBJET_DE_TEST["My ecarts"].valueserie(1)
-    print "La dernière valeur  :", OBJET_DE_TEST["My ecarts"].valueserie(-1)
+    print "Les valeurs         :", OBJET_DE_TEST["My ecarts"][:]
+    print "La 2ème valeur      :", OBJET_DE_TEST["My ecarts"][1]
+    print "La dernière valeur  :", OBJET_DE_TEST["My ecarts"][-1]
     print "Liste des attributs :", OBJET_DE_TEST["My ecarts"].tagserie()
     print "Taille \"shape\"      :", OBJET_DE_TEST["My ecarts"].shape()
     print "Taille \"len\"        :", len(OBJET_DE_TEST["My ecarts"])
     print
 
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Palier":"Premier"} )
-    print "Valeurs pour tag    :", OBJET_DE_TEST["My ecarts"].valueserie( tags={"Palier":"Premier"} )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Palier="Premier" )
+    print "Valeurs pour tag    :", OBJET_DE_TEST["My ecarts"].values( Palier="Premier" )
     print
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Carte":"IGN1"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Niveau":1024} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"Base"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Camp":"TOTO"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Toto":"Premier"} )
-    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( tags={"Carte":"IGN1"} )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Carte="IGN1" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Niveau=1024 )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Camp="Base" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Camp="TOTO" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Toto="Premier" )
+    print "Pas pour tag        :", OBJET_DE_TEST["My ecarts"].stepserie( Carte="IGN1" )
     print
+    #import sys ; sys.exit()
     print "Attributs                 :", OBJET_DE_TEST["My ecarts"].tagserie()
-    print "Attributs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( tags={"Camp":"Base"} )
-    print "Attributs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( tags={"Niveau":4024} )
+    print "Attributs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( Camp="Base" )
+    print "Attributs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( Niveau=4024 )
     print
     print "Attributs et valeurs                 :", OBJET_DE_TEST["My ecarts"].tagserie( withValues=True )
-    print "Attributs et valeurs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( withValues=True, tags={"Camp":"Base"} )
-    print "Attributs et valeurs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( withValues=True, tags={"Niveau":4024} )
+    print "Attributs et valeurs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( withValues=True, Camp="Base" )
+    print "Attributs et valeurs pour tag filtré :", OBJET_DE_TEST["My ecarts"].tagserie( withValues=True, Niveau=4024 )
     print
     print "Valeur d'attribut pour un tag donné 'BU'           :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Niveau" )
-    print "Valeur d'attribut pour un tag donné 'BU' filtré    :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Niveau", tags={"Camp":"Base"} )
-    print "Valeur d'attribut pour un tag donné 'BU' filtré    :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Niveau", tags={"Palier":"Second"} )
-    print "Valeur d'attribut pour un tag donné 'Camp' filtré  :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Camp", tags={"Palier":"Premier"} )
-    print "Valeur d'attribut pour un tag donné 'Carte' filtré :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Carte", tags={"Palier":"Premier"} )
-    print "Valeur d'attribut pour un tag donné 'Carte' filtré :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Carte", tags={"Palier":"Premier","Niveau":4024} )
-    print "Valeur d'attribut pour un tag donné 'Carte' filtré :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Carte", tags={"Palier":"Premier","Niveau":210} )
+    print "Valeur d'attribut pour un tag donné 'BU' filtré    :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Niveau", Camp="Base" )
+    print "Valeur d'attribut pour un tag donné 'BU' filtré    :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Niveau", Palier="Second" )
+    print "Valeur d'attribut pour un tag donné 'Camp' filtré  :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Camp",   Palier="Premier" )
+    print "Valeur d'attribut pour un tag donné 'Carte' filtré :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Carte",  Palier="Premier" )
+    print "Valeur d'attribut pour un tag donné 'Carte' filtré :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Carte",  Palier="Premier", Niveau=4024 )
+    print "Valeur d'attribut pour un tag donné 'Carte' filtré :", OBJET_DE_TEST["My ecarts"].tagserie( outputTag = "Carte",  Palier="Premier", Niveau=210 )
+    print
+
+    print "======> Cas d'erreur"
+    OBJET_DE_TEST = OneScalar("My float", unit="cm")
+    OBJET_DE_TEST.store( 5., step="azerty")
+    OBJET_DE_TEST.store(-5., step="poiuyt")
+    OBJET_DE_TEST.store( 1., step="azerty")
+    OBJET_DE_TEST.store( 0., step="xxxxxx")
+    OBJET_DE_TEST.store( 5., step="poiuyt")
+    OBJET_DE_TEST.store(-5., step="azerty")
+    OBJET_DE_TEST.store( 1., step="poiuyt")
+    print "Les pas de stockage :", OBJET_DE_TEST.stepserie()
+    print "Les valeurs         :", OBJET_DE_TEST[:]
+    print "La 2ème valeur      :", OBJET_DE_TEST[1]
+    print "La dernière valeur  :", OBJET_DE_TEST[-1]
+    print "Valeurs 'azerty'    :", OBJET_DE_TEST.values( step = "azerty" )
+    print "Valeurs 'poiuyt'    :", OBJET_DE_TEST.values( step = "poiuyt" )
+    print
+    print "Nombre de valeurs   :", len(OBJET_DE_TEST)
+    try:
+        x = OBJET_DE_TEST[7]
+        print "La 8ème valeur      :", x
+    except IndexError, e:
+        print "Erreur correcte     :",e
+    try:
+        x = OBJET_DE_TEST[7]
+        print "La 8ème valeur      :", x
+    except IndexError, e:
+        print "Erreur correcte     :",e
+    print
+
+    print "======> Impression d'objet Persistence"
+    OBJET_DE_TEST = OneScalar("My float", unit="cm")
+    OBJET_DE_TEST.store( 5., step="azerty")
+    OBJET_DE_TEST.store(-5., step="poiuyt")
+    OBJET_DE_TEST.store( 1., step="azerty")
+    OBJET_DE_TEST.store( 0., step="xxxxxx")
+    OBJET_DE_TEST.store( 5., step="poiuyt")
+    OBJET_DE_TEST.store(-5., step="azerty")
+    OBJET_DE_TEST.store( 1., step="poiuyt")
+    print OBJET_DE_TEST
     print
index bba69346ffdfd0ae87964b38292161db59c7cf2b..1bc82e160211fd17df3e013873bf8d8a6c5ca217 100644 (file)
@@ -81,7 +81,7 @@ if __name__ == "__main__":
     vect2 = [0,0,0,0,0,0,0,0,0,0]
     D.calculate(vect1,vect2)
     print " Les valeurs de RMS attendues sont les suivantes : [1.0, 1.0, 1.0, 3.0, 0.53162016515553656, 0.73784217096601323]"
-    print " Les RMS obtenues................................:", D.valueserie()
+    print " Les RMS obtenues................................:", D[:]
     print " La moyenne......................................:", D.mean()
     print
 
index ccd287a76b0be30527131c37a6b95eb94a240ce3..ee42f196d907cc8016b76f6f92c3b9fd75be366b 100644 (file)
@@ -86,7 +86,7 @@ if __name__ == "__main__":
     print " La variance de OMA est de...........................:", x2.var()
     #
     D.calculate( vectorOMB = x1,  vectorOMA = x2)
-    if not D.valueserie(0) :
+    if not D[0] :
             print " Résultat : l'analyse NE RÉDUIT PAS la variance"
     else :
             print " Résultat : l'analyse RÉDUIT la variance"
@@ -104,7 +104,7 @@ if __name__ == "__main__":
     print " La variance de OMA est de...........................:", x2.var()
     #
     D.calculate( vectorOMB = x1,  vectorOMA = x2)
-    if not D.valueserie(1) :
+    if not D[1] :
             print " Résultat : l'analyse NE RÉDUIT PAS la variance"
     else :
             print " Résultat : l'analyse RÉDUIT la variance"
index 9089cb55485592f9b296212e331a7c6e5b829d9e..9e09e6d9ac78e12208e63bdd6463b29781d4983d 100644 (file)
@@ -91,6 +91,9 @@ class FDApproximation:
         logging.debug("     Incrément de............: %s*X"%float(self.__increment))
         logging.debug("     Approximation centrée...: %s"%(self.__centeredDF))
         #
+        if X is None or len(X)==0:
+            raise ValueError("Nominal point X for approximate derivatives can not be None or void.")
+        #
         _X = numpy.asmatrix(numpy.ravel( X )).T
         #
         if self.__dX is None:
index 46d3ef2a943f4aa259ab12c86c0a10190fc23b83..8e290a0f80ccfafabbf4f48763e0aa6cdb9902ef 100644 (file)
@@ -17,7 +17,7 @@
 #
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
-# Author: André Ribes, andre.ribes@edf.fr, EDF R&D
+# Author: André Ribes, andre.ribes@edf.fr, EDF R&D
 
 study_config = {}
 study_config["Name"] = "test000_Blue"
@@ -61,14 +61,14 @@ precision = 1.e-13
 Xa = ADD.get("Analysis")
 print
 print "    Nombre d'analyses  :",Xa.stepnumber()
-print "    Analyse résultante :",Xa.valueserie(0)
+print "    Analyse résultante :",Xa[0]
 #
-# Vérification du résultat
+# Vérification du résultat
 # ------------------------
-if max(numpy.array(Xa.valueserie(0))-numpy.array([0.25, 1.25, 2.25])) > precision:
-  raise ValueError("Résultat du test erroné")
+if max(numpy.array(Xa[0])-numpy.array([0.25, 1.25, 2.25])) > precision:
+  raise ValueError("Résultat du test erroné")
 else:
-  print "    Test correct, erreur maximale inférieure à %s"%precision
+  print "    Test correct, erreur maximale inférieure à %s"%precision
   print
 """
 Analysis_config["From"] = "String"
index 8d76957a5589a73175a3c587c7cbddbe0aa4b4a6..85c4ef172836b7ce39a4b2f90455b5336efef396 100644 (file)
@@ -17,7 +17,7 @@
 #
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
-# Author: André Ribes, andre.ribes@edf.fr, EDF R&D
+# Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
 
 import numpy
 precision = 1.e-13
@@ -25,13 +25,13 @@ precision = 1.e-13
 Xa = ADD.get("Analysis")
 print
 print "    Nombre d'analyses  :",Xa.stepnumber()
-print "    Analyse résultante :",Xa.valueserie(0)
+print "    Analyse résultante :",Xa[0]
 #
-# Vérification du résultat
+# Vérification du résultat
 # ------------------------
-if max(numpy.array(Xa.valueserie(0))-numpy.array([0.25, 1.25, 2.25])) > precision:
-  raise ValueError("Résultat du test erroné")
+if max(numpy.array(Xa[0])-numpy.array([0.25, 1.25, 2.25])) > precision:
+  raise ValueError("Résultat du test erroné")
 else:
-  print "    Test correct, erreur maximale inférieure à %s"%precision
+  print "    Test correct, erreur maximale inférieure à %s"%precision
   print
 
index 2a56c7d24ae04431f2abf14463d7e98b12f137a9..4d6c9345b73e3db3222671f951d826656a2264c1 100644 (file)
@@ -30,8 +30,8 @@ dimension = 300
 precision = 1.e-10
 xt = numpy.matrix(numpy.arange(dimension)).T
 xb = Study.getBackground()
-xa = numpy.array(ADD.get("Analysis").valueserie(0))
-d  = numpy.array(ADD.get("Innovation").valueserie(0))
+xa = numpy.array(ADD.get("Analysis")[0])
+d  = numpy.array(ADD.get("Innovation")[0])
 #
 # Verification du resultat
 # ------------------------
index fcfe703264691d9119209f6508247f0ebca7c41e..e5dcd70697cb00e10673c73c96ea4b3a3d0f180b 100644 (file)
@@ -37,15 +37,15 @@ ASSIMILATION_STUDY(Study_name='aster_zzzz159a_LBFGSB',
                                        STRING=
 """import numpy
 import os
-xa = ADD.get("Analysis").valueserie(0)
-Innovation = ADD.get("Innovation").valueserie(0)
+xa = ADD.get("Analysis")[0]
+Innovation = ADD.get("Innovation")[0]
 A = []
-J = ADD.get("CostFunctionJ").valueserie()
+J = ADD.get("CostFunctionJ")[:]
 ADD.setDiagnostic("PlotVectors", "J")
 MonPlot = ADD.get("J")
 if os.path.isfile("recherche_xx_Fonctionnelles.ps"):
   os.remove("recherche_xx_Fonctionnelles.ps")
-MonPlot.calculate([J,ADD.get("CostFunctionJb").valueserie(),ADD.get("CostFunctionJo").valueserie()],
+MonPlot.calculate([J,ADD.get("CostFunctionJb")[:],ADD.get("CostFunctionJo")[:]],
     title = "Fonctionnelles J, Jb et Jo",
     ltitle = ["J","Jb","Jo"],
     xlabel = "Pas", ylabel = "Valeur",