#!/usr/bin/env python import argparse def read_from_line(line: str) -> dict[str, int | float]: ret = {} if 'skip:' in line: ret.update({'skip': int(line.split('skip:', 1)[1].split(',')[0])}) ret.update({'sample': int(line.split('length:', 1)[1].split('|', 1)[0])}) ret.update({'custom': float(line.split('custom time: ', 1)[1].split('time')[0])}) ret.update({'normal': float(line.rsplit('time:', 1)[1])}) return ret def calc_avg(sz: list[float]) -> float: return sum(sz) / len(sz) def calc_middle_number(sz: list[float]) -> float: if (length := len(sz)) & 1 == 0: length = length // 2 return (sz[length] + sz[length - 1]) / 2 return sz[length // 2] def get_array_summary(sz: list[float]) -> tuple[str, str]: sz.sort() middle = calc_middle_number(sz) avg = calc_avg(sz) return f'{middle:.6f}', f'{avg:.6f}' def read(file: str, need_calc: bool = False, output_latex: bool = False) -> None: items = {} with open(file) as fin: while s := fin.readline(): element = read_from_line(s.strip()) if (sample := element['sample']) not in items: items.update({sample: []}) items[sample].append(element) if need_calc: keys = ['custom', 'normal'] new_result = {} for key, value in items.items(): if key not in new_result: new_result.update({key: {x: [] for x in keys}}) for element in value: # print(element) for x in keys: new_result[key][x].append(element[x]) print(*keys) for key, value in new_result.items(): column = list(get_array_summary(value[x]) for x in keys) if output_latex: column = list(map(str, column)) column.insert(0, str(key)) print('\\hline\n', ' & '.join(column), '\\\\') else: print(key, *column) return print(items) if __name__ == '__main__': arg_ = argparse.ArgumentParser() arg_.add_argument("file") arg_.add_argument('--latex', action='store_true') sub_ = arg_.add_subparsers(title="sub", dest='sub') calc_ = sub_.add_parser('calc') parser_ = arg_.parse_args() read(parser_.file, parser_.sub == 'calc', parser_.latex)