o
    "j#                     @   s   d dl Z d dlZd dlmZ ddlmZ g ZdZdZdZ	dZ
dZd	d
 ZG dd dZe ZdddZdd ZedfddZdd Zdd Zdd Zdd Zdd ZdS )    N)
log_helper   )ast_to_source_codeZTRANSLATOR_VERBOSITYZTRANSLATOR_CODE_LEVELd   c                    s    fdd}|S )Nc                     s:   t    | i |W  d    S 1 sw   Y  d S N)	threadingLock)argskwargsfunc c/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/dy2static/logging_utils.pywrapper!   s   
$zsynchronized.<locals>.wrapperr   )r   r   r   r   r   synchronized    s   r   c                   @   s   e Zd ZdZedd Zdd Zedd Zedd	 Z	e	j
d
d	 Z	edd Zej
dd Zedd Zej
dd Zedd Zej
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$S )%TranslatorLoggerz
    class for Logging and debugging during the tranformation from dygraph to static graph.
    The object of this class is a singleton.
    c                 O   s2   t | dstj| g|R i || _d| j_| jS )N	_instanceF)hasattrobject__new__r   _initialized)clsr
   r   r   r   r   r   .   s   
zTranslatorLogger.__new__c                 C   sF   | j rd S d| _ d| _tj| jddd| _d | _d | _d | _d | _d S )NTzDynamic-to-Staticr   z/%(asctime)s %(name)s %(levelname)s: %(message)s)fmt)	r   logger_namer   Z
get_logger_logger_verbosity_level_transformed_code_level_need_to_echo_log_to_stdout_need_to_echo_code_to_stdoutselfr   r   r   __init__5   s   
zTranslatorLogger.__init__c                 C   s   | j S r   )r   r    r   r   r   loggerE   s   zTranslatorLogger.loggerc                 C       | j d ur| j S ttttS r   )r   intosgetenvVERBOSITY_ENV_NAMEDEFAULT_VERBOSITYr    r   r   r   verbosity_levelI      
z TranslatorLogger.verbosity_levelc                 C      |  | || _d S r   )check_levelr   r!   levelr   r   r   r*   P      

c                 C   r$   r   )r   r%   r&   r'   CODE_LEVEL_ENV_NAMEDEFAULT_CODE_LEVELr    r   r   r   transformed_code_levelU   r+   z'TranslatorLogger.transformed_code_levelc                 C   r,   r   )r-   r   r.   r   r   r   r3   \   r0   c                 C      | j d ur| j S dS NF)r   r    r   r   r   need_to_echo_log_to_stdouta      
z+TranslatorLogger.need_to_echo_log_to_stdoutc                 C       t |ttd fsJ || _d S r   )
isinstancebooltyper   )r!   Zlog_to_stdoutr   r   r   r6   g      
c                 C   r4   r5   )r   r    r   r   r   need_to_echo_code_to_stdoutl   r7   z,TranslatorLogger.need_to_echo_code_to_stdoutc                 C   r8   r   )r9   r:   r;   r   )r!   Zcode_to_stdoutr   r   r   r=   r   r<   c                 C   s(   t |ttd fr|}|S td| )NzLevel is not an integer: )r9   r%   r;   	TypeError)r!   r/   rvr   r   r   r-   w   s   zTranslatorLogger.check_levelc                 C   s   |  |}|| jkS r   )r-   r3   r.   r   r   r   has_code_level~   s   

zTranslatorLogger.has_code_levelc                 C   s   |  |}| j|kS )a,  
        Checks whether the verbosity level set by the user is greater than or equal to the log level.
        Args:
            level(int): The level of log.
        Returns:
            True if the verbosity level set by the user is greater than or equal to the log level, otherwise False.
        )r-   r*   r.   r   r   r   has_verbosity   s   

zTranslatorLogger.has_verbosityc                 O   s>   | j j|g|R i | | jr| jd| g|R   d S d S )NzERROR: )r#   errorr6   _output_to_stdoutr!   msgr
   r   r   r   r   rB      s   zTranslatorLogger.errorc                 O   sL   | j dkr"| jj|g|R i | | jr$| jd| g|R   d S d S d S )Nr   z	WARNING: )r*   r#   warningr6   rC   rD   r   r   r   warn   s   
zTranslatorLogger.warnc                 O   s\   |  |r*d| d| }| jj|g|R i | | jr,| jd| g|R   d S d S d S )Nz(Level z) INFO: )rA   r#   infor6   rC   )r!   r/   rE   r
   r   Zmsg_with_levelr   r   r   log   s   
zTranslatorLogger.logc           	      O   s|   |  |r:t|}|tkrd|}nd||}|| }| jj|g|R i | | jr<| jd| g|R   d S d S d S )NzBAfter the last level ast transformer: '{}', the transformed code:
z@After the level {} ast transformer: '{}', the transformed code:
rH   )r@   r   LOG_AllTransformerformatr#   rI   r=   rC   )	r!   r/   ast_nodetransformer_namer
   r   Zsource_codeZ
header_msgrE   r   r   r   log_transformed_code   s   
z%TranslatorLogger.log_transformed_codec                 G   s   | j d | }t||  d S )N )r   print)r!   rE   r
   r   r   r   rC      s   z"TranslatorLogger._output_to_stdoutN)__name__
__module____qualname____doc__r   r   r"   propertyr#   r*   setterr3   r6   r=   r-   r@   rA   rB   rG   rJ   rO   rC   r   r   r   r   r   (   s>    









r   Fc                 C      | t _|t _dS )a  
    Sets the verbosity level of log for dygraph to static graph. Logs can be output to stdout by setting `also_to_stdout`.

    There are two means to set the logging verbosity:

    1. Call function `set_verbosity`

    2. Set environment variable `TRANSLATOR_VERBOSITY`


    **Note**:
    `set_verbosity` has a higher priority than the environment variable.

    Args:
        level(int): The verbosity level. The larger value idicates more verbosity.
            The default value is 0, which means no logging.
        also_to_stdout(bool): Whether to also output log messages to `sys.stdout`.

    Examples:
        .. code-block:: python

            >>> import os
            >>> import paddle

            >>> paddle.jit.set_verbosity(1)
            >>> # The verbosity level is now 1

            >>> os.environ['TRANSLATOR_VERBOSITY'] = '3'
            >>> # The verbosity level is now 3, but it has no effect because it has a lower priority than `set_verbosity`
    N)_TRANSLATOR_LOGGERr*   r6   r/   Zalso_to_stdoutr   r   r   set_verbosity   s   
r[   c                   C      t jS r   )rY   r*   r   r   r   r   get_verbosity      r]   c                 C   rX   )aE  
    Sets the level to print code from specific level Ast Transformer. Code can be output to stdout by setting `also_to_stdout`.

    There are two means to set the code level:

    1. Call function `set_code_level`

    2. Set environment variable `TRANSLATOR_CODE_LEVEL`


    **Note**:
    `set_code_level` has a higher priority than the environment variable.

    Args:
        level(int): The level to print code. Default is 100, which means to print the code after all AST Transformers.
        also_to_stdout(bool): Whether to also output code to `sys.stdout`.

    Examples:
        .. code-block:: python

            >>> import os
            >>> import paddle

            >>> paddle.jit.set_code_level(2)
            >>> # It will print the transformed code at level 2, which means to print the code after second transformer,
            >>> # as the date of August 28, 2020, it is CastTransformer.

            >>> os.environ['TRANSLATOR_CODE_LEVEL'] = '3'
            >>> # The code level is now 3, but it has no effect because it has a lower priority than `set_code_level`

    N)rY   r3   r=   rZ   r   r   r   set_code_level   s    
r_   c                   C   r\   r   )rY   r3   r   r   r   r   get_code_level  r^   r`   c                 O      t j| g|R i | d S r   )rY   rB   rE   r
   r   r   r   r   rB   
     rB   c                 O   ra   r   )rY   rG   rb   r   r   r   rG     rc   rG   c                 O   s   t j| |g|R i | d S r   )rY   rJ   )r/   rE   r
   r   r   r   r   rJ     s   rJ   c                 O   s    t j| ||g|R i | d S r   )rY   rO   )r/   rM   rN   r
   r   r   r   r   rO     s   
rO   )r   F)r&   r   Zpaddle.baser   Z	ast_utilsr   __all__r(   r1   r)   r2   rK   r   r   rY   r[   r]   r_   r`   rB   rG   rJ   rO   r   r   r   r   <module>   s,    
#$