From 845a9fd266ba0a073a295d7ebc27e28be96e83fa Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Thu, 28 May 2026 19:10:50 +0200 Subject: [PATCH 1/7] add parsing of normalized time from @10 in scip .out --- ipet/Key.py | 1 + ipet/parsing/ReaderManager.py | 4 +++- ipet/parsing/StatisticReader.py | 18 ++++++++++++++++++ ipet/parsing/__init__.py | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ipet/Key.py b/ipet/Key.py index 9d9e393..f33f9f7 100644 --- a/ipet/Key.py +++ b/ipet/Key.py @@ -73,6 +73,7 @@ TimeToBestSolution = "TimeToBest" TimeToFirstSolution = "TimeToFirst" TimeLimit = "TimeLimit" +NormalizedTime = "NormalizedTime" Version = "Version" ViolationBds = "Viol_Bounds" ViolationInt = "Viol_Int" diff --git a/ipet/parsing/ReaderManager.py b/ipet/parsing/ReaderManager.py index 5695f98..6a18089 100644 --- a/ipet/parsing/ReaderManager.py +++ b/ipet/parsing/ReaderManager.py @@ -14,7 +14,8 @@ import xml.etree.ElementTree as ElementTree from .StatisticReader import ErrorFileReader, GapReader, TimeLimitReader, ListReader, \ BestSolInfeasibleReader, MaxDepthReader, MetaDataReader, NodeNameReader, NodesReader, RootNodeFixingsReader, \ - SettingsFileReader, TimeToFirstReader, TimeToBestReader, ObjsenseReader, DateTimeReader, SolCheckerReader + SettingsFileReader, TimeToFirstReader, TimeToBestReader, ObjsenseReader, DateTimeReader, SolCheckerReader, \ + NormalizedTimeReader from .StatisticReader_TableReader import TableReader, CustomTableReader from .StatisticReader_VariableReader import VariableReader from .StatisticReader_CustomReader import CustomReader @@ -198,6 +199,7 @@ def registerDefaultReaders(self): TimeLimitReader(), TimeToFirstReader(), TimeToBestReader(), + NormalizedTimeReader(), TraceFileReader() ]) diff --git a/ipet/parsing/StatisticReader.py b/ipet/parsing/StatisticReader.py index 62281f8..d938e4d 100644 --- a/ipet/parsing/StatisticReader.py +++ b/ipet/parsing/StatisticReader.py @@ -428,6 +428,24 @@ def extractStatistic(self, line): except TypeError: pass +class NormalizedTimeReader(StatisticReader): + """ + reads the normalized solution time + """ + name = 'NormalizedTimeReader' + regular_exp = re.compile(r'^@10 .*normtime=([0-9\.]*)$') + datakey = Key.NormalizedTime + datatype = float + + def extractStatistic(self, line): + m = self.regular_exp.match(line) + if m: + try: + normtime = float(m.group(1)) + self.addData(self.datakey, normtime) + except TypeError: + pass + class ListReader(StatisticReader): """ reads a list matching a regular expression diff --git a/ipet/parsing/__init__.py b/ipet/parsing/__init__.py index 15f03c2..bc43dea 100644 --- a/ipet/parsing/__init__.py +++ b/ipet/parsing/__init__.py @@ -17,5 +17,5 @@ from .StatisticReader_TableReader import TableReader, CustomTableReader from .StatisticReader import StatisticReader, ErrorFileReader, GapReader, TimeLimitReader, \ BestSolInfeasibleReader, MaxDepthReader, MetaDataReader, ObjlimitReader, NodesReader, RootNodeFixingsReader, \ - SettingsFileReader, TimeToFirstReader, TimeToBestReader, ListReader, ObjsenseReader, DateTimeReader + SettingsFileReader, TimeToFirstReader, TimeToBestReader, NormalizedTimeReader, ListReader, ObjsenseReader, DateTimeReader __all__ = [] From 52faef131110255ddceb03457dd3cc966655d94a Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 27 Jul 2026 16:38:46 +0200 Subject: [PATCH 2/7] rename NormalizedTimeReader to PerfDataReader to prepare for more parsing --- ipet/parsing/ReaderManager.py | 4 ++-- ipet/parsing/StatisticReader.py | 27 +++++++++++++++------------ ipet/parsing/__init__.py | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/ipet/parsing/ReaderManager.py b/ipet/parsing/ReaderManager.py index 6a18089..3c3d908 100644 --- a/ipet/parsing/ReaderManager.py +++ b/ipet/parsing/ReaderManager.py @@ -15,7 +15,7 @@ from .StatisticReader import ErrorFileReader, GapReader, TimeLimitReader, ListReader, \ BestSolInfeasibleReader, MaxDepthReader, MetaDataReader, NodeNameReader, NodesReader, RootNodeFixingsReader, \ SettingsFileReader, TimeToFirstReader, TimeToBestReader, ObjsenseReader, DateTimeReader, SolCheckerReader, \ - NormalizedTimeReader + PerfDataReader from .StatisticReader_TableReader import TableReader, CustomTableReader from .StatisticReader_VariableReader import VariableReader from .StatisticReader_CustomReader import CustomReader @@ -199,7 +199,7 @@ def registerDefaultReaders(self): TimeLimitReader(), TimeToFirstReader(), TimeToBestReader(), - NormalizedTimeReader(), + PerfDataReader(), TraceFileReader() ]) diff --git a/ipet/parsing/StatisticReader.py b/ipet/parsing/StatisticReader.py index d938e4d..a502666 100644 --- a/ipet/parsing/StatisticReader.py +++ b/ipet/parsing/StatisticReader.py @@ -428,23 +428,26 @@ def extractStatistic(self, line): except TypeError: pass -class NormalizedTimeReader(StatisticReader): +class PerfDataReader(StatisticReader): """ - reads the normalized solution time + reads the perf statistics, like normalized solution time """ - name = 'NormalizedTimeReader' - regular_exp = re.compile(r'^@10 .*normtime=([0-9\.]*)$') - datakey = Key.NormalizedTime + name = 'PerfDataReader' + normtimeexpr = re.compile(r'^@10 .*normtime=([0-9\.]*)$') + normtimekey = Key.NormalizedTime datatype = float + key2expr = {normtimekey : normtimeexpr} + def extractStatistic(self, line): - m = self.regular_exp.match(line) - if m: - try: - normtime = float(m.group(1)) - self.addData(self.datakey, normtime) - except TypeError: - pass + for key, regexpr in list(self.key2expr.items()): + m = regexpr.match(line) + if m: + try: + value = float(m.group(1)) + self.addData(key, value) + except TypeError: + pass class ListReader(StatisticReader): """ diff --git a/ipet/parsing/__init__.py b/ipet/parsing/__init__.py index bc43dea..b1b595e 100644 --- a/ipet/parsing/__init__.py +++ b/ipet/parsing/__init__.py @@ -17,5 +17,5 @@ from .StatisticReader_TableReader import TableReader, CustomTableReader from .StatisticReader import StatisticReader, ErrorFileReader, GapReader, TimeLimitReader, \ BestSolInfeasibleReader, MaxDepthReader, MetaDataReader, ObjlimitReader, NodesReader, RootNodeFixingsReader, \ - SettingsFileReader, TimeToFirstReader, TimeToBestReader, NormalizedTimeReader, ListReader, ObjsenseReader, DateTimeReader + SettingsFileReader, TimeToFirstReader, TimeToBestReader, PerfDataReader, ListReader, ObjsenseReader, DateTimeReader __all__ = [] From 0eb67fe023d44090518fd99b2183aee6be857d8a Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 27 Jul 2026 16:54:47 +0200 Subject: [PATCH 3/7] parse also MeanFreq and NormalizedFreq --- ipet/Key.py | 4 +++- ipet/parsing/StatisticReader.py | 15 +++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ipet/Key.py b/ipet/Key.py index f33f9f7..c408435 100644 --- a/ipet/Key.py +++ b/ipet/Key.py @@ -49,11 +49,14 @@ GitHash = "GitHash" LogFileName = "LogFileName" LPSolver = "LPSolver" +MeanFreq = "MeanFreq" MetaData = "MetaData" MaximumDepth = "MaxDepth" Mode = "mode" NodeName = "NodeName" Nodes = "Nodes" +NormalizedFreq = "NormalizedFreq" +NormalizedTime = "NormalizedTime" ObjectiveLimit = "Objlimit" ObjectiveSense = "Objsense" OptimalValue = "OptVal" @@ -73,7 +76,6 @@ TimeToBestSolution = "TimeToBest" TimeToFirstSolution = "TimeToFirst" TimeLimit = "TimeLimit" -NormalizedTime = "NormalizedTime" Version = "Version" ViolationBds = "Viol_Bounds" ViolationInt = "Viol_Int" diff --git a/ipet/parsing/StatisticReader.py b/ipet/parsing/StatisticReader.py index a502666..6027cf2 100644 --- a/ipet/parsing/StatisticReader.py +++ b/ipet/parsing/StatisticReader.py @@ -433,18 +433,17 @@ class PerfDataReader(StatisticReader): reads the perf statistics, like normalized solution time """ name = 'PerfDataReader' - normtimeexpr = re.compile(r'^@10 .*normtime=([0-9\.]*)$') - normtimekey = Key.NormalizedTime datatype = float - - key2expr = {normtimekey : normtimeexpr} + regular_expr = re.compile(r'^@10 meanfreq=([0-9\.]*) nmsfreq=([0-9\.]*) normtime=([0-9\.]*)$') + keys = [Key.MeanFreq, Key.NormalizedFreq, Key.NormalizedTime] def extractStatistic(self, line): - for key, regexpr in list(self.key2expr.items()): - m = regexpr.match(line) - if m: + m = self.regular_expr.match(line) + if m: + for keyidx in range(len(self.keys)): try: - value = float(m.group(1)) + key = self.keys[keyidx] + value = float(m.group(keyidx+1)) self.addData(key, value) except TypeError: pass From 685cec00428c379c5a80dbbc00d72653736d2214 Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 27 Jul 2026 16:59:58 +0200 Subject: [PATCH 4/7] add NormTime column to evaluation.xml --- scripts/evaluation.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/evaluation.xml b/scripts/evaluation.xml index f2c5fae..712d69e 100644 --- a/scripts/evaluation.xml +++ b/scripts/evaluation.xml @@ -3,6 +3,9 @@ + + + From 0db84ced828f7534991749706e5c412b2f6c5ccd Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 27 Jul 2026 17:19:00 +0200 Subject: [PATCH 5/7] add parsing of raw performance data --- ipet/parsing/ReaderManager.py | 3 ++- ipet/parsing/StatisticReader.py | 22 +++++++++++++++++++++- ipet/parsing/__init__.py | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ipet/parsing/ReaderManager.py b/ipet/parsing/ReaderManager.py index 3c3d908..0a631a5 100644 --- a/ipet/parsing/ReaderManager.py +++ b/ipet/parsing/ReaderManager.py @@ -15,7 +15,7 @@ from .StatisticReader import ErrorFileReader, GapReader, TimeLimitReader, ListReader, \ BestSolInfeasibleReader, MaxDepthReader, MetaDataReader, NodeNameReader, NodesReader, RootNodeFixingsReader, \ SettingsFileReader, TimeToFirstReader, TimeToBestReader, ObjsenseReader, DateTimeReader, SolCheckerReader, \ - PerfDataReader + PerfDataReader, RawPerfDataReader from .StatisticReader_TableReader import TableReader, CustomTableReader from .StatisticReader_VariableReader import VariableReader from .StatisticReader_CustomReader import CustomReader @@ -200,6 +200,7 @@ def registerDefaultReaders(self): TimeToFirstReader(), TimeToBestReader(), PerfDataReader(), + RawPerfDataReader(), TraceFileReader() ]) diff --git a/ipet/parsing/StatisticReader.py b/ipet/parsing/StatisticReader.py index 6027cf2..a1a013e 100644 --- a/ipet/parsing/StatisticReader.py +++ b/ipet/parsing/StatisticReader.py @@ -430,7 +430,7 @@ def extractStatistic(self, line): class PerfDataReader(StatisticReader): """ - reads the perf statistics, like normalized solution time + reads the processed perf statistics, like normalized solution time """ name = 'PerfDataReader' datatype = float @@ -448,6 +448,26 @@ def extractStatistic(self, line): except TypeError: pass +class RawPerfDataReader(StatisticReader): + """ + reads the raw perf statistics, e.g., @06 cpu-cycles:u=13572052343862 cpu-cycles:k=68612735800 instructions:u=25079950435035 instructions:k=54294963792 cache-references:u=610557529359 cache-misses:u=320070506935 branch-instructions:u=3638145957323 branch-misses:u=36667745269 L1-dcache-loads=9147033741310 L1-dcache-load-misses=756723588525 L1-icache-load-misses=730865048 dTLB-loads=9147044559864 dTLB-load-misses=3092490807 iTLB-load-misses=4470770 minor-faults:u=10452738 minor-faults:k=86 major-faults:u=8 major-faults:k=0 context-switches=3217 cpu-migrations=94 cycle_activity.cycles_mem_any=13078074806121 cycle_activity.stalls_mem_any=4772553217683 cycle_activity.stalls_total=5226003573246 task-clock=7223006.36 + """ + name = 'RawPerfDataReader' + datatype = int + raw_regular_expr = re.compile(r'^@06 (.*)') + + def extractStatistic(self, line): + m = self.raw_regular_expr.match(line) + if m: + for keyval in m.group(1).split() : + keyval = keyval.strip().split('=') + if len(keyval) == 2: + try: + value = int(float(keyval[1])) + self.addData('perf:' + keyval[0], value) + except TypeError: + pass + class ListReader(StatisticReader): """ reads a list matching a regular expression diff --git a/ipet/parsing/__init__.py b/ipet/parsing/__init__.py index b1b595e..6a6a6f0 100644 --- a/ipet/parsing/__init__.py +++ b/ipet/parsing/__init__.py @@ -17,5 +17,5 @@ from .StatisticReader_TableReader import TableReader, CustomTableReader from .StatisticReader import StatisticReader, ErrorFileReader, GapReader, TimeLimitReader, \ BestSolInfeasibleReader, MaxDepthReader, MetaDataReader, ObjlimitReader, NodesReader, RootNodeFixingsReader, \ - SettingsFileReader, TimeToFirstReader, TimeToBestReader, PerfDataReader, ListReader, ObjsenseReader, DateTimeReader + SettingsFileReader, TimeToFirstReader, TimeToBestReader, PerfDataReader, RawPerfDataReader, ListReader, ObjsenseReader, DateTimeReader __all__ = [] From 3ec797ad029db67e548b270b3dc819b23abf148b Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 27 Jul 2026 17:43:00 +0200 Subject: [PATCH 6/7] add another evaluation.xml example that aggregates perf stats --- scripts/evaluation-perf.xml | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 scripts/evaluation-perf.xml diff --git a/scripts/evaluation-perf.xml b/scripts/evaluation-perf.xml new file mode 100644 index 0000000..d0c1013 --- /dev/null +++ b/scripts/evaluation-perf.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3a0d4eb897f4aed456e1e3b7aaea953250ed829c Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Thu, 30 Jul 2026 15:32:03 +0200 Subject: [PATCH 7/7] avoid _ and . in keys - they seem to end up as space in rubberband, but don't work like that either --- ipet/parsing/StatisticReader.py | 3 ++- scripts/evaluation-perf.xml | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ipet/parsing/StatisticReader.py b/ipet/parsing/StatisticReader.py index a1a013e..579f658 100644 --- a/ipet/parsing/StatisticReader.py +++ b/ipet/parsing/StatisticReader.py @@ -463,8 +463,9 @@ def extractStatistic(self, line): keyval = keyval.strip().split('=') if len(keyval) == 2: try: + key = 'perf:' + keyval[0].replace('_','-').replace('.','-') value = int(float(keyval[1])) - self.addData('perf:' + keyval[0], value) + self.addData(key, value) except TypeError: pass diff --git a/scripts/evaluation-perf.xml b/scripts/evaluation-perf.xml index d0c1013..1f22644 100644 --- a/scripts/evaluation-perf.xml +++ b/scripts/evaluation-perf.xml @@ -43,13 +43,13 @@ - + - + - +