From ecb1cee18080a8fdfaded0712823391dd72d2952 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Fri, 5 Sep 2025 14:35:26 -0500 Subject: [PATCH 1/8] Initial changes to add cpptype to parsed info --- .../scripts/edmModuleAllocMonitorAnalyze.py | 102 ++++++++++-------- 1 file changed, 57 insertions(+), 45 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index abf7ac062b41c..bae3904f09e9b 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -280,7 +280,7 @@ def __init__(self, start, stop, transition, sync, activity, allocInfo, recordNam self.allocInfo = allocInfo self.record = (recordName, callID) def __repr__(self): - if self.record[0]: + if len(self.record) == 2: return "{{ 'timeRange': {}, 'transition': {}, 'sync' :{}, 'activity':{}, 'record': {{'name' : {}, 'callID' :{} }}, 'alloc':{} }}".format(self.timeRange, self.transition, self.sync, self.activity, self.record[0], self.record[1], self.allocInfo) return "{{ 'timeRange': {}, 'transition': {}, 'sync' :{}, 'activity':{}, 'alloc':{} }}".format(self.timeRange, self.transition, self.sync, self.activity, self.allocInfo) @@ -294,7 +294,8 @@ def syncToSimpleDict(self): return {'run' : self.sync[0], 'lumi' : self.sync[1], 'event' : self.sync[2] } def toSimpleDict(self) : if self.record[0]: - return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity' : activityName(self.activity), 'record' :{'name': self.record[0], 'callID' : self.record[1] }, 'alloc' : self.allocInfo.toSimpleDict() } + if len(self.record) == 2: + return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity' : activityName(self.activity), 'record' :{'name': self.record[0], 'callID' : self.record[1]}, 'alloc' : self.allocInfo.toSimpleDict() } return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity': activityName(self.activity), 'alloc' : self.allocInfo.toSimpleDict() } @@ -642,11 +643,12 @@ def jsonVisInfo(self, data): self.allocInfo.inject(container[-1]) class EDModuleTransitionParser(object): - def __init__(self, payload, moduleNames): + def __init__(self, payload, moduleNames, moduleTypes): self.transition = int(payload[0]) self.index = int(payload[1]) self.moduleID = int(payload[2]) self.moduleName = moduleNames[self.moduleID] + self.moduleType = moduleTypes[self.moduleID] self.callID = int(payload[3]) self.time = int(payload[4]) def baseIndentLevel(self): @@ -707,8 +709,8 @@ def _postJsonInfo(self, syncs, temp, data, activity): class PreEDModuleTransitionParser(EDModuleTransitionParser): - def __init__(self, payload, names, moduleCentric): - super().__init__(payload, names) + def __init__(self, payload, names, types, moduleCentric): + super().__init__(payload, names, types) self._moduleCentric = moduleCentric def textSpecial(self): return "starting action" @@ -719,8 +721,8 @@ def jsonInfo(self, syncs, temp, data): class PostEDModuleTransitionParser(EDModuleTransitionParser): - def __init__(self, payload, names): - super().__init__(payload, names) + def __init__(self, payload, names, types): + super().__init__(payload, names, types) self.allocInfo = AllocInfo(payload[5:]) def textSpecial(self): return "finished action" @@ -731,8 +733,8 @@ def jsonVisInfo(self, data): class PreEDModuleAcquireParser(EDModuleTransitionParser): - def __init__(self, payload, names, moduleCentric): - super().__init__(payload, names) + def __init__(self, payload, names, types, moduleCentric): + super().__init__(payload, names, types) self._moduleCentric = moduleCentric def textSpecial(self): return "starting acquire" @@ -743,8 +745,8 @@ def jsonInfo(self, syncs, temp, data): class PostEDModuleAcquireParser(EDModuleTransitionParser): - def __init__(self, payload, names, moduleCentric): - super().__init__(payload, names) + def __init__(self, payload, names, types, moduleCentric): + super().__init__(payload, names, types) self.allocInfo = AllocInfo(payload[5:]) self._moduleCentric = moduleCentric def textSpecial(self): @@ -758,8 +760,8 @@ def jsonInfo(self, syncs, temp, data): self._postJsonInfo(syncs, temp, data, Activity.acquire) class PreEDModuleEventDelayedGetParser(EDModuleTransitionParser): - def __init__(self, payload, names): - super().__init__(payload, names) + def __init__(self, payload, names, types): + super().__init__(payload, names, types) def textSpecial(self): return "starting delayed get" def jsonVisInfo(self, data): @@ -769,8 +771,8 @@ def jsonInfo(self, syncs, temp, data): #self._preJsonInfo(temp) class PostEDModuleEventDelayedGetParser(EDModuleTransitionParser): - def __init__(self, payload, names): - super().__init__(payload, names) + def __init__(self, payload, names, types): + super().__init__(payload, names, types) self.allocInfo = AllocInfo(payload[5:]) def textSpecial(self): return "finished delayed get" @@ -781,8 +783,8 @@ def jsonInfo(self, syncs, temp, data): #self._postJsonInfo(syncs, temp, data, Activity.delayedGet) class PreEventReadFromSourceParser(EDModuleTransitionParser): - def __init__(self, payload, names): - super().__init__(payload, names) + def __init__(self, payload, names, types): + super().__init__(payload, names, types) def textSpecial(self): return "starting read from source" def jsonVisInfo(self, data): @@ -793,8 +795,8 @@ def jsonInfo(self, syncs, temp, data): temp.insertTime(self.moduleName+'source', self.transition, self.index, self.time) class PostEventReadFromSourceParser(EDModuleTransitionParser): - def __init__(self, payload, names): - super().__init__(payload, names) + def __init__(self, payload, names, types): + super().__init__(payload, names, types) self.allocInfo = AllocInfo(payload[5:]) def textSpecial(self): return "finished read from source" @@ -805,11 +807,12 @@ def jsonInfo(self, syncs, temp, data): data.insert( "source" , start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , Activity.delayedGet, self.allocInfo) class ESModuleTransitionParser(object): - def __init__(self, payload, moduleNames, esModuleNames, recordNames): + def __init__(self, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames): self.transition = int(payload[0]) self.index = int(payload[1]) self.moduleID = int(payload[2]) self.moduleName = esModuleNames[self.moduleID] + self.moduleType = esModuleTypes[self.moduleID] self.recordID = int(payload[3]) self.recordName = recordNames[self.recordID] self.callID = int(payload[4]) @@ -852,8 +855,8 @@ def _postJsonInfo(self, syncs, temp, data, activity): class PreESModuleTransitionParser(ESModuleTransitionParser): - def __init__(self, payload, names, esNames, recordNames): - super().__init__(payload, names, esNames, recordNames) + def __init__(self, payload, names, types, esNames, esTypes, recordNames): + super().__init__(payload, names, types, esNames, esTypes, recordNames) def textSpecial(self): return "starting action" def jsonVisInfo(self, data): @@ -862,8 +865,8 @@ def jsonInfo(self, syncs, temp, data): self._preJsonInfo(temp) class PostESModuleTransitionParser(ESModuleTransitionParser): - def __init__(self, payload, names, esNames, recordNames): - super().__init__(payload, names, esNames, recordNames) + def __init__(self, payload, names, types, esNames, esTypes, recordNames): + super().__init__(payload, names, types, esNames, esTypes, recordNames) self.allocInfo = AllocInfo(payload[6:]) def textSpecial(self): return "finished action" @@ -873,16 +876,16 @@ def jsonInfo(self, syncs, temp, data): self._postJsonInfo(syncs, temp, data, Activity.process) class PreESModuleAcquireParser(ESModuleTransitionParser): - def __init__(self, payload, names, recordNames): - super().__init__(payload, names, recordNames) + def __init__(self, payload, names, types, esNames, esTypes, recordNames): + super().__init__(payload, names, types, esNames, esTypes, recordNames) def textSpecial(self): return "starting acquire" def jsonVisInfo(self, data): return self._preJsonVis(Activity.acquire, data) class PostESModuleAcquireParser(ESModuleTransitionParser): - def __init__(self, payload, names, esNames, recordNames): - super().__init__(payload, names, esNames, recordNames) + def __init__(self, payload, names, types, esNames, esTypes, recordNames): + super().__init__(payload, names, types, esNames, esTypes, recordNames) self.allocInfo = AllocInfo(payload[6:]) def textSpecial(self): return "finished acquire" @@ -890,7 +893,7 @@ def jsonVisInfo(self, data): return self._postJsonVis(data, self.allocInfo) -def lineParserFactory (step, payload, moduleNames, esModuleNames, recordNames, moduleCentric): +def lineParserFactory (step, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames, moduleCentric): if step == 'F': parser = PreFrameworkTransitionParser(payload) return parser @@ -901,33 +904,33 @@ def lineParserFactory (step, payload, moduleNames, esModuleNames, recordNames, m if step == 's': return PostSourceTransitionParser(payload, moduleCentric) if step == 'M': - return PreEDModuleTransitionParser(payload, moduleNames, moduleCentric) + return PreEDModuleTransitionParser(payload, moduleNames, moduleTypes, moduleCentric) if step == 'm': - return PostEDModuleTransitionParser(payload, moduleNames) + return PostEDModuleTransitionParser(payload, moduleNames, moduleTypes) if step == 'A': - return PreEDModuleAcquireParser(payload, moduleNames, moduleCentric) + return PreEDModuleAcquireParser(payload, moduleNames, moduleTypes, moduleCentric) if step == 'a': - return PostEDModuleAcquireParser(payload, moduleNames, moduleCentric) + return PostEDModuleAcquireParser(payload, moduleNames, moduleTypes, moduleCentric) if step == 'D': - return PreEDModuleEventDelayedGetParser(payload, moduleNames) + return PreEDModuleEventDelayedGetParser(payload, moduleNames, moduleTypes) if step == 'd': - return PostEDModuleEventDelayedGetParser(payload, moduleNames) + return PostEDModuleEventDelayedGetParser(payload, moduleNames, moduleTypes) if step == 'R': - return PreEventReadFromSourceParser(payload, moduleNames) + return PreEventReadFromSourceParser(payload, moduleNames, moduleTypes) if step == 'r': - return PostEventReadFromSourceParser(payload, moduleNames) + return PostEventReadFromSourceParser(payload, moduleNames, moduleTypes) if step == 'N': - return PreESModuleTransitionParser(payload, moduleNames, esModuleNames, recordNames) + return PreESModuleTransitionParser(payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames) if step == 'n': - return PostESModuleTransitionParser(payload, moduleNames, esModuleNames, recordNames) + return PostESModuleTransitionParser(payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames) if step == 'B': - return PreESModuleAcquireParser(payload, moduleNames, esModuleNames, recordNames) + return PreESModuleAcquireParser(payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames) if step == 'b': return PostESModuleAcquireParser(payload, moduleNames, esModuleNames, recordNames) raise LogicError("Unknown step '{}'".format(step)) #---------------------------------------------- -def processingStepsFromFile(f,moduleNames, esModuleNames, recordNames, moduleCentric): +def processingStepsFromFile(f,moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames, moduleCentric): for rawl in f: l = rawl.strip() if not l or l[0] == '#': @@ -935,7 +938,7 @@ def processingStepsFromFile(f,moduleNames, esModuleNames, recordNames, moduleCen (step,payload) = tuple(l.split(None,1)) payload=payload.split() - parser = lineParserFactory(step, payload, moduleNames, esModuleNames, recordNames, moduleCentric) + parser = lineParserFactory(step, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames, moduleCentric) if parser: yield parser return @@ -946,7 +949,9 @@ def __init__(self,f, moduleCentric): numStreams = 0 numStreamsFromSource = 0 moduleNames = {} + moduleTypes = {} esModuleNames = {} + esModuleTypes = {} recordNames = {} for rawl in f: l = rawl.strip() @@ -963,10 +968,12 @@ def __init__(self,f, moduleCentric): if len(l) > 5 and l[0:2] == "#M": (id,name,mType)=tuple(l[2:].split()) moduleNames[int(id)] = name + moduleTypes[int(id)] = mType continue if len(l) > 5 and l[0:2] == "#N": (id,name,mType)=tuple(l[2:].split()) esModuleNames[int(id)] = name + esModuleTypes[int(id)] = mType continue if len(l) > 5 and l[0:2] == "#R": (id,name)=tuple(l[2:].split()) @@ -979,7 +986,9 @@ def __init__(self,f, moduleCentric): numStreams = numStreamsFromSource +2 self.numStreams =numStreams self._moduleNames = moduleNames + self._moduleTypes = moduleTypes self._esModuleNames = esModuleNames + self._esModuleTypes = esModuleTypes self._recordNames = recordNames self.maxNameSize =0 for n in moduleNames.items(): @@ -994,7 +1003,7 @@ def processingSteps(self): Using a generator reduces the memory overhead when parsing a large file. """ self._f.seek(0) - return processingStepsFromFile(self._f,self._moduleNames, self._esModuleNames, self._recordNames, self._moduleCentric) + return processingStepsFromFile(self._f,self._moduleNames, self._moduleTypes, self._esModuleNames, self._esModuleTypes, self._recordNames, self._moduleCentric) def textOutput( parser ): context = {} @@ -1249,7 +1258,7 @@ def jsonVisualizationInfo(parser): sourceSlot = data._modules[data._moduleID2Index(0)] modules = [] for i,m in parser._moduleNames.items(): - modules.append({"name": f"{m}", "slots":[]}) + modules.append({"name": f"{m}", "cpptype": f"{parser._moduleTypes[i]}", "slots":[]}) slots = modules[-1]["slots"] foundSlots = data._modules[data._moduleID2Index(i)] time = 0 @@ -1260,7 +1269,7 @@ def jsonVisualizationInfo(parser): time += t["finish"]-t["start"] modules[-1]['time']=time for i,m in parser._esModuleNames.items(): - modules.append({"name": f"{m}", "slots":[]}) + modules.append({"name": f"{m}", "cpptype": f"{parser._esModuleTypes[i]}", "slots":[]}) slots = modules[-1]["slots"] foundSlots = data._modules[data._moduleID2Index(-1*i)] time = 0 @@ -1411,6 +1420,7 @@ def testFind(item): def testJson(self): parser = ModuleAllocCompactFileParser(self.tracerFile, False) j = jsonInfo(parser, False) + #print(j) self.assertEqual(len(j.data()),3) self.assertEqual(len(j.data()["source"]), 10) self.assertEqual(len(j.data()["Module"]), 8) @@ -1506,6 +1516,8 @@ def runTests(): help='''Run internal tests.''') args = parser.parse_args() + #breakpoint() + if args.test: runTests() else : From bffc8327fbf27ad3f2245ae31059793206391108 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Fri, 5 Sep 2025 15:25:35 -0500 Subject: [PATCH 2/8] Add cpptypes dictionary to json output --- .../scripts/edmModuleAllocMonitorAnalyze.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index bae3904f09e9b..a1172414ffe69 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -303,12 +303,15 @@ class ModuleCentricModuleData(object): def __init__(self): self._data = {} self._last = {} + self._cpptypes = {} self._startTime = None def setStartTime(self, time): self._startTime = time - def insert(self, label, start, stop, transition, index, sync, activity, allocInfo, recordName=None, callID=None): + def insert(self, label, cpptype, start, stop, transition, index, sync, activity, allocInfo, recordName=None, callID=None): if label not in self._data: self._data[label] = [] + if cpptype not in self._cpptypes: + self._cpptypes[label] = cpptype self._data[label].append(ModuleData(start, stop, transition, sync, activity, allocInfo, recordName, callID)) self._last[(label, transition, index, activity)] = self._data[label][-1] def findLast(self, label, transition, index, activity): @@ -318,8 +321,9 @@ def __repr__(self): def data(self): return self._data def toSimpleDict(self): - dct = {'startedMonitoring': self._startTime, 'source' :[], 'clearEvent': [], 'modules' :{}} + dct = {'startedMonitoring': self._startTime, 'source' :[], 'clearEvent': [], 'modules' :{}, 'cpptypes':{}} modules = dct['modules'] + cpptypes = dct['cpptypes'] for m,lst in self._data.items(): l = None if m == 'source': @@ -329,6 +333,7 @@ def toSimpleDict(self): else: modules[m]=[] l = modules[m] + cpptypes[m]=self._cpptypes[m] for d in lst: l.append( d.toSimpleDict() ) return dct @@ -502,7 +507,7 @@ def textSpecial(self): def jsonInfo(self, syncs, temp, data): if self.transition == Phase.clearEvent: start = temp.findTime("clearEvent", self.transition, self.index) - data.insert( "clearEvent" , start, self.time, self.transition, self.index, syncs.get(Phase.Event, self.index) , Activity.process, self.alloc) + data.insert( "clearEvent" , "cleatEventType", start, self.time, self.transition, self.index, syncs.get(Phase.Event, self.index) , Activity.process, self.alloc) def jsonVisInfo(self, data): if transitionIsGlobal(self.transition): index = findMatchingTransition(list(self.sync), data.allGlobals()) @@ -611,9 +616,9 @@ def jsonInfo(self, syncs, temp, data): start = temp.findTime("source", self.transition, self.index) #we do not know the sync yet so have to wait until the framework transition if self.transition in [ Phase.construction, Phase.getNextTransition, Phase.destruction, Phase.openFile]: - data.insert( "source" , start, self.time, self.transition, self.index, (0,) , Activity.process, self.allocInfo) + data.insert( "source" , "sourceType", start, self.time, self.transition, self.index, (0,) , Activity.process, self.allocInfo) else: - data.insert( "source" , start, self.time, self.transition, self.index, self.index , Activity.process, self.allocInfo) + data.insert( "source" , "sourceType", start, self.time, self.transition, self.index, self.index , Activity.process, self.allocInfo) def jsonVisInfo(self, data): index = self.index if self.transition == Phase.Event: @@ -705,7 +710,7 @@ def _preJsonInfo(self, temp): temp.insertTime(self.moduleName, self.transition, self.index, self.time) def _postJsonInfo(self, syncs, temp, data, activity): start = temp.findTime(self.moduleName, self.transition, self.index) - data.insert( self.moduleName , start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo) + data.insert( self.moduleName , self.moduleType, start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo) class PreEDModuleTransitionParser(EDModuleTransitionParser): @@ -851,7 +856,7 @@ def _preJsonInfo(self, temp): temp.insertTimeES(self.moduleName, self.transition, self.index, self.recordID, self.callID, self.time) def _postJsonInfo(self, syncs, temp, data, activity): start = temp.findTimeES(self.moduleName, self.transition, self.index, self.recordID, self.callID) - data.insert( self.moduleName , start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo, self.recordName, self.callID) + data.insert( self.moduleName , self.moduleType, start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo, self.recordName, self.callID) class PreESModuleTransitionParser(ESModuleTransitionParser): From 6cc7c14ce3dcc4d035f55171796a628ff5bd4f5d Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Fri, 5 Sep 2025 15:32:57 -0500 Subject: [PATCH 3/8] Fix bugs found with testing --- .../AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index a1172414ffe69..c73e500222a40 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -333,7 +333,7 @@ def toSimpleDict(self): else: modules[m]=[] l = modules[m] - cpptypes[m]=self._cpptypes[m] + cpptypes[m]=self._cpptypes.get(m) for d in lst: l.append( d.toSimpleDict() ) return dct @@ -809,7 +809,7 @@ def jsonVisInfo(self, data): return self._postJsonVis(data, self.allocInfo) def jsonInfo(self, syncs, temp, data): start = temp.findTime(self.moduleName+'source', self.transition, self.index) - data.insert( "source" , start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , Activity.delayedGet, self.allocInfo) + data.insert( "source" , "sourceType", start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , Activity.delayedGet, self.allocInfo) class ESModuleTransitionParser(object): def __init__(self, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames): From 55288499f4ff1ec9b3994a8af150ec6f51bba3e0 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Mon, 8 Sep 2025 12:49:58 -0500 Subject: [PATCH 4/8] Fix bug where null reported for cpptype --- PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index c73e500222a40..cbef97a461c29 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -310,7 +310,6 @@ def setStartTime(self, time): def insert(self, label, cpptype, start, stop, transition, index, sync, activity, allocInfo, recordName=None, callID=None): if label not in self._data: self._data[label] = [] - if cpptype not in self._cpptypes: self._cpptypes[label] = cpptype self._data[label].append(ModuleData(start, stop, transition, sync, activity, allocInfo, recordName, callID)) self._last[(label, transition, index, activity)] = self._data[label][-1] @@ -507,7 +506,7 @@ def textSpecial(self): def jsonInfo(self, syncs, temp, data): if self.transition == Phase.clearEvent: start = temp.findTime("clearEvent", self.transition, self.index) - data.insert( "clearEvent" , "cleatEventType", start, self.time, self.transition, self.index, syncs.get(Phase.Event, self.index) , Activity.process, self.alloc) + data.insert( "clearEvent" , "clearEventType", start, self.time, self.transition, self.index, syncs.get(Phase.Event, self.index) , Activity.process, self.alloc) def jsonVisInfo(self, data): if transitionIsGlobal(self.transition): index = findMatchingTransition(list(self.sync), data.allGlobals()) From 7bd6616a8295716f6e657800488b194ca799fc5d Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Mon, 8 Sep 2025 13:06:53 -0500 Subject: [PATCH 5/8] Revert changes made to accomodate previous changes --- .../AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index cbef97a461c29..552d9c3c64fb1 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -280,7 +280,7 @@ def __init__(self, start, stop, transition, sync, activity, allocInfo, recordNam self.allocInfo = allocInfo self.record = (recordName, callID) def __repr__(self): - if len(self.record) == 2: + if self.record[0]: return "{{ 'timeRange': {}, 'transition': {}, 'sync' :{}, 'activity':{}, 'record': {{'name' : {}, 'callID' :{} }}, 'alloc':{} }}".format(self.timeRange, self.transition, self.sync, self.activity, self.record[0], self.record[1], self.allocInfo) return "{{ 'timeRange': {}, 'transition': {}, 'sync' :{}, 'activity':{}, 'alloc':{} }}".format(self.timeRange, self.transition, self.sync, self.activity, self.allocInfo) @@ -332,7 +332,7 @@ def toSimpleDict(self): else: modules[m]=[] l = modules[m] - cpptypes[m]=self._cpptypes.get(m) + cpptypes[m]=self._cpptypes[m] for d in lst: l.append( d.toSimpleDict() ) return dct From 2806a0840bfe4c0268250e52db230fcab9f74c5a Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Mon, 8 Sep 2025 13:45:55 -0500 Subject: [PATCH 6/8] Remove commented out print and breakpoint statements. --- .../AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index 552d9c3c64fb1..c762b434b8932 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -603,7 +603,6 @@ def jsonVisInfo(self, data): class PostSourceTransitionParser(SourceTransitionParser): def __init__(self, payload, moduleCentric): super().__init__(payload) - #print(payload) if self.index == -1: self.allocInfo = AllocInfo(payload[2:]) else: @@ -1424,7 +1423,6 @@ def testFind(item): def testJson(self): parser = ModuleAllocCompactFileParser(self.tracerFile, False) j = jsonInfo(parser, False) - #print(j) self.assertEqual(len(j.data()),3) self.assertEqual(len(j.data()["source"]), 10) self.assertEqual(len(j.data()["Module"]), 8) @@ -1436,7 +1434,6 @@ def testJsonTemporal(self): def testSortBy(self): parser = ModuleAllocCompactFileParser(self.tracerFile, True) d = sortByAttribute(parser, 'maxTemp') - #print(d) self.assertEqual(len(d), 3) self.assertEqual(d[0][0], 'ESModule') self.assertEqual(d[1][0], 'Module') @@ -1444,7 +1441,6 @@ def testSortBy(self): def testFullVisualization(self): parser = ModuleAllocCompactFileParser(self.tracerFile, False) j = jsonVisualizationInfo(parser) - #print(j) self.assertEqual(len(j["modules"]), 2) self.assertEqual(len(j["esModules"]), 2) self.assertEqual(len(j['transitions']), 3) @@ -1463,7 +1459,6 @@ def testFullVisualization(self): def testModuleCentricVisualization(self): parser = ModuleAllocCompactFileParser(self.tracerFile, True) j = jsonVisualizationInfo(parser) - #print(j) self.assertEqual(len(j["modules"]), 2) self.assertEqual(len(j["esModules"]), 2) self.assertEqual(len(j['transitions']), 6) @@ -1520,7 +1515,6 @@ def runTests(): help='''Run internal tests.''') args = parser.parse_args() - #breakpoint() if args.test: runTests() From c9700e2e6b5090a5b95876f8d65df9c6dc39dbc2 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Tue, 9 Sep 2025 11:10:53 -0500 Subject: [PATCH 7/8] Remove redundant record length check --- PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index c762b434b8932..3f30347f85e75 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -294,8 +294,7 @@ def syncToSimpleDict(self): return {'run' : self.sync[0], 'lumi' : self.sync[1], 'event' : self.sync[2] } def toSimpleDict(self) : if self.record[0]: - if len(self.record) == 2: - return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity' : activityName(self.activity), 'record' :{'name': self.record[0], 'callID' : self.record[1]}, 'alloc' : self.allocInfo.toSimpleDict() } + return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity' : activityName(self.activity), 'record' :{'name': self.record[0], 'callID' : self.record[1]}, 'alloc' : self.allocInfo.toSimpleDict() } return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity': activityName(self.activity), 'alloc' : self.allocInfo.toSimpleDict() } From 3087361696bbd08d541a644dbdfc080a3f169338 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Tue, 9 Sep 2025 17:10:29 -0500 Subject: [PATCH 8/8] Use ModuleInfo class to hold module name and cpptype --- .../scripts/edmModuleAllocMonitorAnalyze.py | 159 +++++++++--------- 1 file changed, 79 insertions(+), 80 deletions(-) diff --git a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py index 3f30347f85e75..e75cc2a0ea78a 100755 --- a/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py +++ b/PerfTools/AllocMonitor/scripts/edmModuleAllocMonitorAnalyze.py @@ -297,7 +297,14 @@ def toSimpleDict(self) : return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity' : activityName(self.activity), 'record' :{'name': self.record[0], 'callID' : self.record[1]}, 'alloc' : self.allocInfo.toSimpleDict() } return {'timeRange': self.timeRange, 'transition': transitionName(self.transition), 'sync' : self.syncToSimpleDict(), 'activity': activityName(self.activity), 'alloc' : self.allocInfo.toSimpleDict() } - +class ModuleInfo(object): + def __init__(self, name, cpptype): + self._name = name + self._cpptype = cpptype + def __repr__(self): + return "{{'name': {}, 'cpptype': {} }}".format(self._name, self._cpptype) + + class ModuleCentricModuleData(object): def __init__(self): self._data = {} @@ -349,7 +356,7 @@ def __init__(self): self._startTime = None def setStartTime(self, time): self._startTime = time - def insert(self, label, start, stop, transition, index, sync, activity, allocInfo, recordName=None, callID=None): + def insert(self, label, cpptype, start, stop, transition, index, sync, activity, allocInfo, recordName=None, callID=None): self._data.append((label, ModuleData(start, stop, transition, sync, activity, allocInfo, recordName, callID))) self._last[(label,transition, index, activity)] = self._data[-1] def findLast(self, label, transition,index, activity): @@ -645,12 +652,11 @@ def jsonVisInfo(self, data): self.allocInfo.inject(container[-1]) class EDModuleTransitionParser(object): - def __init__(self, payload, moduleNames, moduleTypes): + def __init__(self, payload, moduleInfos): self.transition = int(payload[0]) self.index = int(payload[1]) self.moduleID = int(payload[2]) - self.moduleName = moduleNames[self.moduleID] - self.moduleType = moduleTypes[self.moduleID] + self.moduleInfo = moduleInfos[self.moduleID] self.callID = int(payload[3]) self.time = int(payload[4]) def baseIndentLevel(self): @@ -660,7 +666,7 @@ def textPrefix(self, context): context[(self.transition, self.index, self.moduleID, self.callID)] = indent+1 return textPrefix_(self.time, indent+1+self.baseIndentLevel()) def textPostfix(self): - return f'{self.moduleName} during {transitionName(self.transition)} : id={self.index}' + return f'{self.moduleInfo._name} during {transitionName(self.transition)} : id={self.index}' def textIfTransform(self): if self.callID: return f' transform {self.callID-1}' @@ -704,15 +710,15 @@ def _postJsonVis(self, data, alloc, injectAfter = None): if injectAfter: slot.append(injectAfter) def _preJsonInfo(self, temp): - temp.insertTime(self.moduleName, self.transition, self.index, self.time) + temp.insertTime(self.moduleInfo._name, self.transition, self.index, self.time) def _postJsonInfo(self, syncs, temp, data, activity): - start = temp.findTime(self.moduleName, self.transition, self.index) - data.insert( self.moduleName , self.moduleType, start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo) + start = temp.findTime(self.moduleInfo._name, self.transition, self.index) + data.insert( self.moduleInfo._name, self.moduleInfo._cpptype, start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo) class PreEDModuleTransitionParser(EDModuleTransitionParser): - def __init__(self, payload, names, types, moduleCentric): - super().__init__(payload, names, types) + def __init__(self, payload, infos, moduleCentric): + super().__init__(payload, infos) self._moduleCentric = moduleCentric def textSpecial(self): return "starting action" @@ -723,8 +729,8 @@ def jsonInfo(self, syncs, temp, data): class PostEDModuleTransitionParser(EDModuleTransitionParser): - def __init__(self, payload, names, types): - super().__init__(payload, names, types) + def __init__(self, payload, infos): + super().__init__(payload, infos) self.allocInfo = AllocInfo(payload[5:]) def textSpecial(self): return "finished action" @@ -735,8 +741,8 @@ def jsonVisInfo(self, data): class PreEDModuleAcquireParser(EDModuleTransitionParser): - def __init__(self, payload, names, types, moduleCentric): - super().__init__(payload, names, types) + def __init__(self, payload, infos, moduleCentric): + super().__init__(payload, infos) self._moduleCentric = moduleCentric def textSpecial(self): return "starting acquire" @@ -747,8 +753,8 @@ def jsonInfo(self, syncs, temp, data): class PostEDModuleAcquireParser(EDModuleTransitionParser): - def __init__(self, payload, names, types, moduleCentric): - super().__init__(payload, names, types) + def __init__(self, payload, infos, moduleCentric): + super().__init__(payload, infos) self.allocInfo = AllocInfo(payload[5:]) self._moduleCentric = moduleCentric def textSpecial(self): @@ -762,8 +768,8 @@ def jsonInfo(self, syncs, temp, data): self._postJsonInfo(syncs, temp, data, Activity.acquire) class PreEDModuleEventDelayedGetParser(EDModuleTransitionParser): - def __init__(self, payload, names, types): - super().__init__(payload, names, types) + def __init__(self, payload, infos): + super().__init__(payload, infos) def textSpecial(self): return "starting delayed get" def jsonVisInfo(self, data): @@ -773,8 +779,8 @@ def jsonInfo(self, syncs, temp, data): #self._preJsonInfo(temp) class PostEDModuleEventDelayedGetParser(EDModuleTransitionParser): - def __init__(self, payload, names, types): - super().__init__(payload, names, types) + def __init__(self, payload, infos): + super().__init__(payload, infos) self.allocInfo = AllocInfo(payload[5:]) def textSpecial(self): return "finished delayed get" @@ -785,8 +791,8 @@ def jsonInfo(self, syncs, temp, data): #self._postJsonInfo(syncs, temp, data, Activity.delayedGet) class PreEventReadFromSourceParser(EDModuleTransitionParser): - def __init__(self, payload, names, types): - super().__init__(payload, names, types) + def __init__(self, payload, infos): + super().__init__(payload, infos) def textSpecial(self): return "starting read from source" def jsonVisInfo(self, data): @@ -794,27 +800,26 @@ def jsonVisInfo(self, data): slot['isSrc'] = True return slot def jsonInfo(self, syncs, temp, data): - temp.insertTime(self.moduleName+'source', self.transition, self.index, self.time) + temp.insertTime(self.moduleInfo._name+'source', self.transition, self.index, self.time) class PostEventReadFromSourceParser(EDModuleTransitionParser): - def __init__(self, payload, names, types): - super().__init__(payload, names, types) + def __init__(self, payload, infos): + super().__init__(payload, infos) self.allocInfo = AllocInfo(payload[5:]) def textSpecial(self): return "finished read from source" def jsonVisInfo(self, data): return self._postJsonVis(data, self.allocInfo) def jsonInfo(self, syncs, temp, data): - start = temp.findTime(self.moduleName+'source', self.transition, self.index) + start = temp.findTime(self.moduleInfo._name+'source', self.transition, self.index) data.insert( "source" , "sourceType", start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , Activity.delayedGet, self.allocInfo) class ESModuleTransitionParser(object): - def __init__(self, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames): + def __init__(self, payload, moduleInfos, esModuleInfos, recordNames): self.transition = int(payload[0]) self.index = int(payload[1]) self.moduleID = int(payload[2]) - self.moduleName = esModuleNames[self.moduleID] - self.moduleType = esModuleTypes[self.moduleID] + self.moduleInfo = esModuleInfos[self.moduleID] self.recordID = int(payload[3]) self.recordName = recordNames[self.recordID] self.callID = int(payload[4]) @@ -826,7 +831,7 @@ def textPrefix(self, context): context[(self.transition, self.index, -1*self.moduleID, self.callID)] = indent+1 return textPrefix_(self.time, indent+1+self.baseIndentLevel()) def textPostfix(self): - return f'esmodule {self.moduleName} in record {self.recordName} during {transitionName(self.transition)} : id={self.index}' + return f'esmodule {self.moduleInfo._name} in record {self.recordName} during {transitionName(self.transition)} : id={self.index}' def text(self, context): return f'{self.textPrefix(context)} {self.textSpecial()}: {self.textPostfix()}' def _preJsonVis(self, activity, data): @@ -850,15 +855,15 @@ def _postJsonVis(self, data, alloc): item["finish"]=self.time*kMicroToSec alloc.inject(item) def _preJsonInfo(self, temp): - temp.insertTimeES(self.moduleName, self.transition, self.index, self.recordID, self.callID, self.time) + temp.insertTimeES(self.moduleInfo._name, self.transition, self.index, self.recordID, self.callID, self.time) def _postJsonInfo(self, syncs, temp, data, activity): - start = temp.findTimeES(self.moduleName, self.transition, self.index, self.recordID, self.callID) - data.insert( self.moduleName , self.moduleType, start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo, self.recordName, self.callID) + start = temp.findTimeES(self.moduleInfo._name, self.transition, self.index, self.recordID, self.callID) + data.insert( self.moduleInfo._name , self.moduleInfo._cpptype, start, self.time, self.transition, self.index, syncs.get(self.transition, self.index) , activity, self.allocInfo, self.recordName, self.callID) class PreESModuleTransitionParser(ESModuleTransitionParser): - def __init__(self, payload, names, types, esNames, esTypes, recordNames): - super().__init__(payload, names, types, esNames, esTypes, recordNames) + def __init__(self, payload, infos, esInfos, recordNames): + super().__init__(payload, infos, esInfos, recordNames) def textSpecial(self): return "starting action" def jsonVisInfo(self, data): @@ -867,8 +872,8 @@ def jsonInfo(self, syncs, temp, data): self._preJsonInfo(temp) class PostESModuleTransitionParser(ESModuleTransitionParser): - def __init__(self, payload, names, types, esNames, esTypes, recordNames): - super().__init__(payload, names, types, esNames, esTypes, recordNames) + def __init__(self, payload, infos, esInfos, recordNames): + super().__init__(payload, infos, esInfos, recordNames) self.allocInfo = AllocInfo(payload[6:]) def textSpecial(self): return "finished action" @@ -878,16 +883,16 @@ def jsonInfo(self, syncs, temp, data): self._postJsonInfo(syncs, temp, data, Activity.process) class PreESModuleAcquireParser(ESModuleTransitionParser): - def __init__(self, payload, names, types, esNames, esTypes, recordNames): - super().__init__(payload, names, types, esNames, esTypes, recordNames) + def __init__(self, payload, infos, esInfos, recordNames): + super().__init__(payload, infos, esInfos, recordNames) def textSpecial(self): return "starting acquire" def jsonVisInfo(self, data): return self._preJsonVis(Activity.acquire, data) class PostESModuleAcquireParser(ESModuleTransitionParser): - def __init__(self, payload, names, types, esNames, esTypes, recordNames): - super().__init__(payload, names, types, esNames, esTypes, recordNames) + def __init__(self, payload, infos, esInfos, recordNames): + super().__init__(payload, infos, esInfos, recordNames) self.allocInfo = AllocInfo(payload[6:]) def textSpecial(self): return "finished acquire" @@ -895,7 +900,7 @@ def jsonVisInfo(self, data): return self._postJsonVis(data, self.allocInfo) -def lineParserFactory (step, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames, moduleCentric): +def lineParserFactory (step, payload, moduleInfos, esModuleInfos, recordNames, moduleCentric): if step == 'F': parser = PreFrameworkTransitionParser(payload) return parser @@ -906,33 +911,33 @@ def lineParserFactory (step, payload, moduleNames, moduleTypes, esModuleNames, e if step == 's': return PostSourceTransitionParser(payload, moduleCentric) if step == 'M': - return PreEDModuleTransitionParser(payload, moduleNames, moduleTypes, moduleCentric) + return PreEDModuleTransitionParser(payload, moduleInfos, moduleCentric) if step == 'm': - return PostEDModuleTransitionParser(payload, moduleNames, moduleTypes) + return PostEDModuleTransitionParser(payload, moduleInfos) if step == 'A': - return PreEDModuleAcquireParser(payload, moduleNames, moduleTypes, moduleCentric) + return PreEDModuleAcquireParser(payload, moduleInfos, moduleCentric) if step == 'a': - return PostEDModuleAcquireParser(payload, moduleNames, moduleTypes, moduleCentric) + return PostEDModuleAcquireParser(payload, moduleInfos, moduleCentric) if step == 'D': - return PreEDModuleEventDelayedGetParser(payload, moduleNames, moduleTypes) + return PreEDModuleEventDelayedGetParser(payload, moduleInfos) if step == 'd': - return PostEDModuleEventDelayedGetParser(payload, moduleNames, moduleTypes) + return PostEDModuleEventDelayedGetParser(payload, moduleInfos) if step == 'R': - return PreEventReadFromSourceParser(payload, moduleNames, moduleTypes) + return PreEventReadFromSourceParser(payload, moduleInfos) if step == 'r': - return PostEventReadFromSourceParser(payload, moduleNames, moduleTypes) + return PostEventReadFromSourceParser(payload, moduleInfos) if step == 'N': - return PreESModuleTransitionParser(payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames) + return PreESModuleTransitionParser(payload, moduleInfos, esModuleInfos, recordNames) if step == 'n': - return PostESModuleTransitionParser(payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames) + return PostESModuleTransitionParser(payload, moduleInfos, esModuleInfos, recordNames) if step == 'B': - return PreESModuleAcquireParser(payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames) + return PreESModuleAcquireParser(payload, moduleInfos, esModuleInfos, recordNames) if step == 'b': - return PostESModuleAcquireParser(payload, moduleNames, esModuleNames, recordNames) + return PostESModuleAcquireParser(payload, moduleInfos, esModuleInfos, recordNames) raise LogicError("Unknown step '{}'".format(step)) #---------------------------------------------- -def processingStepsFromFile(f,moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames, moduleCentric): +def processingStepsFromFile(f, moduleInfos, esModuleInfos, recordNames, moduleCentric): for rawl in f: l = rawl.strip() if not l or l[0] == '#': @@ -940,7 +945,7 @@ def processingStepsFromFile(f,moduleNames, moduleTypes, esModuleNames, esModuleT (step,payload) = tuple(l.split(None,1)) payload=payload.split() - parser = lineParserFactory(step, payload, moduleNames, moduleTypes, esModuleNames, esModuleTypes, recordNames, moduleCentric) + parser = lineParserFactory(step, payload, moduleInfos, esModuleInfos, recordNames, moduleCentric) if parser: yield parser return @@ -950,10 +955,8 @@ def __init__(self,f, moduleCentric): streamBeginRun = str(Phase.streamBeginRun) numStreams = 0 numStreamsFromSource = 0 - moduleNames = {} - moduleTypes = {} - esModuleNames = {} - esModuleTypes = {} + moduleInfos = {} + esModuleInfos = {} recordNames = {} for rawl in f: l = rawl.strip() @@ -969,13 +972,11 @@ def __init__(self,f, moduleCentric): numStreamsFromSource = s if len(l) > 5 and l[0:2] == "#M": (id,name,mType)=tuple(l[2:].split()) - moduleNames[int(id)] = name - moduleTypes[int(id)] = mType + moduleInfos[int(id)] = ModuleInfo(name,mType) continue if len(l) > 5 and l[0:2] == "#N": (id,name,mType)=tuple(l[2:].split()) - esModuleNames[int(id)] = name - esModuleTypes[int(id)] = mType + esModuleInfos[int(id)] = ModuleInfo(name,mType) continue if len(l) > 5 and l[0:2] == "#R": (id,name)=tuple(l[2:].split()) @@ -987,15 +988,13 @@ def __init__(self,f, moduleCentric): if numStreams == 0: numStreams = numStreamsFromSource +2 self.numStreams =numStreams - self._moduleNames = moduleNames - self._moduleTypes = moduleTypes - self._esModuleNames = esModuleNames - self._esModuleTypes = esModuleTypes + self._moduleInfos = moduleInfos + self._esModuleInfos = esModuleInfos self._recordNames = recordNames self.maxNameSize =0 - for n in moduleNames.items(): + for n in moduleInfos.items(): self.maxNameSize = max(self.maxNameSize,len(n)) - for n in esModuleNames.items(): + for n in esModuleInfos.items(): self.maxNameSize = max(self.maxNameSize,len(n)) self.maxNameSize = max(self.maxNameSize,len(kSourceDelayedRead)) self.maxNameSize = max(self.maxNameSize, len('streamBeginLumi')) @@ -1005,7 +1004,7 @@ def processingSteps(self): Using a generator reduces the memory overhead when parsing a large file. """ self._f.seek(0) - return processingStepsFromFile(self._f,self._moduleNames, self._moduleTypes, self._esModuleNames, self._esModuleTypes, self._recordNames, self._moduleCentric) + return processingStepsFromFile(self._f,self._moduleInfos, self._esModuleInfos, self._recordNames, self._moduleCentric) def textOutput( parser ): context = {} @@ -1259,8 +1258,8 @@ def jsonVisualizationInfo(parser): if parser._moduleCentric: sourceSlot = data._modules[data._moduleID2Index(0)] modules = [] - for i,m in parser._moduleNames.items(): - modules.append({"name": f"{m}", "cpptype": f"{parser._moduleTypes[i]}", "slots":[]}) + for i,m in parser._moduleInfos.items(): + modules.append({"name": f"{m._name}", "cpptype": f"{m._cpptype}", "slots":[]}) slots = modules[-1]["slots"] foundSlots = data._modules[data._moduleID2Index(i)] time = 0 @@ -1270,8 +1269,8 @@ def jsonVisualizationInfo(parser): if t["act"] !=Activity.prefetch: time += t["finish"]-t["start"] modules[-1]['time']=time - for i,m in parser._esModuleNames.items(): - modules.append({"name": f"{m}", "cpptype": f"{parser._esModuleTypes[i]}", "slots":[]}) + for i,m in parser._esModuleInfos.items(): + modules.append({"name": f"{m._name}", "cpptype": f"{m._cpptype}", "slots":[]}) slots = modules[-1]["slots"] foundSlots = data._modules[data._moduleID2Index(-1*i)] time = 0 @@ -1287,21 +1286,21 @@ def jsonVisualizationInfo(parser): final['transitions'].append(m) max = 0 - for k in parser._moduleNames.keys(): + for k in parser._moduleInfos.keys(): if k > max: max = k final["modules"] =['']*(max+1) final["modules"][0] = 'source' - for k,v in parser._moduleNames.items(): + for k,v in parser._moduleInfos.items(): final["modules"][k]=v max = 0 - for k in parser._esModuleNames.keys(): + for k in parser._esModuleInfos.keys(): if k > max: max = k final["esModules"] = ['']*(max+1) - for k,v in parser._esModuleNames.items(): + for k,v in parser._esModuleInfos.items(): final["esModules"][k] = v return final