# Copyright (c) 2024 Justin Davis (davisjustin302@gmail.com)## MIT License# mypy: disable-error-code="import-untyped"from__future__importannotationsimportcontextlibfromtypingimportTYPE_CHECKINGfromtqdmimporttqdmwithcontextlib.suppress(ImportError):importtensorrtastrtifTYPE_CHECKING:fromtyping_extensionsimportSelf
[docs]classProgressBar(trt.IProgressMonitor):# type: ignore[misc]"""A progress bar for building TensorRT engines."""def__init__(self:Self)->None:"""Initialize the progress bar."""super().__init__()self._progress_bars:dict[str,tqdm]={}self._phase_parents:dict[str,str|None]={}# Track parent relationshipsself._indentation_levels:dict[str,int,]={}# Track indentation levels directlyself._last_steps:dict[str,int]={}# Track last step for each phaseself._interrupted:bool=Falsedef__del__(self:Self)->None:forprogress_barinself._progress_bars.values():progress_bar.close()
[docs]defphase_start(self:Self,phase_name:str,parent_phase:str|None,num_steps:int,)->None:""" Start a new phase. Parameters ---------- phase_name : str The name of the phase. parent_phase : str | None The name of the parent phase, or None if the phase is a root phase. num_steps : int The number of steps in the phase. """try:# Store parent relationshipself._phase_parents[phase_name]=parent_phase# Calculate indentation based on parentcurrent_indent=0ifparent_phaseisnotNoneandparent_phaseinself._indentation_levels:current_indent=self._indentation_levels[parent_phase]+1self._indentation_levels[phase_name]=current_indentself._last_steps[phase_name]=0# Initialize last step counter# Create progress bar with indentationindent=" "*current_indentdesc=f"{indent}{phase_name}"self._progress_bars[phase_name]=tqdm(total=num_steps,desc=desc,leave=False,position=len(self._progress_bars),bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}]",)exceptKeyboardInterrupt:self._interrupted=True
[docs]defstep_complete(self:Self,phase_name:str,step:int)->bool:""" Step in current phase is completed. Parameters ---------- phase_name : str The name of the phase. step : int The step number. Returns ------- bool True if the build should continue, False if it should be interrupted. """try:ifphase_nameinself._progress_bars:last_step=self._last_steps[phase_name]step_diff=step-last_stepifstep_diff>0:self._progress_bars[phase_name].update(step_diff)self._last_steps[phase_name]=stepexceptKeyboardInterrupt:self._interrupted=TruereturnFalsereturnnotself._interrupted
[docs]defphase_finish(self:Self,phase_name:str)->None:"""Finish the current phase."""try:ifphase_nameinself._progress_bars:self._progress_bars[phase_name].close()delself._progress_bars[phase_name]ifphase_nameinself._phase_parents:delself._phase_parents[phase_name]ifphase_nameinself._indentation_levels:delself._indentation_levels[phase_name]ifphase_nameinself._last_steps:delself._last_steps[phase_name]exceptKeyboardInterrupt:self._interrupted=True