o
    }oi                     @   sF   d dl Z d dlZd dlmZ G dd de jZedkr!e   dS dS )    N)VAEGeneratorc                   @   sh   e Zd 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d Zdd Zdd Zdd ZdS )TestVAEGeneratorz&Unit tests for the VAEGenerator class.c                 C   s"   d| _ d| _t| j | jd| _d S )N      input_resolutioncompression_ratio)r   r   r   	generatorself r   _/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/diffusion/vae/test_autovae.pysetUp   s   zTestVAEGenerator.setUpc                 C   sT   t ddd}| |jd | |jd t ddd}| |jd | |jd dS )zETest that valid initialization parameters set the correct properties.r   r   r   i      N)r   assertEqualr   r   )r   r	   r   r   r   test_initialization_valid   s   z*TestVAEGenerator.test_initialization_validc                 C   s<   |  t tddd W d   dS 1 sw   Y  dS )z;Test that invalid initialization parameters raise an error.i   r   r   N)assertRaisesNotImplementedErrorr   r
   r   r   r   test_initialization_invalid(   s   "z,TestVAEGenerator.test_initialization_invalidc                 C   sL   | j  }dd| j| jf}| |j| | |jtj | |jj	d dS )zNTest that _generate_input produces a tensor with the correct shape and device.      cudaN)
r	   _generate_inputr   r   shapedtypetorchfloat16devicetype)r   input_tensorexpected_shaper   r   r   test_generate_input-   s
   
z$TestVAEGenerator.test_generate_inputc                 C   s\   t jt jddt j t jdd}tdd | D }| j|}| 	|| dS )z>Test that _count_parameters correctly counts model parameters.
         c                 s   s    | ]
}|j r| V  qd S N)requires_gradnumel).0pr   r   r   	<genexpr>8   s    z9TestVAEGenerator.test_count_parameters.<locals>.<genexpr>N)
r   nn
SequentialLinearReLUsum
parametersr	   _count_parametersr   )r   modelexpected_param_countparam_countr   r   r   test_count_parameters5   s   *z&TestVAEGenerator.test_count_parametersc                 C   s*   | j  }h d}| t| | dS )z@Test that _load_base_json_skeleton returns the correct skeleton.>   act_fn_class_namein_channelssample_sizeforce_upcastout_channels_name_or_pathscaling_factorup_block_typeslatent_channelsnorm_num_groupsdown_block_typeslayers_per_block_diffusers_versionblock_out_channelsN)r	   _load_base_json_skeletonr   setkeys)r   skeletonexpected_keysr   r   r   test_load_base_json_skeleton<   s   
z-TestVAEGenerator.test_load_base_json_skeletonc                 C   sp   ddgddgd}| j |}ddddddddddddg}| t|t| |D ]}| || q-dS )zITest that _generate_all_combinations generates all possible combinations.r         r   )rB   r?   N)r	   _generate_all_combinationsr   lenassertIn)r   attrcombinationsexpected_combinationscombor   r   r   test_generate_all_combinationsR   s   z/TestVAEGenerator.test_generate_all_combinationsc                 C   s   dgd dgd g dddd}| j |}| |d |d  | |d	 |d	  | |d
 |d
  | |d |d  | |d |d  dS )zJTest that _assign_attributes correctly assigns attributes to the skeleton.DownEncoderBlock2DrL   UpDecoderBlock2D)@         i   rK   r   )rA   r>   rD   rB   r?   rA   r>   rD   rB   r?   N)r	   _assign_attributesr   )r   choicerH   r   r   r   test_assign_attributes`   s   z'TestVAEGenerator.test_assign_attributesc                 C   sF   | j  }h d}| t| | | tdd | D  dS )zATest that _search_space_16x1024 returns the correct search space.>   r>   r?   rA   rB   rD   c                 s   s    | ]}t |tV  qd S r%   )
isinstancelist)r(   vr   r   r   r*   {   s    z=TestVAEGenerator.test_search_space_16x1024.<locals>.<genexpr>N)r	   _search_space_16x1024r   rF   rG   
assertTrueallvalues)r   search_spacerI   r   r   r   test_search_space_16x1024p   s   
 z*TestVAEGenerator.test_search_space_16x1024c                 C   s   ddddddddddd	dg}| j j|d
d g d}dd |D }| || | j j|dd g d}dd |D }| || | j j|dd g d}dd |D }| || dS )zOTest that _sort_data_in_place correctly sorts data based on the specified mode.r"   d   )
param_diffcuda_mem_diffr$   2         F   abs_param_diff)mode)rj   r$   rl   r"   c                 S      g | ]}|d  qS rg   r   r(   itemr   r   r   
<listcomp>       z<TestVAEGenerator.test_sort_data_in_place.<locals>.<listcomp>abs_cuda_mem_diff)rk   ri   rm   rf   c                 S   rp   )rh   r   rr   r   r   r   rt      ru   msec                 S   rp   rq   r   rr   r   r   r   rt      ru   N)r	   _sort_data_in_placer   )r   dataexpected_order_paramactual_order_paramexpected_order_memactual_order_memexpected_order_mseactual_order_mser   r   r   test_sort_data_in_place}   s"   z(TestVAEGenerator.test_sort_data_in_placec                 C   s@   |  t | jjddd W d   dS 1 sw   Y  dS )zLTest that search_for_target_vae raises an error when no budget is specified.r   )parameters_budgetcuda_max_memN)r   
ValueErrorr	   search_for_target_vaer
   r   r   r   "test_search_for_target_vae_invalid   s   "z3TestVAEGenerator.test_search_for_target_vae_invalidN)__name__
__module____qualname____doc__r   r   r   r!   r5   rJ   rT   r\   re   r   r   r   r   r   r   r      s    
r   __main__)unittestr   autovaer   TestCaser   r   mainr   r   r   r   <module>   s    	