U
    Mh                     @   s4   d Z ddlmZ G dd dZG dd dejZdS )z3Functionality for Python <-> C++ frontend inter-op.    )nnc                   @   s\   e Zd ZdZdd Ze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 )OrderedDictWrappera  A wrapper around a C++ OrderedDict.

    It dynamically evaluates the OrderedDict getter on a bound C++ module, such
    that new changes on the C++ side are picked up. Otherwise accessing e.g.
    ``cpp_module._parameters`` just once would get a frozen copy of the parameters
    at the time of access. ``torch.nn.Module`` accesses ``_parameters`` et al. via ``self.__dict__``
    so using properties does not work.
    c                 C   s   || _ || _d S N)
cpp_moduleattrselfr   r    r	   >/var/www/html/venv/lib/python3.8/site-packages/torch/nn/cpp.py__init__   s    zOrderedDictWrapper.__init__c                 C   s   t | j| jS r   )getattrr   r   r   r	   r	   r
   cpp_dict   s    zOrderedDictWrapper.cpp_dictc                 C   s
   | j  S r   )r   itemsr   r	   r	   r
   r      s    zOrderedDictWrapper.itemsc                 C   s
   | j  S r   )r   keysr   r	   r	   r
   r      s    zOrderedDictWrapper.keysc                 C   s
   | j  S r   )r   valuesr   r	   r	   r
   r   "   s    zOrderedDictWrapper.valuesc                 C   s
   | j  S r   )r   __iter__r   r	   r	   r
   r   %   s    zOrderedDictWrapper.__iter__c                 C   s
   | j  S r   )r   __len__r   r	   r	   r
   r   (   s    zOrderedDictWrapper.__len__c                 C   s   | j |S r   )r   __contains__r   keyr	   r	   r
   r   +   s    zOrderedDictWrapper.__contains__c                 C   s   | j |S r   )r   __getitem__r   r	   r	   r
   r   .   s    zOrderedDictWrapper.__getitem__N)__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   r   r	   r	   r	   r
   r      s   	
r   c                       sL   e Zd ZdZ fddZdddZedd Zejd	d Zd
d Z	  Z
S )ModuleWrapperz\A subclass of ``torch.nn.Module`` that wraps a C++ frontend module and delegates all access.c                    sd   || _ t   t|d| _t|d| _t|d| _t|D ]"}|ds<t	| |t
| j | q<d S )N_parameters_buffers_modules_)r   superr   r   r   r   r    dir
startswithsetattrr   r   	__class__r	   r
   r   5   s    

zModuleWrapper.__init__Tc                 C   sR   |   D ]*}||j|_|jd k	r||jj|j_q|  D ]}||j|_q<| S r   )
parametersdataZ_gradbuffers)r   fnrecurseparambufr	   r	   r
   _applyB   s    
zModuleWrapper._applyc                 C   s   | j jS r   )r   trainingr   r	   r	   r
   r0   P   s    zModuleWrapper.trainingc                 C   s   | j | d S r   )r   train)r   moder	   r	   r
   r0   T   s    c                 C   s
   | j  S r   )r   __repr__r   r	   r	   r
   r3   X   s    zModuleWrapper.__repr__)T)r   r   r   r   r   r/   r   r0   setterr3   __classcell__r	   r	   r&   r
   r   2   s   


r   N)r   Ztorchr   r   Moduler   r	   r	   r	   r
   <module>   s   +