blob: 6a368979aee04fc796f3ca069abb51ad8b375cfe [file] [log] [blame]
# SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the License); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an AS IS BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Description:
# Contains various utility functions used across the codebase.
from __future__ import annotations
import collections
import inspect
def progress_print(
enabled: bool,
message: str,
progress_counter: int = -1,
progress_total: int | collections.abc.Sized = 0,
progress_granularity: float = 0.20,
):
"""Print progress information.
:param enabled: boolean indicating whether message should be printed.
:param message: message to be printed
:param progress_counter: the value of the incremental counter that indicates the progress
:param progress_total: integer value or sized data structure to use to extract the total number of elements that
progress is measured against
:param progress_granularity: floating point percentage indicating how often progress information should be printed
:param enable_context: boolean used to indicate whether context information should be printed with the message
Example
-------
def example_function(verbose_progress: bool = True):
a_list = [x for x in range(101)]
for index, value in a:
progress_print(verbose_progress,
message="Processing",
progress_counter=index,
progress_total=a_list,
progress_granulrity=0.25,
enable_context=True)
**Output**
Processing 0/100
Processing 25/100
Processing 50/100
Processing 75/100
Processing 100/100
"""
if not enabled:
return
context_str = ""
# Get calling function name
context_str = inspect.stack()[1].function
context_str += ": " if message else ""
display_total = progress_total
# If a sized collection is provided, extract its size to use as progress total
if isinstance(progress_total, collections.abc.Sized):
progress_total = len(progress_total)
display_total = progress_total - 1
# Print progress information with "counter/total" information
if progress_counter > -1 and progress_total > 0 and 0 < progress_granularity < 1:
# Extract progress frequency and ensure it is not equal to 0 (avoid zero division)
progress_frequency = int(progress_total * progress_granularity)
progress_frequency = progress_frequency if progress_frequency else 1
# Check whether information should be printed based on computed progress frequency
if (
progress_counter % progress_frequency == 0 and progress_counter <= progress_total - progress_frequency
) or progress_counter == display_total:
print(f"{context_str}{message} {progress_counter}/{display_total}")
return
print(f"{context_str}{message}")