1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2008-2021 EDF R&D
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 Normalized interface for ADAO scripting (generic API).
26 __author__ = "Jean-Philippe ARGAUD"
33 from daCore.BasicObjects import State, Covariance, FullOperator, Operator
34 from daCore.BasicObjects import AlgorithmAndParameters, DataObserver
35 from daCore.BasicObjects import RegulationAndParameters, CaseLogger
36 from daCore.BasicObjects import UserScript, ExternalParameters
37 from daCore import PlatformInfo
39 from daCore import ExtendedLogging ; ExtendedLogging.ExtendedLogging() # A importer en premier
42 # ==============================================================================
44 """ ADAO Internal Data Structure Model """
45 def __init__(self, name = "", addViewers=None):
46 self.__name = str(name)
48 self.__directory = None
49 self.__case = CaseLogger(self.__name, "case", addViewers)
51 self.__adaoObject = {}
52 self.__StoredInputs = {}
53 self.__PostAnalysis = []
55 self.__Concepts = [ # Liste exhaustive
56 "AlgorithmParameters",
70 "ObservationOperator",
72 "RegulationParameters",
73 "SupplementaryParameters",
77 for ename in self.__Concepts:
78 self.__adaoObject[ename] = None
79 for ename in ("ObservationOperator", "EvolutionModel", "ControlModel"):
80 self.__adaoObject[ename] = {}
81 for ename in ("Observer", "UserPostAnalysis"):
82 self.__adaoObject[ename] = []
83 self.__StoredInputs[ename] = [] # Vide par defaut
84 self.__StoredInputs["Name"] = self.__name
85 self.__StoredInputs["Directory"] = self.__directory
87 # Récupère le chemin du répertoire parent et l'ajoute au path
88 # (Cela complète l'action de la classe PathManagement dans PlatformInfo,
89 # qui est activée dans Persistence)
90 self.__parent = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
91 sys.path.insert(0, self.__parent)
92 sys.path = PlatformInfo.uniq( sys.path ) # Conserve en unique exemplaire chaque chemin
95 Concept = None, # Premier argument
103 DiagonalSparseMatrix = None,
104 ExtraArguments = None,
106 InputFunctionAsMulti = False,
108 ObjectFunction = None,
112 ScalarSparseMatrix = None,
118 ThreeFunctions = None,
123 "Interface unique de definition de variables d'entrees par argument"
124 self.__case.register("set",dir(),locals(),None,True)
126 if Concept in ("Background", "CheckingPoint", "ControlInput", "Observation"):
127 commande = getattr(self,"set"+Concept)
128 commande(Vector, VectorSerie, Script, DataFile, ColNames, ColMajor, Stored, Scheduler, Checked )
129 elif Concept in ("BackgroundError", "ObservationError", "EvolutionError"):
130 commande = getattr(self,"set"+Concept)
131 commande(Matrix, ScalarSparseMatrix, DiagonalSparseMatrix,
132 Script, Stored, ObjectMatrix, Checked )
133 elif Concept == "AlgorithmParameters":
134 self.setAlgorithmParameters( Algorithm, Parameters, Script )
135 elif Concept == "RegulationParameters":
136 self.setRegulationParameters( Algorithm, Parameters, Script )
137 elif Concept == "Name":
139 elif Concept == "Directory":
140 self.setDirectory(String)
141 elif Concept == "Debug":
143 elif Concept == "NoDebug":
145 elif Concept == "Observer":
146 self.setObserver( Variable, Template, String, Script, Info, ObjectFunction, Scheduler )
147 elif Concept == "UserPostAnalysis":
148 self.setUserPostAnalysis( Template, String, Script )
149 elif Concept == "SupplementaryParameters":
150 self.setSupplementaryParameters( Parameters, Script )
151 elif Concept == "ObservationOperator":
152 self.setObservationOperator(
153 Matrix, OneFunction, ThreeFunctions, AppliedInXb,
154 Parameters, Script, ExtraArguments,
155 Stored, AvoidRC, InputFunctionAsMulti, Checked )
156 elif Concept in ("EvolutionModel", "ControlModel"):
157 commande = getattr(self,"set"+Concept)
159 Matrix, OneFunction, ThreeFunctions,
160 Parameters, Script, Scheduler, ExtraArguments,
161 Stored, AvoidRC, InputFunctionAsMulti, Checked )
163 raise ValueError("the variable named '%s' is not allowed."%str(Concept))
164 except Exception as e:
165 if isinstance(e, SyntaxError): msg = "at %s: %s"%(e.offset, e.text)
167 raise ValueError(("during settings, the following error occurs:\n"+\
168 "\n%s %s\n\nSee also the potential messages, "+\
169 "which can show the origin of the above error, "+\
170 "in the launching terminal.")%(str(e),msg))
172 # -----------------------------------------------------------
174 def setBackground(self,
184 "Definition d'un concept de calcul"
185 Concept = "Background"
186 self.__case.register("set"+Concept, dir(), locals())
187 self.__adaoObject[Concept] = State(
190 asPersistentVector = VectorSerie,
191 asScript = self.__with_directory(Script),
192 asDataFile = DataFile,
195 scheduledBy = Scheduler,
196 toBeChecked = Checked,
199 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
202 def setCheckingPoint(self,
212 "Definition d'un concept de calcul"
213 Concept = "CheckingPoint"
214 self.__case.register("set"+Concept, dir(), locals())
215 self.__adaoObject[Concept] = State(
218 asPersistentVector = VectorSerie,
219 asScript = self.__with_directory(Script),
220 asDataFile = DataFile,
223 scheduledBy = Scheduler,
224 toBeChecked = Checked,
227 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
230 def setControlInput(self,
240 "Definition d'un concept de calcul"
241 Concept = "ControlInput"
242 self.__case.register("set"+Concept, dir(), locals())
243 self.__adaoObject[Concept] = State(
246 asPersistentVector = VectorSerie,
247 asScript = self.__with_directory(Script),
248 asDataFile = DataFile,
251 scheduledBy = Scheduler,
252 toBeChecked = Checked,
255 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
258 def setObservation(self,
268 "Definition d'un concept de calcul"
269 Concept = "Observation"
270 self.__case.register("set"+Concept, dir(), locals())
271 self.__adaoObject[Concept] = State(
274 asPersistentVector = VectorSerie,
275 asScript = self.__with_directory(Script),
276 asDataFile = DataFile,
279 scheduledBy = Scheduler,
280 toBeChecked = Checked,
283 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
286 def setBackgroundError(self,
288 ScalarSparseMatrix = None,
289 DiagonalSparseMatrix = None,
294 "Definition d'un concept de calcul"
295 Concept = "BackgroundError"
296 self.__case.register("set"+Concept, dir(), locals())
297 self.__adaoObject[Concept] = Covariance(
299 asCovariance = Matrix,
300 asEyeByScalar = ScalarSparseMatrix,
301 asEyeByVector = DiagonalSparseMatrix,
302 asCovObject = ObjectMatrix,
303 asScript = self.__with_directory(Script),
304 toBeChecked = Checked,
307 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
310 def setObservationError(self,
312 ScalarSparseMatrix = None,
313 DiagonalSparseMatrix = None,
318 "Definition d'un concept de calcul"
319 Concept = "ObservationError"
320 self.__case.register("set"+Concept, dir(), locals())
321 self.__adaoObject[Concept] = Covariance(
323 asCovariance = Matrix,
324 asEyeByScalar = ScalarSparseMatrix,
325 asEyeByVector = DiagonalSparseMatrix,
326 asCovObject = ObjectMatrix,
327 asScript = self.__with_directory(Script),
328 toBeChecked = Checked,
331 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
334 def setEvolutionError(self,
336 ScalarSparseMatrix = None,
337 DiagonalSparseMatrix = None,
342 "Definition d'un concept de calcul"
343 Concept = "EvolutionError"
344 self.__case.register("set"+Concept, dir(), locals())
345 self.__adaoObject[Concept] = Covariance(
347 asCovariance = Matrix,
348 asEyeByScalar = ScalarSparseMatrix,
349 asEyeByVector = DiagonalSparseMatrix,
350 asCovObject = ObjectMatrix,
351 asScript = self.__with_directory(Script),
352 toBeChecked = Checked,
355 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
358 def setObservationOperator(self,
361 ThreeFunctions = None,
365 ExtraArguments = None,
368 InputFunctionAsMulti = False,
370 "Definition d'un concept de calcul"
371 Concept = "ObservationOperator"
372 self.__case.register("set"+Concept, dir(), locals())
373 self.__adaoObject[Concept] = FullOperator(
376 asOneFunction = OneFunction,
377 asThreeFunctions = ThreeFunctions,
378 asScript = self.__with_directory(Script),
380 appliedInX = AppliedInXb,
381 extraArguments = ExtraArguments,
383 inputAsMF = InputFunctionAsMulti,
385 toBeChecked = Checked,
388 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
391 def setEvolutionModel(self,
394 ThreeFunctions = None,
398 ExtraArguments = None,
401 InputFunctionAsMulti = False,
403 "Definition d'un concept de calcul"
404 Concept = "EvolutionModel"
405 self.__case.register("set"+Concept, dir(), locals())
406 self.__adaoObject[Concept] = FullOperator(
409 asOneFunction = OneFunction,
410 asThreeFunctions = ThreeFunctions,
411 asScript = self.__with_directory(Script),
414 extraArguments = ExtraArguments,
416 inputAsMF = InputFunctionAsMulti,
417 scheduledBy = Scheduler,
418 toBeChecked = Checked,
421 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
424 def setControlModel(self,
427 ThreeFunctions = None,
431 ExtraArguments = None,
434 InputFunctionAsMulti = False,
436 "Definition d'un concept de calcul"
437 Concept = "ControlModel"
438 self.__case.register("set"+Concept, dir(), locals())
439 self.__adaoObject[Concept] = FullOperator(
442 asOneFunction = OneFunction,
443 asThreeFunctions = ThreeFunctions,
444 asScript = self.__with_directory(Script),
447 extraArguments = ExtraArguments,
449 inputAsMF = InputFunctionAsMulti,
450 scheduledBy = Scheduler,
451 toBeChecked = Checked,
454 self.__StoredInputs[Concept] = self.__adaoObject[Concept].getO()
457 def setName(self, String=None):
458 "Definition d'un concept de calcul"
459 self.__case.register("setName",dir(),locals())
460 if String is not None:
461 self.__name = str(String)
464 self.__StoredInputs["Name"] = self.__name
466 def setDirectory(self, String=None):
467 "Definition d'un concept de calcul"
468 self.__case.register("setDirectory",dir(),locals())
469 if os.path.isdir(os.path.abspath(str(String))):
470 self.__directory = os.path.abspath(str(String))
472 self.__directory = None
473 self.__StoredInputs["Directory"] = self.__directory
475 def setDebug(self, __level = 10):
476 "NOTSET=0 < DEBUG=10 < INFO=20 < WARNING=30 < ERROR=40 < CRITICAL=50"
477 self.__case.register("setDebug",dir(),locals())
478 log = logging.getLogger()
479 log.setLevel( __level )
480 self.__StoredInputs["Debug"] = __level
481 self.__StoredInputs["NoDebug"] = False
484 def setNoDebug(self):
485 "NOTSET=0 < DEBUG=10 < INFO=20 < WARNING=30 < ERROR=40 < CRITICAL=50"
486 self.__case.register("setNoDebug",dir(),locals())
487 log = logging.getLogger()
488 log.setLevel( logging.WARNING )
489 self.__StoredInputs["Debug"] = logging.WARNING
490 self.__StoredInputs["NoDebug"] = True
493 def setAlgorithmParameters(self,
497 "Definition d'un concept de calcul"
498 Concept = "AlgorithmParameters"
499 self.__case.register("set"+Concept, dir(), locals())
500 self.__adaoObject[Concept] = AlgorithmAndParameters(
502 asAlgorithm = Algorithm,
504 asScript = self.__with_directory(Script),
508 def updateAlgorithmParameters(self,
511 "Mise a jour d'un concept de calcul"
512 Concept = "AlgorithmParameters"
513 if Concept not in self.__adaoObject or self.__adaoObject[Concept] is None:
514 raise ValueError("\n\nNo algorithm registred, set one before updating parameters or executing\n")
515 self.__adaoObject[Concept].updateParameters(
517 asScript = self.__with_directory(Script),
522 def setRegulationParameters(self,
526 "Definition d'un concept de calcul"
527 Concept = "RegulationParameters"
528 self.__case.register("set"+Concept, dir(), locals())
529 self.__adaoObject[Concept] = RegulationAndParameters(
531 asAlgorithm = Algorithm,
533 asScript = self.__with_directory(Script),
537 def setSupplementaryParameters(self,
540 "Definition d'un concept de calcul"
541 Concept = "SupplementaryParameters"
542 self.__case.register("set"+Concept, dir(), locals())
543 self.__adaoObject[Concept] = ExternalParameters(
546 asScript = self.__with_directory(Script),
550 def updateSupplementaryParameters(self,
553 "Mise a jour d'un concept de calcul"
554 Concept = "SupplementaryParameters"
555 if Concept not in self.__adaoObject or self.__adaoObject[Concept] is None:
556 self.__adaoObject[Concept] = ExternalParameters(name = Concept)
557 self.__adaoObject[Concept].updateParameters(
559 asScript = self.__with_directory(Script),
563 def setObserver(self,
569 ObjectFunction = None,
571 "Definition d'un concept de calcul"
573 self.__case.register("set"+Concept, dir(), locals())
574 self.__adaoObject[Concept].append( DataObserver(
576 onVariable = Variable,
577 asTemplate = Template,
579 asScript = self.__with_directory(Script),
580 asObsObject = ObjectFunction,
582 scheduledBy = Scheduler,
583 withAlgo = self.__adaoObject["AlgorithmParameters"]
587 def removeObserver(self,
589 ObjectFunction = None,
591 "Permet de retirer un observer à une ou des variable nommée"
592 if "AlgorithmParameters" not in self.__adaoObject:
593 raise ValueError("No algorithm registred, ask for one before removing observers")
595 # Vérification du nom de variable et typage
596 # -----------------------------------------
597 if isinstance(Variable, str):
598 VariableNames = (Variable,)
599 elif isinstance(Variable, list):
600 VariableNames = tuple(map( str, Variable ))
602 raise ValueError("The observer requires a name or a list of names of variables.")
604 # Association interne de l'observer à la variable
605 # -----------------------------------------------
606 for ename in VariableNames:
607 if ename not in self.__adaoObject["AlgorithmParameters"]:
608 raise ValueError("An observer requires to be removed on a variable named %s which does not exist."%ename)
610 return self.__adaoObject["AlgorithmParameters"].removeObserver( ename, ObjectFunction )
612 def setUserPostAnalysis(self,
616 "Definition d'un concept de calcul"
617 Concept = "UserPostAnalysis"
618 self.__case.register("set"+Concept, dir(), locals())
619 self.__adaoObject[Concept].append( repr(UserScript(
621 asTemplate = Template,
623 asScript = self.__with_directory(Script),
626 # -----------------------------------------------------------
628 def get(self, Concept=None, noDetails=True ):
629 "Recuperation d'une sortie du calcul"
630 if Concept is not None:
632 self.__case.register("get", dir(), locals(), Concept) # Break pickle in Python 2
635 if Concept in self.__StoredInputs:
636 return self.__StoredInputs[Concept]
638 elif self.__adaoObject["AlgorithmParameters"] is not None and Concept == "AlgorithmParameters":
639 return self.__adaoObject["AlgorithmParameters"].get()
641 elif self.__adaoObject["AlgorithmParameters"] is not None and Concept in self.__adaoObject["AlgorithmParameters"]:
642 return self.__adaoObject["AlgorithmParameters"].get( Concept )
644 elif Concept == "AlgorithmRequiredParameters" and self.__adaoObject["AlgorithmParameters"] is not None:
645 return self.__adaoObject["AlgorithmParameters"].getAlgorithmRequiredParameters(noDetails)
647 elif Concept == "AlgorithmRequiredInputs" and self.__adaoObject["AlgorithmParameters"] is not None:
648 return self.__adaoObject["AlgorithmParameters"].getAlgorithmInputArguments()
650 elif Concept == "AlgorithmAttributes" and self.__adaoObject["AlgorithmParameters"] is not None:
651 return self.__adaoObject["AlgorithmParameters"].getAlgorithmAttributes()
653 elif self.__adaoObject["SupplementaryParameters"] is not None and Concept == "SupplementaryParameters":
654 return self.__adaoObject["SupplementaryParameters"].get()
656 elif self.__adaoObject["SupplementaryParameters"] is not None and Concept in self.__adaoObject["SupplementaryParameters"]:
657 return self.__adaoObject["SupplementaryParameters"].get( Concept )
660 raise ValueError("The requested key \"%s\" does not exists as an input or a stored variable."%Concept)
663 allvariables.update( {"AlgorithmParameters":self.__adaoObject["AlgorithmParameters"].get()} )
664 if self.__adaoObject["SupplementaryParameters"] is not None:
665 allvariables.update( {"SupplementaryParameters":self.__adaoObject["SupplementaryParameters"].get()} )
666 # allvariables.update( self.__adaoObject["AlgorithmParameters"].get() )
667 allvariables.update( self.__StoredInputs )
668 allvariables.pop('Observer', None)
669 allvariables.pop('UserPostAnalysis', None)
672 # -----------------------------------------------------------
674 def get_available_variables(self):
676 Renvoie les variables potentiellement utilisables pour l'étude,
677 initialement stockées comme données d'entrées ou dans les algorithmes,
678 identifiés par les chaînes de caractères. L'algorithme doit avoir été
679 préalablement choisi sinon la méthode renvoie "None".
681 if len(list(self.__adaoObject["AlgorithmParameters"].keys())) == 0 and \
682 len(list(self.__StoredInputs.keys())) == 0:
686 if len(list(self.__adaoObject["AlgorithmParameters"].keys())) > 0:
687 variables.extend(list(self.__adaoObject["AlgorithmParameters"].keys()))
688 if self.__adaoObject["SupplementaryParameters"] is not None and \
689 len(list(self.__adaoObject["SupplementaryParameters"].keys())) > 0:
690 variables.extend(list(self.__adaoObject["SupplementaryParameters"].keys()))
691 if len(list(self.__StoredInputs.keys())) > 0:
692 variables.extend( list(self.__StoredInputs.keys()) )
693 variables.remove('Observer')
694 variables.remove('UserPostAnalysis')
698 def get_available_algorithms(self):
700 Renvoie la liste des algorithmes potentiellement utilisables, identifiés
701 par les chaînes de caractères.
704 for directory in sys.path:
705 trypath = os.path.join(directory,"daAlgorithms")
706 if os.path.isdir(trypath):
707 for fname in os.listdir(trypath):
708 if os.path.isfile(os.path.join(trypath,fname)):
709 root, ext = os.path.splitext(fname)
710 if ext != ".py": continue
711 with open(os.path.join(trypath,fname)) as fc:
712 iselal = bool("class ElementaryAlgorithm" in fc.read())
713 if iselal and ext == '.py' and root != '__init__':
718 def get_algorithms_main_path(self):
720 Renvoie le chemin pour le répertoire principal contenant les algorithmes
724 def add_algorithms_path(self, Path=None):
726 Ajoute au chemin de recherche des algorithmes un répertoire dans lequel
727 se trouve un sous-répertoire "daAlgorithms"
729 if not os.path.isdir(Path):
730 raise ValueError("The given "+Path+" argument must exist as a directory")
731 if not os.path.isdir(os.path.join(Path,"daAlgorithms")):
732 raise ValueError("The given \""+Path+"\" argument must contain a subdirectory named \"daAlgorithms\"")
733 if not os.path.isfile(os.path.join(Path,"daAlgorithms","__init__.py")):
734 raise ValueError("The given \""+Path+"/daAlgorithms\" path must contain a file named \"__init__.py\"")
735 sys.path.insert(0, os.path.abspath(Path))
736 sys.path = PlatformInfo.uniq( sys.path ) # Conserve en unique exemplaire chaque chemin
739 # -----------------------------------------------------------
741 def execute(self, Executor=None, SaveCaseInFile=None, nextStep=False):
742 "Lancement du calcul"
743 self.__case.register("execute",dir(),locals(),None,True)
744 self.updateAlgorithmParameters(Parameters={"nextStep":bool(nextStep)})
745 if not nextStep: Operator.CM.clearCache()
747 if Executor == "YACS": self.__executeYACSScheme( SaveCaseInFile )
748 else: self.__executePythonScheme( SaveCaseInFile )
749 except Exception as e:
750 if isinstance(e, SyntaxError): msg = "at %s: %s"%(e.offset, e.text)
752 raise ValueError(("during execution, the following error occurs:\n"+\
753 "\n%s %s\n\nSee also the potential messages, "+\
754 "which can show the origin of the above error, "+\
755 "in the launching terminal.\n")%(str(e),msg))
758 def __executePythonScheme(self, FileName=None):
759 "Lancement du calcul"
760 self.__case.register("executePythonScheme", dir(), locals())
761 if FileName is not None:
762 self.dump( FileName, "TUI")
763 self.__adaoObject["AlgorithmParameters"].executePythonScheme( self.__adaoObject )
764 if "UserPostAnalysis" in self.__adaoObject and len(self.__adaoObject["UserPostAnalysis"])>0:
765 self.__objname = self.__retrieve_objname()
766 __Upa = [str(val).replace("ADD.","self.").replace(self.__objname+".","self.") for val in self.__adaoObject["UserPostAnalysis"]]
767 __Upa = eval("\n".join(__Upa))
768 exec(__Upa, {}, {'self':self})
771 def __executeYACSScheme(self, FileName=None):
772 "Lancement du calcul"
773 self.__case.register("executeYACSScheme", dir(), locals())
774 self.dump( FileName, "YACS")
775 self.__adaoObject["AlgorithmParameters"].executeYACSScheme( FileName )
778 # -----------------------------------------------------------
780 def dump(self, FileName=None, Formater="TUI"):
781 "Restitution normalisée des commandes"
782 __Upa = "\n".join(self.__PostAnalysis)
783 return self.__case.dump(FileName, Formater, __Upa)
785 def load(self, FileName=None, Content=None, Object=None, Formater="TUI"):
786 "Chargement normalisé des commandes"
787 __commands = self.__case.load(FileName, Content, Object, Formater)
788 from numpy import array, matrix
789 for __command in __commands:
790 if (__command.find("set")>-1 and __command.find("set_")<0) or 'UserPostAnalysis' in __command:
791 exec("self."+__command, {}, locals())
793 self.__PostAnalysis.append(__command)
797 FileNameFrom=None, ContentFrom=None, ObjectFrom=None, FormaterFrom="TUI",
798 FileNameTo=None, FormaterTo="TUI",
800 "Conversion normalisée des commandes"
802 FileName=FileNameFrom, Content=ContentFrom, Object=ObjectFrom, Formater=FormaterFrom
804 FileName=FileNameTo, Formater=FormaterTo
808 "Effacement du contenu du cas en cours"
809 self.__init__(self.__name)
811 # -----------------------------------------------------------
813 def __with_directory(self, __filename=None):
814 if os.path.exists(str(__filename)):
815 __fullpath = __filename
816 elif os.path.exists(os.path.join(str(self.__directory), str(__filename))):
817 __fullpath = os.path.join(self.__directory, str(__filename))
819 __fullpath = __filename
822 def __retrieve_objname(self):
823 "Ne pas utiliser dans le __init__, la variable appelante n'existe pas encore"
825 for level in reversed(inspect.stack()):
826 __names += [name for name, value in level.frame.f_locals.items() if value is self]
827 __names += [name for name, value in globals().items() if value is self]
828 __names.remove('self') # Devrait toujours être trouvé, donc pas d'erreur
830 logging.debug("Cet objet est appelé par au moins une variable :",__names)
831 self.__objname = __names[0]
833 self.__objname = "ADD"
834 return self.__objname
837 "Clarifie la visibilité des méthodes"
838 return ['set', 'get', 'execute', 'dump', 'load', '__doc__', '__init__', '__module__']
841 "Représentation pour impression (mais pas repr)"
842 msg = self.dump(None, "SimpleReportInPlainTxt")
845 def prepare_to_pickle(self):
846 "Retire les variables non pickelisables, avec recopie efficace"
847 if self.__adaoObject['AlgorithmParameters'] is not None:
848 for k in self.__adaoObject['AlgorithmParameters'].keys():
849 if k == "Algorithm": continue
850 if k in self.__StoredInputs:
851 raise ValueError("The key \"%s\" to be transfered for pickling will overwrite an existing one."%(k,))
852 if self.__adaoObject['AlgorithmParameters'].hasObserver( k ):
853 self.__adaoObject['AlgorithmParameters'].removeObserver( k, "", True )
854 self.__StoredInputs[k] = self.__adaoObject['AlgorithmParameters'].pop(k, None)
855 if sys.version_info[0] == 2:
856 del self.__adaoObject # Because it breaks pickle in Python 2. Not required for Python 3
857 del self.__case # Because it breaks pickle in Python 2. Not required for Python 3
858 if sys.version_info.major < 3:
861 return self.__StoredInputs
863 # ==============================================================================
864 if __name__ == "__main__":
865 print('\n AUTODIAGNOSTIC\n')