Salome HOME
Adding multi-functions input capabilities (5)
[modules/adao.git] / src / daComposant / daCore / Aidsm.py
index c5f0da28a9b4cf357b7f7c792d1f1c162f615bce..df5de4278d7e28b644f5cfd8e13a6f360422ea95 100644 (file)
@@ -31,7 +31,7 @@ import sys
 #
 from daCore.BasicObjects import State, Covariance, FullOperator, Operator
 from daCore.BasicObjects import AlgorithmAndParameters, DataObserver
-from daCore.BasicObjects import DiagnosticAndParameters, CaseLogger
+from daCore.BasicObjects import RegulationAndParameters, CaseLogger
 from daCore import PlatformInfo
 #
 from daCore import ExtendedLogging ; ExtendedLogging.ExtendedLogging() # A importer en premier
@@ -42,10 +42,12 @@ class Aidsm(object):
     """ ADAO Internal Data Structure Model """
     def __init__(self, name = "", addViewers=None):
         self.__name = str(name)
+        self.__directory    = None
         self.__case = CaseLogger(self.__name, "case", addViewers)
         #
         self.__adaoObject   = {}
         self.__StoredInputs = {}
+        self.__PostAnalysis = []
         #
         self.__Concepts = [
             "AlgorithmParameters",
@@ -53,15 +55,17 @@ class Aidsm(object):
             "CheckingPoint",
             "ControlInput",
             "Observation",
-            "Controls",
             "BackgroundError",
             "ObservationError",
             "EvolutionError",
             "ObservationOperator",
             "EvolutionModel",
             "ControlModel",
+            "Name",
+            "Directory",
             "Debug",
             "NoDebug",
+            "RegulationParameters",
             "Observer",
             ]
         #
@@ -69,7 +73,7 @@ class Aidsm(object):
             self.__adaoObject[ename] = None
         for ename in ("ObservationOperator", "EvolutionModel", "ControlModel"):
             self.__adaoObject[ename] = {}
-        for ename in ("Diagnostic", "Observer"):
+        for ename in ("Observer",):
             self.__adaoObject[ename]   = []
             self.__StoredInputs[ename] = []
         #
@@ -85,12 +89,13 @@ class Aidsm(object):
             Algorithm            = None,
             AppliedInXb          = None,
             AvoidRC              = True,
-            BaseType             = None,
             Checked              = False,
-            Diagnostic           = None,
+            ColMajor             = False,
+            ColNames             = None,
+            DataFile             = None,
             DiagonalSparseMatrix = None,
-            Identifier           = None,
             Info                 = None,
+            InputAsMF            = False,
             Matrix               = None,
             ObjectFunction       = None,
             ObjectMatrix         = None,
@@ -103,7 +108,6 @@ class Aidsm(object):
             String               = None,
             Template             = None,
             ThreeFunctions       = None,
-            Unit                 = None,
             Variable             = None,
             Vector               = None,
             VectorSerie          = None,
@@ -111,42 +115,47 @@ class Aidsm(object):
         "Interface unique de definition de variables d'entrees par argument"
         self.__case.register("set",dir(),locals(),None,True)
         try:
-            if   Concept in ("Background", "CheckingPoint", "ControlInput", "Observation", "Controls"):
+            if   Concept in ("Background", "CheckingPoint", "ControlInput", "Observation"):
                 commande = getattr(self,"set"+Concept)
-                commande(Vector, VectorSerie, Script, Stored, Scheduler, Checked )
+                commande(Vector, VectorSerie, Script, DataFile, ColNames, ColMajor, Stored, Scheduler, Checked )
             elif Concept in ("BackgroundError", "ObservationError", "EvolutionError"):
                 commande = getattr(self,"set"+Concept)
                 commande(Matrix, ScalarSparseMatrix, DiagonalSparseMatrix,
                          Script, Stored, ObjectMatrix, Checked )
             elif Concept == "AlgorithmParameters":
                 self.setAlgorithmParameters( Algorithm, Parameters, Script )
+            elif Concept == "RegulationParameters":
+                self.setRegulationParameters( Algorithm, Parameters, Script )
+            elif Concept == "Name":
+                self.setName(String)
+            elif Concept == "Directory":
+                self.setDirectory(String)
             elif Concept == "Debug":
                 self.setDebug()
             elif Concept == "NoDebug":
                 self.setNoDebug()
             elif Concept == "Observer":
                 self.setObserver( Variable, Template, String, Script, Info, ObjectFunction, Scheduler )
-            elif Concept == "Diagnostic":
-                self.setDiagnostic( Diagnostic, Identifier, Parameters, Script, Unit, BaseType )
             elif Concept == "ObservationOperator":
                 self.setObservationOperator(
                     Matrix, OneFunction, ThreeFunctions, AppliedInXb,
-                    Parameters, Script, Stored, AvoidRC, Checked )
+                    Parameters, Script,
+                    Stored, AvoidRC, InputAsMF, Checked )
             elif Concept in ("EvolutionModel", "ControlModel"):
                 commande = getattr(self,"set"+Concept)
                 commande(
                     Matrix, OneFunction, ThreeFunctions,
-                    Parameters, Script, Scheduler, Stored, AvoidRC, Checked )
-
+                    Parameters, Script, Scheduler,
+                    Stored, AvoidRC, InputAsMF, Checked )
             else:
                 raise ValueError("the variable named '%s' is not allowed."%str(Concept))
         except Exception as e:
             if isinstance(e, SyntaxError): msg = "at %s: %s"%(e.offset, e.text)
             else: msg = ""
-            raise ValueError("during settings, the following error occurs:\n"+\
-                             "\n%s %s\n\nSee also the potential messages, "+\
-                             "which can show the origin of the above error, "+\
-                             "in the launching terminal."%(str(e),msg))
+            raise ValueError(("during settings, the following error occurs:\n"+\
+                              "\n%s %s\n\nSee also the potential messages, "+\
+                              "which can show the origin of the above error, "+\
+                              "in the launching terminal.")%(str(e),msg))
 
     # -----------------------------------------------------------
 
@@ -154,6 +163,9 @@ class Aidsm(object):
             Vector         = None,
             VectorSerie    = None,
             Script         = None,
+            DataFile       = None,
+            ColNames       = None,
+            ColMajor       = False,
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
@@ -164,7 +176,10 @@ class Aidsm(object):
             name               = Concept,
             asVector           = Vector,
             asPersistentVector = VectorSerie,
-            asScript           = Script,
+            asScript           = self.__with_directory(Script),
+            asDataFile         = DataFile,
+            colNames           = ColNames,
+            colMajor           = ColMajor,
             scheduledBy        = Scheduler,
             toBeChecked        = Checked,
             )
@@ -176,6 +191,9 @@ class Aidsm(object):
             Vector         = None,
             VectorSerie    = None,
             Script         = None,
+            DataFile       = None,
+            ColNames       = None,
+            ColMajor       = False,
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
@@ -186,7 +204,10 @@ class Aidsm(object):
             name               = Concept,
             asVector           = Vector,
             asPersistentVector = VectorSerie,
-            asScript           = Script,
+            asScript           = self.__with_directory(Script),
+            asDataFile         = DataFile,
+            colNames           = ColNames,
+            colMajor           = ColMajor,
             scheduledBy        = Scheduler,
             toBeChecked        = Checked,
             )
@@ -198,6 +219,9 @@ class Aidsm(object):
             Vector         = None,
             VectorSerie    = None,
             Script         = None,
+            DataFile       = None,
+            ColNames       = None,
+            ColMajor       = False,
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
@@ -208,7 +232,10 @@ class Aidsm(object):
             name               = Concept,
             asVector           = Vector,
             asPersistentVector = VectorSerie,
-            asScript           = Script,
+            asScript           = self.__with_directory(Script),
+            asDataFile         = DataFile,
+            colNames           = ColNames,
+            colMajor           = ColMajor,
             scheduledBy        = Scheduler,
             toBeChecked        = Checked,
             )
@@ -220,6 +247,9 @@ class Aidsm(object):
             Vector         = None,
             VectorSerie    = None,
             Script         = None,
+            DataFile       = None,
+            ColNames       = None,
+            ColMajor       = False,
             Stored         = False,
             Scheduler      = None,
             Checked        = False):
@@ -230,29 +260,10 @@ class Aidsm(object):
             name               = Concept,
             asVector           = Vector,
             asPersistentVector = VectorSerie,
-            asScript           = Script,
-            scheduledBy        = Scheduler,
-            toBeChecked        = Checked,
-            )
-        if Stored:
-            self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
-        return 0
-
-    def setControls(self,
-            Vector         = (), # Valeur par defaut pour un vecteur vide
-            VectorSerie    = None,
-            Script         = None,
-            Stored         = False,
-            Scheduler      = None,
-            Checked        = False):
-        "Definition d'un concept de calcul"
-        Concept = "Controls"
-        self.__case.register("set"+Concept, dir(), locals())
-        self.__adaoObject[Concept] = State(
-            name               = Concept,
-            asVector           = Vector,
-            asPersistentVector = VectorSerie,
-            asScript           = Script,
+            asScript           = self.__with_directory(Script),
+            asDataFile         = DataFile,
+            colNames           = ColNames,
+            colMajor           = ColMajor,
             scheduledBy        = Scheduler,
             toBeChecked        = Checked,
             )
@@ -277,7 +288,7 @@ class Aidsm(object):
             asEyeByScalar = ScalarSparseMatrix,
             asEyeByVector = DiagonalSparseMatrix,
             asCovObject   = ObjectMatrix,
-            asScript      = Script,
+            asScript      = self.__with_directory(Script),
             toBeChecked   = Checked,
             )
         if Stored:
@@ -301,7 +312,7 @@ class Aidsm(object):
             asEyeByScalar = ScalarSparseMatrix,
             asEyeByVector = DiagonalSparseMatrix,
             asCovObject   = ObjectMatrix,
-            asScript      = Script,
+            asScript      = self.__with_directory(Script),
             toBeChecked   = Checked,
             )
         if Stored:
@@ -325,7 +336,7 @@ class Aidsm(object):
             asEyeByScalar = ScalarSparseMatrix,
             asEyeByVector = DiagonalSparseMatrix,
             asCovObject   = ObjectMatrix,
-            asScript      = Script,
+            asScript      = self.__with_directory(Script),
             toBeChecked   = Checked,
             )
         if Stored:
@@ -341,6 +352,7 @@ class Aidsm(object):
             Script         = None,
             Stored         = False,
             AvoidRC        = True,
+            InputAsMF      = False,
             Checked        = False):
         "Definition d'un concept de calcul"
         Concept = "ObservationOperator"
@@ -350,10 +362,11 @@ class Aidsm(object):
             asMatrix         = Matrix,
             asOneFunction    = OneFunction,
             asThreeFunctions = ThreeFunctions,
-            asScript         = Script,
+            asScript         = self.__with_directory(Script),
             asDict           = Parameters,
             appliedInX       = AppliedInXb,
             avoidRC          = AvoidRC,
+            inputAsMF        = InputAsMF,
             scheduledBy      = None,
             toBeChecked      = Checked,
             )
@@ -367,9 +380,10 @@ class Aidsm(object):
             ThreeFunctions = None,
             Parameters     = None,
             Script         = None,
-            Stored         = False,
             Scheduler      = None,
+            Stored         = False,
             AvoidRC        = True,
+            InputAsMF      = False,
             Checked        = False):
         "Definition d'un concept de calcul"
         Concept = "EvolutionModel"
@@ -379,10 +393,11 @@ class Aidsm(object):
             asMatrix         = Matrix,
             asOneFunction    = OneFunction,
             asThreeFunctions = ThreeFunctions,
-            asScript         = Script,
+            asScript         = self.__with_directory(Script),
             asDict           = Parameters,
             appliedInX       = None,
             avoidRC          = AvoidRC,
+            inputAsMF        = InputAsMF,
             scheduledBy      = Scheduler,
             toBeChecked      = Checked,
             )
@@ -396,9 +411,10 @@ class Aidsm(object):
             ThreeFunctions = None,
             Parameters     = None,
             Script         = None,
-            Stored         = False,
             Scheduler      = None,
+            Stored         = False,
             AvoidRC        = True,
+            InputAsMF      = False,
             Checked        = False):
         "Definition d'un concept de calcul"
         Concept = "ControlModel"
@@ -408,10 +424,11 @@ class Aidsm(object):
             asMatrix         = Matrix,
             asOneFunction    = OneFunction,
             asThreeFunctions = ThreeFunctions,
-            asScript         = Script,
+            asScript         = self.__with_directory(Script),
             asDict           = Parameters,
             appliedInX       = None,
             avoidRC          = AvoidRC,
+            inputAsMF        = InputAsMF,
             scheduledBy      = Scheduler,
             toBeChecked      = Checked,
             )
@@ -419,12 +436,30 @@ class Aidsm(object):
             self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
         return 0
 
-    def setDebug(self, level = 10):
+    def setName(self, String=None):
+        "Definition d'un concept de calcul"
+        self.__case.register("setName",dir(),locals())
+        if String is not None:
+            self.__name = str(String)
+        else:
+            self.__name = None
+        self.__StoredInputs["Name"] = self.__name
+
+    def setDirectory(self, String=None):
+        "Definition 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))
+        else:
+            self.__directory = None
+        self.__StoredInputs["Directory"] = self.__directory
+
+    def setDebug(self, __level = 10):
         "NOTSET=0 < DEBUG=10 < INFO=20 < WARNING=30 < ERROR=40 < CRITICAL=50"
         self.__case.register("setDebug",dir(),locals())
         log = logging.getLogger()
-        log.setLevel( level )
-        self.__StoredInputs["Debug"]   = level
+        log.setLevel( __level )
+        self.__StoredInputs["Debug"]   = __level
         self.__StoredInputs["NoDebug"] = False
         return 0
 
@@ -448,7 +483,7 @@ class Aidsm(object):
             name          = Concept,
             asAlgorithm   = Algorithm,
             asDict        = Parameters,
-            asScript      = Script,
+            asScript      = self.__with_directory(Script),
             )
         return 0
 
@@ -460,7 +495,22 @@ class Aidsm(object):
             raise ValueError("No algorithm registred, ask for one before updating parameters")
         self.__adaoObject["AlgorithmParameters"].updateParameters(
             asDict        = Parameters,
-            asScript      = Script,
+            asScript      = self.__with_directory(Script),
+            )
+        return 0
+
+    def setRegulationParameters(self,
+            Algorithm  = None,
+            Parameters = None,
+            Script     = None):
+        "Definition d'un concept de calcul"
+        Concept = "RegulationParameters"
+        self.__case.register("set"+Concept, dir(), locals())
+        self.__adaoObject[Concept] = RegulationAndParameters(
+            name          = Concept,
+            asAlgorithm   = Algorithm,
+            asDict        = Parameters,
+            asScript      = self.__with_directory(Script),
             )
         return 0
 
@@ -480,7 +530,7 @@ class Aidsm(object):
             onVariable  = Variable,
             asTemplate  = Template,
             asString    = String,
-            asScript    = Script,
+            asScript    = self.__with_directory(Script),
             asObsObject = ObjectFunction,
             withInfo    = Info,
             scheduledBy = Scheduler,
@@ -515,29 +565,6 @@ class Aidsm(object):
 
     # -----------------------------------------------------------
 
-    def setDiagnostic(self,
-            Diagnostic = None,
-            Identifier = None,
-            Parameters = None,
-            Script     = None,
-            Unit       = None,
-            BaseType   = None):
-        "Definition d'un concept de calcul"
-        Concept = "Diagnostic"
-        self.__case.register("set"+Concept, dir(), locals())
-        self.__adaoObject[Concept].append( DiagnosticAndParameters(
-                 name               = Concept,
-                 asDiagnostic       = Diagnostic,
-                 asIdentifier       = Identifier,
-                 asDict             = Parameters,
-                 asScript           = Script,
-                 asUnit             = Unit,
-                 asBaseType         = BaseType,
-                 asExistingDiags    = self.__StoredInputs[Concept],
-                ))
-        self.__StoredInputs[Concept].append(str(Identifier))
-        return 0
-
     def get(self, Concept=None, noDetails=True ):
         "Recuperation d'une sortie du calcul"
         if Concept is not None:
@@ -557,18 +584,13 @@ class Aidsm(object):
             elif Concept == "AlgorithmRequiredParameters" and self.__adaoObject["AlgorithmParameters"] is not None:
                 return self.__adaoObject["AlgorithmParameters"].getAlgorithmRequiredParameters(noDetails)
                 #
-            elif Concept in self.__StoredInputs["Diagnostic"]:
-                indice = self.__StoredInputs["Diagnostic"].index(Concept)
-                return self.__adaoObject["Diagnostic"][indice].get()
-                #
             else:
-                raise ValueError("The requested key \"%s\" does not exists as an input, a diagnostic or a stored variable."%Concept)
+                raise ValueError("The requested key \"%s\" does not exists as an input or a stored variable."%Concept)
         else:
             allvariables = {}
             allvariables.update( {"AlgorithmParameters":self.__adaoObject["AlgorithmParameters"].get()} )
             # allvariables.update( self.__adaoObject["AlgorithmParameters"].get() )
             allvariables.update( self.__StoredInputs )
-            allvariables.pop('Diagnostic', None)
             allvariables.pop('Observer', None)
             return allvariables
 
@@ -590,7 +612,6 @@ class Aidsm(object):
                 variables.extend(list(self.__adaoObject["AlgorithmParameters"].keys()))
             if len(list(self.__StoredInputs.keys())) > 0:
                 variables.extend( list(self.__StoredInputs.keys()) )
-            variables.remove('Diagnostic')
             variables.remove('Observer')
             variables.sort()
             return variables
@@ -614,27 +635,9 @@ class Aidsm(object):
         files.sort()
         return files
 
-    def get_available_diagnostics(self):
-        """
-        Renvoie la liste des diagnostics potentiellement utilisables, identifiés
-        par les chaînes de caractères.
-        """
-        files = []
-        for directory in sys.path:
-            if os.path.isdir(os.path.join(directory,"daDiagnostics")):
-                for fname in os.listdir(os.path.join(directory,"daDiagnostics")):
-                    root, ext = os.path.splitext(fname)
-                    if ext == '.py' and root != '__init__':
-                        files.append(root)
-        files.sort()
-        return files
-
-    # -----------------------------------------------------------
-
     def get_algorithms_main_path(self):
         """
         Renvoie le chemin pour le répertoire principal contenant les algorithmes
-        dans un sous-répertoire "daAlgorithms"
         """
         return self.__parent
 
@@ -642,9 +645,6 @@ class Aidsm(object):
         """
         Ajoute au chemin de recherche des algorithmes un répertoire dans lequel
         se trouve un sous-répertoire "daAlgorithms"
-
-        Remarque : si le chemin a déjà été ajouté pour les diagnostics, il n'est
-        pas indispensable de le rajouter ici.
         """
         if not os.path.isdir(Path):
             raise ValueError("The given "+Path+" argument must exist as a directory")
@@ -656,31 +656,6 @@ class Aidsm(object):
         sys.path = PlatformInfo.uniq( sys.path ) # Conserve en unique exemplaire chaque chemin
         return 0
 
-    def get_diagnostics_main_path(self):
-        """
-        Renvoie le chemin pour le répertoire principal contenant les diagnostics
-        dans un sous-répertoire "daDiagnostics"
-        """
-        return self.__parent
-
-    def add_diagnostics_path(self, Path=None):
-        """
-        Ajoute au chemin de recherche des algorithmes un répertoire dans lequel
-        se trouve un sous-répertoire "daDiagnostics"
-
-        Remarque : si le chemin a déjà été ajouté pour les algorithmes, il n'est
-        pas indispensable de le rajouter ici.
-        """
-        if not os.path.isdir(Path):
-            raise ValueError("The given "+Path+" argument must exist as a directory")
-        if not os.path.isdir(os.path.join(Path,"daDiagnostics")):
-            raise ValueError("The given \""+Path+"\" argument must contain a subdirectory named \"daDiagnostics\"")
-        if not os.path.isfile(os.path.join(Path,"daDiagnostics","__init__.py")):
-            raise ValueError("The given \""+Path+"/daDiagnostics\" path must contain a file named \"__init__.py\"")
-        sys.path.insert(0, os.path.abspath(Path))
-        sys.path = PlatformInfo.uniq( sys.path ) # Conserve en unique exemplaire chaque chemin
-        return 0
-
     # -----------------------------------------------------------
 
     def execute(self, Executor=None, SaveCaseInFile=None):
@@ -718,25 +693,49 @@ class Aidsm(object):
 
     def dump(self, FileName=None, Formater="TUI"):
         "Restitution normalisée des commandes"
-        return self.__case.dump(FileName, Formater)
+        __Upa = "\n".join(self.__PostAnalysis)
+        return self.__case.dump(FileName, Formater, __Upa)
 
-    def load(self, FileName=None, Formater="TUI"):
+    def load(self, FileName=None, Content=None, Object=None, Formater="TUI"):
         "Chargement normalisé des commandes"
-        __commands = self.__case.load(FileName, Formater)
+        __commands = self.__case.load(FileName, Content, Object, Formater)
         from numpy import array, matrix
         for __command in __commands:
-            exec("self."+__command)
+            if __command.find("set")>-1 and __command.find("set_")<0:
+                exec("self."+__command)
+            else:
+                self.__PostAnalysis.append(__command)
         return self
 
+    def convert(self,
+        FileNameFrom=None, ContentFrom=None, ObjectFrom=None, FormaterFrom="TUI",
+        FileNameTo=None, FormaterTo="TUI",
+        ):
+        "Conversion normalisée des commandes"
+        return self.load(
+            FileName=FileNameFrom, Content=ContentFrom, Object=ObjectFrom, Formater=FormaterFrom
+            ).dump(
+            FileName=FileNameTo, Formater=FormaterTo
+            )
+
     def clear(self):
         "Effacement du contenu du cas en cours"
         self.__init__(self.__name)
 
     # -----------------------------------------------------------
 
+    def __with_directory(self, __filename=None):
+        if os.path.exists(str(__filename)):
+            __fullpath = __filename
+        elif os.path.exists(os.path.join(str(self.__directory), str(__filename))):
+            __fullpath = os.path.join(self.__directory, str(__filename))
+        else:
+            __fullpath = __filename
+        return __fullpath
+
     def __dir__(self):
         "Clarifie la visibilité des méthodes"
-        return ['set', 'get', 'execute', '__doc__', '__init__', '__module__']
+        return ['set', 'get', 'execute', 'dump', 'load', '__doc__', '__init__', '__module__']
 
     def prepare_to_pickle(self):
         "Retire les variables non pickelisables, avec recopie efficace"
@@ -751,7 +750,10 @@ class Aidsm(object):
         if sys.version_info[0] == 2:
             del self.__adaoObject # Because it breaks pickle in Python 2. Not required for Python 3
             del self.__case       # Because it breaks pickle in Python 2. Not required for Python 3
-        return 0
+        if sys.version_info.major < 3:
+            return 0
+        else:
+            return self.__StoredInputs
 
 # ==============================================================================
 if __name__ == "__main__":