Source code for fluidimage.util.util

"""
Miscellaneous utilities
=======================

Provides:

.. autofunction:: imread

.. autofunction:: print_memory_usage

.. autofunction:: cstring

.. autofunction:: cprint

.. autofunction:: is_memory_full

.. autofunction:: str_short

.. autofunction:: safe_eval

.. autofunction:: format_time_in_seconds

"""

from pathlib import Path

import psutil
from IPython.lib.pretty import pretty
from simpleeval import EvalWithCompoundTypes

from fluiddyn.io.image import imread as _imread
from fluiddyn.io.image import imsave as _imsave
from fluiddyn.util import get_memory_usage
from fluiddyn.util import terminal_colors as term

color_dict = {
    "HEADER": term.HEADER,
    "OKBLUE": term.OKBLUE,
    "OKGREEN": term.OKGREEN,
    "WARNING": term.WARNING,
    "FAIL": term.FAIL,
    "ENDC": term.ENDC,
}


[docs]def imread(path): """Flatten image as a single gray-scale layer and loads as a numpy floating point array. """ if isinstance(path, Path): path = str(path) # pylint: disable=W0703 try: array = _imread(path) except Exception as error: raise type(error)(path).with_traceback(error.__traceback__) return array
def imsave(path, array, **kwargs): "tmp docstring" _imsave(path, array, **kwargs) imsave.__doc__ = _imsave.__doc__ def get_txt_memory_usage(string="Memory usage", color="OKGREEN"): mem = get_memory_usage() cstr = cstring((string + ": ").ljust(30) + f"{mem:.3f} Mb", color=color) return cstr
[docs]def cstring(*args, **kwargs): """Return a coloured string.""" if "color" in kwargs: color = kwargs["color"] else: color = "OKBLUE" cstr = " ".join(args) return color_dict[color] + cstr + color_dict["ENDC"]
[docs]def cprint(*args, **kwargs): """Print with terminal colors.""" cstr = cstring(*args, **kwargs) print(cstr)
[docs]def is_memory_full(): """Checks if available system virtual memory is nearly saturated. Returns ------- type: bool `True` if memory usage > 90 % and available memory < 500 MB. `False` otherwise """ from .log import log_memory_usage mem = psutil.virtual_memory() if mem.percent > 90 or mem.available < 500 * 1024**2: log_memory_usage("Memory full! Current process using", mode="info") return True else: return False
[docs]def str_short(obj): """Give a short str for classes, function, etc.""" try: return obj.__module__ + "." + obj.__name__ except AttributeError: return pretty(obj)
_evaluator = EvalWithCompoundTypes()
[docs]def safe_eval(source): """Save eval with simpleeval""" return _evaluator.eval(source)
[docs]def format_time_in_seconds(duration_in_s): """return a formatted str of the duration""" if duration_in_s < 60: return f"{duration_in_s:.2f} s" hours, remainder = divmod(duration_in_s, 3600) minutes, seconds = divmod(remainder, 60) return f"{int(hours):02}:{int(minutes):02}:{int(seconds):02}"