]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Minor documentation and code review corrections (38)
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Tue, 10 Jan 2023 20:49:59 +0000 (21:49 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Tue, 10 Jan 2023 20:50:57 +0000 (21:50 +0100)
doc/en/snippets/ModuleCompatibility.rst
doc/fr/snippets/ModuleCompatibility.rst
src/daComposant/daAlgorithms/Atoms/ecwnlls.py
src/daComposant/daAlgorithms/Atoms/incr3dvar.py
src/daComposant/daAlgorithms/Atoms/psas3dvar.py
src/daComposant/daAlgorithms/Atoms/std3dvar.py
src/daComposant/daAlgorithms/Atoms/std4dvar.py
src/daComposant/daAlgorithms/Atoms/van3dvar.py
src/daComposant/daCore/Aidsm.py
src/daComposant/daCore/BasicObjects.py
src/daComposant/daCore/PlatformInfo.py

index 51b980e4bc93ae2e5808ecbb6089755ab36111b3..a0018437f1df79278f84f642095b3d65f0056624 100644 (file)
@@ -13,8 +13,8 @@ guarantee).
    :widths: 20, 10, 10
 
    Python,     3.6.5,    3.10.8
-   Numpy,      1.14.3,   1.23.5
-   Scipy,      1.1.0,    1.9.3
+   Numpy,      1.14.3,    1.24.1
+   Scipy,      1.1.0,    1.10.0
    MatplotLib, 2.2.2,    3.6.2
-   GnuplotPy,  1.8,      1.8
+   GnuplotPy,  1.8,    1.8
    NLopt,      2.4.2,    2.7.1
index a53e95206dae1d72b05e0bef77bf3dc043957be6..b9eab336ea61d2b00b1dea8ba33d83b98ac706af 100644 (file)
@@ -13,8 +13,8 @@ la version atteinte (mais cela reste sans garantie).
    :widths: 20, 10, 10
 
    Python,     3.6.5,    3.10.8
-   Numpy,      1.14.3,   1.23.5
-   Scipy,      1.1.0,    1.9.3
+   Numpy,      1.14.3,    1.24.1
+   Scipy,      1.1.0,    1.10.0
    MatplotLib, 2.2.2,    3.6.2
-   GnuplotPy,  1.8,      1.8
+   GnuplotPy,  1.8,    1.8
    NLopt,      2.4.2,    2.7.1
index 950cd1a3bcc9842b27f08089c496c942871d2baf..4ddfa119f8efd5283c4ceba183491185976322cf 100644 (file)
@@ -26,6 +26,7 @@ __doc__ = """
 __author__ = "Jean-Philippe ARGAUD"
 
 import numpy, scipy, scipy.optimize, scipy.version
+from daCore.PlatformInfo import vt
 
 # ==============================================================================
 def ecwnlls(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
@@ -132,13 +133,13 @@ def ecwnlls(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
     nbPreviousSteps = selfA.StoredVariables["CostFunctionJ"].stepnumber()
     #
     if selfA._parameters["Minimizer"] == "LBFGSB":
-        if "0.19" <= scipy.version.version <= "1.4.99":
+        if   vt("0.19")  <= vt(scipy.version.version) <= vt("1.4.99"):
             import daAlgorithms.Atoms.lbfgsb14hlt as optimiseur
-        elif "1.5.0" <= scipy.version.version <= "1.7.99":
+        elif vt("1.5.0") <= vt(scipy.version.version) <= vt("1.7.99"):
             import daAlgorithms.Atoms.lbfgsb17hlt as optimiseur
-        elif "1.8.0" <= scipy.version.version <= "1.8.99":
+        elif vt("1.8.0") <= vt(scipy.version.version) <= vt("1.8.99"):
             import daAlgorithms.Atoms.lbfgsb18hlt as optimiseur
-        elif "1.9.0" <= scipy.version.version <= "1.9.99":
+        elif vt("1.9.0") <= vt(scipy.version.version) <= vt("1.10.99"):
             import daAlgorithms.Atoms.lbfgsb19hlt as optimiseur
         else:
             import scipy.optimize as optimiseur
index 9e217aa1230bd9af25e828dea3059f62b0c2afc4..9540603753220364c161b1599a07a6c93ab2a1b7 100644 (file)
@@ -28,7 +28,7 @@ __author__ = "Jean-Philippe ARGAUD"
 import numpy, scipy, scipy.optimize, scipy.version
 from daCore.NumericObjects import HessienneEstimation, QuantilesEstimations
 from daCore.NumericObjects import RecentredBounds
-from daCore.PlatformInfo import PlatformInfo
+from daCore.PlatformInfo import PlatformInfo, vt
 mpr = PlatformInfo().MachinePrecision()
 
 # ==============================================================================
@@ -134,13 +134,13 @@ def incr3dvar(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
         #
         if selfA._parameters["Minimizer"] == "LBFGSB":
             # Minimum, J_optimal, Informations = scipy.optimize.fmin_l_bfgs_b(
-            if "0.19" <= scipy.version.version <= "1.4.99":
+            if   vt("0.19")  <= vt(scipy.version.version) <= vt("1.4.99"):
                 import daAlgorithms.Atoms.lbfgsb14hlt as optimiseur
-            elif "1.5.0" <= scipy.version.version <= "1.7.99":
+            elif vt("1.5.0") <= vt(scipy.version.version) <= vt("1.7.99"):
                 import daAlgorithms.Atoms.lbfgsb17hlt as optimiseur
-            elif "1.8.0" <= scipy.version.version <= "1.8.99":
+            elif vt("1.8.0") <= vt(scipy.version.version) <= vt("1.8.99"):
                 import daAlgorithms.Atoms.lbfgsb18hlt as optimiseur
-            elif "1.9.0" <= scipy.version.version <= "1.9.99":
+            elif vt("1.9.0") <= vt(scipy.version.version) <= vt("1.10.99"):
                 import daAlgorithms.Atoms.lbfgsb19hlt as optimiseur
             else:
                 import scipy.optimize as optimiseur
index 39210226990bef3233febafeda048b481b3736a8..a98a604b5f3fed8455a3097e3675cc254f674348 100644 (file)
@@ -27,6 +27,7 @@ __author__ = "Jean-Philippe ARGAUD"
 
 import numpy, scipy, scipy.optimize, scipy.version
 from daCore.NumericObjects import HessienneEstimation, QuantilesEstimations
+from daCore.PlatformInfo import vt
 
 # ==============================================================================
 def psas3dvar(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
@@ -114,13 +115,13 @@ def psas3dvar(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
     nbPreviousSteps = selfA.StoredVariables["CostFunctionJ"].stepnumber()
     #
     if selfA._parameters["Minimizer"] == "LBFGSB":
-        if "0.19" <= scipy.version.version <= "1.4.99":
+        if   vt("0.19")  <= vt(scipy.version.version) <= vt("1.4.99"):
             import daAlgorithms.Atoms.lbfgsb14hlt as optimiseur
-        elif "1.5.0" <= scipy.version.version <= "1.7.99":
+        elif vt("1.5.0") <= vt(scipy.version.version) <= vt("1.7.99"):
             import daAlgorithms.Atoms.lbfgsb17hlt as optimiseur
-        elif "1.8.0" <= scipy.version.version <= "1.8.99":
+        elif vt("1.8.0") <= vt(scipy.version.version) <= vt("1.8.99"):
             import daAlgorithms.Atoms.lbfgsb18hlt as optimiseur
-        elif "1.9.0" <= scipy.version.version <= "1.9.99":
+        elif vt("1.9.0") <= vt(scipy.version.version) <= vt("1.10.99"):
             import daAlgorithms.Atoms.lbfgsb19hlt as optimiseur
         else:
             import scipy.optimize as optimiseur
index 8d2b7b275aa9e73288419fa67db79ccf247a573f..b67735e3c754c8a73d097067e717df5bd1f0851a 100644 (file)
@@ -27,6 +27,7 @@ __author__ = "Jean-Philippe ARGAUD"
 
 import numpy, scipy, scipy.optimize, scipy.version
 from daCore.NumericObjects import HessienneEstimation, QuantilesEstimations
+from daCore.PlatformInfo import vt
 
 # ==============================================================================
 def std3dvar(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
@@ -117,13 +118,13 @@ def std3dvar(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
     nbPreviousSteps = selfA.StoredVariables["CostFunctionJ"].stepnumber()
     #
     if selfA._parameters["Minimizer"] == "LBFGSB":
-        if "0.19" <= scipy.version.version <= "1.4.99":
+        if   vt("0.19")  <= vt(scipy.version.version) <= vt("1.4.99"):
             import daAlgorithms.Atoms.lbfgsb14hlt as optimiseur
-        elif "1.5.0" <= scipy.version.version <= "1.7.99":
+        elif vt("1.5.0") <= vt(scipy.version.version) <= vt("1.7.99"):
             import daAlgorithms.Atoms.lbfgsb17hlt as optimiseur
-        elif "1.8.0" <= scipy.version.version <= "1.8.99":
+        elif vt("1.8.0") <= vt(scipy.version.version) <= vt("1.8.99"):
             import daAlgorithms.Atoms.lbfgsb18hlt as optimiseur
-        elif "1.9.0" <= scipy.version.version <= "1.9.99":
+        elif vt("1.9.0") <= vt(scipy.version.version) <= vt("1.10.99"):
             import daAlgorithms.Atoms.lbfgsb19hlt as optimiseur
         else:
             import scipy.optimize as optimiseur
index 6a6aa471e0146074d7c9c419be40214f9fbde1f9..39ca15715a445d578f9ac979b8ecdace84f8052e 100644 (file)
@@ -27,7 +27,7 @@ __author__ = "Jean-Philippe ARGAUD"
 
 import numpy, scipy, scipy.optimize, scipy.version
 from daCore.NumericObjects import ForceNumericBounds, ApplyBounds
-from daCore.PlatformInfo import PlatformInfo
+from daCore.PlatformInfo import PlatformInfo, vt
 mpr = PlatformInfo().MachinePrecision()
 mfp = PlatformInfo().MaximumPrecision()
 
@@ -178,13 +178,13 @@ def std4dvar(selfA, Xb, Y, U, HO, EM, CM, R, B, Q):
     nbPreviousSteps = selfA.StoredVariables["CostFunctionJ"].stepnumber()
     #
     if selfA._parameters["Minimizer"] == "LBFGSB":
-        if "0.19" <= scipy.version.version <= "1.4.99":
+        if   vt("0.19")  <= vt(scipy.version.version) <= vt("1.4.99"):
             import daAlgorithms.Atoms.lbfgsb14hlt as optimiseur
-        elif "1.5.0" <= scipy.version.version <= "1.7.99":
+        elif vt("1.5.0") <= vt(scipy.version.version) <= vt("1.7.99"):
             import daAlgorithms.Atoms.lbfgsb17hlt as optimiseur
-        elif "1.8.0" <= scipy.version.version <= "1.8.99":
+        elif vt("1.8.0") <= vt(scipy.version.version) <= vt("1.8.99"):
             import daAlgorithms.Atoms.lbfgsb18hlt as optimiseur
-        elif "1.9.0" <= scipy.version.version <= "1.9.99":
+        elif vt("1.9.0") <= vt(scipy.version.version) <= vt("1.10.99"):
             import daAlgorithms.Atoms.lbfgsb19hlt as optimiseur
         else:
             import scipy.optimize as optimiseur
index 95403c0c4555e88fc279c48f4a6cd20aae437acd..541a5c16b734556e47bab6bb97912022028c8a27 100644 (file)
@@ -28,7 +28,7 @@ __author__ = "Jean-Philippe ARGAUD"
 import numpy, scipy, scipy.optimize, scipy.version
 from daCore.NumericObjects import HessienneEstimation, QuantilesEstimations
 from daCore.NumericObjects import RecentredBounds
-from daCore.PlatformInfo import PlatformInfo
+from daCore.PlatformInfo import PlatformInfo, vt
 mpr = PlatformInfo().MachinePrecision()
 
 # ==============================================================================
@@ -126,13 +126,13 @@ def van3dvar(selfA, Xb, Y, U, HO, CM, R, B, __storeState = False):
     nbPreviousSteps = selfA.StoredVariables["CostFunctionJ"].stepnumber()
     #
     if selfA._parameters["Minimizer"] == "LBFGSB":
-        if "0.19" <= scipy.version.version <= "1.4.99":
+        if   vt("0.19")  <= vt(scipy.version.version) <= vt("1.4.99"):
             import daAlgorithms.Atoms.lbfgsb14hlt as optimiseur
-        elif "1.5.0" <= scipy.version.version <= "1.7.99":
+        elif vt("1.5.0") <= vt(scipy.version.version) <= vt("1.7.99"):
             import daAlgorithms.Atoms.lbfgsb17hlt as optimiseur
-        elif "1.8.0" <= scipy.version.version <= "1.8.99":
+        elif vt("1.8.0") <= vt(scipy.version.version) <= vt("1.8.99"):
             import daAlgorithms.Atoms.lbfgsb18hlt as optimiseur
-        elif "1.9.0" <= scipy.version.version <= "1.9.99":
+        elif vt("1.9.0") <= vt(scipy.version.version) <= vt("1.10.99"):
             import daAlgorithms.Atoms.lbfgsb19hlt as optimiseur
         else:
             import scipy.optimize as optimiseur
index 0017714fd17aa261d5944b307799ec2ed0b67a95..256c38a765483378a4d8f87d6fc51793d6db9f2b 100644 (file)
@@ -124,7 +124,7 @@ class Aidsm(object):
             Vector               = None,
             VectorSerie          = None,
             ):
-        "Interface unique de definition de variables d'entrees par argument"
+        "Interface unique de définition de variables d'entrées par argument"
         self.__case.register("set",dir(),locals(),None,True)
         try:
             if   Concept in ("Background", "CheckingPoint", "ControlInput", "Observation"):
@@ -185,7 +185,7 @@ class Aidsm(object):
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "Background"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = State(
@@ -213,7 +213,7 @@ class Aidsm(object):
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "CheckingPoint"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = State(
@@ -241,7 +241,7 @@ class Aidsm(object):
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "ControlInput"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = State(
@@ -269,7 +269,7 @@ class Aidsm(object):
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "Observation"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = State(
@@ -295,7 +295,7 @@ class Aidsm(object):
             Stored               = False,
             ObjectMatrix         = None,
             Checked              = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "BackgroundError"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = Covariance(
@@ -319,7 +319,7 @@ class Aidsm(object):
             Stored               = False,
             ObjectMatrix         = None,
             Checked              = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "ObservationError"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = Covariance(
@@ -343,7 +343,7 @@ class Aidsm(object):
             Stored               = False,
             ObjectMatrix         = None,
             Checked              = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "EvolutionError"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = Covariance(
@@ -371,7 +371,7 @@ class Aidsm(object):
             PerformanceProfile   = None,
             InputFunctionAsMulti = False,
             Checked              = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "ObservationOperator"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = FullOperator(
@@ -404,7 +404,7 @@ class Aidsm(object):
             PerformanceProfile   = None,
             InputFunctionAsMulti = False,
             Checked              = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "EvolutionModel"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = FullOperator(
@@ -437,7 +437,7 @@ class Aidsm(object):
             PerformanceProfile   = None,
             InputFunctionAsMulti = False,
             Checked              = False):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "ControlModel"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = FullOperator(
@@ -459,7 +459,7 @@ class Aidsm(object):
         return 0
 
     def setName(self, String=None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         self.__case.register("setName",dir(),locals())
         if String is not None:
             self.__name = str(String)
@@ -468,7 +468,7 @@ class Aidsm(object):
         self.__StoredInputs["Name"] = self.__name
 
     def setDirectory(self, String=None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         self.__case.register("setDirectory",dir(),locals())
         if os.path.isdir(os.path.abspath(str(String))):
             self.__directory = os.path.abspath(str(String))
@@ -498,7 +498,7 @@ class Aidsm(object):
             Algorithm  = None,
             Parameters = None,
             Script     = None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "AlgorithmParameters"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = AlgorithmAndParameters(
@@ -512,7 +512,7 @@ class Aidsm(object):
     def updateAlgorithmParameters(self,
             Parameters = None,
             Script     = None):
-        "Mise a jour d'un concept de calcul"
+        "Mise à jour d'un concept de calcul"
         Concept = "AlgorithmParameters"
         if Concept not in self.__adaoObject or self.__adaoObject[Concept] is None:
             raise ValueError("\n\nNo algorithm registred, set one before updating parameters or executing\n")
@@ -527,7 +527,7 @@ class Aidsm(object):
             Algorithm  = None,
             Parameters = None,
             Script     = None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "RegulationParameters"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = RegulationAndParameters(
@@ -541,7 +541,7 @@ class Aidsm(object):
     def setSupplementaryParameters(self,
             Parameters = None,
             Script     = None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "SupplementaryParameters"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept] = ExternalParameters(
@@ -554,7 +554,7 @@ class Aidsm(object):
     def updateSupplementaryParameters(self,
             Parameters = None,
             Script     = None):
-        "Mise a jour d'un concept de calcul"
+        "Mise à jour d'un concept de calcul"
         Concept = "SupplementaryParameters"
         if Concept not in self.__adaoObject or self.__adaoObject[Concept] is None:
             self.__adaoObject[Concept] = ExternalParameters(name = Concept)
@@ -572,7 +572,7 @@ class Aidsm(object):
             Info           = None,
             ObjectFunction = None,
             Scheduler      = None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "Observer"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept].append( DataObserver(
@@ -592,7 +592,7 @@ class Aidsm(object):
             Variable       = None,
             ObjectFunction = None,
             ):
-        "Permet de retirer un observer à une ou des variable nommée"
+        "Permet de retirer un observer à une ou des variable nommées"
         if "AlgorithmParameters" not in self.__adaoObject:
             raise ValueError("No algorithm registred, ask for one before removing observers")
         #
@@ -617,7 +617,7 @@ class Aidsm(object):
             Template       = None,
             String         = None,
             Script         = None):
-        "Definition d'un concept de calcul"
+        "Définition d'un concept de calcul"
         Concept = "UserPostAnalysis"
         self.__case.register("set"+Concept, dir(), locals())
         self.__adaoObject[Concept].append( repr(UserScript(
@@ -631,7 +631,7 @@ class Aidsm(object):
     # -----------------------------------------------------------
 
     def get(self, Concept=None, noDetails=True ):
-        "Recuperation d'une sortie du calcul"
+        "Récupération d'une sortie du calcul"
         if Concept is not None:
             try:
                 self.__case.register("get", dir(), locals(), Concept) # Break pickle in Python 2
index 4ba3b3758f8eba2ffc8cf9a96a624386ddb20d07..eefbea3806812c12230658e7ad229270ecbf40a7 100644 (file)
@@ -792,7 +792,7 @@ class Algorithm(object):
         logging.debug("%s Taille mémoire utilisée de %.0f Mio"%(self._name, self._m.getUsedMemory("Mio")))
         self._getTimeState(reset=True)
         #
-        # Mise a jour des paramètres internes avec le contenu de Parameters, en
+        # Mise à jour des paramètres internes avec le contenu de Parameters, en
         # reprenant les valeurs par défauts pour toutes celles non définies
         self.__setParameters(Parameters, reset=True)
         for k, v in self.__variable_names_not_public.items():
@@ -978,10 +978,9 @@ class Algorithm(object):
 
     def run(self, Xb=None, Y=None, H=None, M=None, R=None, B=None, Q=None, Parameters=None):
         """
-        Doit implémenter l'opération élémentaire de calcul d'assimilation sous
-        sa forme mathématique la plus naturelle possible.
+        Doit implémenter l'opération élémentaire de calcul algorithmique.
         """
-        raise NotImplementedError("Mathematical assimilation calculation has not been implemented!")
+        raise NotImplementedError("Mathematical algorithmic calculation has not been implemented!")
 
     def defineRequiredParameter(self,
         name     = None,
@@ -1246,7 +1245,7 @@ class AlgorithmAndParameters(object):
                  asDict     = None,
                  asScript   = None,
                 ):
-        "Mise a jour des parametres"
+        "Mise à jour des paramètres"
         if asDict is None and asScript is not None:
             __Dict = Interfaces.ImportFromScript(asScript).getvalue( self.__name, "Parameters" )
         else:
@@ -1748,7 +1747,7 @@ class UserScript(object):
 # ==============================================================================
 class ExternalParameters(object):
     """
-    Classe générale d'interface de type texte de script utilisateur
+    Classe générale d'interface pour le stockage des paramètres externes
     """
     def __init__(self,
                  name        = "GenericExternalParameters",
@@ -1766,7 +1765,7 @@ class ExternalParameters(object):
                  asDict     = None,
                  asScript   = None,
                 ):
-        "Mise a jour des parametres"
+        "Mise à jour des paramètres"
         if asDict is None and asScript is not None:
             __Dict = Interfaces.ImportFromScript(asScript).getvalue( self.__name, "ExternalParameters" )
         else:
index f37c23e6e0c5c630e6a2aa732e5c64a26f7a1000..128cebbe66aa742e42289e58471266124547baec 100644 (file)
@@ -279,6 +279,13 @@ def uniq( __sequence ):
     __seen = set()
     return [x for x in __sequence if x not in __seen and not __seen.add(x)]
 
+def vt( __version ):
+    "Version transformée pour comparaison robuste, obtenue comme un tuple"
+    serie = []
+    for sv in re.split("[_.+-]", __version):
+        serie.append(sv.zfill(6))
+    return tuple(serie)
+
 def isIterable( __sequence, __check = False, __header = "" ):
     """
     Vérification que l'argument est un itérable interne.