o
    ̳iB                  
   @   s   d dl Z d dlZd dlmZmZ d dlmZmZmZ d dl	m
Z ededZddee de jfd	d
Zede jfde jdededdfddZddedeegef fddZe jfde jdededdfddZdS )    N)	lru_cachewraps)CallableOptionalTypeVar)distributedT)boundlevelreturnc                 C   sD   t t}| s|t   | dur tt |  } ||  |S )a{  
    Get a logger with a stream handler.

    Args:
        level (Optional[str]): The logging level. See https://docs.python.org/3/library/logging.html#levels for list of levels.

    Example:
        >>> logger = get_logger("INFO")
        >>> logger.info("Hello world!")
        INFO:torchtune.utils._logging:Hello world!

    Returns:
        logging.Logger: The logger.
    N)	logging	getLogger__name__hasHandlers
addHandlerStreamHandlergetattruppersetLevel)r
   logger r   L/home/ubuntu/.local/lib/python3.10/site-packages/torchtune/utils/_logging.py
get_logger   s   

r   r   msgc                 C   s   t | ||d dS )a  
    Logs a message only once. LRU cache is used to ensure a specific message is
    logged only once, similar to how :func:`~warnings.warn` works when the ``once``
    rule is set via command-line or environment variable.

    Args:
        logger (logging.Logger): The logger.
        msg (str): The warning message.
        level (int): The logging level. See https://docs.python.org/3/library/logging.html#levels for values.
            Defaults to ``logging.INFO``.
    r   r   r
   N)log_rank_zeror   r   r   r   log_once)   s   r    c                    s&   t dd fddfdd}|S )z
    Decorator to mark an object as deprecated and print additional message.

    Args:
        msg (str): additional information to print after warning.

    Returns:
        Callable[[T], T]: the decorated object.
       )maxsizec                    sH   t  rt  rt  nd}|dkrd S tj| j d  tdd d S )Nr   z7 is deprecated and will be removed in future versions.    )category
stacklevel)distis_availableis_initializedget_rankwarningswarnr   FutureWarning)objrank)r   r   r   r(   D   s   

zdeprecated.<locals>.warnc                    s   t   fdd}|S )Nc                     s      | i |S Nr   )argskwargs)r*   r(   r   r   wrapperQ   s   z.deprecated.<locals>.decorator.<locals>.wrapper)r   )r*   r/   )r(   )r*   r   	decoratorP   s   zdeprecated.<locals>.decorator)r   )r   r0   r   )r   r(   r   
deprecated9   s   r1   c                 C   s<   t  rt  rt  nd}|dkrdS | j||dd dS )a#  
    Logs a message only on rank zero.

    Args:
        logger (logging.Logger): The logger.
        msg (str): The warning message.
        level (int): The logging level. See https://docs.python.org/3/library/logging.html#levels for values.
            Defaults to ``logging.INFO``.
    r   N   )r"   )r#   r$   r%   r&   log)r   r   r
   r+   r   r   r   r   [   s   
r   r,   )r   )r   r'   	functoolsr   r   typingr   r   r   torchr   r#   typer   strLoggerr   INFOintr   r1   r   r   r   r   r   <module>   s   $&"