§
    Ÿ²Åja)  ã                   óR  — d dl Z d dlZd dlmZmZmZmZ d dlZd dlm	c m
Z d dlmZ d dlmZmZmZmZmZ d dlmZ ej        j        j        Zd„ Zd„ Zd„ Zd	„ Zd
„ Zdeeeef                  deeeej        ef                  fd„Z	 	 	 	 	 ddej        defd„Z  G d„ de¦  «        Z!dS )é    N)ÚAnyÚCallableÚListÚUnion)Ú
OpOverload)Ú
FakeTensorÚFakeTensorModeÚMetadataMismatchErrorÚtree_flatten_onlyÚUnsupportedFakeTensorException)ÚTorchDispatchModec                 ó²   ‡— d„ t          t          j        |¦  «        D ¦   «         Št          ˆfd„t          t          j        | ¦  «        D ¦   «         ¦  «        S )Nc                 ó~   — h | ]:}t           j                             |¦  «        ¯!|                     ¦   «         j        ’Œ;S © ©ÚtorchÚ_CÚ_has_storageÚ_typed_storageÚ_cdata©Ú.0Úinps     úMC:\Projects\Historical\venv\Lib\site-packages\torch/_subclasses/fake_utils.pyú	<setcomp>z'outputs_alias_inputs.<locals>.<setcomp>   sM   € ð ð ð àÝŒ8× Ò  Ñ%Ô%ðØ×ÒÑÔÔ#ðð ð ó    c              3   óŒ   •K  — | ]>}t           j                             |¦  «        o|                     ¦   «         j        ‰v V — Œ?d S ©Nr   )r   ÚoutÚinput_storagess     €r   ú	<genexpr>z'outputs_alias_inputs.<locals>.<genexpr>   s`   øè è € ð ð àõ 	Œ×Ò˜cÑ"Ô"ÐT s×'9Ò'9Ñ';Ô';Ô'BÀnÐ'Tðð ð ð ð ð r   ©r   r   ÚTensorÚany)ÚoutputsÚinputsr    s     @r   Úoutputs_alias_inputsr'      ss   ø€ ðð å$¥U¤\°6Ñ:Ô:ðñ ô €Nõ
 ð ð ð ð å$¥U¤\°7Ñ;Ô;ðñ ô ñ ô ð r   c                 ó²   ‡— d„ t          t          j        |¦  «        D ¦   «         Št          ˆfd„t          t          j        | ¦  «        D ¦   «         ¦  «        S )Nc                 ó,   — h | ]}t          |¦  «        ’ŒS r   ©Úidr   s     r   r   z%outputs_are_inputs.<locals>.<setcomp>$   s   € ÐLÐLÐL˜S•�C‘”ÐLÐLÐLr   c              3   ó:   •K  — | ]}t          |¦  «        ‰v V — Œd S r   r*   )r   r   Ú	input_idss     €r   r!   z%outputs_are_inputs.<locals>.<genexpr>%   s.   øè è € ÐXÐX¨�r�#‰wŒw˜)Ð#ÐXÐXÐXÐXÐXÐXr   r"   )r%   r&   r-   s     @r   Úoutputs_are_inputsr.   #   sS   ø€ ØLÐLÕ$5µe´lÀFÑ$KÔ$KÐLÑLÔL€IÝÐXÐXÐXÐXÕ/@ÅÄÈwÑ/WÔ/WÐXÑXÔXÑXÔXÐXr   c                 ó  — t          ¦   «         }t          t          j        | ¦  «        D ]W}t          j                             |¦  «        sŒ"|                     ¦   «         j        }||v r dS |                     |¦  «         ŒXdS )NTF)	Úsetr   r   r#   r   r   r   r   Úadd)r%   Ústoragesr   Ústors       r   Úoutput_alias_each_otherr4   (   s�   € Ý‰uŒu€HÝ ¥¤¨wÑ7Ô7ð ð ˆÝŒx×$Ò$ SÑ)Ô)ð 	ØØ×!Ò!Ñ#Ô#Ô*ˆØ�8ÐÐØ�4�4Ø�Š�TÑÔÐÐØˆ5r   c                 óp  — t          ||¦  «        }t          ||¦  «        }||k    rt          | › d|› d|› �¦  «        ‚t          ||¦  «        }t          ||¦  «        }||k    rt          | › d|› d|› �¦  «        ‚t          |¦  «        }	t          |¦  «        }
|	|
k    rt          | › d|
› d|	› �¦  «        ‚d S )Nz( mismatch in outputs_alias_inputs check ú != z& mismatch in outputs_are_inputs check z, mismatch in outputs_alias_each_other check )r'   r
   r.   r4   )ÚcontextÚreal_outÚreal_inÚfake_outÚfake_inÚ
r_aliasingÚ
f_aliasingÚr_identity_eqÚf_identity_eqÚr_output_alias_each_otherÚf_output_alias_each_others              r   Ú_check_alias_inforB   4   s  € Ý% h°Ñ8Ô8€JÝ% h°Ñ8Ô8€JØ�ZÒÐÝ#ØÐ\Ð\À
Ð\Ð\ÐPZÐ\Ð\ñ
ô 
ð 	
õ ' x°Ñ9Ô9€MÝ& x°Ñ9Ô9€MØ˜Ò%Ð%Ý#ØÐ`Ð`¸mÐ`Ð`ÐQ^Ð`Ð`ñ
ô 
ð 	
õ !8¸Ñ AÔ AÐÝ 7¸Ñ AÔ AÐØ Ð$=Ò=Ð=Ý#Øð Jð JØ(ðJð JØ.GðJð Jñ
ô 
ð 	
ð >Ð=r   c                 óN  — | t           j        j        u s| t           j        j        u r|dv rdt	          |¦  «        v rdS | t           j        j        u s| t           j        j        u r|dv rdt	          |¦  «        v rdS | t           j        j        u r|dv rdt	          |¦  «        v rdS dS )N)é   é   ÚDevicesT)é   é   F)ÚatenÚ#_scaled_dot_product_flash_attentionÚdefaultÚ_flash_attention_forwardÚreprÚ'_scaled_dot_product_efficient_attentionÚ_efficient_attention_forwardÚ#_scaled_dot_product_cudnn_attention)ÚfuncÚidxÚes      r   Úis_sdpa_errorrT   L   s½   € ð •DÔ<ÔDÐDÐDØ•tÔ4Ô<Ð<Ð<à�6ˆMˆMØ�˜a™œÐ Ð àˆtð •DÔ@ÔHÐHÐHØ•tÔ8Ô@Ð@Ð@à�6ˆMˆMØ�˜a™œÐ Ð àˆtà•Ô8Ô@Ð@Ð@Ø�6ˆMˆMØ�˜a™œÐ Ð àˆtØˆ5r   Úten_listÚreturnc                 óê  ‡‡— t          d„ | D ¦   «         d¦  «        }|€| S |j        }|j        j        }|j        }d„ |j                             ¦   «         D ¦   «         }d„ |j                             ¦   «         D ¦   «         }g }| D �]l}t          |t          ¦  «        r|j
        t          j        k    s|                     |¦  «         ŒC|                     |                     ¦   «         ¦  «        }	|	€dn|                     |	¦  «        }
|
€|                     |¦  «         Œ›dŠˆfd„Š ‰|                     ¦   «         ¦  «        }ˆfd„|j        D ¦   «         }ˆfd„|                     ¦   «         D ¦   «         }‰r|                     |¦  «         �Œt          j        g |j        |j        ¬	¦  «        }|                     |
|||¬
¦  «         |                     |                     ¦   «         ¦  «         �Œn|S )ai  
    Attempt to convert fake tensors to a corresponding real tensor with the correct underlying storage by looking up
    the FakeTensorMode meta to real storage mapping. On failure to find the storage mapping, the FakeTensor will
    remain in the list.

    Note: this is not currently optimized (makes copies of the meta converter internal dictionaries)
    c              3   óD   K  — | ]}t          |t          ¦  «        ¯|V — Œd S r   )Ú
isinstancer   )r   Úitems     r   r!   z+try_convert_fake_to_real.<locals>.<genexpr>t   s1   è è € ÐCÐC�$¥j°µzÑ&BÔ&BÐCˆÐCÐCÐCÐCÐCÐCr   Nc                 ó   — i | ]\  }}||“Œ	S r   r   ©r   ÚkÚvs      r   ú
<dictcomp>z,try_convert_fake_to_real.<locals>.<dictcomp>}   s   € ÐKÐKÐK™t˜q !�a˜ÐKÐKÐKr   c                 ó   — i | ]\  }}||“Œ	S r   r   r\   s      r   r_   z,try_convert_fake_to_real.<locals>.<dictcomp>~   s   € ÐHÐHÐH¡D A q˜1˜aÐHÐHÐHr   Fc                 óŽ   •— t          | t          j        ¦  «        s| S ‰s‰n| j                             ¦   «         Š| j        j        S r   )rY   r   ÚSymIntÚnodeÚhas_hintÚhint)ÚsÚunhinteds    €r   Ú
map_symintz,try_convert_fake_to_real.<locals>.map_symint�   s@   ø€ å˜a¥¤Ñ.Ô.ð Ø�Ø'/ÐF�x�x°Q´V·_²_Ñ5FÔ5FˆHØ”6”;Ðr   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   ©r   rf   rh   s     €r   ú
<listcomp>z,try_convert_fake_to_real.<locals>.<listcomp>•   s!   ø€ Ð/Ð/Ð/ !�
�
˜1‘”Ð/Ð/Ð/r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   rj   s     €r   rk   z,try_convert_fake_to_real.<locals>.<listcomp>–   s!   ø€ Ð4Ð4Ð4 A�*�*˜Q‘-”-Ð4Ð4Ð4r   )ÚdtypeÚdevice)Ústorage_offsetÚsizeÚstride)ÚnextÚ	fake_modeÚfake_tensor_converterÚmeta_converterÚ	describerÚstorage_memoÚitemsÚlookup_storagerY   r   Úlayoutr   ÚstridedÚappendÚgetÚuntyped_storagero   Úshaperq   Úemptyrm   rn   Úset_Úclone)rU   Úfake_tensorrs   ru   ÚdescÚstorage_to_keyÚkey_to_real_storager   ÚtÚkeyÚreal_storageÚstor_offsetrp   rq   Ú
new_tensorrh   rg   s                  @@r   Útry_convert_fake_to_realrŒ   h   s3  øø€ õ ØCÐC˜(ÐCÑCÔCÀTñô €Kð ÐØˆàÔ%€IØÔ4ÔC€NØÔ#€DàKÐK ~Ô'B×'HÒ'HÑ'JÔ'JÐKÑKÔK€NØHÐH¨DÔ,?×,EÒ,EÑ,GÔ,GÐHÑHÔHÐØ
€CØð ''ñ ''ˆÝ˜!�ZÑ(Ô(ð 	°´½E¼MÒ0IÐ0IØ�JŠJ�q‰MŒMˆMØà× Ò  ×!2Ò!2Ñ!4Ô!4Ñ5Ô5ˆØ"˜{�t�tÐ0C×0GÒ0GÈÑ0LÔ0LˆØÐØ�JŠJ�q‰MŒMˆMØàˆð	ð 	ð 	ð 	ð 	ð !�j ×!1Ò!1Ñ!3Ô!3Ñ4Ô4ˆØ/Ð/Ð/Ð/ q¤wÐ/Ñ/Ô/ˆØ4Ð4Ð4Ð4¨¯ª©¬Ð4Ñ4Ô4ˆàð 	Ø�JŠJ�q‰MŒMˆMÙå”[ØØ”'Ø”8ð
ñ 
ô 
ˆ
ð
 	�ŠØØ&ØØð	 	ñ 	
ô 	
ð 	
ð 	�
Š
�:×#Ò#Ñ%Ô%Ñ&Ô&Ð&Ñ&à€Jr   Ú TFr8   r:   c                 ó^  — |r"| j         |j         k    rt          |› d�¦  «        ‚t          j                             | ¦  «        r@|                      ¦   «         }|                     ¦   «         }||k    rt          |› d�¦  «        ‚t          j        j                             | |||d¬¦  «         d S )Nz· mismatched requires_grad-ness of outputs. This usually means that you have added autograd support for your operator at a dispatch key other than Autograd, which will lead to problemsz mismatched storage offsetT)Úcheck_sizesÚcheck_stridesÚallow_rhs_unbacked)	Úrequires_gradr
   r   r   r   ro   Ú_primsÚutilsÚcompare_tensor_meta)	r8   r:   r7   ÚsizesÚstridesro   r’   Úr_offsetÚf_offsets	            r   Ú_check_fake_real_tensorsrš   ¬   sÛ   € ð ð ØÔ! XÔ%;Ò;Ð;Ý'Øð /ð /ð /ñô ð õ „x×Ò˜XÑ&Ô&ð PØ×*Ò*Ñ,Ô,ˆØ×*Ò*Ñ,Ô,ˆØ�xÒÐÝ'¨7Ð(NÐ(NÐ(NÑOÔOÐOå	„LÔ×*Ò*ØØØØØð +ñ ô ð ð ð r   c                   ó\   ‡ — e Zd Z	 dddddœdeeegef         df         fˆ fd„Zd	d„Zˆ xZ	S )
ÚCrossRefFakeModeNT)r�   Úcheck_aliasingÚonly_check_ops_with_metaÚignore_op_fnc                óŠ   •— t          ¦   «                              ¦   «          |�|nd„ | _        || _        || _        || _        d S )Nc                 ó   — dS )NFr   )Úfns    r   ú<lambda>z+CrossRefFakeMode.__init__.<locals>.<lambda>Ø   s   € ÀU€ r   )ÚsuperÚ__init__rŸ   r�   r�   rž   )ÚselfrŸ   r�   r�   rž   Ú	__class__s        €r   r¥   zCrossRefFakeMode.__init__Î   sS   ø€ õ 	‰Œ×ÒÑÔÐà(Ð4ˆLˆLÐ:JÐ:Jð 	Ôð +ˆÔØ,ˆÔØ(@ˆÔ%Ð%Ð%r   r   c           	      óZ  — |pi }d }|t           j        j        t           j        j        t           j        j        fv�rC|                      |¦  «        �s-| j        r%t          j	        j
                             |¦  «        �rt          j        j        |j        vrét          j        j        |j        vrÑt          j        j        |j        vr¹ddlm} 	 t'           |¦   «         ¬¦  «        5 }t)          j        t          j        t/          j        |j        d¬¦  «        ||f¦  «        \  }}	t5          j        ¦   «         5   ||i |	¤Ž}d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   n# t8          $ r Y nw xY wd|› d�}
 ||i |¤Ž}|��›t)          j        |¦  «        }t)          j        |¦  «        }t=          |¦  «        t=          |¦  «        k    s,J |
› dt=          |¦  «        › d	t=          |¦  «        › �¦   «         ‚| j        rtA          |
|||f|||	f¦  «         tC          tE          t)          j        |¦  «        t)          j        |¦  «        ¦  «        ¦  «        D ]Ç\  }\  }}tG          |t          j        ¦  «        }|tG          |t          j        ¦  «        k    sJ |
› d
�¦   «         ‚|rx	 tI          ||d| j%        dd¬¦  «         Œk# tL          $ rO}tO          |||¦  «        rY d }~Œ‹t=          |¦  «        dk    r|
› d|› �n	|
› d|› d|› �}tQ          |¦  «        |‚d }~ww xY wŒÈ|S )Nr   )ÚShapeEnv)Ú	shape_envT)Ústatic_shapeszWhen comparing the output of z* on FakeTensor and concrete Tensors, foundz mismatch in number of returns r6   z$ mismatched number of tensor outputs)r–   r—   ro   r’   é   z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: ))rI   Ú
lift_freshrK   Úlift_fresh_copyr�   Úsource_Storage_storage_offsetrŸ   rž   r   Ú_subclassesÚ
fake_implsÚhas_metaÚTagÚdynamic_output_shapeÚtagsÚinplace_viewÚdata_dependent_outputÚ%torch.fx.experimental.symbolic_shapesr©   r	   ÚpytreeÚtree_map_onlyr#   Ú	functoolsÚpartialÚfrom_tensorÚwarningsÚcatch_warningsr   Útree_leavesÚlenr�   rB   Ú	enumerateÚziprY   rš   r�   Ú	ExceptionrT   r
   )r¦   rQ   ÚtypesÚargsÚkwargsÚfake_rr©   rs   Ú	fake_argsÚfake_kwargsr7   ÚrÚr_flatÚf_flatrR   Úr_outÚf_outÚr_is_tenrS   Úerror_messages                       r   Ú__torch_dispatch__z#CrossRefFakeMode.__torch_dispatch__Þ   s¡  € Ø�˜2ˆàˆð
 å”Ô'ÝÔ$Ô,Ý”	Ô7ððñ ð ×%Ò% dÑ+Ô+ñð Ô1ðõ Ô$Ô/×8Ò8¸Ñ>Ô>ñõ ”	Ô.°d´iÐ?Ð?Ý”	Ô&¨d¬iÐ7Ð7Ý”	Ô/°t´yÐ@Ð@ð GÐFÐFÐFÐFÐFðå#¨h¨h©j¬jÐ9Ñ9Ô9ð A¸YÝ-3Ô-AÝœÝ!Ô)¨)Ô*?ÈtÐTÑTÔTØ˜v˜ñ.ô .Ñ*�I˜{õ
 "Ô0Ñ2Ô2ð Að AØ!%  yÐ!@°KÐ!@Ð!@˜ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að AðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Aøøõ 2ð ð ð Ø�ðøøøð¨Dð ð ð ð 	ð ˆD�$Ð!˜&Ð!Ð!ˆØÑÝÔ'¨Ñ*Ô*ˆFÝÔ'¨Ñ/Ô/ˆFÝ�v‘;”;¥#Øñ#ô #ò ð ð àÐXÐX½#¸f¹+¼+ÐXÐXÍ3ÈvÉ;Ì;ÐXÐXñô ð ð Ô"ð Ý!Ø˜Q  v °¸ÀKÐ8Pñô ð õ (1Ý•FÔ& qÑ)Ô)­6Ô+=¸fÑ+EÔ+EÑFÔFñ(ô (ð Jð JÑ#�‘^�e˜Uõ & e­U¬\Ñ:Ô:�Ø¥:Ø�5œ<ñ$ô $ò ð ð àÐCÐCÐCñô ð ð ð JðJÝ0Ø!Ø!Ø"&Ø$(Ô$6Ø+/Ø*.ðñ ô ð ð øõ %ð Jð Jð JÝ(¨¨s°AÑ6Ô6ð %Ø$˜H˜H˜H˜Hõ  # 6™{œ{¨aÒ/Ð/ð  'ÐHÐHÀQÐHÐHÐHà$+Ð!_Ð!_ÐTWÐ!_Ð!_Ð\]Ð!_Ð!_ð &õ
 4°MÑBÔBÈÐIøøøøðJøøøðJð& ˆsy   ÃE/ Ã%AE#Ä7	EÅ E#ÅE	ÅE#ÅE	ÅE#ÅE/ Å#E'Å'E/ Å*E'Å+E/ Å/
E<Å;E<Ê3KË
L'ËL"Ë.4L"Ì"L'r   )r   N)
Ú__name__Ú
__module__Ú__qualname__r   r   r   Úboolr¥   rÒ   Ú__classcell__)r§   s   @r   rœ   rœ   Í   s¢   ø€ € € € € ð CGðAð ØØ!%ðAð Að Aà˜H j \°4Ð%7Ô8¸$Ð>Ô?ðAð Að Að Að Að Að Rð Rð Rð Rð Rð Rð Rð Rr   rœ   )r�   TFTT)"r»   r¾   Útypingr   r   r   r   r   Útorch.utils._pytreer”   Ú_pytreer¹   Ú
torch._opsr   Útorch._subclasses.fake_tensorr   r	   r
   r   r   Útorch.utils._python_dispatchr   Ú_opsÚopsrI   r'   r.   r4   rB   rT   r#   rŒ   rš   rœ   r   r   r   ú<module>rà      sô  ðð Ð Ð Ð Ø €€€Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø !Ð !Ð !Ð !Ð !Ð !ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ;Ð :Ð :Ð :Ð :Ð :ð „z„~Ô€ð	ð 	ð 	ðYð Yð Yð
	ð 	ð 	ð
ð 
ð 
ð0ð ð ð8AØ�5˜ S˜Ô)Ô*ðAà	ˆ%�
˜EœL¨#Ð-Ô
.Ô/ðAð Að Að AðN Ø
ØØØðð ØŒlðàðð ð ð ðBcð cð cð cð cÐ(ñ cô cð cð cð cr   