Source code for TidalPy.utilities.io.progress

import time

import numpy as np

from TidalPy.utilities.conversions import convert_to_hms


[docs] def progress_bar(loop_limits: tuple, verbose: bool = True, poll_time: float = 1.5): def outer_wrapper(function): clock_old = time.time() prev_delta = 1. prev_prev_delta = 1. prev_perc = 0. def inner_wrapper(input_time, *args, **kwargs): now = time.time() # Print Progress Bar if verbose: if now - inner_wrapper.clock_old > poll_time: # Occasionally certain integration techniques may probe beyond the expected integration limits. # If/When that occurs a false time value will be used for the progress bar. if input_time < loop_limits[0]: input_time = loop_limits[0] elif input_time > loop_limits[1]: input_time = 0.997 * (loop_limits[1] - loop_limits[0]) percent_done = (input_time - loop_limits[0]) / (loop_limits[-1] - loop_limits[0]) percent_done = np.nan_to_num(percent_done) delta = (percent_done - inner_wrapper.prev_perc) / (now - inner_wrapper.clock_old) # Use an average of the last 3 (arbitrary) time_left's. time_left = 3. * (1. - percent_done) / ( delta + inner_wrapper.prev_delta + inner_wrapper.prev_prev_delta) if time_left > 99999999.0: time_left = 99999999.0 print( '\rPercent Done: {:0>5.2f}%. Approx. Time Remaining: {:0>2} days, ' '{:0>2.0f}:{:0>2.0f}::{:0>4.1f}'.format(100. * percent_done, *convert_to_hms(time_left)), flush=True, end='' ) inner_wrapper.prev_perc = percent_done inner_wrapper.clock_old = now inner_wrapper.prev_prev_delta = max(inner_wrapper.prev_delta, 1.e-5) inner_wrapper.prev_delta = max(delta, 1.e-5) return function(input_time, *args, **kwargs) inner_wrapper.clock_old = clock_old inner_wrapper.prev_delta = prev_delta inner_wrapper.prev_perc = prev_perc inner_wrapper.prev_prev_delta = prev_prev_delta return inner_wrapper return outer_wrapper