PaddleClas/test_tipc/extract_loss.py

108 lines
2.7 KiB
Python

import sys
import argparse
import re
def parameter_parser():
parser = argparse.ArgumentParser(description="Support Args:")
parser.add_argument(
"-v",
"--valid-expr",
type=str,
default="*",
help="when not match, the line will discard.")
parser.add_argument(
"-e",
"--extract-expr",
type=str,
default="^{%s}$,",
help="the extract expr for the loss: loss {%f}")
parser.add_argument(
"-r",
"--reduction-expr",
type=str,
default="print",
help="print | sum | mean")
parser.add_argument(
"-n",
"--discard",
type=int,
default=0,
help="while reduction, discard [0:n] and [-n:]")
parser.add_argument(
"-d", "--debug", type=bool, default=False, help="debug")
return parser.parse_args()
args = parameter_parser()
def log(*inp, **kargs):
if args.debug:
print(*inp, **kargs)
def is_valid(line, valid_expr):
if valid_expr == "*": return True
if valid_expr in line: return True
return False
def extract(line, extract_expr):
"""
return tuple, the output will be
"""
log("Extract_expression is : ", extract_expr)
x = re.findall("\{%(.)\}", extract_expr)
assert len(x) == 1, "Must exist a {%d} | {%f} | {%s} "
t = x[0]
type_converter = {
'f': float,
'i': int,
's': str,
}
type_extracter = {
"f": r'(\\d+\\.\\d+)',
"i": r'(\\d+)',
"s": r'(.*?)',
}
log(type_extracter[t])
pattern = re.sub("\{%(.)\}", type_extracter[t], extract_expr, 1)
log("Created Pattern is: ", pattern)
x = re.findall(pattern, line)
if len(x) == 0: return None
assert len(x) == 1, f"Multi Match for `{extract_expr}` in line: \n{line}"
log("Find in line: ", x[0].strip())
return type_converter[t](x[0].strip())
def action(tuple_list, action):
# discard the warm up
if args.discard > 0:
tuple_list = tuple_list[args.discard:]
tuple_list = tuple_list[:-args.discard]
# do action for each item
if action == "sum":
print(sum(tuple_list))
if action == "mean":
if len(tuple_list) == 0: print("null")
else: print(sum(tuple_list) / len(tuple_list))
if action == "print":
for item in tuple_list:
print(item)
def main():
current_step = 0
tuple_list = []
for line in sys.stdin:
line = line.strip()
if is_valid(line, args.valid_expr):
ret = extract(line, args.extract_expr)
if ret: tuple_list.append(ret)
action(tuple_list, args.reduction_expr)
if __name__ == "__main__":
main()