stat_name_delim = "," class Database: def __init__(self): self.rows = [] self.currentRow = dict() def insert(self, name, val): assert name not in self.currentRow self.currentRow[name] = val def commitRow(self): self.rows.append(self.currentRow) self.currentRow = dict() def currentRowIsClear(self): return len(self.currentRow) == 0 def writeDB(self, file, order): assert self.currentRowIsClear() first = True for name in order: if first: first = False else: file.write(",") file.write(name) file.write("\n") for row in self.rows: first = True for name in order: if first: first = False else: file.write(",") if name in row: file.write(str(row[name])) else: file.write(" ") file.write("\n") def readDatabase(filename): file = open(filename) db = Database() first = True names = [] for line in file: if first: first = False (_,hash,line) = line.partition("#") assert hash == "#" line = line.strip() names = line.split(",") for n in names: assert n in registry else: vals = line.split(",") for index in xrange(len(vals)): addStat(db,names[index],vals[index]) db.commitRow() file.close() return db int_default = "-1" def str2int(x): if x.strip() == "": return int_default else: return int(x) str2str = lambda x: x str2strip2str = lambda x: x.strip() float_default = "-1.0" def str2float(x): if x.strip() == "": return float_default else: return float(x) def strpercent2float(x): if x.strip() == "": return float_default else: return float(x.strip('%')) registry = dict() registry["sat/unsat"] = lambda x: x.upper() == "SAT" and 1 or 0 registry["filename"] = str2strip2str registry["sat::clauses_literals"] = str2int registry["sat::tot_literals"] = str2int registry["sat::starts"] = str2int registry["sat::rnd_decisions"] = str2int registry["sat::propagations"] = str2int registry["sat::max_literals"] = str2int registry["sat::learnts_literals"] = str2int registry["sat::decisions"] = str2int registry["sat::conflicts"] = str2int registry["theory::arith::AssertLowerConflicts"] = str2int registry["theory::arith::AssertUpperConflicts"] = str2int registry["theory::arith::UpdateConflicts"] = str2int registry["theory::arith::Average#ConstantInPivotRow"] = str2float registry["theory::arith::AveragePivotLength"] = str2float registry["theory::arith::Ejections"] = str2int registry["theory::arith::UnEjections"] = str2int registry["theory::arith::SlackVariables"] = str2int registry["theory::arith::UserVariables"] = str2int registry["theory::arith::pivots"] = str2int registry["theory::arith::updates"] = str2int registry["theory::aug_lemma"] = str2int registry["theory::conflicts"] = str2int registry["theory::explanation"] = str2int registry["theory::lemma"] = str2int registry["theory::propagate"] = str2int registry["cpu_percent"] = strpercent2float registry["exit_status"] = str2int registry["system_time"] = str2float registry["user_time"] = str2float registry["major_page_faults"] = str2float registry["minor_page_faults"] = str2int registry["average_unshared_memory"] = str2int registry["average_total_memory"] = str2int registry["maximum_resident_size"] = str2int registry["average_resident_size"] = str2int registry["id"] = str2int def find(l, elem): for i in xrange(len(l)): if elem == l[i]: return i return -1 def pushToFront(l, elem): l.remove(elem) l.insert(0,elem) regOrder = list(registry.keys()) regOrder.sort() pushToFront(regOrder, "filename") pushToFront(regOrder, "theory::propagate") pushToFront(regOrder, "theory::conflicts") pushToFront(regOrder, "sat::decisions") pushToFront(regOrder, "system_time") pushToFront(regOrder, "user_time") def isSatResult(line): up = line.upper().strip() if up == "UNSAT": return True elif up == "SAT": return True else: return False def addStat(db, name, result): assert name in registry interpreter = registry[name] val = interpreter(result) db.insert(name, val) def handleCoutFile(db, filename): file = open(filename) num_lines = 0 for line in file: assert num_lines <= 2 num_lines += 1 if(isSatResult(line)): continue time_return = line.split() # First word is 'empty' to distinguish the 'empty' output addStat(db, "exit_status", time_return[1]) addStat(db, "system_time", time_return[2]) addStat(db, "user_time", time_return[3]) addStat(db, "cpu_percent", time_return[4]) addStat(db, "major_page_faults", time_return[5]) addStat(db, "minor_page_faults", time_return[6]) addStat(db, "average_unshared_memory", time_return[7]) addStat(db, "average_total_memory", time_return[8]) addStat(db, "maximum_resident_size", time_return[9]) addStat(db, "average_resident_size", time_return[10]) file.close() ignoreThese = ["Illegal instruction", "Aborted", "CVC4 interrupted by timeout.", "CVC4 suffered a segfault.", "ssh: Could not resolve hostname", "Trace/breakpoint trap", "Segmentation fault"] def ignoreFault(ln): for ignore in ignoreThese: if (ln.find(ignore) != -1): return True return False def handleLine(db, ln): assert ln.strip() != "" if isSatResult(ln): addStat(db,"sat/unsat",ln) elif (not ignoreFault(ln)): (name,delim,result) = ln.partition(stat_name_delim) assert delim != "" addStat(db, name,result) def handleCerrFile(db, filename): assert db.currentRowIsClear() file = open(filename) for line in file: handleLine(db,line) file.close() ignore_files = ["done", "done.err", "init", "init.err"] import os def handleDirectory(db, path): files = os.listdir(path) for name in files: if name in ignore_files: continue if(not name.endswith(".err")): errFile = name+".err" handleCerrFile(db, path+'/'+errFile) addStat(db, "id", name) handleCoutFile(db, path+'/'+name) db.commitRow() import sys dbfile = sys.argv[1] target = sys.argv[2] assert os.path.exists(dbfile) assert os.path.exists(target) db = readDatabase(dbfile) if os.path.isdir(target): handleDirectory(db, target) else: handleFile(db, target) db.commitRow() db.writeDB(sys.stdout, regOrder)