FiniteVolumeGPU/GPUSimulators/common/progress_printer.py

63 lines
2.0 KiB
Python

import logging
import time
import numpy as np
def time_string(seconds):
seconds = int(max(seconds, 1))
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
periods = [('h', hours), ('m', minutes), ('s', seconds)]
return_string = ' '.join('{}{}'.format(value, name)
for name, value in periods
if value)
return return_string
def progress_bar(step, total_steps, width=30):
progress = np.round(width * step / total_steps).astype(np.int32)
progressbar = "0% [" + "#" * progress + "=" * (width - progress) + "] 100%"
return progressbar
class ProgressPrinter(object):
"""
Small helper class for creating a progress bar
"""
def __init__(self, total_steps, print_every=5):
self.logger = logging.getLogger(__name__)
self.start = time.time()
self.total_steps = total_steps
self.print_every = print_every
self.next_print_time = self.print_every
self.last_step = 0
self.secs_per_iter = None
def get_print_string(self, step):
elapsed = time.time() - self.start
if elapsed > self.next_print_time:
dt = elapsed - (self.next_print_time - self.print_every)
dsteps = step - self.last_step
steps_remaining = self.total_steps - step
if dsteps == 0:
return None
self.last_step = step
self.next_print_time = elapsed + self.print_every
if not self.secs_per_iter:
self.secs_per_iter = dt / dsteps
self.secs_per_iter = 0.2 * self.secs_per_iter + 0.8 * (dt / dsteps)
remaining_time = steps_remaining * self.secs_per_iter
return (f"{progress_bar(step, self.total_steps)}. "
+ f"Total: {time_string(elapsed + remaining_time)}, "
+ f"elapsed: {time_string(elapsed)}, "
+ f"remaining: {time_string(remaining_time)}")
return None