X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FdaComposant%2FdaCore%2FAidsm.py;h=a981db1b3330e1a1e0e4af1020af85a952e71c4e;hb=c3059023647feca54ad621b0af00ef55127b59fa;hp=5fcbbc177049a9436cb95d919ec913069df6561a;hpb=bfe709fcc45405050eacc6472144996ddbd9cc56;p=modules%2Fadao.git diff --git a/src/daComposant/daCore/Aidsm.py b/src/daComposant/daCore/Aidsm.py index 5fcbbc1..a981db1 100644 --- a/src/daComposant/daCore/Aidsm.py +++ b/src/daComposant/daCore/Aidsm.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2008-2018 EDF R&D +# Copyright (C) 2008-2021 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 @@ -31,7 +31,8 @@ import sys # from daCore.BasicObjects import State, Covariance, FullOperator, Operator from daCore.BasicObjects import AlgorithmAndParameters, DataObserver -from daCore.BasicObjects import CaseLogger +from daCore.BasicObjects import RegulationAndParameters, CaseLogger +from daCore.BasicObjects import UserScript, ExternalParameters from daCore import PlatformInfo # from daCore import ExtendedLogging ; ExtendedLogging.ExtendedLogging() # A importer en premier @@ -47,32 +48,39 @@ class Aidsm(object): # self.__adaoObject = {} self.__StoredInputs = {} + self.__PostAnalysis = [] # - self.__Concepts = [ + self.__Concepts = [ # Liste exhaustive "AlgorithmParameters", "Background", + "BackgroundError", "CheckingPoint", "ControlInput", - "Observation", - "Controls", - "BackgroundError", - "ObservationError", - "EvolutionError", - "ObservationOperator", - "EvolutionModel", "ControlModel", "Debug", + "Directory", + "EvolutionError", + "EvolutionModel", + "Name", "NoDebug", + "Observation", + "ObservationError", + "ObservationOperator", "Observer", + "RegulationParameters", + "SupplementaryParameters", + "UserPostAnalysis", ] # for ename in self.__Concepts: self.__adaoObject[ename] = None for ename in ("ObservationOperator", "EvolutionModel", "ControlModel"): self.__adaoObject[ename] = {} - for ename in ("Observer",): + for ename in ("Observer", "UserPostAnalysis"): self.__adaoObject[ename] = [] - self.__StoredInputs[ename] = [] + self.__StoredInputs[ename] = [] # Vide par defaut + self.__StoredInputs["Name"] = self.__name + self.__StoredInputs["Directory"] = self.__directory # # Récupère le chemin du répertoire parent et l'ajoute au path # (Cela complète l'action de la classe PathManagement dans PlatformInfo, @@ -87,8 +95,13 @@ class Aidsm(object): AppliedInXb = None, AvoidRC = True, Checked = False, + ColMajor = False, + ColNames = None, + DataFile = None, DiagonalSparseMatrix = None, + ExtraArguments = None, Info = None, + InputFunctionAsMulti = False, Matrix = None, ObjectFunction = None, ObjectMatrix = None, @@ -108,31 +121,42 @@ 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 == "UserPostAnalysis": + self.setUserPostAnalysis( Template, String, Script ) + elif Concept == "SupplementaryParameters": + self.setSupplementaryParameters( Parameters, Script ) elif Concept == "ObservationOperator": self.setObservationOperator( Matrix, OneFunction, ThreeFunctions, AppliedInXb, - Parameters, Script, Stored, AvoidRC, Checked ) + Parameters, Script, ExtraArguments, + Stored, AvoidRC, InputFunctionAsMulti, Checked ) elif Concept in ("EvolutionModel", "ControlModel"): commande = getattr(self,"set"+Concept) commande( Matrix, OneFunction, ThreeFunctions, - Parameters, Script, Scheduler, Stored, AvoidRC, Checked ) - + Parameters, Script, Scheduler, ExtraArguments, + Stored, AvoidRC, InputFunctionAsMulti, Checked ) else: raise ValueError("the variable named '%s' is not allowed."%str(Concept)) except Exception as e: @@ -149,6 +173,9 @@ class Aidsm(object): Vector = None, VectorSerie = None, Script = None, + DataFile = None, + ColNames = None, + ColMajor = False, Stored = False, Scheduler = None, Checked = False): @@ -159,7 +186,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, ) @@ -171,6 +201,9 @@ class Aidsm(object): Vector = None, VectorSerie = None, Script = None, + DataFile = None, + ColNames = None, + ColMajor = False, Stored = False, Scheduler = None, Checked = False): @@ -181,7 +214,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, ) @@ -193,6 +229,9 @@ class Aidsm(object): Vector = None, VectorSerie = None, Script = None, + DataFile = None, + ColNames = None, + ColMajor = False, Stored = False, Scheduler = None, Checked = False): @@ -203,7 +242,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, ) @@ -215,6 +257,9 @@ class Aidsm(object): Vector = None, VectorSerie = None, Script = None, + DataFile = None, + ColNames = None, + ColMajor = False, Stored = False, Scheduler = None, Checked = False): @@ -225,7 +270,10 @@ class Aidsm(object): name = Concept, asVector = Vector, asPersistentVector = VectorSerie, - asScript = self.with_directory(Script), + asScript = self.__with_directory(Script), + asDataFile = DataFile, + colNames = ColNames, + colMajor = ColMajor, scheduledBy = Scheduler, toBeChecked = Checked, ) @@ -250,7 +298,7 @@ class Aidsm(object): asEyeByScalar = ScalarSparseMatrix, asEyeByVector = DiagonalSparseMatrix, asCovObject = ObjectMatrix, - asScript = Script, + asScript = self.__with_directory(Script), toBeChecked = Checked, ) if Stored: @@ -274,7 +322,7 @@ class Aidsm(object): asEyeByScalar = ScalarSparseMatrix, asEyeByVector = DiagonalSparseMatrix, asCovObject = ObjectMatrix, - asScript = Script, + asScript = self.__with_directory(Script), toBeChecked = Checked, ) if Stored: @@ -298,7 +346,7 @@ class Aidsm(object): asEyeByScalar = ScalarSparseMatrix, asEyeByVector = DiagonalSparseMatrix, asCovObject = ObjectMatrix, - asScript = Script, + asScript = self.__with_directory(Script), toBeChecked = Checked, ) if Stored: @@ -306,15 +354,17 @@ class Aidsm(object): return 0 def setObservationOperator(self, - Matrix = None, - OneFunction = None, - ThreeFunctions = None, - AppliedInXb = None, - Parameters = None, - Script = None, - Stored = False, - AvoidRC = True, - Checked = False): + Matrix = None, + OneFunction = None, + ThreeFunctions = None, + AppliedInXb = None, + Parameters = None, + Script = None, + ExtraArguments = None, + Stored = False, + AvoidRC = True, + InputFunctionAsMulti = False, + Checked = False): "Definition d'un concept de calcul" Concept = "ObservationOperator" self.__case.register("set"+Concept, dir(), locals()) @@ -323,10 +373,12 @@ class Aidsm(object): asMatrix = Matrix, asOneFunction = OneFunction, asThreeFunctions = ThreeFunctions, - asScript = Script, + asScript = self.__with_directory(Script), asDict = Parameters, appliedInX = AppliedInXb, + extraArguments = ExtraArguments, avoidRC = AvoidRC, + inputAsMF = InputFunctionAsMulti, scheduledBy = None, toBeChecked = Checked, ) @@ -335,15 +387,17 @@ class Aidsm(object): return 0 def setEvolutionModel(self, - Matrix = None, - OneFunction = None, - ThreeFunctions = None, - Parameters = None, - Script = None, - Stored = False, - Scheduler = None, - AvoidRC = True, - Checked = False): + Matrix = None, + OneFunction = None, + ThreeFunctions = None, + Parameters = None, + Script = None, + Scheduler = None, + ExtraArguments = None, + Stored = False, + AvoidRC = True, + InputFunctionAsMulti = False, + Checked = False): "Definition d'un concept de calcul" Concept = "EvolutionModel" self.__case.register("set"+Concept, dir(), locals()) @@ -352,10 +406,12 @@ class Aidsm(object): asMatrix = Matrix, asOneFunction = OneFunction, asThreeFunctions = ThreeFunctions, - asScript = Script, + asScript = self.__with_directory(Script), asDict = Parameters, appliedInX = None, + extraArguments = ExtraArguments, avoidRC = AvoidRC, + inputAsMF = InputFunctionAsMulti, scheduledBy = Scheduler, toBeChecked = Checked, ) @@ -364,15 +420,17 @@ class Aidsm(object): return 0 def setControlModel(self, - Matrix = None, - OneFunction = None, - ThreeFunctions = None, - Parameters = None, - Script = None, - Stored = False, - Scheduler = None, - AvoidRC = True, - Checked = False): + Matrix = None, + OneFunction = None, + ThreeFunctions = None, + Parameters = None, + Script = None, + Scheduler = None, + ExtraArguments = None, + Stored = False, + AvoidRC = True, + InputFunctionAsMulti = False, + Checked = False): "Definition d'un concept de calcul" Concept = "ControlModel" self.__case.register("set"+Concept, dir(), locals()) @@ -381,10 +439,12 @@ class Aidsm(object): asMatrix = Matrix, asOneFunction = OneFunction, asThreeFunctions = ThreeFunctions, - asScript = Script, + asScript = self.__with_directory(Script), asDict = Parameters, appliedInX = None, + extraArguments = ExtraArguments, avoidRC = AvoidRC, + inputAsMF = InputFunctionAsMulti, scheduledBy = Scheduler, toBeChecked = Checked, ) @@ -392,6 +452,24 @@ class Aidsm(object): self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO() return 0 + 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()) @@ -421,7 +499,7 @@ class Aidsm(object): name = Concept, asAlgorithm = Algorithm, asDict = Parameters, - asScript = Script, + asScript = self.__with_directory(Script), ) return 0 @@ -429,11 +507,54 @@ class Aidsm(object): Parameters = None, Script = None): "Mise a jour d'un concept de calcul" - if "AlgorithmParameters" not in self.__adaoObject: - raise ValueError("No algorithm registred, ask for one before updating parameters") - self.__adaoObject["AlgorithmParameters"].updateParameters( + 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") + self.__adaoObject[Concept].updateParameters( asDict = Parameters, - asScript = Script, + asScript = self.__with_directory(Script), + ) + # RaJ du register + 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 + + def setSupplementaryParameters(self, + Parameters = None, + Script = None): + "Definition d'un concept de calcul" + Concept = "SupplementaryParameters" + self.__case.register("set"+Concept, dir(), locals()) + self.__adaoObject[Concept] = ExternalParameters( + name = Concept, + asDict = Parameters, + asScript = self.__with_directory(Script), + ) + return 0 + + def updateSupplementaryParameters(self, + Parameters = None, + Script = None): + "Mise a 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) + self.__adaoObject[Concept].updateParameters( + asDict = Parameters, + asScript = self.__with_directory(Script), ) return 0 @@ -453,7 +574,7 @@ class Aidsm(object): onVariable = Variable, asTemplate = Template, asString = String, - asScript = Script, + asScript = self.__with_directory(Script), asObsObject = ObjectFunction, withInfo = Info, scheduledBy = Scheduler, @@ -486,6 +607,20 @@ class Aidsm(object): else: return self.__adaoObject["AlgorithmParameters"].removeObserver( ename, ObjectFunction ) + def setUserPostAnalysis(self, + Template = None, + String = None, + Script = None): + "Definition d'un concept de calcul" + Concept = "UserPostAnalysis" + self.__case.register("set"+Concept, dir(), locals()) + self.__adaoObject[Concept].append( repr(UserScript( + name = Concept, + asTemplate = Template, + asString = String, + asScript = self.__with_directory(Script), + ))) + # ----------------------------------------------------------- def get(self, Concept=None, noDetails=True ): @@ -507,14 +642,29 @@ class Aidsm(object): elif Concept == "AlgorithmRequiredParameters" and self.__adaoObject["AlgorithmParameters"] is not None: return self.__adaoObject["AlgorithmParameters"].getAlgorithmRequiredParameters(noDetails) # + elif Concept == "AlgorithmRequiredInputs" and self.__adaoObject["AlgorithmParameters"] is not None: + return self.__adaoObject["AlgorithmParameters"].getAlgorithmInputArguments() + # + elif Concept == "AlgorithmAttributes" and self.__adaoObject["AlgorithmParameters"] is not None: + return self.__adaoObject["AlgorithmParameters"].getAlgorithmAttributes() + # + elif self.__adaoObject["SupplementaryParameters"] is not None and Concept == "SupplementaryParameters": + return self.__adaoObject["SupplementaryParameters"].get() + # + elif self.__adaoObject["SupplementaryParameters"] is not None and Concept in self.__adaoObject["SupplementaryParameters"]: + return self.__adaoObject["SupplementaryParameters"].get( Concept ) + # else: 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()} ) + if self.__adaoObject["SupplementaryParameters"] is not None: + allvariables.update( {"SupplementaryParameters":self.__adaoObject["SupplementaryParameters"].get()} ) # allvariables.update( self.__adaoObject["AlgorithmParameters"].get() ) allvariables.update( self.__StoredInputs ) allvariables.pop('Observer', None) + allvariables.pop('UserPostAnalysis', None) return allvariables # ----------------------------------------------------------- @@ -533,9 +683,13 @@ class Aidsm(object): variables = [] if len(list(self.__adaoObject["AlgorithmParameters"].keys())) > 0: variables.extend(list(self.__adaoObject["AlgorithmParameters"].keys())) + if self.__adaoObject["SupplementaryParameters"] is not None and \ + len(list(self.__adaoObject["SupplementaryParameters"].keys())) > 0: + variables.extend(list(self.__adaoObject["SupplementaryParameters"].keys())) if len(list(self.__StoredInputs.keys())) > 0: variables.extend( list(self.__StoredInputs.keys()) ) variables.remove('Observer') + variables.remove('UserPostAnalysis') variables.sort() return variables @@ -550,15 +704,15 @@ class Aidsm(object): if os.path.isdir(trypath): for fname in os.listdir(trypath): if os.path.isfile(os.path.join(trypath,fname)): - fc = open(os.path.join(trypath,fname)).read() - iselal = bool("class ElementaryAlgorithm" in fc) root, ext = os.path.splitext(fname) - if iselal and ext == '.py' and root != '__init__': - files.append(root) + if ext != ".py": continue + with open(os.path.join(trypath,fname)) as fc: + iselal = bool("class ElementaryAlgorithm" in fc.read()) + if iselal and 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 @@ -582,10 +736,11 @@ class Aidsm(object): # ----------------------------------------------------------- - def execute(self, Executor=None, SaveCaseInFile=None): + def execute(self, Executor=None, SaveCaseInFile=None, nextStep=False): "Lancement du calcul" self.__case.register("execute",dir(),locals(),None,True) - Operator.CM.clearCache() + self.updateAlgorithmParameters(Parameters={"nextStep":bool(nextStep)}) + if not nextStep: Operator.CM.clearCache() try: if Executor == "YACS": self.__executeYACSScheme( SaveCaseInFile ) else: self.__executePythonScheme( SaveCaseInFile ) @@ -617,25 +772,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) or 'UserPostAnalysis' in __command: + 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" @@ -643,15 +822,18 @@ class Aidsm(object): for k in self.__adaoObject['AlgorithmParameters'].keys(): if k == "Algorithm": continue if k in self.__StoredInputs: - raise ValueError("the key \"%s\s to be transfered for pickling will overwrite an existing one.") + raise ValueError("The key \"%s\" to be transfered for pickling will overwrite an existing one."%(k,)) if self.__adaoObject['AlgorithmParameters'].hasObserver( k ): self.__adaoObject['AlgorithmParameters'].removeObserver( k, "", True ) self.__StoredInputs[k] = self.__adaoObject['AlgorithmParameters'].pop(k, None) 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__": - print('\n AUTODIAGNOSTIC \n') + print('\n AUTODIAGNOSTIC\n')