From 9b62428b01fb10882c52498224715961c46731d2 Mon Sep 17 00:00:00 2001 From: Capocchi L Date: Tue, 2 Jun 2020 17:51:14 +0200 Subject: [PATCH 1/2] PyPDEVS compatibility --- Container.py | 10 +++---- DomainInterface/DomainStructure.py | 36 ++++++++++++++++++++++- DomainInterface/MasterModel.py | 47 +++++++++++++++--------------- ExperimentGenerator.py | 4 +-- SimulationGUI.py | 2 +- SimulationNoGUI.py | 10 +++---- 6 files changed, 71 insertions(+), 38 deletions(-) diff --git a/Container.py b/Container.py index 7fcb1fd5..f0495f91 100644 --- a/Container.py +++ b/Container.py @@ -563,12 +563,12 @@ def makeDEVSInstance(diagram = None): devs = diagram.getDEVSModel() # si l'utilisateur n'a pas definit d'ordre de priorité pour l'activation des modèles, on la construit for label1 in diagram.priority_list: - for m in devs.componentSet: + for m in devs.getComponentSet(): label2 = m.getBlockModel().label if label1 == label2: L.append(m) - devs.componentSet = L + devs.setComponentSet(L) return diagram.getDEVSModel() @@ -903,8 +903,8 @@ def DeleteShape(self, shape): ### update the devs componentSet coupled_devs = self.getDEVSModel() devs = shape.getDEVSModel() - if coupled_devs and devs in coupled_devs.componentSet: - coupled_devs.componentSet.remove(devs) + if coupled_devs and devs in coupled_devs.getComponentSet(): + coupled_devs.delTocomponentSet([devs]) try: ### delete shape @@ -1100,7 +1100,7 @@ def Clean(self): sys.stdout.write(_("unsubscribe problem!")) devs.finish(None) - self.devsModel.componentSet = [] + self.devsModel.setComponentSet([]) for m in self.GetShapeList(): m.setDEVSModel(None) diff --git a/DomainInterface/DomainStructure.py b/DomainInterface/DomainStructure.py index 623100c8..ad336797 100644 --- a/DomainInterface/DomainStructure.py +++ b/DomainInterface/DomainStructure.py @@ -67,10 +67,44 @@ def getFlatComponentSet (self): """ get the list of composing submodels - recursive build """ submodelList = {} - for submodel in self.componentSet: + for submodel in self.getComponentSet(): submodelList.update(submodel.getFlatComponentSet()) return submodelList + def getComponentSet(self)->list: + """ return the component set attribute depending on the definition finded in the DEVS.py file + """ + if hasattr(self, 'componentSet'): + return self.componentSet + elif hasattr(self, 'component_set'): + return self.component_set + + def setComponentSet(self,V:list)->None: + """ set the component set attribute depending on the definition finded in the DEVS.py file + """ + if hasattr(self, 'componentSet'): + self.componentSet = V + elif hasattr(self, 'component_set'): + self.component_set = V + + def addToComponentSet(self,V:list)->None: + """ add values in components set attribute + """ + if hasattr(self, 'componentSet'): + self.componentSet.extend(V) + elif hasattr(self, 'component_set'): + self.component_set.extend(V) + + def delToCompnentsSet(self,V:list)->None: + """ del values in the components set attribute + """ + if hasattr(self, 'componentSet'): + for v in V: + self.componentSet.remove(v) + elif hasattr(self, 'component_set'): + for v in V: + self.component_set.remove(v) + def main(): DS = DomainStructure() diff --git a/DomainInterface/MasterModel.py b/DomainInterface/MasterModel.py index 77c25b15..31bae8a1 100644 --- a/DomainInterface/MasterModel.py +++ b/DomainInterface/MasterModel.py @@ -37,23 +37,23 @@ import os ### import the DEVS module depending on the selected DEVS package in DEVSKernel directory -for pydevs_dir in builtins.__dict__['DEVS_DIR_PATH_DICT']: - if pydevs_dir == builtins.__dict__['DEFAULT_DEVS_DIRNAME']: - path = builtins.__dict__['DEVS_DIR_PATH_DICT'][pydevs_dir] - ### split from DEVSKernel string and replace separator with point - d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') - - ### for py 3.X - import importlib - BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) - - #exec("import DEVSKernel%s.DEVS as BaseDEVS"%(d)) +#for pydevs_dir in builtins.__dict__['DEVS_DIR_PATH_DICT']: +# if pydevs_dir == builtins.__dict__['DEFAULT_DEVS_DIRNAME']: +# path = builtins.__dict__['DEVS_DIR_PATH_DICT'][pydevs_dir] +# ### split from DEVSKernel string and replace separator with point +# d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') + +# ### for py 3.X +# import importlib +# BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) +# +# #exec("import DEVSKernel%s.DEVS as BaseDEVS"%(d)) -#import DomainStructure +import DomainInterface.DomainStructure ### ====================================================================== # -class Master(BaseDEVS.CoupledDEVS): -#class Master(DomainStructure.DomainStructure): +#class Master(BaseDEVS.CoupledDEVS): +class Master(DomainInterface.DomainStructure): """ Master class represent the high abstract level DEVS coupled model. """ FINAL_TIME = 10.0 @@ -62,19 +62,18 @@ class Master(BaseDEVS.CoupledDEVS): def __init__(self, name=""): """ Constructor method. """ -# DomainStructure.DomainStructure.__init__(self, name=name) - BaseDEVS.CoupledDEVS.__init__(self, name=name) + DomainInterface.DomainStructure.__init__(self, name=name) +# BaseDEVS.CoupledDEVS.__init__(self, name=name) self.FINAL_TIME = Master.FINAL_TIME - def getFlatComponentSet(self): - """ get the list of composing submodels - recursive build - """ - submodelList = {} - for submodel in self.componentSet: - submodelList.update(submodel.getFlatComponentSet()) - return submodelList - +# def getFlatComponentSet(self): +# """ get the list of composing submodels - recursive build +# """ +# submodelList = {} +# for submodel in self.componentSet: +# submodelList.update(submodel.getFlatComponentSet()) +# return submodelList ### def __str__(self): diff --git a/ExperimentGenerator.py b/ExperimentGenerator.py index 8a92a9e8..c41001be 100644 --- a/ExperimentGenerator.py +++ b/ExperimentGenerator.py @@ -39,13 +39,13 @@ def generateCode(self, model): for ip in model.IPorts: self.modelPythonDescription[model].append(self.dec+'self.addInPort("%s")' % ip.myID) - for c in model.componentSet: + for c in model.getComponentSet(): cname = c.__class__.__name__ clabel = c.blockModel.label self.modelPythonDescription[model].append("") self.modelHierarchyDescription.append('#%s-> %s' % (self.hierarchyDescDec, clabel)) - if not hasattr(c, "componentSet"): + if not ( hasattr(c, "componentSet") or hasattr(c, "component_set")): self.modelPythonDescription[model].append(self.dec+'self.%s=self.addSubModel(%s.%s("%s"))' % (clabel, cname, cname, clabel) ) self.modulePathFile.append(c.blockModel.python_path) if self.listModules.count(cname)==0: diff --git a/SimulationGUI.py b/SimulationGUI.py index c893c790..4cb1c748 100644 --- a/SimulationGUI.py +++ b/SimulationGUI.py @@ -446,7 +446,7 @@ def OnOk(self, event): sys.stdout = mainW.stdioWin ### test si le modele et bien charge - if (self.current_master == None) or (self.current_master.componentSet == []): + if (self.current_master == None) or (self.current_master.getComponentSet() == []): return self.MsgBoxEmptyModel() ### dont erase the gauge if ntl diff --git a/SimulationNoGUI.py b/SimulationNoGUI.py index 5204b224..de87ba33 100644 --- a/SimulationNoGUI.py +++ b/SimulationNoGUI.py @@ -108,11 +108,11 @@ def makeSimulation(master, T, simu_name="simu", is_remote=False, json_trace=True simuPusher = PrintPusher(simu_name) ### Get live stream URL if exist : - for m in [a for a in master.componentSet if hasattr(a, 'plotUrl')]: + for m in [a for a in master.getComponentSet() if hasattr(a, 'plotUrl')]: if m.plotUrl != '': json_report['output'].append({'label':m.name, 'plotUrl':m.plotUrl}) ### Get live stream URL if exist : - for m in [a for a in master.componentSet if hasattr(a, 'pusherChannel')]: + for m in [a for a in master.getComponentSet() if hasattr(a, 'pusherChannel')]: m.pusherChannel = simu_name json_report['output'].append({'label':m.name, 'pusherChannel':m.pusherChannel}) # Send to user @@ -162,13 +162,13 @@ def makeSimulation(master, T, simu_name="simu", is_remote=False, json_trace=True ### inform that data file has been generated json_report['output'] = [] - for m in [a for a in master.componentSet if hasattr(a, 'fileName')]: + for m in [a for a in master.getComponentSet() if hasattr(a, 'fileName')]: for i in range(len(m.IPorts)): fn ='%s%s.dat'%(m.fileName,str(i)) if os.path.exists(fn): json_report['output'].append({'label':m.name+'_port_' + str(i), 'filename':os.path.basename(fn)}) - for m in [a for a in master.componentSet if hasattr(a, 'plotUrl')]: + for m in [a for a in master.getComponentSet() if hasattr(a, 'plotUrl')]: json_report['output'].append({'label':m.name, 'plotUrl':m.plotUrl}) with open(simu_name+'.report', 'w') as f: @@ -219,7 +219,7 @@ def Run(self): # diagram.Clean() ################################################################################################################ ######### To Do : refaire l'enregistrement du chemin d'enregistrements des resultats du to_disk ################### - for m in self.master.componentSet: + for m in self.master.getComponentSet(): if str(m)=='To_Disk': dir_fn = os.path.dirname(diagram.last_name_saved).replace('\t','').replace(' ','') label = m.getBlockModel() From 5f9794c24307bbaa66edf774284386cb10990e36 Mon Sep 17 00:00:00 2001 From: Capocchi L Date: Tue, 2 Jun 2020 18:33:25 +0200 Subject: [PATCH 2/2] PyPDEVS compatibility --- Container.py | 4 ++-- DomainInterface/DomainBehavior.py | 30 ++++++++++++++++++------------ DomainInterface/DomainStructure.py | 18 ++++++------------ Patterns/Strategy.py | 22 ++++++++-------------- 4 files changed, 34 insertions(+), 40 deletions(-) diff --git a/Container.py b/Container.py index f0495f91..4d4a3b7e 100644 --- a/Container.py +++ b/Container.py @@ -368,7 +368,7 @@ def makeDEVSInstance(diagram = None): #ReloadModule.recompile("DomainInterface.MasterModel") ### PyPDEVS work with this - #diagram.setDEVSModel(DomainInterface.MasterModel.Master()) +# diagram.setDEVSModel(DomainInterface.MasterModel.Master()) ### TODO to be tested with PyPDEVS !!! # if isinstance(diagram.parent, ShapeCanvas): @@ -1097,7 +1097,7 @@ def Clean(self): try: Publisher.unsubscribe(devs.finish, "%d.finished"%(id(devs))) except: - sys.stdout.write(_("unsubscribe problem!")) + sys.stdout.write(_("Impossible to execute the finish method for the model %s!\n")%devs) devs.finish(None) self.devsModel.setComponentSet([]) diff --git a/DomainInterface/DomainBehavior.py b/DomainInterface/DomainBehavior.py index 9f9a07be..12e30d7d 100644 --- a/DomainInterface/DomainBehavior.py +++ b/DomainInterface/DomainBehavior.py @@ -37,20 +37,26 @@ import re import os - -### import the DEVS module depending on the selected DEVS package in DEVSKernel directory -for pydevs_dir in builtins.__dict__['DEVS_DIR_PATH_DICT']: - if pydevs_dir == builtins.__dict__['DEFAULT_DEVS_DIRNAME']: - path = builtins.__dict__['DEVS_DIR_PATH_DICT'][pydevs_dir] - ### split from DEVSKernel string and replace separator with point - d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') +import importlib + +path = builtins.__dict__['DEVS_DIR_PATH_DICT'][builtins.__dict__['DEFAULT_DEVS_DIRNAME']] +d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') +BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) + +# ### import the DEVS module depending on the selected DEVS package in DEVSKernel directory +# for pydevs_dir in builtins.__dict__['DEVS_DIR_PATH_DICT']: +# if pydevs_dir == builtins.__dict__['DEFAULT_DEVS_DIRNAME']: +# path = builtins.__dict__['DEVS_DIR_PATH_DICT'][pydevs_dir] +# ### split from DEVSKernel string and replace separator with point +# d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') - ### for py 3.X - import importlib - BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) +# ### for py 3.X +# import importlib +# BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) - ### for py 2.X - #exec("import DEVSKernel%s.DEVS as BaseDEVS"%(d)) +# ### for py 2.X +# #exec("import DEVSKernel%s.DEVS as BaseDEVS"%(d)) + # ====================================================================== # class DomainBehavior(BaseDEVS.AtomicDEVS): diff --git a/DomainInterface/DomainStructure.py b/DomainInterface/DomainStructure.py index ad336797..492d584c 100644 --- a/DomainInterface/DomainStructure.py +++ b/DomainInterface/DomainStructure.py @@ -37,19 +37,13 @@ import re import os +import importlib -### import the DEVS module depending on the selected DEVS package in DEVSKernel directory -for pydevs_dir in builtins.__dict__['DEVS_DIR_PATH_DICT']: - if pydevs_dir == builtins.__dict__['DEFAULT_DEVS_DIRNAME']: - path = builtins.__dict__['DEVS_DIR_PATH_DICT'][pydevs_dir] - ### split from DEVSKernel string and replace separator with point - d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') - - ### for py 3.X - import importlib - BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) - - #exec("import DEVSKernel%s.DEVS as BaseDEVS"%(d)) +path = builtins.__dict__['DEVS_DIR_PATH_DICT'][builtins.__dict__['DEFAULT_DEVS_DIRNAME']] +d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') +BaseDEVS = importlib.import_module("DEVSKernel%s.DEVS"%d) + +#exec("import DEVSKernel%s.DEVS as BaseDEVS"%(d)) # ====================================================================== # class DomainStructure(BaseDEVS.CoupledDEVS): diff --git a/Patterns/Strategy.py b/Patterns/Strategy.py index a473582d..5f4b00f9 100644 --- a/Patterns/Strategy.py +++ b/Patterns/Strategy.py @@ -28,6 +28,7 @@ import heapq import threading import inspect +import importlib from PluginManager import PluginManager #trigger_event from Utilities import getOutDir @@ -514,20 +515,13 @@ def __init__(self, simulator = None): def simulate(self, T = 100000000): """Simulate the model (Root-Coordinator). - """ - - ### for all available DEVS package (keys of built-in DEVS_DIR_PATH_DICT dictionary) - for pydevs_dir in builtins.__dict__['DEVS_DIR_PATH_DICT']: - ### only the selected one - if pydevs_dir == builtins.__dict__['DEFAULT_DEVS_DIRNAME']: - path = builtins.__dict__['DEVS_DIR_PATH_DICT'][pydevs_dir] - ## split from DEVSKernel string and replace separator with point - d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') - import importlib - simulator = importlib.import_module("DEVSKernel%s.simulator"%d) - #exec("from DEVSKernel%s.simulator import Simulator"%d) + """ - + path = builtins.__dict__['DEVS_DIR_PATH_DICT'][builtins.__dict__['DEFAULT_DEVS_DIRNAME']] + d = re.split("DEVSKernel", path)[-1].replace(os.sep, '.') + simulator = importlib.import_module("DEVSKernel%s.simulator"%d) + #exec("from DEVSKernel%s.simulator import Simulator"%d) + S = simulator.Simulator(self._simulator.model) ### old version of PyPDEVS @@ -586,7 +580,7 @@ def simulate(self, T = 100000000): def SetClassicDEVSOption(self): return True -class SimStrategy6(SimStrategy4): +class SimStrategy5(SimStrategy4): """ Parallel strategy for PyPDEVS simulation setClassicDEVS is False and confTransition in enabled """