o
    wi                     @   s@   d dl mZ d dlmZ G dd dejejZG dd dZdS )    )nn)fnc                       s   e Zd Z fddZ  ZS )
MockModulec                    s*   t    tdd| _tdd| _d S )N
   )super__init__r   Linearlayer1layer2self	__class__ `/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/tests/collections/llm/fn/test_mixin.pyr      s   
zMockModule.__init__)__name__
__module____qualname__r   __classcell__r   r   r   r   r      s    r   c                   @   sD   e Z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 )TestFNMixinc                 C   s   t  | _dS )z.
        Setup common test resources.
        N)r   modelr   r   r   r   setup_method   s   zTestFNMixin.setup_methodc                 C   s   | j jdd ddsJ dS )z]
        Test `forall` method returns True when the predicate holds for all modules.
        c                 S      t | tjS N)
isinstancer   Modulemoduler   r   r   <lambda>&       z.TestFNMixin.test_forall_true.<locals>.<lambda>TrecurseNr   forallr   r   r   r   test_forall_true"      zTestFNMixin.test_forall_truec                 C   s   | j jdd ddrJ dS )zf
        Test `forall` method returns False when the predicate does not hold for all modules.
        c                 S   r   r   )r   r   Conv2dr   r   r   r   r   ,   r   z/TestFNMixin.test_forall_false.<locals>.<lambda>Tr    Nr"   r   r   r   r   test_forall_false(   r%   zTestFNMixin.test_forall_falsec                 C   sF   dd }| j j|dd}|j|jfD ]}|jjdk s J dqdS )zF
        Test `map` method applies a function to each module.
        c                 S   s   t | tjr| jjd | S )Ng      ?)r   r   r   weightdatafill_modr   r   r   walk_fn3   s   z%TestFNMixin.test_map.<locals>.walk_fnT	leaf_only   z$Expected all weights to be set to 1.N)r   mapr	   r
   r(   r)   all)r   r-   r   layerr   r   r   test_map.   s
   zTestFNMixin.test_mapc                    s4   d  fdd}| j j|dd  dksJ ddS )	zR
        Test `walk` method traverses each module without modifying them.
        r   c                    s    d7  | S )Nr0   r   r+   
call_countr   r   r-   C   s   z&TestFNMixin.test_walk.<locals>.walk_fnTr.      z7Expected the function to be called on each leaf module.N)r   walk)r   r-   r   r5   r   	test_walk=   s   zTestFNMixin.test_walkc                 C   s,   | j   | j  D ]	}|jrJ dq
dS )zX
        Test `freeze` method sets `requires_grad` to False for all parameters.
        z=Expected all parameters to have `requires_grad` set to False.N)r   freeze
parametersrequires_gradr   paramr   r   r   test_freezeL   s   
zTestFNMixin.test_freezec                 C   s6   | j   | j   | j  D ]	}|jsJ dqdS )zY
        Test `unfreeze` method sets `requires_grad` to True for all parameters.
        z<Expected all parameters to have `requires_grad` set to True.N)r   r:   unfreezer;   r<   r=   r   r   r   test_unfreezeT   s
   

zTestFNMixin.test_unfreezeN)
r   r   r   r   r$   r'   r4   r9   r?   rA   r   r   r   r   r      s    r   N)torchr   nemo.collections.llmr   r   FNMixinr   r   r   r   r   r   <module>   s   