o
    Me                     @   sD   d dl mZ dgZG dd deZe add ZG dd deZdS )	   )	framework	LazyGuardc                   @   sD   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
dS )LazyInitHelperz
    A Helper Context to trigger switching mode between dygraph and static mode,
    and holds the startup program resource.
    c                 C   s   d| _ d | _d| _d S )NF)_state_tracer	_in_guardself r
   FD:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/lazy_init.py__init__   s   
zLazyInitHelper.__init__c                 C   s$   | j rdS t sJ dd| _ dS )zs
        Switch into lazy mode.

        NOTE(dev): This is a very low level API and not exposed for user.
        Nz4LazyInit.enable() is only available in dygraph mode.T)r   r   Z_non_static_moder   r
   r
   r   enable   s   

zLazyInitHelper.enablec                 C   s   | j sdS d| _ dS )zq
        Exit from lazy mode.

        NOTE(dev): This is a very low level API and not exposed for user.
        NFr   r   r
   r
   r   disable+   s   
zLazyInitHelper.disablec                 C   s*   |    | jr	dS tj| _dt_d| _dS )z|
        Switch into lazy mode and set _dygraph_tracer_ with None to convert
        dygraph mode into static mode.
        NT)r   r   r   _dygraph_tracer_r   r   r
   r
   r   	__enter__5   s
   

zLazyInitHelper.__enter__c                 O   s8   |    | js	dS | jdusJ | jt_d| _d| _dS )zC
        Exit from lazy mode and recover _dygraph_tracer_.
        NF)r   r   r   r   r   r	   argskwargsr
   r
   r   __exit__@   s   

zLazyInitHelper.__exit__c                 C   s   | j S Nr   r   r
   r
   r   stateK   s   zLazyInitHelper.stateN)__name__
__module____qualname____doc__r   r   r   r   r   propertyr   r
   r
   r
   r   r      s    
r   c                   C   s   t S r   )_lazy_init_helperr
   r
   r
   r   lazy_init_helperS   s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   z
    LazyGuard is a wrapper interface for nn.Layer, it forwards the construct
    process of user defined Layer. Meanwhile, it provides necessary API to
    trigger EagerParamBase Lazy Initialization and get startup Program.
    c                 C   s   t    dS )a  
        Construct instance from class_obj by Lazy Initializing parameters.

        Examples:
    
            .. code-block:: python

                from paddle import LazyGuard
                from paddle.nn import Linear
                
                with LazyGuard():
                    fc = LazyInit(Linear)(10, 10)

                for param in fc.parameters():
                    param.initialize()
        N)r   r   r   r
   r
   r   r   _   s   zLazyGuard.__enter__c                 O   s   t    d S r   )r   r   r   r
   r
   r   r   r   s   zLazyGuard.__exit__N)r   r   r   r   r   r   r
   r
   r
   r   r   X   s    N) r   __all__objectr   r   r   r   r
   r
   r
   r   <module>   s   <