o
    i                     @   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	   I/home/ubuntu/veenaModal/venv/lib/python3.10/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   
   | j  S r   )r   itemsr   r	   r	   r
   r         
zOrderedDictWrapper.itemsc                 C   r   r   )r   keysr   r	   r	   r
   r      r   zOrderedDictWrapper.keysc                 C   r   r   )r   valuesr   r	   r	   r
   r   "   r   zOrderedDictWrapper.valuesc                 C   r   r   )r   __iter__r   r	   r	   r
   r   %   r   zOrderedDictWrapper.__iter__c                 C   r   r   )r   __len__r   r	   r	   r
   r   (   r   zOrderedDictWrapper.__len__c                 C      | j |S r   )r   __contains__r   keyr	   r	   r
   r   +      zOrderedDictWrapper.__contains__c                 C   r   r   )r   __getitem__r   r	   r	   r
   r   .   r   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 ur||jj|j_q|  D ]}||j|_q| S r   )
parametersdata_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
   r5   P   s   zModuleWrapper.trainingc                 C   s   | j | d S r   )r   train)r   moder	   r	   r
   r5   T   s   c                 C   r   r   )r   __repr__r   r	   r	   r
   r8   X   r   zModuleWrapper.__repr__)T)r   r   r   r   r   r4   r    r5   setterr8   __classcell__r	   r	   r*   r
   r!   2   s    


r!   N)r   torchr   r   Moduler!   r	   r	   r	   r
   <module>   s   +