Ë
    ÌÓ^jØg  ã                   ó  — d dl Z d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z d dlmZ d dlmZmZ d dlmc mZ d dlmZ d dlZd	„ Zd
„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Z d„ Z!d„ Z"dd„Z#d„ Z$d„ Z%d„ Z&dd„Z'	 	 ddefd„Z(ddefd„Z)y) é    N)ÚTensor)ÚTorchDispatchMode)Útree_mapÚtree_flattenÚtree_unflatten)Ú_pytree)Úpartial)Úno_dispatchÚall_same_mode)ÚCallablec                 ód   — | j                   } || «      } ||«      }||k(  ry t        d|› d�«      ‚)Nz.This operator is not Composite Compliant: the zR of the tensor was modified directly without going through the PyTorch dispatcher.)ÚelemÚRuntimeError)Úwrapper_tensorÚmetadata_nameÚmetadata_accessorr   Úmetadata_wrapper_tensorÚmetadata_elems         úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/testing/_internal/composite_compliance.pyÚcheck_attr_consistencyr      sL   € Ø×Ñ€DÙ/°Ó?ÐÙ% dÓ+€MØ -Ò/ØÜ
Ø
8Øˆ/ð 0ð	1ó2ð 2ó    c                 óî   — t        | |«      sy t        j                  d„ d„ t        j                  t        j                  t        j
                  dœ}|j                  «       D ]  \  }}t        | ||«       Œ y )Nc                 ó   — | j                   S ©N)Údtype©Úxs    r   ú<lambda>z,check_metadata_consistency.<locals>.<lambda>"   s
   € ˜1Ÿ7™7€ r   c                 ó   — | j                   S r   )Údevicer   s    r   r   z,check_metadata_consistency.<locals>.<lambda>#   s
   € ˜AŸH™H€ r   )Úshaper   r    ÚnumelÚstrideÚstorage_offset)Ú
isinstancer   Úsizer"   r#   r$   Úitemsr   )r   ÚCCTÚthings_to_checkr   r   s        r   Úcheck_metadata_consistencyr*      si   € ä�n cÔ*Øä—‘Ù"Ù$Ü—‘Ü—-‘-Ü ×/Ñ/ñ€Oð -<×,AÑ,AÓ,Cò QÑ(ˆÐ(Ü˜~¨}Ð>OÕPñQr   c                 ó2   — | j                   j                  dv S )N>"   ÚtÚimagÚrealÚviewÚ_conjÚaliasÚchunkÚsliceÚsplitÚdetachÚexpandÚhsplitÚnarrowÚselectÚunbindÚunfoldÚvsplitÚmovedimÚpermuteÚsqueezeÚview_asÚdiagonalÚswapaxesÚ	expand_asÚ	transposeÚ	unflattenÚ	unsqueezeÚ
as_stridedÚ_unsafe_viewÚtensor_splitÚview_as_realÚ_reshape_aliasÚview_as_complexÚsplit_with_sizes©ÚoverloadpacketÚ__name__©Úfuncs    r   Ú
is_view_fnrS   +   s    € Ø×Ñ×'Ñ'ð #,ð #ð #r   c                 ó2   — | j                   j                  dv S )N>   Út_Údetach_Úsqueeze_Ú	swapaxes_Ú	swapdims_Ú
transpose_Ú
unsqueeze_Úas_strided_rN   rQ   s    r   Úis_inplace_view_fnr]   S   s    € Ø×Ñ×'Ñ'ð 	,ð 	ð 	r   c                 óš   — | j                   j                  }t        j                  d|«      ryt        j                  d|«      ry|d   dk(  S )Nz__i.+__Tz__.+__FéÿÿÿÿÚ_)rO   rP   ÚreÚmatch)rR   Únames     r   Ú
is_inplacerd   a   sC   € Ø×Ñ×'Ñ'€DÜ	‡x�x�	˜4Ô ØÜ	‡x�x�˜$ÔØØ�‰8�s‰?Ðr   c                 ór   ‡ ‡—  G ˆfd„dt         j                  «      Š G ˆˆ fd„dt        «      }‰ |«       fS )Nc                   ó`   •— e Zd ZU ej                  ed<   dgZed„ «       Zd„ Z	e
dˆ fd„	«       Zy)ú7generate_cct_and_mode.<locals>.CompositeCompliantTensorr   c                 ó6  — t        |«      | u rt        d«      ‚t        j                  j	                  | |j                  «       |j                  |j                  |j                  |j                  |j                  «       |j                  «       ¬«      }|j                  r›t        j                  d|j                  |j                  |j                  d¬«      }|j                  |j                  «       j                  «       |j                  «       |j                  «       |j                  «       ¬«       ||_        n||_        |j                  «       |j                   j                  «       k7  r7t        d|j                  «       › d|j                   j                  «       › �«      ‚t        j"                  j%                  ||j                   j'                  «       «       t        j"                  j)                  ||j                   j+                  «       «       ||_        |S )	NzRWrapping a CompositeCompliantTensor in a CompositeCompliantTensor is not supported)r   Úlayoutr    Úrequires_gradÚstridesr$   © F)r   r    ri   rj   )Úsourcer$   r&   r#   z,Expected r.stride() == r.elem.stride(), got z != )ÚtypeÚAssertionErrorÚtorchr   Ú_make_wrapper_subclassr&   r   ri   r    rj   r#   r$   ÚemptyÚset_Úuntyped_storageÚcloner   Ú_CÚ	_set_conjÚis_conjÚ_set_negÚis_negÚmode)Úclsr   r{   ÚargsÚkwargsÚrÚtmps          r   Ú__new__z?generate_cct_and_mode.<locals>.CompositeCompliantTensor.__new__y   sš  € ä�D‹z˜SÑ Ü$Øhóð ô —‘×3Ñ3Ø�T—Y‘Y“[Ø—j‘j¨¯©Ø—{‘{°$×2DÑ2DØŸ™›°d×6IÑ6IÓ6Kð	 4ó MˆAð ×!Ò!ô —k‘kØØŸ*™*ØŸ;™;ØŸ;™;Ø"'ô�ð —‘Ø×/Ñ/Ó1×7Ñ7Ó9Ø#'×#6Ñ#6Ó#8ØŸ™›ØŸ;™;›=ð	 ô ð �•à�”à�x‰x‹z˜QŸV™VŸ]™]›_Ò,Ü$Ð'SÐTU×T\ÑT\ÓT^ÐS_Ð_cÐde×djÑdj×dqÑdqÓdsÐctÐ%uÓvÐvô
 �H‰H×Ñ˜q !§&¡&§.¡.Ó"2Ô3Ü�H‰H×Ñ˜a §¡§¡£Ô1àˆAŒFØˆHr   c                 ó"   — d| j                   › d�S )NzCompositeCompliantTensor(ú))r   )Úselfs    r   Ú__repr__z@generate_cct_and_mode.<locals>.CompositeCompliantTensor.__repr__¬   s   € Ø.¨t¯y©y¨k¸Ð;Ð;r   Nc                 óÐ   •— t        j                  |i |xs i ¤Ž}t        ˆfd„|D «       «      }t        |«      st	        d«      ‚|d   5   ||i |¤Žcd d d «       S # 1 sw Y   y xY w)Nc              3   óP   •K  — | ]  }t        |‰«      sŒ|j                  –— Œ y ­wr   )r%   r{   )Ú.0ÚeÚCompositeCompliantTensors     €r   ú	<genexpr>z]generate_cct_and_mode.<locals>.CompositeCompliantTensor.__torch_dispatch__.<locals>.<genexpr>²   s   øè ø€ Ò^ Q´jÀÐD\Õ6]˜!Ÿ&�&Ñ^ùs   ƒ&•&z*Multiple CompositeCompliantTensorModes NYIr   )ÚpytreeÚarg_tree_leavesÚtupler   r   )r|   rR   Útypesr}   r~   Úall_argsÚmodesrŠ   s          €r   Ú__torch_dispatch__zJgenerate_cct_and_mode.<locals>.CompositeCompliantTensor.__torch_dispatch__¯   si   ø€ ä×-Ñ-¨tÐF¸ºÀ"ÑFˆHÜÓ^¨(Ô^Ó^ˆEÜ  Ô'Ü"Ð#OÓPÐPØ�q‘ñ -Ù˜TÐ, VÑ,÷-÷ -ò -ús   Á
AÁA%©rl   N)rP   Ú
__module__Ú__qualname__rp   r   Ú__annotations__Ú	__slots__Ústaticmethodr�   r…   Úclassmethodr’   )rŠ   s   €r   rŠ   rg   t   s@   ø… Ø�l‰lÓà�Hˆ	à	ñ0	ó 
ð0	òd	<ð 
ô	-ó 
ñ	-r   rŠ   c                   ó   •— e Zd Zdˆ ˆfd„	Zy)ú;generate_cct_and_mode.<locals>.CompositeCompliantTensorModeNc                 óö  •‡ — ˆfd„}ˆˆ fd„}|t         j                  j                  j                  j                  u rt        d«      ‚|j                  j                  dv rt        |j                  › d�«      ‚t        |«      rA|d   }t        |‰«      s0t        ˆfd„|dd  D «       «      rt        d	|j                  › d
�«      ‚t        ||«      }t        ||«      }	 ||i |	¤Ž}
t        ||
«      }t        |«      rl‰rjt        «       5   ||i |¤Ž}t        |t        t        f«      r(t!        ||d¬«      D ]  \  }}|j#                  |«       Œ n|j#                  |«       d d d «       t        «       5  t%        |«      r ||i |¤Ž d d d «       t'        t(        ‰¬«      }t+        j,                  ||«       t+        j,                  ||«       t+        j,                  ||«       |S # 1 sw Y   Œ„xY w# 1 sw Y   ŒjxY w)Nc                 ó8   •— t        | ‰«      r| j                  S | S r   ©r%   r   )r‰   rŠ   s    €r   Úunwrapz^generate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.unwrapº   s   ø€ Ü!+¨AÐ/GÔ!H�q—v‘vÐOÈaÐOr   c                 óN   •— t        | t        j                  «      r	 ‰| ‰«      S | S r   ©r%   rp   r   )r‰   rŠ   r„   s    €€r   Úwrapz\generate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.wrap½   s$   ø€ Ü<FÀqÌ%Ï,É,Ô<WÑ/°°4Ó8Ð^Ð]^Ð^r   z±.item() is not allowed to be called inside of composite functions in the PyTorch library because not all backends and/or Tensor subclasses (e.g. vmap, ProxyTensor) support them.)rs   Úresize_z; is not allowed to be called inside of Composite operators.r   c              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr   )r%   )rˆ   ÚarŠ   s     €r   r‹   zagenerate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.<genexpr>Ð   s   øè ø€ ÒVÈœJ qÐ*B×CÑVùs   ƒé   z7Not composite compliant: performing in-place operation zŽ where the Tensor being written to is regular Tensor but the other tensors are Tensor Subclasses. Please try to avoid this in-place operation.T©Ústrict)r(   )rp   ÚopsÚatenÚ_local_scalar_denseÚdefaultr   rO   rP   rd   r%   Úanyr   rS   r
   rŽ   ÚlistÚziprs   r]   r	   r*   rŒ   Ú	tree_map_)r„   rR   r�   r}   r~   rŸ   r¢   Úmutated_argumentÚunwrapped_argsÚunwrapped_kwargsÚunwrapped_rsÚrsÚresultr¥   ÚbÚcheckrŠ   Úautograd_view_consistencys   `               €€r   r’   zNgenerate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__¹   s   ù€ ôPõ_ð ”u—y‘y—~‘~×9Ñ9×AÑAÑAÜ"ðVóWð Wð
 ×"Ñ"×+Ñ+Ð/BÑBÜ"Ø—}‘}�oð &+ð ,ó-ð -ô ˜$Ôð $(¨¡7Ð Ü!Ð"2Ð4LÔMÜÓVÈTÐRSÐRTÈXÔVÔVÜ&ØQØŸ=™=˜/ð *GðGóHð Hô & f¨dÓ3ˆNÜ'¨°Ó7ÐÙ ÐDÐ3CÑDˆLÜ˜$ Ó-ˆBä˜$ÔÑ$=ô !“]ñ (ñ " 4Ð2¨6Ñ2�FÜ! &¬5´$¨-Ô8Ü$'¨¨F¸4Ô$@ò &™D˜A˜qØŸF™F 1�Iñ&ð Ÿ™ œ÷#(ô, “ñ *Ü% dÔ+Ù˜$Ð) &Ò)÷*ô Ô6Ð<TÔUˆEÜ×Ñ˜U DÔ)Ü×Ñ˜U FÔ+Ü×Ñ˜U BÔ'ØˆI÷C(ð (ú÷,*ð *ús   ÄAG#Å2G/Ç#G,Ç/G8r“   )rP   r”   r•   r’   )rŠ   r¹   s   €€r   ÚCompositeCompliantTensorModer›   ¸   s	   ø„ ÷J	r   rº   )rp   r   r   )r¹   rº   rŠ   s   ` @r   Úgenerate_cct_and_moder»   j   s7   ù€ öB-¤5§<¡<ô B-÷HKÔ'8ô KðZ $Ñ%AÓ%CÐCÐCr   c                 óÌ   — t        | t        «      st        | t        «      syt        | «      dk(  ryt	        d„ | D «       «      }|ryt	        d„ | D «       «      }|rt        d«      ‚y)NFr   c              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr   r¡   ©rˆ   Úelts     r   r‹   z is_tensorlist.<locals>.<genexpr>  s   è ø€ ÒC¸”j ¤e§l¡l×3ÑCùó   ‚$&Tc              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr   r¡   r¾   s     r   r‹   z is_tensorlist.<locals>.<genexpr>  s   è ø€ ÒI¸cœJ s¬E¯L©L×9ÑIùrÀ   zVThis test assumes that PyTorch APIs cannot take mixed lists of Tensor and other things)r%   r®   rŽ   ÚlenÚallr   )ÚlstÚall_tensorsÚexists_one_tensors      r   Úis_tensorlistrÇ     sh   € Ü�cœ4Ô ¬°C¼Ô)?ØÜ
ˆ3ƒx�1‚}ØÜÑC¸sÔCÓC€KÙØÜÑIÀSÔIÓIÐÙÜð Dó Eð 	Eàr   c                 ó   — |r | |«      S |S r   rl   )ÚfnÚ
should_mapÚargs      r   Ú	maybe_maprÌ     s   € Ù ‰2ˆc‹7Ð) cÐ)r   c                 ó¬   — t        | t        j                  «      r	 || |«      S t        | «      r| D �cg c]  } |||«      ‘Œ c}S t	        d«      ‚c c}w )Nz*wrap assumes that the input can be wrapped)r%   rp   r   rÇ   r   )rË   r(   Úcct_moder¥   s       r   r¢   r¢     sN   € ä�#”u—|‘|Ô$Ù�3˜Ó!Ð!Ü�SÔØ*-Ö. Q‘�A�xÕ Ò.Ð.Ü
ÐCÓ
DÐDùò /s   ³Ac              #   óp  K  — | D �cg c])  }t        |t        j                  «      xs t        |«      ‘Œ+ }}|D �cg c]  }|rddgndg‘Œ }}t	        j
                  |Ž D ]C  }t        || d¬«      D ��cg c]"  \  }}t        t        t        ||¬«      ||«      ‘Œ$ }	}}|	|f–— ŒE y c c}w c c}w c c}}w ­w)NFTr§   )r(   rÎ   )
r%   rp   r   rÇ   Ú	itertoolsÚproductr¯   rÌ   r	   r¢   )
Ú	flat_argsr(   rÎ   rË   Úis_tensor_likesÚis_tensor_likeÚsubclass_optionsÚwhich_args_are_wrappedÚshould_wrap_argr¶   s
             r   Úgenerate_subclass_choicesrØ   -  sÍ   è ø€ àV_Ö`Ès”z #¤u§|¡|Ó4ÒJ¼ÀcÓ8JÑJÐ`€OÐ`Ø[jÖkÈ©˜ ™¸e¸WÑDÐkÐÐkä"+×"3Ñ"3Ð5EÐ"Fò -Ðô /2Ð2HÈ)Ð\`Ô.a÷cÙ*�o sô œG¤D¨c¸HÔEÀÐX[Õ\ð cˆñ càÐ,Ð,Ó,ñ	-ùò aùÚkùócùs&   ‚B6‡.B&µB6»B+Á(B6Á3'B0ÂB6c              #   ó(  K  — t        |«      \  }}t        | «      t        |«      z   }t        |||«      D ]Y  \  }}|d t        | «       }	t	        |t        | «      d  |«      }
|d t        | «       }t	        |t        | «      d  |«      }|	|
||f–— Œ[ y ­wr   )r   r®   rØ   rÂ   r   )r}   r~   r(   rÎ   Úflat_kwargsÚspecÚflat_args_kwargsÚchoiceÚdebug_metadataÚnew_argsÚ
new_kwargsrÖ   Úwhich_kwargs_are_wrappeds                r   Ú%generate_subclass_choices_args_kwargsrâ   <  s«   è ø€ ä$ VÓ,Ñ€K�Ü˜D“z¤D¨Ó$5Ñ5ÐÜ";Ð<LÈcÐS[Ó"\ò UÑˆ�Ø˜*œ3˜t›9Ð%ˆÜ# F¬3¨t«9¨:Ð$6¸Ó=ˆ
Ø!/°
´°T³Ð!;ÐÜ#1°.ÄÀTÃÀÐ2LÈdÓ#SÐ Ø˜
Ð$:Ð<TÐTÓTñUùs   ‚BBc                 ó"   — t        d|› d�«      | ‚)Nz8Composite compliance check failed with the above error.
a(  If you are adding an OpInfo of an existing operator, please feel free to skip this test because the problem was pre-existing and file an issue. Otherwise, if you added a new operator, please read through the Composite Compliance section in aten/src/ATen/native/README.md for how to resolve this. )r   )ÚerrÚadditional_infos     r   Ú raise_composite_compliance_errorræ   H  s+   € Ü
ð	àÐ
ð	Cð	Có
ð ð
r   c           
      óø   ‡— t        «       \  Š} | |i |¤Ž}t        ||‰|«      D ]*  }|\  }}}	}
	  | |i |¤Ž}ˆfd„} |t	        |«      |«       Œ, y # t        $ r}t        |d|	› d|
› d�«       Y d }~Œ<d }~ww xY w)Nú- wrapped_args: ú
- wrapped_kwargs: ú
c                 ó8   •— t        | ‰«      r| j                  S | S r   rž   ©r‰   r(   s    €r   rŸ   z&check_all_permutations.<locals>.unwrapz  s   ø€ Ü'¨¨3Ô/�1—6‘6Ð6°QÐ6r   )r»   râ   r   ræ   r   )Úopr}   r~   Úassert_equal_fnrÎ   ÚexpectedrÝ   rß   rà   rÖ   rá   Úactualrä   rŸ   r(   s                 @r   Úcheck_all_permutationsrñ   ^  s²   ø€ Ü)Ó+�M€CˆÙ�4Ð"˜6Ñ"€HÜ7¸¸fÀcÈ8ÓTò <ˆØQWÑNˆ�*Ð4Ð6Nð	Ù˜Ð0 ZÑ0ˆFô*	7ñ 	œ ¨Ó0°(Õ;ñ9<øô$ ò 	Ü,ØØ"Ð#9Ð":ð ;%Ø%=Ð$>¸bðB÷ñ ûð	ús   °AÁ	A9ÁA4Á4A9c                 ó   ‡	‡
— t        «       \  Š	Š
ˆ	ˆ
fd„} | |i |¤Ž}t        ||«      }t        ||«      }	 ‰
5   | |i |¤Ž}d d d «       ˆ	fd„} |t        |«      |«       y # 1 sw Y   Œ"xY w# t        $ r}t        |«       Y d }~Œ>d }~ww xY w)Nc                 óN   •— t        | t        j                  «      r	 ‰| ‰«      S | S r   r¡   )r‰   r(   rÎ   s    €€r   r¢   zcheck_with_mode.<locals>.wrapŽ  s"   ø€ Ü#-¨a´·±Ô#>‰s�1�hÓÐEÀAÐEr   c                 ó8   •— t        | ‰«      r| j                  S | S r   rž   rì   s    €r   rŸ   zcheck_with_mode.<locals>.unwrapœ  s   ø€ Ü# A sÔ+ˆq�v‰vÐ2°Ð2r   )r»   r   r   ræ   )rí   r}   r~   rî   r¢   rï   rð   rä   rŸ   r(   rÎ   s            @@r   Úcheck_with_moderõ   ‹  sž   ù€ Ü)Ó+�M€CˆõFñ �4Ð"˜6Ñ"€Hä�D˜$Ó€DÜ�d˜FÓ#€Fð.Øñ 	)Ù˜Ð( Ñ(ˆF÷	)ô3ñ ”H˜V VÓ,¨hÕ7÷	)ð 	)ûô ò .Ü(¨×-Ñ-ûð.ús.   ·A/ ¹	A#ÁA/ Á#A,Á(A/ Á/	BÁ8BÂBc                 óÌ   — g }t        | «      \  } }t        |«      \  }}| |z   } | D ];  }t        |t        j                  «      sŒ|j                  sŒ+|j                  |«       Œ= |S r   )r   r%   rp   r   rj   Úappend)r}   r~   Úleaf_tensorsÚ
_args_specÚ_kwargs_specrË   s         r   Úgather_leaf_tensorsrû   ¡  sm   € Ø€LÜ# DÓ)Ñ€Dˆ*Ü'¨Ó/Ñ€FˆLØ�&‰=€DØò %ˆÜ˜#œuŸ|™|Ô,ØØ×ÓØ×Ñ Õ$ð	%ð
 Ðr   c                 ób  — |€	 | |i |¤Ž}n || g|¢­i |¤Ž}|� ||«      }t        j                  |«      }|D �cg c]  }t        |t        j                  «      sŒ|‘Œ! }}|D �cg c]  }|j
                  sŒ|‘Œ }}t        |«      dk  rt        d«      ‚|D �cg c]8  }t        j                  |j                  |j                  |j                  ¬«      ‘Œ: }	}t        ||«      }
t        |
«      dk  rt        d«      ‚t        j                  j                  ||
|	dd¬«      S c c}w c c}w c c}w )Nr   ú#Expected len(flat_diff_results) > 0©r    r   úExpected len(leaf_tensors) > 0T©Úallow_unusedÚretain_graph)rŒ   Útree_leavesr%   rp   r   rj   rÂ   ro   Úonesr!   r    r   rû   ÚautogradÚgrad)rí   r}   r~   Úoutput_process_fn_gradÚgradcheck_wrapperÚresultsÚflat_resultsr   Úflat_diff_resultsÚgradsrø   s              r   Úcompute_expected_gradsr  ®  s)  € ØÐ Ù�dÐ%˜fÑ%‰á# BÐ8¨Ò8°Ñ8ˆàÐ)Ù(¨Ó1ˆä×%Ñ% gÓ.€LØ+ÖK˜!¬z¸!¼U¿\¹\Õ/J’AÐK€LÐKØ$0ÖD˜q°A·O³OšÐDÐÐDÜ
ÐÓ Ò"ÜÐBÓCÐCàJ[Ö\ÀQŒU�Z‰Z˜Ÿ™¨¯©¸¿¹Ö@Ð\€EÐ\Ü& t¨VÓ4€LÜ
ˆ<Ó˜AÒÜÐ=Ó>Ð>Ü�>‰>×ÑÐ0°,Ø$°4Àdð ó Lð Lùò LùÚDùò ]s   »D"ÁD"Á%D'Á7D'Â=D,rí   c                 óö  ‡— t        «       \  Š}t        | ||||«      }t        ||‰|«      D �]e  }|\  }	}
}}t        |	|
«      }t	        |«      dk  rt        d«      ‚	 |€	 | |	i |
¤Ž}n || g|	¢­i |
¤Ž}|� ||«      }t        j                  «      }|D �cg c]  }t        |t        j                  «      sŒ|‘Œ! }}|D �cg c]  }|j                  sŒ|‘Œ }}t	        |«      dk  rt        d«      ‚|D �cg c]8  }t        j                  |j                  |j                   |j"                  ¬«      ‘Œ: }}t%        |‰|«      D ]M  \  }}	 t        j&                  j)                  |||dd¬	«      }ˆfd„} |t+        t-        |«      «      |d¬«       ŒO �Œh y # t        $ r}t        |d|› d|› d�«       Y d }~�Œ:d }~ww xY wc c}w c c}w c c}w # t        $ r }t        |d|› d|› d
|› d�«       Y d }~Œ†d }~ww xY w)Nr   rÿ   rè   ré   rê   rý   rþ   Tr   z
- wrapped_grads: c                 ó8   •— t        | ‰«      r| j                  S | S r   rž   rì   s    €r   rŸ   z&check_backward_formula.<locals>.unwrapþ  s   ø€ Ü!+¨A¨sÔ!3�q—v‘vÐ:¸Ð:r   ©Ú	equal_nan)r»   r  râ   rû   rÂ   ro   r   ræ   rŒ   r  r%   rp   r   rj   r  r!   r    r   rØ   r  r  rŽ   Úmap)rí   r}   r~   r  r  rî   rÎ   rï   rÝ   rß   rà   rÖ   rá   rø   r	  rä   r
  r   r  r  Úflat_new_gradsÚwhich_grad_is_batchedrð   rŸ   r(   s                           @r   Úcheck_backward_formular  Ì  sS  ø€ ô *Ó+�M€Cˆä% b¨$°Ð8NÐPaÓb€Hä7¸¸fÀcÈ8ÓTó .RˆØQWÑNˆ�*Ð4Ð6NÜ*¨8°ZÓ@ˆÜˆ|Ó Ò!Ü Ð!AÓBÐBð	Ø Ð(Ù˜hÐ5¨*Ñ5‘á+¨BÐH°ÒH¸ZÑH�Ø%Ð1Ù0°Ó9�ô ×)Ñ)¨'Ó2ˆØ#/ÖO˜a´:¸aÄÇÁÕ3NšÐOˆÐOØ(4ÖH 1¸¿»šQÐHÐÐHÜÐ Ó! QÒ&Ü Ð!FÓGÐGð ,ö-Øô —‘˜AŸG™G¨A¯H©H¸A¿G¹GÖDð -ˆð -ä5NÈuÐVYÐ[cÓ5dò 	RÑ1ˆNÐ1ð
ÜŸ™×,Ñ,Ð->ÀÈnØ:>ÈTð -ó S�ô;ñ œE¤# f¨fÓ"5Ó6¸ÈDÖQò!	Rñ=.Røô ò 	Ü,ØØ"Ð#9Ð":ð ;%Ø%=Ð$>¸bðB÷ò ûð	üò PùÚHùò
-øô  ò Ü0ØØ&Ð'=Ð&>ð ?)Ø)AÐ(Bð C(Ø(=Ð'>¸bðB÷ñ ûðúsN   Á!FÂG Â7G ÃGÃGÃ6=G
Å	$GÆ	F=ÆF8Æ8F=Ç	G8ÇG3Ç3G8c                 ó   ‡ ‡‡!‡"‡#‡$— t        d¬«      \  Š!}ˆ!fd„Š#t        ˆ#fd„|D «       «      }t        |«      \  }}t        ˆ#fd„|D «       «      }	t        |	|«      }
t	        j
                  «       5  d„ Š"ˆˆ"ˆ fd„} |||||
«      }t        t        j                  |«      }t        d„ |d	„ ¬
«      }t        d„ |d„ ¬
«      }t        ||‰!|«      D ]ã  }|\  }}}}t        ||
‰!|«      D ]É  }|\  }}}}t        t        ‰"t        ||d¬«      «      «      }|j                  «       D ��ci c]  \  }}| ‰"|||   f«      “Œ }}}	 ‰€	 ‰ |i |¤Ž}n ‰‰ g|¢­i |¤Ž}ˆ!fd„Š$t        t        j                  «      }t        ˆ$fd„|d„ ¬
«      }t        ˆ$fd„|d„ ¬
«      }  |||d¬«        || |d¬«       ŒË Œå 	 d d d «       y c c}}w # t        $ r#}t        |d|› d|› d|› d|› d�	«       Y d }~Œ”d }~ww xY w# 1 sw Y   y xY w)NF)r¹   c                 ó.  •— t        | «      ‰u rt        d«      ‚t        | t        j                  «      r!| j
                  rt        j                  | «      S t        | «      r1| D �cg c]%  }|j
                  rt        j                  |«      nd ‘Œ' c}S y c c}w )NzExpected type(t) is not CCT)rn   ro   r%   rp   r   rj   Ú
randn_likerÇ   )r,   r‰   r(   s     €r   Úmaybe_tangentz/check_forward_ad_formula.<locals>.maybe_tangent  sy   ø€ Ü�‹7�c‰>Ü Ð!>Ó?Ð?ô �aœŸ™Ô&¨1¯?ª?Ü×#Ñ# AÓ&Ð&Ü˜1ÔØNOÖPÈ¨1¯?ª?”E×$Ñ$ QÔ'ÀÑDÒPÐPØùò Qs   Á$*Bc              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   rl   ©rˆ   rË   r  s     €r   r‹   z+check_forward_ad_formula.<locals>.<genexpr>  s   øè ø€ Ò<°™ s×+Ñ<ùó   ƒc              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   rl   r  s     €r   r‹   z+check_forward_ad_formula.<locals>.<genexpr>  s   øè ø€ ÒJ°s¡¨c× 2ÑJùr  c                 óö   — | \  }}t        |t        j                  «      r0|j                  r$t	        j
                  |j                  «       |«      S t        |«      rt        d„ t        ||d¬«      D «       «      S |S )Nc              3   ór   K  — | ]/  \  }}|�$t        j                  |j                  «       |«      n|–— Œ1 y ­wr   )ÚfwADÚ	make_dualr5   )rˆ   ÚpriÚtangs      r   r‹   zDcheck_forward_ad_formula.<locals>.maybe_make_dual.<locals>.<genexpr>%  s<   è ø€ ò QÙ!*  dð DHÐCSœTŸ^™^¨C¯J©J«L¸$Ô?ÐY\Ó\ñ Qùs   ‚57Tr§   )
r%   rp   r   rj   r   r!  r5   rÇ   rŽ   r¯   )ÚdualÚprimalÚtangents      r   Úmaybe_make_dualz1check_forward_ad_formula.<locals>.maybe_make_dual  sn   € ð #‰OˆF�GÜ˜&¤%§,¡,Ô/°F×4HÒ4HÜ—~‘~ f§m¡m£o°wÓ?Ð?Ü˜vÔ&Üñ QÜ.1°&¸'È$Ô.OôQó Qð QàˆMr   c           
      óÚ   •— t        t        ‰	t        | |d¬«      «      «      }|j                  «       D ��ci c]  \  }}| ‰	|||   f«      “Œ }}}‰€ ‰
|i |¤ŽS  ‰‰
g|¢­i |¤ŽS c c}}w )NTr§   )rŽ   r  r¯   r'   )r}   Útangent_argsr~   Útangent_kwargsÚop_argsÚkÚvÚ	op_kwargsr  r'  rí   s           €€€r   Úcompute_expected_gradz7check_forward_ad_formula.<locals>.compute_expected_grad)  sƒ   ø€ ÜœC ´°T¸<ÐPTÔ1UÓVÓWˆGØPV×P\ÑP\ÓP^×_ÉÈÈ1˜™O¨Q°¸qÑ0AÐ,BÓCÑCÐ_ˆIÑ_à Ð(Ù˜7Ð0 iÑ0Ð0Ù$ RÐ?¨'Ò?°YÑ?Ð?ùó	 `s   ¶A'c                 ó   — | j                   S r   ©r%  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>4  s
   € �a—h‘h€ r   c                 ó8   — t        | «      t        j                  u S r   ©rn   r   ÚUnpackedDualTensorr   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>6  ó   € œd 1›g¬×)@Ñ)@Ð@€ r   )Úis_leafc                 ó   — | j                   S r   ©r&  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>9  s
   € �a—i‘i€ r   c                 ó8   — t        | «      t        j                  u S r   r3  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>;  r5  r   Tr§   rè   ré   z
- wrapped_tangent_args: z
- wrapped_tangent_kwargs: rê   c                 ó8   •— t        | ‰«      r| j                  S | S r   rž   rì   s    €r   rŸ   z(check_forward_ad_formula.<locals>.unwrapY  s   ø€ Ü%/°°3Ô%7˜1Ÿ6™6Ð>¸QÐ>r   c                 ó(   •—  ‰| j                   «      S r   r1  ©r   rŸ   s    €r   r   z*check_forward_ad_formula.<locals>.<lambda>^  s   ø€ ™f Q§X¡XÓ.€ r   c                 ó8   — t        | «      t        j                  u S r   r3  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>`  ó   € ¤d¨1£g´×1HÑ1HÐ&H€ r   c                 ó(   •—  ‰| j                   «      S r   r8  r<  s    €r   r   z*check_forward_ad_formula.<locals>.<lambda>c  s   ø€ ™f Q§Y¡YÓ/€ r   c                 ó8   — t        | «      t        j                  u S r   r3  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>e  r>  r   r  )r»   rŽ   r   r   r   Ú
dual_levelr   Úunpack_dualrâ   r  r¯   r'   r   ræ   )%rí   r}   r~   r  rî   rÎ   r)  rÚ   rÛ   Úflat_tangent_kwargsr*  r/  rï   Úexpected_primalsÚexpected_tangentsrÝ   rß   rà   rÖ   rá   Útang_choiceÚnew_tang_argsÚnew_tang_kwargsÚwhich_tang_args_are_wrappedÚwhich_tang_kwargs_are_wrappedr+  r,  r-  r.  rð   rä   Úactual_primalsÚactual_tangentsr(   r'  r  rŸ   s%   `  `                             @@@@r   Úcheck_forward_ad_formularM  
  s|  ý€ Ü)ÀEÔJ�M€Cˆô	ô Ó<°tÔ<Ó<€LÜ$ VÓ,Ñ€K�ÜÓJ¸kÔJÓJÐÜ#Ð$7¸Ó>€Nä	�‰Ó	ñ KTò		ö	@ñ )¨¨|¸VÀ^ÓTˆÜœD×,Ñ,¨hÓ7ˆÜ#ÙØÙ@ô
Ðô
 %ÙØÙ@ô
Ðô <¸DÀ&È#ÈxÓXò )	TˆFØU[ÑRˆH�jÐ"8Ð:Rô  EÀ\ÐSaÐcfÐhpÓqò %T�àQ\ñO�˜Ø/Ð1Nä¤ O´S¸À=ÐY]Ô5^Ó _Ó`�ØU_×UeÑUeÓUg×hÉTÈQÐPQ˜Q¡°°OÀAÑ4FÐ0GÓ HÑHÐh�	ÑhðØ(Ð0Ù!# WÐ!:°	Ñ!:™á!2°2Ð!M¸Ò!MÀ9Ñ!M˜ô?ô "¤$×"2Ñ"2°FÓ;�Ü!)Û.ØÙHô"�ô
 #+Û/ØÙHô#�ñ
   Ð0@ÈDÕQÙ Ð1BÈdÖSñK%Tñ	)	T÷EKTð KTùóV iøô $ò Ü4ØØ*Ð+AÐ*Bð C-Ø-EÐ,Fð G3Ø3NÐ2Oð P5Ø5RÐ4SÐSUðW÷ñ ûðú÷gKTð KTúsJ   Á1B4G4Ä%F?Ä=G4ÅGÅAG4Æ?G4Ç	G1	ÇG,	Ç'G4Ç,G1	Ç1G4Ç4G=)T)Ú )NN)NNN)*rp   r   rÐ   Útorch.utils._python_dispatchr   Útorch.utils._pytreer   r   r   Útorch.utilsr   rŒ   Ú	functoolsr	   Útorch.utils._mode_utilsr
   r   Útorch.autograd.forward_adr  Ú
forward_adr   Úcollections.abcr   ra   r   r*   rS   r]   rd   r»   rÇ   rÌ   r¢   rØ   râ   ræ   rñ   rõ   rû   r  r  rM  rl   r   r   ú<module>rW     s®   ðó Ý Û å :ß FÑ FÝ )Ý ß >ß (Ð (Ý $Û 	ò	2òQò$òP
òó[Dòzò*òEò&	-ò	Uóò,<òZ8ò,
óLð> 37ØCGñ5R˜xó 5Rñ|^T ô ^Tr   