73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
#!/usr/bin/env python
|
|
import datetime
|
|
import os
|
|
import sys
|
|
|
|
def extract_datetime_from_line(line, year):
|
|
# Expected format: I0210 13:39:22.381027 25210 solver.cpp:204] Iteration 100, lr = 0.00992565
|
|
line = line.strip().split()
|
|
month = int(line[0][1:3])
|
|
day = int(line[0][3:])
|
|
timestamp = line[1]
|
|
pos = timestamp.rfind('.')
|
|
ts = [int(x) for x in timestamp[:pos].split(':')]
|
|
hour = ts[0]
|
|
minute = ts[1]
|
|
second = ts[2]
|
|
microsecond = int(timestamp[pos + 1:])
|
|
dt = datetime.datetime(year, month, day, hour, minute, second, microsecond)
|
|
return dt
|
|
|
|
|
|
def get_log_created_year(input_file):
|
|
"""Get year from log file system timestamp
|
|
"""
|
|
|
|
log_created_time = os.path.getctime(input_file)
|
|
log_created_year = datetime.datetime.fromtimestamp(log_created_time).year
|
|
return log_created_year
|
|
|
|
|
|
def get_start_time(line_iterable, year):
|
|
"""Find start time from group of lines
|
|
"""
|
|
|
|
start_datetime = None
|
|
for line in line_iterable:
|
|
line = line.strip()
|
|
if line.find('Solving') != -1:
|
|
start_datetime = extract_datetime_from_line(line, year)
|
|
break
|
|
return start_datetime
|
|
|
|
|
|
def extract_seconds(input_file, output_file):
|
|
with open(input_file, 'r') as f:
|
|
lines = f.readlines()
|
|
log_created_year = get_log_created_year(input_file)
|
|
start_datetime = get_start_time(lines, log_created_year)
|
|
assert start_datetime, 'Start time not found'
|
|
|
|
last_dt = start_datetime
|
|
out = open(output_file, 'w')
|
|
for line in lines:
|
|
line = line.strip()
|
|
if line.find('Iteration') != -1:
|
|
dt = extract_datetime_from_line(line, log_created_year)
|
|
|
|
# if it's another year
|
|
if dt.month < last_dt.month:
|
|
log_created_year += 1
|
|
dt = extract_datetime_from_line(line, log_created_year)
|
|
last_dt = dt
|
|
|
|
elapsed_seconds = (dt - start_datetime).total_seconds()
|
|
out.write('%f\n' % elapsed_seconds)
|
|
out.close()
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) < 3:
|
|
print('Usage: ./extract_seconds input_file output_file')
|
|
exit(1)
|
|
extract_seconds(sys.argv[1], sys.argv[2])
|