o
    ãÊi°S  ã                   @   s†   d dl Z d dlmZ d dlZd dlm  mZ d dlm	Z	 d dl
mZmZ G dd„ de jƒZG dd„ de jƒZed	krAe  ¡  dS dS )
é    N)Úpatch)Úskip_if_no_cuda)ÚTorchAOBaseTensorÚtorch_version_at_leastc                   @   s   e Zd Zdd„ ZdS )ÚTestTorchVersionc              
   C   sh   g d¢}|D ]+\}}}t d|ƒ t|ƒ}|  ||d|› d|› ¡ W d   ƒ n1 s,w   Y  qd S )N))ú2.5.0a0+git9f17037ú2.5.0F)r   ú2.4.0T)ú2.5.0.dev20240708+cu121r   F)r
   r	   T)r   r	   T)r   r   T)r	   r	   T)r	   r   Fztorch.__version__zFailed for torch.__version__=z, comparing with )r   r   ÚassertEqual)ÚselfÚ
test_casesÚtorch_versionÚcompare_versionÚexpected_resultÚresult© r   úC/home/ubuntu/.local/lib/python3.10/site-packages/test/test_utils.pyÚtest_torch_version_at_least   s   ýý€ÿz,TestTorchVersion.test_torch_version_at_leastN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s    r   c                   @   sv   e Zd Zdd„ Zdd„ Zeƒ dd„ ƒZeƒ 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S )ÚTestTorchAOBaseTensorc                 C   sd   G dd„ dt ƒ}tj dd¡}|  td¡ tj ||jƒ¡|_W d   ƒ d S 1 s+w   Y  d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z<TestTorchAOBaseTensor.test_print_arg_types.<locals>.MyTensorc                 S   s   |j }tj | |¡S ©N)ÚshapeÚtorchÚTensorÚ_make_wrapper_subclass)ÚclsÚdatar   r   r   r   Ú__new__+   s   zDTestTorchAOBaseTensor.test_print_arg_types.<locals>.MyTensor.__new__c                 S   s
   || _ d S r   )r   )r   r   r   r   r   Ú__init__/   s   
zETestTorchAOBaseTensor.test_print_arg_types.<locals>.MyTensor.__init__N)r   r   r   r    r!   r   r   r   r   ÚMyTensor*   s    r"   é
   Ú	arg_types)r   r   ÚnnÚLinearÚassertRaisesRegexÚNotImplementedErrorÚ	ParameterÚweight)r   r"   Úlr   r   r   Útest_print_arg_types)   s
   "ÿz*TestTorchAOBaseTensor.test_print_arg_typesc              	      s&  ˆ j  ¡ }tˆ dƒrˆ jD ]}tˆ |ƒd ur| |¡ qˆ j ¡ }tˆ dƒr8ˆ jD ]}tˆ |ƒd ur7| |¡ q)ˆ  ¡ \}}‡ fdd„|D ƒ}	ˆ  	¡ }
ˆ  
¡ }tˆ ƒ |	||
|¡}|D ]}|  t tˆ |ƒt||ƒ¡¡ q[|D ]}|  tˆ |ƒt||ƒ¡ qo|  t ˆ j|j¡¡ |  ˆ j|j¡ ˆ jtjdd}ˆ jtjdd}ˆ j}ˆ  d¡‰ |  ˆ jjd¡ ˆ  |¡‰ |  ˆ j|¡ tˆ ƒ}ˆ  ¡ ‰ tjj ˆ ¡‰ ˆ  ¡ }|D ]}|  t t||ƒtˆ |ƒ¡¡ qÒ|D ]}|  t||ƒtˆ |ƒ¡ qæ|D ]%}tˆ |ƒ}| dd	¡ ¡ }| dd	¡}tˆ ||ƒ |   tˆ |ƒ !¡ ¡ q÷ˆ  ¡ }|D ]}|  t||ƒ !¡ ¡ q#|D ]}|  t||ƒtˆ |ƒ¡ q3|  "ˆ jd d |jd d ¡ |D ]}|  t||ƒtˆ |ƒ¡ qUˆ  #|¡ |D ]}|  t tˆ |ƒt||ƒ¡¡ ql|D ]}|  t||ƒtˆ |ƒ¡ qd S )
NÚoptional_tensor_data_namesÚoptional_tensor_attribute_namesc                    s   i | ]}|t ˆ |ƒ“qS r   )Úgetattr)Ú.0Úname©Ú	lp_tensorr   r   Ú
<dictcomp>J   s    ÿzDTestTorchAOBaseTensor._test_default_impls_helper.<locals>.<dictcomp>Úcuda)Údevice)Úlayoutr6   r   é   )$Útensor_data_namesÚcopyÚhasattrr-   r/   ÚappendÚtensor_attribute_namesr.   Ú__tensor_flatten__ÚsizeÚstrideÚtypeÚ__tensor_unflatten__Ú
assertTruer   Úequalr   ÚqdataÚattrÚ_get_to_kwargsÚstridedr6   ÚtoÚstrÚdetachÚopsÚatenÚaliasÚcloneÚ	transposeÚ
contiguousÚsetattrÚassertFalseÚis_contiguousÚassertNotEqualÚcopy_)r   r3   Úlp_tensor_for_copyÚall_tensor_data_namesÚtensor_data_nameÚall_tensor_attribute_namesÚtensor_attribute_namer9   Útensor_attributesÚtensor_data_dictÚ
outer_sizeÚouter_strideÚreconstructedÚ_Úoriginal_deviceÚlp_tensor_cloneÚtensorÚlp_tensor_tr   r2   r   Ú_test_default_impls_helper;   s¸   



€



€
ÿÿþÿþ

þÿþ
þ þ
þÿþÿz0TestTorchAOBaseTensor._test_default_impls_helperc                 C   sh   G dd„ dt ƒ}tj dd¡}tj ||jddƒ¡|_|j}tj dd¡j}||ddƒ}|  ||¡ dS )z¡Making sure some common functions has default implementations, such as
        __tensor_unflatten__, __tensor_flatten__, _apply_fn_to_data, __repr__, to
        c                   @   s*   e Zd ZdgZddgZdd„ Zdd„ ZdS )	z:TestTorchAOBaseTensor.test_default_impls.<locals>.MyTensorrE   rF   r6   c                 S   s2   |j }|d u r
|j}d|i}tjj| |fi |¤ŽS ©Nr6   ©r   r6   r   r   r   )r   rE   rF   r6   r   Úkwargsr   r   r   r    Æ   ó
   zBTestTorchAOBaseTensor.test_default_impls.<locals>.MyTensor.__new__c                 S   s   || _ || _d S r   )rE   rF   ©r   rE   rF   r6   r   r   r   r!   Í   s   
zCTestTorchAOBaseTensor.test_default_impls.<locals>.MyTensor.__init__N©r   r   r   r9   r=   r    r!   r   r   r   r   r"   Â   s
    r"   é   é   rF   N)r   r   r%   r&   r)   r*   rf   )r   r"   r+   r3   Úanother_tensorrW   r   r   r   Útest_default_impls¼   s   z(TestTorchAOBaseTensor.test_default_implsc                 C   s´   G dd„ dt ƒ}tj dd¡}||jdd d ƒ}tj dd¡}||jdd d ƒ}|  ||¡ tj dd¡}||jdd t |j¡ƒ}tj dd¡}||jdd t |j¡ƒ}|  ||¡ d S )Nc                   @   s4   e Zd ZdgZddgZdgZd
dd„Zd
dd	„ZdS )z]TestTorchAOBaseTensor.test_default_impls_with_optional_data.<locals>.MyTensorWithOptionalDatarE   rF   r6   Ú
zero_pointNc                 S   s2   |j }|d u r
|j}d|i}tjj| |fi |¤ŽS rg   rh   )r   rE   rF   r6   rq   r   ri   r   r   r   r    á   rj   zeTestTorchAOBaseTensor.test_default_impls_with_optional_data.<locals>.MyTensorWithOptionalData.__new__c                 S   s   || _ || _|| _d S r   )rE   rF   rq   )r   rE   rF   r6   rq   r   r   r   r!   è   s   
zfTestTorchAOBaseTensor.test_default_impls_with_optional_data.<locals>.MyTensorWithOptionalData.__init__r   )r   r   r   r9   r=   r-   r    r!   r   r   r   r   ÚMyTensorWithOptionalDataÜ   s    
rr   rm   rn   rF   )r   r   r%   r&   r*   rf   Ú
zeros_like©r   rr   r+   r3   rW   r   r   r   Ú%test_default_impls_with_optional_dataÚ   s   ÿÿz;TestTorchAOBaseTensor.test_default_impls_with_optional_datac                 C   s°   G dd„ dt ƒ}tj dd¡}||jdd d d}tj dd¡}||jdd d d}|  ||¡ tj dd¡}||jdd d dd}tj dd¡}||jdd d dd}|  ||¡ d S )	Nc                   @   s<   e Zd ZdgZddgZdgZdgZddd„Z	dd	d
„ZdS )z]TestTorchAOBaseTensor.test_default_impls_with_optional_attr.<locals>.MyTensorWithOptionalDatarE   rF   r6   rq   Úoptional_attrNc                 S   s2   |j }|d u r
|j}d|i}tjj| |fi |¤ŽS rg   rh   )r   rE   rF   r6   rq   rv   r   ri   r   r   r   r      rj   zeTestTorchAOBaseTensor.test_default_impls_with_optional_attr.<locals>.MyTensorWithOptionalData.__new__c                 S   s   || _ || _|| _|| _d S r   )rE   rF   rq   rv   )r   rE   rF   r6   rq   rv   r   r   r   r!     s   
zfTestTorchAOBaseTensor.test_default_impls_with_optional_attr.<locals>.MyTensorWithOptionalData.__init__)NN)	r   r   r   r9   r=   r-   r.   r    r!   r   r   r   r   rr     s    
ÿrr   rm   rn   rF   )rq   Úvalue)rq   rv   )r   r   r%   r&   r*   rf   rt   r   r   r   Ú%test_default_impls_with_optional_attrÿ   s"   
ÿÿÿz;TestTorchAOBaseTensor.test_default_impls_with_optional_attrc                    sÞ   ddi‰ G dd„ dt ƒ}|j}|j}|tjjjjgƒ|tj	gƒ‡ fdd„ƒƒ}tj
 dd¡}tj
 ||j ¡ d	d
ƒ¡|_t dd¡}t 	||j|j¡ |  ˆ d dd¡ |t dd¡ƒ}tjjj |¡ |  ˆ d dd¡ d
S )zYEnsure a function decorated with both @_implements and @_implements_torch_function works.Úcallsr   c                   @   sF   e Zd ZdgZddgZd	dejdefdd„Zd	dejdefdd„Z	dS )
zSTestTorchAOBaseTensor.test_implements_and_torch_function_together.<locals>.MyTensorrE   rF   r6   Nc                 S   sL   i }|d u r	|j }||d< |j|d< tjj| |jfi |¤Ž}||_||_|S )Nr6   Údtype)r6   rz   r   r   r   r   rE   rF   )r   rE   rF   r6   ri   Úrr   r   r   r    2  s   
z[TestTorchAOBaseTensor.test_implements_and_torch_function_together.<locals>.MyTensor.__new__c                 S   ó   d S r   r   rk   r   r   r   r!   =  ó   z\TestTorchAOBaseTensor.test_implements_and_torch_function_together.<locals>.MyTensor.__init__)rF   N)
r   r   r   r9   r=   r   r   rJ   r    r!   r   r   r   r   r"   .  s
    r"   c                    ó   ˆ d  d7  < d S ©Nry   r8   r   ©ÚfuncÚtypesÚargsri   ©Úcounterr   r   Úfake_linearC  s   zVTestTorchAOBaseTensor.test_implements_and_torch_function_together.<locals>.fake_linearrm   rn   rF   Né   r8   z.Expected fake_linear to be called via F.linearz4Expected fake_linear to be called via aten.t.default)r   Ú
implementsÚimplements_torch_functionr   rL   rM   ÚtÚdefaultÚFÚlinearr%   r&   r)   r*   rK   ÚrandnÚbiasr   )r   r"   rˆ   r‰   r†   r+   ÚxÚmtr   r„   r   Ú+test_implements_and_torch_function_together*  s&   

ÿ
ÿzATestTorchAOBaseTensor.test_implements_and_torch_function_togetherc                    sî   ddi‰ G dd„ dt ƒ}| tjjjjg¡‡ fdd„ƒ}G dd„ d|ƒ}|t d	d
¡dƒ}|t d	d
¡dƒ}tjjj ||gd¡ |  ˆ d d¡ | tjjj	jg¡dd„ ƒ}|  
t¡ tjjj	 |¡ W d   ƒ d S 1 spw   Y  d S )NÚparentr   c                   @   ó(   e Zd ZdgZdgZdd„ Zdd„ ZdS )z6TestTorchAOBaseTensor.test_subclassing.<locals>.ParentrE   rF   c                 S   ó    t j | |j¡}||_||_|S r   ©r   r   r   r   rE   rF   ©r   rE   rF   r{   r   r   r   r    `  ó   z>TestTorchAOBaseTensor.test_subclassing.<locals>.Parent.__new__c                 S   r|   r   r   ©r   rE   rF   r   r   r   r!   f  r}   z?TestTorchAOBaseTensor.test_subclassing.<locals>.Parent.__init__Nrl   r   r   r   r   ÚParent\  ó
    rš   c                    r~   ©Nr“   r8   r   r€   ©Úcountersr   r   Ú
parent_cati  ó   z:TestTorchAOBaseTensor.test_subclassing.<locals>.parent_catc                   @   ó   e Zd ZdgZdgZdS )z5TestTorchAOBaseTensor.test_subclassing.<locals>.ChildrE   rF   N©r   r   r   r9   r=   r   r   r   r   ÚChildm  ó    
r£   rm   rn   ÚaÚbr8   c                 S   r|   r   r   r€   r   r   r   Úparent_reluy  s   z;TestTorchAOBaseTensor.test_subclassing.<locals>.parent_relu)r   rˆ   r   rL   rM   Úcatr‹   rŽ   r   ÚreluÚassertRaisesÚRuntimeError)r   rš   rŸ   r£   Út1Út2r§   r   r   r   Útest_subclassingY  s   
"ÿz&TestTorchAOBaseTensor.test_subclassingc                    s–   ddi‰ G dd„ dt ƒ}| tjjjjg¡‡ fdd„ƒ}G dd„ d|ƒ}|t d	d
¡dƒ}|t d	d
¡dƒ}tjjj ||gd¡ |  ˆ d d¡ d S )Nry   r   c                   @   r”   )zCTestTorchAOBaseTensor.test_subclassing_with_real_op.<locals>.ParentrE   rF   c                 S   r•   r   r–   r—   r   r   r   r    ˆ  r˜   zKTestTorchAOBaseTensor.test_subclassing_with_real_op.<locals>.Parent.__new__c                 S   r|   r   r   r™   r   r   r   r!   Ž  r}   zLTestTorchAOBaseTensor.test_subclassing_with_real_op.<locals>.Parent.__init__Nrl   r   r   r   r   rš   „  r›   rš   c                    r~   r   r   r€   r„   r   r   rŸ   ‘  r    zGTestTorchAOBaseTensor.test_subclassing_with_real_op.<locals>.parent_catc                   @   r¡   )zBTestTorchAOBaseTensor.test_subclassing_with_real_op.<locals>.ChildrE   rF   Nr¢   r   r   r   r   r£   •  r¤   r£   rm   rn   r¥   r¦   r8   ©	r   rˆ   r   rL   rM   r¨   r‹   rŽ   r   )r   rš   rŸ   r£   r¬   r­   r   r„   r   Útest_subclassing_with_real_op  s   z3TestTorchAOBaseTensor.test_subclassing_with_real_opc           	         s"  dddœ‰ G dd„ dt ƒ}| tjjjjg¡‡ fdd„ƒ}G dd„ d|ƒ}| tjjjjg¡‡ fd	d
„ƒ}|t dd¡dƒ}|t dd¡dƒ}tjjj ||gd¡ |  ˆ d d¡ |  ˆ d d¡ |t dd¡dƒ}|t dd¡dƒ}tjjj ||gd¡ |  ˆ d d¡ |  ˆ d d¡ d S )Nr   )r“   Úchildc                   @   r”   )z7TestTorchAOBaseTensor.test_op_overwrite.<locals>.ParentrE   rF   c                 S   r•   r   r–   r—   r   r   r   r    §  r˜   z?TestTorchAOBaseTensor.test_op_overwrite.<locals>.Parent.__new__c                 S   r|   r   r   r™   r   r   r   r!   ­  r}   z@TestTorchAOBaseTensor.test_op_overwrite.<locals>.Parent.__init__Nrl   r   r   r   r   rš   £  r›   rš   c                    r~   rœ   r   r€   r   r   r   rŸ   °  r    z;TestTorchAOBaseTensor.test_op_overwrite.<locals>.parent_catc                   @   r¡   )z6TestTorchAOBaseTensor.test_op_overwrite.<locals>.ChildrE   rF   Nr¢   r   r   r   r   r£   ´  r¤   r£   c                    r~   )Nr±   r8   r   r€   r   r   r   Ú	child_cat¸  r    z:TestTorchAOBaseTensor.test_op_overwrite.<locals>.child_catrm   rn   r¥   r¦   r“   r8   r±   r¯   )	r   rš   rŸ   r£   r²   Úp1Úp2Úc1Úc2r   r   r   Útest_op_overwrite   s"   
z'TestTorchAOBaseTensor.test_op_overwritec                    sÀ   dddœ‰ G dd„ dt ƒ}| tjjjjg¡‡ fdd„ƒ}G dd„ dt ƒ}| tjjjjg¡‡ fd	d
„ƒ}G dd„ d||ƒ}|t d¡dƒ}tjjj |¡ |  ˆ d d¡ |  ˆ d d¡ d S )Nr   )ÚAÚBc                   @   r”   )z:TestTorchAOBaseTensor.test_multiple_inheritance.<locals>.Ar¥   r¦   c                 S   r•   r   ©r   r   r   r   r¥   r¦   ©r   r¥   r¦   r{   r   r   r   r    Ó  r˜   zBTestTorchAOBaseTensor.test_multiple_inheritance.<locals>.A.__new__c                 S   r|   r   r   ©r   r¥   r¦   r   r   r   r!   Ù  r}   zCTestTorchAOBaseTensor.test_multiple_inheritance.<locals>.A.__init__Nrl   r   r   r   r   r¸   Ï  r›   r¸   c                    r~   ©Nr¸   r8   r   r€   r   r   r   Úa_negÜ  r    z>TestTorchAOBaseTensor.test_multiple_inheritance.<locals>.a_negc                   @   r”   )z:TestTorchAOBaseTensor.test_multiple_inheritance.<locals>.Br¥   r¦   c                 S   r•   r   rº   r»   r   r   r   r    ä  r˜   zBTestTorchAOBaseTensor.test_multiple_inheritance.<locals>.B.__new__c                 S   r|   r   r   r¼   r   r   r   r!   ê  r}   zCTestTorchAOBaseTensor.test_multiple_inheritance.<locals>.B.__init__Nrl   r   r   r   r   r¹   à  r›   r¹   c                    r~   ©Nr¹   r8   r   r€   r   r   r   Úb_negí  r    z>TestTorchAOBaseTensor.test_multiple_inheritance.<locals>.b_negc                   @   r¡   )z:TestTorchAOBaseTensor.test_multiple_inheritance.<locals>.Cr¥   r¦   Nr¢   r   r   r   r   ÚCñ  r¤   rÁ   rn   r   r8   ©	r   rˆ   r   rL   rM   Únegr‹   rŽ   r   )r   r¸   r¾   r¹   rÀ   rÁ   rŠ   r   r   r   Útest_multiple_inheritanceÌ  s   
z/TestTorchAOBaseTensor.test_multiple_inheritancec           
         s’  ddddœ‰ G dd„ dt ƒ}| tjjjjg¡‡ fdd„ƒ}G dd„ dt ƒ}| tjjjjg¡‡ fd	d
„ƒ}G dd„ d||ƒ}| tjjjjg¡‡ fdd„ƒ}|t d¡dƒ}tjjj |¡ |  ˆ d d¡ |  ˆ d d¡ |  ˆ d d¡ |t d¡dƒ}tjjj |¡ |  ˆ d d¡ |  ˆ d d¡ |  ˆ d d¡ |t d¡dƒ}	tjjj |	¡ |  ˆ d d¡ |  ˆ d d¡ |  ˆ d d¡ d S )Nr   )r¸   r¹   rÁ   c                   @   r”   )zNTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.Ar¥   r¦   c                 S   r•   r   rº   r»   r   r   r   r      r˜   zVTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.A.__new__c                 S   r|   r   r   r¼   r   r   r   r!     r}   zWTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.A.__init__Nrl   r   r   r   r   r¸   þ  r›   r¸   c                    r~   r½   r   r€   r   r   r   r¾     r    zRTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.a_negc                   @   r”   )zNTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.Br¥   r¦   c                 S   r•   r   rº   r»   r   r   r   r      r˜   zVTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.B.__new__c                 S   r|   r   r   r¼   r   r   r   r!     r}   zWTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.B.__init__Nrl   r   r   r   r   r¹     r›   r¹   c                    r~   r¿   r   r€   r   r   r   rÀ     r    zRTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.b_negc                   @   r¡   )zNTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.Cr¥   r¦   Nr¢   r   r   r   r   rÁ      r¤   rÁ   c                    r~   )NrÁ   r8   r   r€   r   r   r   Úc_neg$  r    zRTestTorchAOBaseTensor.test_multiple_inheritance_with_child_override.<locals>.c_negrn   r   r8   rÂ   )
r   r¸   r¾   r¹   rÀ   rÁ   rÅ   r¥   r¦   Úcr   r   r   Ú-test_multiple_inheritance_with_child_overrideû  s2   zCTestTorchAOBaseTensor.test_multiple_inheritance_with_child_overrideN)r   r   r   r,   rf   r   rp   ru   rx   r’   r®   r°   r·   rÄ   rÇ   r   r   r   r   r   (   s      

$
*/(,/r   Ú__main__)ÚunittestÚunittest.mockr   r   Útorch.nn.functionalr%   Ú
functionalrŒ   Útorchao.testing.utilsr   Útorchao.utilsr   r   ÚTestCaser   r   r   Úmainr   r   r   r   Ú<module>   s       ÿ