]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Updating copyright information and version change
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 8 Apr 2015 06:06:57 +0000 (08:06 +0200)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Wed, 8 Apr 2015 06:14:31 +0000 (08:14 +0200)
33 files changed:
Makefile.am
adm_local/check_eficas.m4
adm_local/check_module_eficas.m4
adm_local/check_scipy.m4
adm_local/make_common_starter.am
autogen.sh
doc/en/advanced.rst
doc/fr/advanced.rst
examples/Makefile.am
examples/daSalome/Makefile.am
examples/daSalome/test003_ADAO_scripts_for_JDC.py
examples/daSalome/test003_bis_ADAO_scripts_for_JDC.py
examples/daSalome/test003_bis_ADAO_user_data_init.py
examples/daSalome/test004_ADAO_scripts_for_JDC.py
examples/daSalome/test005_ADAO_scripts_for_JDC.py
examples/daSalome/test006_Observers_Observation_Operator.py
examples/daSalome/test006_Observers_init.py
examples/daSalome/test006_Observers_var.py
examples/daSkeletons/External_data_definition_by_scripts/Makefile.am
examples/daSkeletons/External_data_definition_by_scripts/Physical_data_and_covariance_matrices.py
examples/daSkeletons/External_data_definition_by_scripts/Physical_simulation_functions.py
examples/daSkeletons/External_data_definition_by_scripts/Script_AlgorithmParameters.py
examples/daSkeletons/External_data_definition_by_scripts/Script_BackgroundError_B.py
examples/daSkeletons/External_data_definition_by_scripts/Script_Background_xb.py
examples/daSkeletons/External_data_definition_by_scripts/Script_ObservationError_R.py
examples/daSkeletons/External_data_definition_by_scripts/Script_ObservationOperator_H.py
examples/daSkeletons/External_data_definition_by_scripts/Script_Observation_yo.py
examples/daSkeletons/External_data_definition_by_scripts/Script_UserPostAnalysis.py
examples/daSkeletons/Makefile.am
idl/ADAO_COMPONENT.idl
idl/Makefile.am
src/daComposant/daAlgorithms/4DVAR.py [new file with mode: 0644]
src/daEficas/prefs.py

index a3343188934160bbdcaa5312b276ad9acdd748f6..eb430d82e21bc0c775c01642b098d5499307e087 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2011 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 8c4b6cec565a525162add0ae07ec074bb2bcd12f..b0b5be92197c8724d2cf6ab3c4c46c6bde319195 100644 (file)
@@ -1,4 +1,4 @@
-dnl  Copyright (C) 2010-2011  EDF R&D
+dnl  Copyright (C) 2008-2015  EDF R&D
 dnl
 dnl  This library is free software; you can redistribute it and/or
 dnl  modify it under the terms of the GNU Lesser General Public
index edecf0a7ff39134fac9006c3599b92f228279ba7..af0f03d56a379b5e9f89d070969c4e27b32d19b7 100644 (file)
@@ -1,4 +1,4 @@
-dnl  Copyright (C) 2010-2011  EDF R&D
+dnl  Copyright (C) 2008-2015  EDF R&D
 dnl
 dnl  This library is free software; you can redistribute it and/or
 dnl  modify it under the terms of the GNU Lesser General Public
index cd29e0841d511e51a9ac3ba82600979f796044d6..794fc8c1bd45a925471c088c935c2bb56bff2c7f 100644 (file)
@@ -1,4 +1,4 @@
-dnl  Copyright (C) 2010-2011  EDF R&D
+dnl  Copyright (C) 2008-2015  EDF R&D
 dnl
 dnl  This library is free software; you can redistribute it and/or
 dnl  modify it under the terms of the GNU Lesser General Public
index 01ac3a3c7efc4595ac2a28056c9b560c17eca0f8..3d42fe0dc67edacd2958b35730c9cfacfe27e073 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2011 EDF R&D
+# Copyright (C) 2008-2015  EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 160acd08da9469b1444f49e78d97b6158afff2a8..93dc9a2361d82a309b27d73d379bc75b330aa119 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (C) 2010-2011 EDF R&D
+# Copyright (C) 2008-2015  EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 0cac3d192cc097cd6feeb20153bc0a0f70a7ddc4..2d5c2ab537ad6f53be0e27f59fd382482f61fdb0 100644 (file)
@@ -266,6 +266,14 @@ is not guaranteed for all the commands or keywords. In general also, an ADAO
 case file for one version can not be read by a previous minor or major version
 of the ADAO module.
 
+Switching from 7.5 to 7.6
++++++++++++++++++++++++++
+
+There is no known incompatibility for the ADAO case files. The upgrade procedure
+is to read the old ADAO case file with the new SALOME/ADAO module, and save it
+with a new name. This procedure proceed automatically to the required
+modifications of the storage tree of the ADAO case file.
+
 Switching from 7.4 to 7.5
 +++++++++++++++++++++++++
 
index ec94024e485bbb272bd47b653e5ef48bbf9cc91c..85c900cd79f3b904fceed0651520fe759813cffe 100644 (file)
@@ -282,6 +282,15 @@ commandes ou tous les mots-cl
 version ne peut pas être lu par une précédente version mineure ou majeure du
 module ADAO.
 
+Passer de la version 7.5 à la 7.6
++++++++++++++++++++++++++++++++++
+
+Il n'y a pas d'incompatibilité connue pour les fichiers de cas ADAO. La
+procédure de montée en version consiste à lire l'ancien fichier de cas ADAO avec
+le nouveau module SALOME/ADAO, et à l'enregistrer avec un nouveau nom. Cette
+procédure effectue automatiquement les modifications requises dans
+l'arborescence de stockage du fichier de cas ADAO.
+
 Passer de la version 7.4 à la 7.5
 +++++++++++++++++++++++++++++++++
 
index c9ed7204b9086f0140766c6eb897f15372709bde..7e0d966a69d40b0b7f160e4a4aece0b64c079b53 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 65d2a5efa758660ccb918c087eef5c35fe51e070..066036d9cd15b92586fff7c2108a18603702e024 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index fca7d619c96cd6141f36c6d22dda3e043feea737..9aa54bea05d6a3aa0747996687ac6e208ad2db17 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index da5ddb1f06117304b6dd76fd10341c4fad3a3ef9..286f7989838bbef5c410d0dd54a5915715cac6e5 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 217efc76ff2efa3457af97ea121eb45bb019840a..e803bb5261ffbbfd924c7990d09b89e6fd9e31e4 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index eaac2754c4ed143d73d75e505377ee8072b493c3..c8173f62ac7b87e66b17754744511e533645978f 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 7a8805070cf7646ddb62ceffef3d595ebec292fe..4d06006a803bc48b8ff5db38132238aa1f173cbe 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 27fd985701c7655fdcadb5aa1050f52e73785510..3c1689a6d9819ce2ae6212ef3836b263d4be770b 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 419c3ad42a0b74c4399131f3452109fb632d3a1b..10bb4a92635f8f1976aee99d44863e990e169716 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index a7ef03e1a5c7573bf57286951c5816c82f74fc97..390045f4e0664a87e8d678490aa715d30cfff97b 100644 (file)
@@ -1,5 +1,5 @@
 #-*-coding:iso-8859-1-*-
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 6c314f13c45fd69627f8f60a4e4ddff44e3dbb92..1755130cab741ef016952ec9c2c87cbe27139f24 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index d3287777892425bb4f48135dc7f05500e0ea2a83..e461d41dae347fd44302be6cd141b5531bb242f8 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index 91e4e2f46ae3135dc3c6173cfb72cf7f30b676e1..29c40cc33cd1c69d132c022f3d05f3c5e52cf814 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index 9524602665a86f4b479a118b738f319196fb4c94..68c7a9353036187b4812677f9a254277ff53c70d 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index d27c967e8ca33870f4583415eb59ab9e41e8ed8f..8fed22fc2190005575b3af5250183c9567dd8403 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index c664b5acee99d82ffc69e8fb0337f4e9ebf95c9f..dd934953fc3f5ff5d52fdb9689476a8bc7ace1b7 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index 5cf296789c1de3ec2cbac12f6b7774432724193b..d92be4da54a0ec56c3387de918545ae928b0ecea 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index e5586e07a56ca1eb469fbdb14620da595558e1c4..e631d2af12d422e59ceed9e6815c542ab898bb31 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index 22245daff942b99c23d7ccb2dfccae9d5e944613..cebe2ecf185d2134c0f46096f3d20f130108118e 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index b810ca08bcb28c98a41fcc241c49a48376b79564..8863005578cf6c80ac3a8a0ce78537ac89483975 100644 (file)
@@ -1,6 +1,6 @@
 #-*-coding:iso-8859-1-*-
 #
-#  Copyright (C) 2008-2014 EDF R&D
+#  Copyright (C) 2008-2015 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
index e1f99bbbe5a3564182605f4c7c9a981a9ad8869b..a200655882ad2595fc6fa5321e1f1acf7d5a69af 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2014 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
index 2df221376a61bd5c921d3ac0ebad443cfd759215..c7de7960f78f657ce62e439ff81d9954f576cb89 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2010-2011 EDF R&D
+// Copyright (C) 2008-2015 EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
index 7410b1b04e49d89dc707061a870dee78ae6aef96..76ca19e0ac0a2714c5d0a79f6f17bc863589d4c6 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2010-2011 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
diff --git a/src/daComposant/daAlgorithms/4DVAR.py b/src/daComposant/daAlgorithms/4DVAR.py
new file mode 100644 (file)
index 0000000..12bc9ac
--- /dev/null
@@ -0,0 +1,329 @@
+#-*-coding:iso-8859-1-*-
+#
+#  Copyright (C) 2008-2015 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#  Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
+
+import logging
+from daCore import BasicObjects
+import numpy, scipy.optimize
+
+# ==============================================================================
+class ElementaryAlgorithm(BasicObjects.Algorithm):
+    def __init__(self):
+        BasicObjects.Algorithm.__init__(self, "4DVAR")
+        self.defineRequiredParameter(
+            name     = "ConstrainedBy",
+            default  = "EstimateProjection",
+            typecast = str,
+            message  = "Prise en compte des contraintes",
+            listval  = ["EstimateProjection"],
+            )
+        self.defineRequiredParameter(
+            name     = "EstimationOf",
+            default  = "State",
+            typecast = str,
+            message  = "Estimation d'etat ou de parametres",
+            listval  = ["State", "Parameters"],
+            )
+        self.defineRequiredParameter(
+            name     = "Minimizer",
+            default  = "LBFGSB",
+            typecast = str,
+            message  = "Minimiseur utilisé",
+            listval  = ["LBFGSB","TNC", "CG", "NCG", "BFGS"],
+            )
+        self.defineRequiredParameter(
+            name     = "MaximumNumberOfSteps",
+            default  = 15000,
+            typecast = int,
+            message  = "Nombre maximal de pas d'optimisation",
+            minval   = -1,
+            )
+        self.defineRequiredParameter(
+            name     = "CostDecrementTolerance",
+            default  = 1.e-7,
+            typecast = float,
+            message  = "Diminution relative minimale du cout lors de l'arrêt",
+            )
+        self.defineRequiredParameter(
+            name     = "ProjectedGradientTolerance",
+            default  = -1,
+            typecast = float,
+            message  = "Maximum des composantes du gradient projeté lors de l'arrêt",
+            minval   = -1,
+            )
+        self.defineRequiredParameter(
+            name     = "GradientNormTolerance",
+            default  = 1.e-05,
+            typecast = float,
+            message  = "Maximum des composantes du gradient lors de l'arrêt",
+            )
+        self.defineRequiredParameter(
+            name     = "StoreInternalVariables",
+            default  = False,
+            typecast = bool,
+            message  = "Stockage des variables internes ou intermédiaires du calcul",
+            )
+        self.defineRequiredParameter(
+            name     = "StoreSupplementaryCalculations",
+            default  = [],
+            typecast = tuple,
+            message  = "Liste de calculs supplémentaires à stocker et/ou effectuer",
+            listval  = ["BMA", "CurrentState", "CostFunctionJ"]
+            )
+        self.defineRequiredParameter( # Pas de type
+            name     = "Bounds",
+            message  = "Liste des valeurs de bornes",
+            )
+
+    def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
+        self._pre_run()
+        if logging.getLogger().level < logging.WARNING:
+            self.__iprint, self.__disp = 1, 1
+            self.__message = scipy.optimize.tnc.MSG_ALL
+        else:
+            self.__iprint, self.__disp = -1, 0
+            self.__message = scipy.optimize.tnc.MSG_NONE
+        #
+        # Paramètres de pilotage
+        # ----------------------
+        self.setParameters(Parameters)
+        #
+        if self._parameters.has_key("Bounds") and (type(self._parameters["Bounds"]) is type([]) or type(self._parameters["Bounds"]) is type(())) and (len(self._parameters["Bounds"]) > 0):
+            Bounds = self._parameters["Bounds"]
+            logging.debug("%s Prise en compte des bornes effectuee"%(self._name,))
+        else:
+            Bounds = None
+        #
+        # Correction pour pallier a un bug de TNC sur le retour du Minimum
+        if self._parameters.has_key("Minimizer") == "TNC":
+            self.setParameterValue("StoreInternalVariables",True)
+        #
+        # Opérateurs
+        # ----------
+        Hm = HO["Direct"].appliedControledFormTo
+        #
+        Mm = EM["Direct"].appliedControledFormTo
+        #
+        if CM is not None and CM.has_key("Tangent") and U is not None:
+            Cm = CM["Tangent"].asMatrix(Xb)
+        else:
+            Cm = None
+        #
+        def Un(_step):
+            if U is not None:
+                if hasattr(U,"store") and 1<=_step<len(U) :
+                    _Un = numpy.asmatrix(numpy.ravel( U[_step] )).T
+                elif hasattr(U,"store") and len(U)==1:
+                    _Un = numpy.asmatrix(numpy.ravel( U[0] )).T
+                else:
+                    _Un = numpy.asmatrix(numpy.ravel( U )).T
+            else:
+                _Un = None
+            return _Un
+        def CmUn(_xn,_un):
+            if Cm is not None and _un is not None: # Attention : si Cm est aussi dans M, doublon !
+                _Cm   = Cm.reshape(_xn.size,_un.size) # ADAO & check shape
+                _CmUn = _Cm * _un
+            else:
+                _CmUn = 0.
+            return _CmUn
+        #
+        # Remarque : les observations sont exploitées à partir du pas de temps
+        # numéro 1, et sont utilisées dans Yo comme rangées selon ces indices.
+        # Donc le pas 0 n'est pas utilisé puisque la première étape commence
+        # avec l'observation du pas 1.
+        #
+        # Nombre de pas identique au nombre de pas d'observations
+        # -------------------------------------------------------
+        if hasattr(Y,"stepnumber"):
+            duration = Y.stepnumber()
+        else:
+            duration = 2
+        #
+        # Précalcul des inversions de B et R
+        # ----------------------------------
+        BI = B.getI()
+        RI = R.getI()
+        #
+        # Définition de la fonction-coût
+        # ------------------------------
+        self.DirectCalculation = [None,] # Le pas 0 n'est pas observé
+        self.DirectInnovation  = [None,] # Le pas 0 n'est pas observé
+        def CostFunction(x):
+            _X  = numpy.asmatrix(numpy.ravel( x )).T
+            Jb  = 0.5 * (_X - Xb).T * BI * (_X - Xb)
+            self.DirectCalculation = [None,]
+            self.DirectInnovation  = [None,]
+            Jo  = 0.
+            _Xn = _X
+            for step in range(0,duration-1):
+                self.DirectCalculation.append( _Xn )
+                if hasattr(Y,"store"):
+                    _Ynpu = numpy.asmatrix(numpy.ravel( Y[step+1] )).T
+                else:
+                    _Ynpu = numpy.asmatrix(numpy.ravel( Y )).T
+                _Un = Un(step)
+                #
+                # Etape d'évolution
+                if self._parameters["EstimationOf"] == "State":
+                    _Xn = Mm( (_Xn, _Un) ) + CmUn(_Xn, _Un)
+                elif self._parameters["EstimationOf"] == "Parameters":
+                    pass
+                #
+                if Bounds is not None and self._parameters["ConstrainedBy"] == "EstimateProjection":
+                    _Xn = numpy.max(numpy.hstack((_Xn,numpy.asmatrix(Bounds)[:,0])),axis=1)
+                    _Xn = numpy.min(numpy.hstack((_Xn,numpy.asmatrix(Bounds)[:,1])),axis=1)
+                #
+                # Etape de différence aux observations
+                if self._parameters["EstimationOf"] == "State":
+                    _YmHMX = _Ynpu - numpy.asmatrix(numpy.ravel( Hm( (_Xn, None) ) )).T
+                elif self._parameters["EstimationOf"] == "Parameters":
+                    _YmHMX = _Ynpu - numpy.asmatrix(numpy.ravel( Hm( (_Xn, _Un) ) )).T - CmUn(_Xn, _Un)
+                self.DirectInnovation.append( _YmHMX )
+                # Ajout dans la fonctionnelle d'observation
+                Jo = Jo + _YmHMX.T * RI * _YmHMX
+            Jo  = 0.5 * Jo
+            J   = float( Jb ) + float( Jo )
+            if self._parameters["StoreInternalVariables"] or "CurrentState" in self._parameters["StoreSupplementaryCalculations"]:
+                self.StoredVariables["CurrentState"].store( _X )
+            self.StoredVariables["CostFunctionJb"].store( Jb )
+            self.StoredVariables["CostFunctionJo"].store( Jo )
+            self.StoredVariables["CostFunctionJ" ].store( J )
+            return J
+        #
+        def GradientOfCostFunction(x):
+            _X      = numpy.asmatrix(numpy.ravel( x )).T
+            GradJb  = BI * (_X - Xb)
+            GradJo  = 0.
+            for step in range(duration-1,0,-1):
+                # Etape de récupération du dernier stockage de l'évolution
+                _Xn = self.DirectCalculation.pop()
+                # Etape de récupération du dernier stockage de l'innovation
+                _YmHMX = self.DirectInnovation.pop()
+                # Calcul des adjoints
+                Ha = HO["Adjoint"].asMatrix(ValueForMethodForm = _Xn)
+                Ha = Ha.reshape(_Xn.size,_YmHMX.size) # ADAO & check shape
+                Ma = EM["Adjoint"].asMatrix(ValueForMethodForm = _Xn)
+                Ma = Ma.reshape(_Xn.size,_Xn.size) # ADAO & check shape
+                # Calcul du gradient par etat adjoint
+                GradJo = GradJo + Ha * RI * _YmHMX # Equivaut pour Ha lineaire à : Ha( (_Xn, RI * _YmHMX) )
+                GradJo = Ma * GradJo               # Equivaut pour Ma lineaire à : Ma( (_Xn, GradJo) )
+            GradJ   = numpy.asmatrix( numpy.ravel( GradJb ) - numpy.ravel( GradJo ) ).T
+            return GradJ.A1
+        #
+        # Point de démarrage de l'optimisation : Xini = Xb
+        # ------------------------------------
+        if type(Xb) is type(numpy.matrix([])):
+            Xini = Xb.A1.tolist()
+        else:
+            Xini = list(Xb)
+        #
+        # Minimisation de la fonctionnelle
+        # --------------------------------
+        nbPreviousSteps = self.StoredVariables["CostFunctionJ"].stepnumber()
+        #
+        if self._parameters["Minimizer"] == "LBFGSB":
+            Minimum, J_optimal, Informations = scipy.optimize.fmin_l_bfgs_b(
+                func        = CostFunction,
+                x0          = Xini,
+                fprime      = GradientOfCostFunction,
+                args        = (),
+                bounds      = Bounds,
+                maxfun      = self._parameters["MaximumNumberOfSteps"]-1,
+                factr       = self._parameters["CostDecrementTolerance"]*1.e14,
+                pgtol       = self._parameters["ProjectedGradientTolerance"],
+                iprint      = self.__iprint,
+                )
+            nfeval = Informations['funcalls']
+            rc     = Informations['warnflag']
+        elif self._parameters["Minimizer"] == "TNC":
+            Minimum, nfeval, rc = scipy.optimize.fmin_tnc(
+                func        = CostFunction,
+                x0          = Xini,
+                fprime      = GradientOfCostFunction,
+                args        = (),
+                bounds      = Bounds,
+                maxfun      = self._parameters["MaximumNumberOfSteps"],
+                pgtol       = self._parameters["ProjectedGradientTolerance"],
+                ftol        = self._parameters["CostDecrementTolerance"],
+                messages    = self.__message,
+                )
+        elif self._parameters["Minimizer"] == "CG":
+            Minimum, fopt, nfeval, grad_calls, rc = scipy.optimize.fmin_cg(
+                f           = CostFunction,
+                x0          = Xini,
+                fprime      = GradientOfCostFunction,
+                args        = (),
+                maxiter     = self._parameters["MaximumNumberOfSteps"],
+                gtol        = self._parameters["GradientNormTolerance"],
+                disp        = self.__disp,
+                full_output = True,
+                )
+        elif self._parameters["Minimizer"] == "NCG":
+            Minimum, fopt, nfeval, grad_calls, hcalls, rc = scipy.optimize.fmin_ncg(
+                f           = CostFunction,
+                x0          = Xini,
+                fprime      = GradientOfCostFunction,
+                args        = (),
+                maxiter     = self._parameters["MaximumNumberOfSteps"],
+                avextol     = self._parameters["CostDecrementTolerance"],
+                disp        = self.__disp,
+                full_output = True,
+                )
+        elif self._parameters["Minimizer"] == "BFGS":
+            Minimum, fopt, gopt, Hopt, nfeval, grad_calls, rc = scipy.optimize.fmin_bfgs(
+                f           = CostFunction,
+                x0          = Xini,
+                fprime      = GradientOfCostFunction,
+                args        = (),
+                maxiter     = self._parameters["MaximumNumberOfSteps"],
+                gtol        = self._parameters["GradientNormTolerance"],
+                disp        = self.__disp,
+                full_output = True,
+                )
+        else:
+            raise ValueError("Error in Minimizer name: %s"%self._parameters["Minimizer"])
+        #
+        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"] or "CurrentState" in self._parameters["StoreSupplementaryCalculations"]:
+            Minimum = self.StoredVariables["CurrentState"][IndexMin]
+        #
+        # Obtention de l'analyse
+        # ----------------------
+        Xa = numpy.asmatrix(numpy.ravel( Minimum )).T
+        #
+        self.StoredVariables["Analysis"].store( Xa.A1 )
+        #
+        # Calculs et/ou stockages supplémentaires
+        # ---------------------------------------
+        if "BMA" in self._parameters["StoreSupplementaryCalculations"]:
+            self.StoredVariables["BMA"].store( numpy.ravel(Xb) - numpy.ravel(Xa) )
+        #
+        self._post_run(HO)
+        return 0
+
+# ==============================================================================
+if __name__ == "__main__":
+    print '\n AUTODIAGNOSTIC \n'
index b4f0463843c52b1d227ed82dd591a5b0d60cc2cf..b6711b421b104195b7a468aa46554695ac0920c6 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2010-2015 EDF R&D
+# Copyright (C) 2008-2015 EDF R&D
 #
 # This file is part of SALOME ADAO module
 #