]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Extending location selection and documentation review
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 22 Feb 2023 19:53:45 +0000 (20:53 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 22 Feb 2023 19:53:45 +0000 (20:53 +0100)
20 files changed:
doc/en/bibliography.rst
doc/en/ref_algorithm_MeasurementsOptimalPositioningTask.rst
doc/en/snippets/ExcludeLocations.rst
doc/en/snippets/ExcludedPoints.rst [new file with mode: 0644]
doc/en/snippets/ModuleCompatibility.rst
doc/en/snippets/NameOfLocations.rst [new file with mode: 0644]
doc/en/versions.rst
doc/fr/bibliography.rst
doc/fr/ref_algorithm_MeasurementsOptimalPositioningTask.rst
doc/fr/snippets/ExcludeLocations.rst
doc/fr/snippets/ExcludedPoints.rst [new file with mode: 0644]
doc/fr/snippets/ModuleCompatibility.rst
doc/fr/snippets/NameOfLocations.rst [new file with mode: 0644]
doc/fr/versions.rst
src/daComposant/daAlgorithms/Atoms/ecweim.py
src/daComposant/daAlgorithms/Atoms/lbfgsb19hlt.py
src/daComposant/daAlgorithms/ExtendedKalmanFilter.py
src/daComposant/daAlgorithms/MeasurementsOptimalPositioningTask.py
src/daComposant/daCore/BasicObjects.py
src/daComposant/daCore/NumericObjects.py

index 0209a3df0c08629391721a52f16ce6761e38626e..8d887ae14232ddfe828446f8e9ac8ac84b6a9aea 100644 (file)
@@ -109,11 +109,13 @@ exhaustive bibliography.
 
 .. [Nelder65] Nelder J. A., Mead R., *A simplex method for function minimization*, The Computer Journal, 7, pp.308-313, 1965
 
+.. [NumPy20] Harris C.R. et al., *Array programming with NumPy*, Nature 585, pp.357–362, 2020, https://numpy.org/
+
 .. [Powell64] Powell M. J. D., *An efficient method for finding the minimum of a function of several variables without calculating derivatives*, Computer Journal, 7(2), pp.155-162, 1964
 
 .. [Powell94] Powell M. J. D., *A direct search optimization method that models the objective and constraint functions by linear interpolation*, in Advances in Optimization and Numerical Analysis, eds. S. Gomez and J-P Hennart, Kluwer Academic (Dordrecht), pp. 51-67, 1994
 
-.. [Powell98] Powell M. J. D., *Direct search algorithms for optimization calculations*, Acta Numerica 7, 287-336, 1998
+.. [Powell98] Powell M. J. D., *Direct search algorithms for optimization calculations*, Acta Numerica 7, pp.287-336, 1998
 
 .. [Powell04] Powell M. J. D., *The NEWUOA software for unconstrained optimization without derivatives*, Proc. 40th Workshop on Large Scale Nonlinear Optimization, Erice, Italy, 2004
 
@@ -135,6 +137,8 @@ exhaustive bibliography.
 
 .. [SalomeMeca] *Salome_Meca and Code_Aster, Analysis of Structures and Thermomechanics for Studies & Research*, http://www.code-aster.org/
 
+.. [SciPy20] Virtanen P. et al., *SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python*, Nature Methods, 17(3), pp.261-272, 2020, https://scipy.org/
+
 .. [Storn97] Storn R., Price, K., *Differential Evolution – A Simple and Efficient Heuristic for global Optimization over Continuous Spaces*, Journal of Global Optimization, 11(1), pp.341-359, 1997
 
 .. [Tarantola87] Tarantola A., *Inverse Problem: Theory Methods for Data Fitting and Parameter Estimation*, Elsevier, 1987
index 0d305c93f94a5cdf9a234bed838dc389602afb2e..cbab4746b8700638583d1fac791f92981de610a3 100644 (file)
@@ -91,6 +91,8 @@ search.
 
 .. include:: snippets/MaximumNumberOfLocations.rst
 
+.. include:: snippets/NameOfLocations.rst
+
 .. include:: snippets/SampleAsExplicitHyperCube.rst
 
 .. include:: snippets/SampleAsIndependantRandomVariables.rst
@@ -118,6 +120,7 @@ StoreSupplementaryCalculations
   algorithm*"): [
   "EnsembleOfSimulations",
   "EnsembleOfStates",
+  "ExcludedPoints",
   "OptimalPoints",
   "ReducedBasis",
   "Residus",
@@ -140,6 +143,8 @@ StoreSupplementaryCalculations
 
 .. include:: snippets/EnsembleOfStates.rst
 
+.. include:: snippets/ExcludedPoints.rst
+
 .. include:: snippets/OptimalPoints.rst
 
 .. include:: snippets/ReducedBasis.rst
index 0ccad27cb374889c71a9a10372548d1be3aebfa7..f46a99e90c2d07658c6b6700220cc8d797e787d5 100644 (file)
@@ -1,11 +1,18 @@
 .. index:: single: ExcludeLocations
 
 ExcludeLocations
-  *List of integers*. This key specifies the list of points in the state vector
-  excluded from the optimal search. The default value is an empty list.
-  Important: the numbering of these excluded points must be identical to the
-  one implicitly adopted in the states provided by the "*EnsembleOfSnapshots*"
-  key.
+  *List of integers or names*. This key specifies the list of points in the
+  state vector excluded from the optimal search. The default value is an empty
+  list. The list can contain either **indices of points** (in the implicit
+  internal order of a state vector) or **names of points** (which must exist in
+  the list of position names indicated by the keyword "*NameOfLocations*" in
+  order to be excluded). By default, if the elements of the list are strings
+  that can be assimilated to indices, then these strings are indeed considered
+  as indices and not names.
+
+  Important notice: the numbering of these excluded points must be identical to
+  that adopted, implicitly and imperatively, by the variables constituting a
+  state considered arbitrarily in one-dimensional form.
 
   Example :
-  ``{"ExcludeLocations":[3, 125, 286]}``
+  ``{"ExcludeLocations":[3, 125, 286]}`` or ``{"ExcludeLocations":["Point3", "XgTaC"]}``
diff --git a/doc/en/snippets/ExcludedPoints.rst b/doc/en/snippets/ExcludedPoints.rst
new file mode 100644 (file)
index 0000000..5a9a6ad
--- /dev/null
@@ -0,0 +1,9 @@
+.. index:: single: ExcludedPoints
+
+ExcludedPoints
+  *List of integer series*. Each element is a series, containing the indices of
+  the points excluded from the optimal search, according to the order of the
+  variables of a state vector considered arbitrarily in one-dimensional form.
+
+  Example :
+  ``mp = ADD.get("ExcludedPoints")[-1]``
index 1fb912ab275fad48a58ea318322dd0f543d9cda6..1138bf9afac11127a5e91c91789f99ef0322d755 100644 (file)
@@ -15,6 +15,6 @@ guarantee).
    Python,     3.6.5,    3.10.9
    Numpy,      1.14.3,    1.24.2
    Scipy,      1.1.0,    1.10.0
-   MatplotLib, 2.2.2,    3.6.3
+   MatplotLib, 2.2.2,    3.7.0
    GnuplotPy,  1.8,    1.8
    NLopt,      2.4.2,    2.7.1
diff --git a/doc/en/snippets/NameOfLocations.rst b/doc/en/snippets/NameOfLocations.rst
new file mode 100644 (file)
index 0000000..9684913
--- /dev/null
@@ -0,0 +1,14 @@
+.. index:: single: NameOfLocations
+
+NameOfLocations
+  *List of names*. This key indicates an explicit list of variable names or
+  positions, positioned as in a state vector considered arbitrarily in
+  one-dimensional form. The default value is an empty list. To be used, this
+  list must have the same length as that of a physical state.
+
+  Important notice: the order of the names is, implicitly and imperatively, the
+  same as that of the variables constituting a state considered arbitrarily in
+  one-dimensional form.
+
+  Example :
+  ``{"NameOfLocations":["Point3", "Location42", "Position125", "XgTaC"]}``
index 997b8d3b24831fe84db3d7b69f44fe2c0a7cd5e3..552ae8676d937a921bf2ee1098a39e16b517875f 100644 (file)
@@ -171,6 +171,12 @@ operator script files has to be modified.
 Versions of ADAO compatibility with support tools
 -------------------------------------------------
 
+The module benefits greatly from the **Python environment** [Python]_ and the
+multiple features of this language, from the scientific calculation tools
+included in **NumPy** [NumPy20]_, **SciPy** [SciPy20]_, **NLopt** [Johnson08]_
+or in the tools that can be reached with them, and from the numerous
+capabilities of **SALOME** [Salome]_ when used in combination.
+
 .. include:: snippets/ModuleValidation.rst
 
 .. include:: snippets/ModuleCompatibility.rst
index cfa505a20a0ca317f96c80228f754a89ac53f929..9479d7402fc052fab33fe401f3f2196f496e5e05 100644 (file)
@@ -109,11 +109,13 @@ néanmoins d'intention de constituer une bibliographie exhaustive.
 
 .. [Nelder65] Nelder J. A., Mead R., *A simplex method for function minimization*, The Computer Journal, 7, pp.308-313, 1965
 
+.. [NumPy20] Harris C.R. et al., *Array programming with NumPy*, Nature 585, pp.357–362, 2020, https://numpy.org/
+
 .. [Powell64] Powell M. J. D., *An efficient method for finding the minimum of a function of several variables without calculating derivatives*, Computer Journal, 7(2), pp.155-162, 1964
 
 .. [Powell94] Powell M. J. D., *A direct search optimization method that models the objective and constraint functions by linear interpolation*, in Advances in Optimization and Numerical Analysis, eds. S. Gomez and J-P Hennart, Kluwer Academic (Dordrecht), pp. 51-67, 1994
 
-.. [Powell98] Powell M. J. D., *Direct search algorithms for optimization calculations*, Acta Numerica 7, 287-336, 1998
+.. [Powell98] Powell M. J. D., *Direct search algorithms for optimization calculations*, Acta Numerica 7, pp.287-336, 1998
 
 .. [Powell04] Powell M. J. D., *The NEWUOA software for unconstrained optimization without derivatives*, Proc. 40th Workshop on Large Scale Nonlinear Optimization, Erice, Italy, 2004
 
@@ -135,6 +137,8 @@ néanmoins d'intention de constituer une bibliographie exhaustive.
 
 .. [SalomeMeca] *Salome_Meca et Code_Aster, Analyse des Structures et Thermomécanique pour les Etudes et la Recherche*, http://www.code-aster.org/
 
+.. [SciPy20] Virtanen P. et al., *SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python*, Nature Methods, 17(3), pp.261-272, 2020, https://scipy.org/
+
 .. [Storn97] Storn R., Price, K., *Differential Evolution – A Simple and Efficient Heuristic for global Optimization over Continuous Spaces*, Journal of Global Optimization, 11(1), pp.341-359, 1997
 
 .. [Tarantola87] Tarantola A., *Inverse Problem: Theory Methods for Data Fitting and Parameter Estimation*, Elsevier, 1987
index b862906252393334d1e852c959b35fa365d6602b..5fcdc3f339a1db065bf497c6dd4128814500653f 100644 (file)
@@ -93,6 +93,8 @@ recherche de positionnement contraint.
 
 .. include:: snippets/MaximumNumberOfLocations.rst
 
+.. include:: snippets/NameOfLocations.rst
+
 .. include:: snippets/SampleAsExplicitHyperCube.rst
 
 .. include:: snippets/SampleAsIndependantRandomVariables.rst
@@ -120,6 +122,7 @@ StoreSupplementaryCalculations
   "*Informations et variables disponibles à la fin de l'algorithme*") : [
   "EnsembleOfSimulations",
   "EnsembleOfStates",
+  "ExcludedPoints",
   "OptimalPoints",
   "ReducedBasis",
   "Residus",
@@ -142,6 +145,8 @@ StoreSupplementaryCalculations
 
 .. include:: snippets/EnsembleOfStates.rst
 
+.. include:: snippets/ExcludedPoints.rst
+
 .. include:: snippets/OptimalPoints.rst
 
 .. include:: snippets/ReducedBasis.rst
index 47cf1b23c2eedfb49b481c04b21abb30cb2018f5..b35564a591bddac1bc8fac2c0b507e7bf0e76b2c 100644 (file)
@@ -1,11 +1,19 @@
 .. index:: single: ExcludeLocations
 
 ExcludeLocations
-  *Liste d'entiers*. Cette clé indique la liste des points du vecteur d'état
-  exclus de la recherche optimale. La valeur par défaut est une liste vide.
-  Important : la numérotation de ces points exclus doit être identique à celle
-  qui est adoptée implicitement dans les états fournis par la clé
-  "*EnsembleOfSnapshots*".
+  *Liste d'entiers ou de noms*. Cette clé indique la liste des points du
+  vecteur d'état exclus de la recherche optimale. La valeur par défaut est une
+  liste vide. La liste peut contenir soit des **indices de points** (dans
+  l'ordre interne implicite d'un vecteur d'état), soit des **noms des points**
+  (qui doivent exister dans la liste des noms de positions indiquées par le
+  mot-clé "*NameOfLocations*" pour pouvoir être exclus). Par défaut, si les
+  éléments de la liste sont des chaînes de caractères assimilables à des
+  indices, alors ces chaînes sont bien considérées comme des indices et pas des
+  noms.
+
+  Rappel important : la numérotation de ces points exclus doit être identique à
+  celle qui est adoptée, implicitement et impérativement, par les variables
+  constituant un état considéré arbitrairement sous forme unidimensionnelle.
 
   Exemple :
-  ``{"ExcludeLocations":[3, 125, 286]}``
+  ``{"ExcludeLocations":[3, 125, 286]}`` ou ``{"ExcludeLocations":["Point3", "XgTaC"]}``
diff --git a/doc/fr/snippets/ExcludedPoints.rst b/doc/fr/snippets/ExcludedPoints.rst
new file mode 100644 (file)
index 0000000..280c8a2
--- /dev/null
@@ -0,0 +1,10 @@
+.. index:: single: ExcludedPoints
+
+ExcludedPoints
+  *Liste de série d'entiers*. Chaque élément est une série, contenant les
+  indices des points exclus de la recherche optimale, selon l'ordre des
+  variables d'un vecteur d'état considéré arbitrairement sous forme
+  unidimensionnelle.
+
+  Exemple :
+  ``mp = ADD.get("ExcludedPoints")[-1]``
index cbe732585ffd2efe39407bcf08852caf7a52090d..b9adf274918044f85bdc1060d16e070fabce64cb 100644 (file)
@@ -15,6 +15,6 @@ la version atteinte (mais cela reste sans garantie).
    Python,     3.6.5,    3.10.9
    Numpy,      1.14.3,    1.24.2
    Scipy,      1.1.0,    1.10.0
-   MatplotLib, 2.2.2,    3.6.3
+   MatplotLib, 2.2.2,    3.7.0
    GnuplotPy,  1.8,    1.8
    NLopt,      2.4.2,    2.7.1
diff --git a/doc/fr/snippets/NameOfLocations.rst b/doc/fr/snippets/NameOfLocations.rst
new file mode 100644 (file)
index 0000000..e9d4a1c
--- /dev/null
@@ -0,0 +1,15 @@
+.. index:: single: NameOfLocations
+
+NameOfLocations
+  *Liste de noms*. Cette clé indique une liste explicite de noms des variables
+  ou de positions, positionnées comme dans un vecteur d'état considéré
+  arbitrairement sous forme unidimensionnelle. La valeur par défaut est une
+  liste vide. Pour être utilisée, cette liste doit avoir la même longueur que
+  celle d'un état physique.
+
+  Rappel important : l'ordre des noms est, implicitement et impérativement, le
+  même que celui des variables constituant un état considéré arbitrairement
+  sous forme unidimensionnelle.
+
+  Exemple :
+  ``{"NameOfLocations":["Point3", "Location42", "Position125", "XgTaC"]}``
index faa1d9088b8db21392f2e127cfc136ec89b265bf..ec9f3053e745b5ae6468ee1e5900da5573172b5f 100644 (file)
@@ -181,6 +181,12 @@ doivent être modifiés.
 Versions de compatibilité d'ADAO avec les outils support
 --------------------------------------------------------
 
+Le module ADAO bénéficie largement de l'**environnement Python** [Python]_ et
+des nombreuses possibilités de ce langage, des outils de calcul scientifique
+inclus dans **NumPy** [NumPy20]_, **SciPy** [SciPy20]_, **NLopt** [Johnson08]_
+ou dans les outils atteignables grâce à eux, et des nombreuses capacités de
+**SALOME** [Salome]_ lorsqu'il est utilisé en association.
+
 .. include:: snippets/ModuleValidation.rst
 
 .. include:: snippets/ModuleCompatibility.rst
index 01734c14d7e85216b82cbfceedacf152d5eca7b5..6f5dadfef5e31a0361779e71db86ee43b9e06b9c 100644 (file)
 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
 
 __doc__ = """
-    EIM
+    EIM & lcEIM
 """
 __author__ = "Jean-Philippe ARGAUD"
 
 import numpy
 import daCore.Persistence
+from daCore.NumericObjects import FindIndexesFromNames
 
 # ==============================================================================
 def EIM_offline(selfA, EOS = None, Verbose = False):
@@ -43,6 +44,7 @@ def EIM_offline(selfA, EOS = None, Verbose = False):
         # __EOS = numpy.asarray(EOS).T
     else:
         raise ValueError("EnsembleOfSnapshots has to be an array/matrix (each column being a vector) or a list/tuple (each element being a vector).")
+    __dimS, __nbmS = __EOS.shape
     #
     if   selfA._parameters["ErrorNorm"] == "L2":
         MaxNormByColumn = MaxL2NormByColumn
@@ -56,8 +58,16 @@ def EIM_offline(selfA, EOS = None, Verbose = False):
     if __LcCsts and "ExcludeLocations" in selfA._parameters:
         __ExcludedMagicPoints = selfA._parameters["ExcludeLocations"]
     else:
-        __ExcludedMagicPoints = []
+        __ExcludedMagicPoints = ()
+    if __LcCsts and "NameOfLocations" in selfA._parameters:
+        if isinstance(selfA._parameters["NameOfLocations"], (list, numpy.ndarray, tuple)) and len(selfA._parameters["NameOfLocations"]) == __dimS:
+            __NameOfLocations = selfA._parameters["NameOfLocations"]
+        else:
+            __NameOfLocations = ()
+    else:
+        __NameOfLocations = ()
     if __LcCsts and len(__ExcludedMagicPoints) > 0:
+        __ExcludedMagicPoints = FindIndexesFromNames( __NameOfLocations, __ExcludedMagicPoints )
         __ExcludedMagicPoints = numpy.ravel(numpy.asarray(__ExcludedMagicPoints, dtype=int))
         __IncludedMagicPoints = numpy.setdiff1d(
             numpy.arange(__EOS.shape[0]),
@@ -67,7 +77,6 @@ def EIM_offline(selfA, EOS = None, Verbose = False):
     else:
         __IncludedMagicPoints = []
     #
-    __dimS, __nbmS = __EOS.shape
     if "MaximumNumberOfLocations" in selfA._parameters and "MaximumRBSize" in selfA._parameters:
         selfA._parameters["MaximumRBSize"] = min(selfA._parameters["MaximumNumberOfLocations"],selfA._parameters["MaximumRBSize"])
     elif "MaximumNumberOfLocations" in selfA._parameters:
@@ -148,6 +157,8 @@ def EIM_offline(selfA, EOS = None, Verbose = False):
             selfA.StoredVariables["ReducedBasis"].store( __Q )
         if selfA._toStore("Residus"):
             selfA.StoredVariables["Residus"].store( __errors )
+        if selfA._toStore("ExcludedPoints"):
+            selfA.StoredVariables["ExcludedPoints"].store( __ExcludedMagicPoints )
     #
     return __mu, __I, __Q, __errors
 
index d8d7b6cd15f26e19fde515de118d393bb46e3a0e..be191ad6029b181cf1a0a8945f27d4d48503fdab 100644 (file)
@@ -1,4 +1,4 @@
-# Modification de la version 1.9.1
+# Modification de la version 1.9.1 et 1.10.1
 """
 Functions
 ---------
@@ -241,7 +241,9 @@ def _minimize_lbfgsb(fun, x0, args=(), jac=None, bounds=None,
         If `jac is None` the absolute step size used for numerical
         approximation of the jacobian via forward differences.
     maxfun : int
-        Maximum number of function evaluations.
+        Maximum number of function evaluations. Note that this function
+        may violate the limit because of evaluating gradients by numerical
+        differentiation.
     maxiter : int
         Maximum number of iterations.
     iprint : int, optional
index ea38ea59f94039b97104faf38244cac8d05186f5..89f73f54b1e2ba928672fd24c4beeee8ab8ce759 100644 (file)
@@ -107,13 +107,10 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         self._pre_run(Parameters, Xb, Y, U, HO, EM, CM, R, B, Q)
         #
         #--------------------------
-        # Default EKF
-        #--------------------------
         if   self._parameters["Variant"] == "EKF":
             exkf.exkf(self, Xb, Y, U, HO, EM, CM, R, B, Q)
         #
         #--------------------------
-        # Default CEKF
         elif self._parameters["Variant"] == "CEKF":
             cekf.cekf(self, Xb, Y, U, HO, EM, CM, R, B, Q)
         #
index 9e45bf611f0805d83ae221a0846cb240981ea074..df6756760d489dafef44ce09f10f6a2bb48e47ce 100644 (file)
@@ -22,8 +22,7 @@
 
 import numpy
 from daCore import BasicObjects
-from daAlgorithms.Atoms import ecweim
-from daAlgorithms.Atoms import eosg
+from daAlgorithms.Atoms import ecweim, eosg
 
 # ==============================================================================
 class ElementaryAlgorithm(BasicObjects.Algorithm):
@@ -56,8 +55,13 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             name     = "ExcludeLocations",
             default  = [],
             typecast = tuple,
-            message  = "Liste des positions exclues selon la numérotation interne d'un snapshot",
-            minval   = -1,
+            message  = "Liste des indices ou noms de positions exclues selon l'ordre interne d'un snapshot",
+            )
+        self.defineRequiredParameter(
+            name     = "NameOfLocations",
+            default  = [],
+            typecast = tuple,
+            message  = "Liste des noms de positions selon l'ordre interne d'un snapshot",
             )
         self.defineRequiredParameter(
             name     = "ErrorNorm",
@@ -111,6 +115,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
             listval  = [
                 "EnsembleOfSimulations",
                 "EnsembleOfStates",
+                "ExcludedPoints",
                 "OptimalPoints",
                 "ReducedBasis",
                 "Residus",
index acddc3577447e74f1bcee2b7ce085dcc99f2f938..6c8666d6255b9bd489ba1c2b01d5d13e7fdeda00 100644 (file)
@@ -748,6 +748,7 @@ class Algorithm(object):
         self.StoredVariables["EnsembleOfSimulations"]                = Persistence.OneMatrix(name = "EnsembleOfSimulations")
         self.StoredVariables["EnsembleOfSnapshots"]                  = Persistence.OneMatrix(name = "EnsembleOfSnapshots")
         self.StoredVariables["EnsembleOfStates"]                     = Persistence.OneMatrix(name = "EnsembleOfStates")
+        self.StoredVariables["ExcludedPoints"]                       = Persistence.OneVector(name = "ExcludedPoints")
         self.StoredVariables["ForecastCovariance"]                   = Persistence.OneMatrix(name = "ForecastCovariance")
         self.StoredVariables["ForecastState"]                        = Persistence.OneVector(name = "ForecastState")
         self.StoredVariables["GradientOfCostFunctionJ"]              = Persistence.OneVector(name = "GradientOfCostFunctionJ")
index 9005366f926429d63ee349acbf24f5cd5b2ae437..87b6895961ea41971c073b863312b1243397fbfe 100644 (file)
@@ -914,6 +914,68 @@ def Apply3DVarRecentringOnEnsemble(__EnXn, __EnXf, __Ynpu, __HO, __R, __B, __Sup
     #
     return Xa + EnsembleOfAnomalies( __EnXn )
 
+# ==============================================================================
+def FindIndexesFromNames( __NameOfLocations = None, __ExcludeLocations = None, ForceArray = False):
+    "Exprime les indices des noms exclus, en ignorant les absents"
+    if __ExcludeLocations is None:
+        __ExcludeIndexes = ()
+    elif isinstance(__ExcludeLocations, (list, numpy.ndarray, tuple)) and len(__ExcludeLocations)==0:
+        __ExcludeIndexes = ()
+    # ----------
+    elif __NameOfLocations is None:
+        try:
+            __ExcludeIndexes = numpy.asarray(__ExcludeLocations, dtype=int)
+        except ValueError as e:
+            if "invalid literal for int() with base 10:" in str(e):
+                raise ValueError("to exclude named locations, initial location name list can not be void and has to have the same length as one state")
+            else:
+                raise ValueError(str(e))
+    elif isinstance(__NameOfLocations, (list, numpy.ndarray, tuple)) and len(__NameOfLocations)==0:
+        try:
+            __ExcludeIndexes = numpy.asarray(__ExcludeLocations, dtype=int)
+        except ValueError as e:
+            if "invalid literal for int() with base 10:" in str(e):
+                raise ValueError("to exclude named locations, initial location name list can not be void and has to have the same length as one state")
+            else:
+                raise ValueError(str(e))
+    # ----------
+    else:
+        try:
+            __ExcludeIndexes = numpy.asarray(__ExcludeLocations, dtype=int)
+        except ValueError as e:
+            if "invalid literal for int() with base 10:" in str(e):
+                if len(__NameOfLocations) < 1.e6+1 and len(__ExcludeLocations) > 1500:
+                    __Heuristic = True
+                else:
+                    __Heuristic = False
+                if ForceArray or __Heuristic:
+                    # Recherche par array permettant des noms invalides, peu efficace
+                    __NameToIndex = dict(numpy.array((
+                        __NameOfLocations,
+                        range(len(__NameOfLocations))
+                        )).T)
+                    __ExcludeIndexes = numpy.asarray([__NameToIndex.get(k, -1) for k in __ExcludeLocations], dtype=int)
+                    #
+                else:
+                    # Recherche par liste permettant des noms invalides, très efficace
+                    def __NameToIndex_get( cle, default = -1 ):
+                        if cle in __NameOfLocations:
+                            return __NameOfLocations.index(cle)
+                        else:
+                            return default
+                    __ExcludeIndexes = numpy.asarray([__NameToIndex_get(k, -1) for k in __ExcludeLocations], dtype=int)
+                    #
+                    # Recherche par liste interdisant des noms invalides, mais encore un peu plus efficace
+                    # __ExcludeIndexes = numpy.asarray([__NameOfLocations.index(k) for k in __ExcludeLocations], dtype=int)
+                    #
+                # Ignore les noms absents
+                __ExcludeIndexes = numpy.compress(__ExcludeIndexes > -1, __ExcludeIndexes)
+                if len(__ExcludeIndexes)==0: __ExcludeIndexes = ()
+            else:
+                raise ValueError(str(e))
+    # ----------
+    return __ExcludeIndexes
+
 # ==============================================================================
 def BuildComplexSampleList(
     __SampleAsnUplet,