Source code for gana.utils.decorators
"""Decorators for functions"""
import logging
import time
from functools import wraps
[docs]
def once(func):
"""Ensures the function is executed only once"""
def wrapper(*args, **kwargs):
if not hasattr(wrapper, "has_run"):
wrapper.has_run = True
return func(*args, **kwargs)
return wrapper
[docs]
def timer(
logger: logging.Logger, kind: str = None, with_return=True, level=logging.INFO
):
"""
Logs execution time and optionally shows a full computation using function arguments and result.
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
# returns the result if successful, else False
result = func(*args, **kwargs)
elapsed = time.time() - start
if result:
if kind == 'generate-mps':
msg = f"📝 Generated {result}.mps"
if kind == 'generate-solution':
msg = f"📝 Generated Solution object for {result}. See .solution"
if kind == 'generate-ppopt':
msg = "📝 Generated MPLP. See .formulation"
if kind == 'generate-gurobi':
msg = "📝 Generated gurobipy model. See .formulation"
if kind == 'solve-mpqp':
msg = "✅ Solved MPLP using PPOPT. See .solution"
if kind == 'optimize':
msg = f"✅ {result[0]} optimized using {result[1]}. Display using .output()"
logger.log(
level,
f"{msg:<75} ⏱ {elapsed:.4f} s",
)
if with_return:
return result
return wrapper
return decorator