ó
    Eñi§%  ã                   ó~  • S r SSKrSSKrSSKJr  SSKJrJrJrJ	r	J
r
  SSKJrJr  SSKrSSKJs  Jr   SSKr\" S5      r\	" S5      r\(       a  \" S\S	9S
\4S j5       rOS
\4S jrS\\\4   S
\\\4   4S jrS\S\\R8                     4   S\S\S
\R8                  4S jrS\\\4   S
\\\4   4S jr " S S5      rS\R@                  RB                  RD                  S\#\R8                     S\S
\
\R8                  \$\R8                  S4   4   4S jr%S\S
\#\   4S jr&S\R8                  S
\'4S jr( " S S5      r)S\S \S!\*S\S
\4
S" jr+ " S# S$\R@                  RX                  5      r-S%\S&\S\S \S'\*S(\*S
\4S) jr.S\\\4   S
\\\4   4S* jr/S+\S,\\\4   S
\\\4   4S- jr0S\
\R8                  \'4   S
\'4S. jr1S/\R8                  S0\R8                  S1\S
S4S2 jr2S\\\4   S3\S
\\\4   4S4 jr3S5\$\S4   S6\#\   S
\$\S4   4S7 jr4S5\$\S4   S6\#\   S8\$\S4   S
\$\S4   4S9 jr5g! \ a    Sr GNf = f):a«  
This module contains utility functions that are explicitly allowed to be called during
TorchDynamo compilation. These functions are carefully vetted to ensure they work
correctly within the TorchDynamo tracing and compilation process.

Key functionality groups:

- Compilation State:
  Functions for checking compilation state (is_compiling)

- Function Wrapping:
  Utilities for wrapping functions (wrap_inline, wrap_numpy) to work with
  TorchDynamo compilation

- Autograd Hooks:
  Functions and classes for handling autograd hooks and backward passes
  (call_hook, FakeBackwardCFunction, etc.)

- Tensor Operations:
  Utility functions for tensor operations and transformations
é    N)ÚCallable)ÚAnyÚOptionalÚTYPE_CHECKINGÚTypeVarÚUnion)Ú
deprecatedÚ	ParamSpecÚ_PÚ_Rze`torch._dynamo.external_utils.is_compiling` is deprecated. Use `torch.compiler.is_compiling` instead.)ÚcategoryÚreturnc                  ó>   • [         R                  R                  5       $ ©N©ÚtorchÚcompilerÚis_compiling© ó    ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_dynamo/external_utils.pyr   r   ,   s   € ô
 �~‰~×*Ñ*Ó,Ð,r   c                  ó>   • [         R                  R                  5       $ )zT
Indicates whether we are tracing/compiling with torch.compile() or torch.export().
r   r   r   r   r   r   5   s   € ô �~‰~×*Ñ*Ó,Ð,r   Úfnc                 ó–   ^ • [         R                  " T 5      S[        R                  S[        R                  S[
        4U 4S jj5       nU$ )z;
Create an extra frame around fn that is not in skipfiles.
ÚargsÚkwargsr   c                  ó   >• T" U 0 UD6$ r   r   ©r   r   r   s     €r   ÚinnerÚwrap_inline.<locals>.innerC   s   ø€ á�4Ð"˜6Ñ"Ð"r   ©Ú	functoolsÚwrapsr   r   r   r   )r   r   s   ` r   Úwrap_inliner$   >   sD   ø€ ô
 ‡_‚_�RÓð#”R—W‘Wð #¬¯	©	ð #´bö #ó ð#ð €Lr   Úhook.r   r   c                 ó`   • U " U6 nUc  US   $ UR                  S5      S:X  a  [        S5      eU$ )z:
Used by compiled autograd to handle hook returning None.
r   Ú	hook_typeÚpost_acc_grad_hookz5Tensor post accumulate grad hooks should return None.)ÚgetÚRuntimeError)r%   r   r   Úresults       r   Ú	call_hookr,   J   s>   € ñ �4ˆ[€FØ�~Ø�A‰wˆØ	�‰�KÓ	 Ð$8Ó	8ÜÐRÓSÐSØ€Mr   Úfc                 óÄ   ^ • [         (       d  T $ [        R                  " T 5      S[        R                  S[        R
                  S[        R                  4U 4S jj5       nU$ )z…Decorator that turns a function from ``np.ndarray``s to ``np.ndarray``s into a function
from ``torch.Tensor``s to ``torch.Tensor``s.
r   r   r   c                  ó¶   >• [         R                  " [        R                  S X45      u  pT" U 0 UD6n[         R                  " [        R
                  S U5      $ )Nc                 ó"   • U R                  5       $ r   )Únumpy©Úxs    r   Ú<lambda>Ú*wrap_numpy.<locals>.wrap.<locals>.<lambda>b   s
   €  A§G¡G¤Ir   c                 ó.   • [         R                  " U 5      $ r   )r   Ú	as_tensorr2   s    r   r4   r5   g   s   € ¼%¿/º/È!Ô:Lr   )ÚpytreeÚtree_map_onlyr   ÚTensorÚnpÚndarray)r   r   Úoutr-   s      €r   ÚwrapÚwrap_numpy.<locals>.wrap_   sN   ø€ ä×+Ò+Ü�L‰LÑ-°¨~ó
‰ˆñ �Ð ˜Ñ ˆä×#Ò#¤B§J¡JÑ0LÈcÓRÐRr   )r;   r"   r#   r   r   r   r8   ÚPyTree)r-   r>   s   ` r   Ú
wrap_numpyrA   X   sW   ø€ ÷ Š2Øˆä‡_‚_�QÓðS”B—G‘Gð S¤r§y¡yð S´V·]±]ö Só ðSð €Kr   c                   ó’   • \ rS rSrS\R
                  R                  R                  S\\R                     SS4S jr
S\S\4S jrS	rg)
ÚFakeBackwardCFunctionél   ÚrealÚsaved_tensorsr   Nc                 ó   • Xl         X l        g r   ©rE   rF   )ÚselfrE   rF   s      r   Ú__init__ÚFakeBackwardCFunction.__init__m   s   € ð
 Œ	Ø*Õr   Únamec                 óˆ   • US:X  a'  [         R                  " S[        5        U R                  $ [	        U R
                  U5      $ )NÚsaved_variablesz4'saved_variables' is deprecated; use 'saved_tensors')ÚwarningsÚwarnÚDeprecationWarningrF   ÚgetattrrE   )rI   rL   s     r   Ú__getattr__Ú!FakeBackwardCFunction.__getattr__u   s<   € ØÐ$Ó$Ü�MŠMØFÜ"ôð ×%Ñ%Ð%ä�t—y‘y $Ó'Ð'r   rH   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚautogradÚfunctionÚBackwardCFunctionÚlistr:   rJ   Ústrr   rS   Ú__static_attributes__r   r   r   rC   rC   l   sO   † ð+à�n‰n×%Ñ%×7Ñ7ð+ð ˜EŸL™LÑ)ð+ð 
ô	+ð( ð (¨÷ (r   rC   Úbackward_c_functionrF   c                 ó†   • [        X5      nUR                  R                  " U/UQ76 n[        U[        5      (       d  U4nU$ r   )rC   Ú_forward_clsÚbackwardÚ
isinstanceÚtuple)r_   rF   r   ÚfakeÚgradss        r   Úcall_backwardrg   €   sC   € ô
 !Ð!4ÓD€DØ×Ñ×&Ò& tÐ3¨dÒ3€Eä�eœU×#Ñ#Ø�ˆà€Lr   r3   c                 óv   • [        U [        5      (       a  [        U 5      $ [        U [        5      (       a  U $ U /$ r   )rc   rd   r\   r2   s    r   Únormalize_as_listri   Ž   s1   € Ü�!”U×ÑÜ�A‹wˆÜ	�A”t×	Ñ	ØˆØˆ3€Jr   c                 ó>   • U R                  5       R                  5       $ r   )Úuntyped_storageÚsizer2   s    r   Úuntyped_storage_sizerm   –   s   € Ø×ÑÓ×#Ñ#Ó%Ð%r   c                   óŽ   • \ rS rSr\S\\/ S4      S\/ S4   SS4S j5       r\S\\/ S4      SS4S j5       r\S
S j5       r	S	r
g)ÚFakeCompiledAutogradEngineéš   Úfinal_callbacksNÚcbr   c                 ó&   • U R                  U5        g r   )Úappend)rq   rr   s     r   Úqueue_callbackÚ)FakeCompiledAutogradEngine.queue_callback›   s   € ð 	×Ñ˜rÕ"r   c                 óˆ   • SnU[        U 5      :  a!  X   nU" 5         US-  nU[        U 5      :  a  M!  U R                  5         g )Nr   é   )ÚlenÚclear)rq   Úirr   s      r   Úexec_final_callbacksÚ/FakeCompiledAutogradEngine.exec_final_callbacks¡   sG   € àˆØ”#�oÓ&Ó&Ø Ñ#ˆBÙŒDØ�‰FˆAð ”#�oÓ&Õ&ð 	×ÑÕr   c                  ó   • g r   r   r   r   r   Ú_exec_final_callbacks_stubÚ5FakeCompiledAutogradEngine._exec_final_callbacks_stubª   s   € àr   r   )r   N)rU   rV   rW   rX   Ústaticmethodr\   r   ru   r|   r   r^   r   r   r   ro   ro   š   s‡   † Øð#Ø˜h r¨4 xÑ0Ñ1ð#Ø7?ÀÀDÀÑ7Ið#à	ó#ó ð#ð
 ð ¨d°8¸BÀ¸HÑ3EÑ.Fð  È4ó  ó ð ð óó ór   ro   Úbw_stateÚ	hook_namec                 ó$   • [        X5      " U0 UD6$ r   ©rR   )r‚   rƒ   r   r   s       r   Úcall_hook_from_backward_stater†   ¯   s   € ô �8Ô'¨Ð8°Ñ8Ð8r   c            	       óÀ   • \ rS rSrSr\S\S\R                  S\	S\4   S\R                  4S j5       r
\S\S	\R                  S\\R                  S
4   4S j5       rSrg
)Ú_ApplyBackwardHookéµ   z÷Custom autograd function that applies a hook during backward.

This is used to implement register_hook on intermediate tensors without
requiring compiled autograd. The hook function is captured in the context
and applied during the backward pass.
ÚctxÚtensorÚhook_fn.r   c                 ó0   • X l         UR                  U5      $ r   )rŒ   Úview_as)rŠ   r‹   rŒ   s      r   ÚforwardÚ_ApplyBackwardHook.forward½   s   € ð
 ŒØ�~‰~˜fÓ%Ð%r   ÚgradNc                 ó6   • U R                  U5      nUc  UnUS 4$ r   )rŒ   )rŠ   r‘   r+   s      r   rb   Ú_ApplyBackwardHook.backwardÅ   s$   € à—‘˜TÓ"ˆØ‰>ØˆFØ�tˆ|Ðr   r   )rU   rV   rW   rX   Ú__doc__r�   r   r   r:   r   r�   rd   rb   r^   r   r   r   rˆ   rˆ   µ   s‡   † ñð ð&Øð&ØŸ,™,ð&Ø19¸#¸s¸(Ñ1Cð&à	�‰ó&ó ð&ð ð�cð  §¡ð °%¸¿¹ÀdÐ8JÑ2Kó ó ór   rˆ   Ú_r+   Ú
hooks_nameÚmodule_namec                ód   • [        X$5      n[        X#5      nU H  nU" Xa/UQ76 n	U	c  M  U	nM     U$ r   r…   )
r•   r+   r‚   r–   r—   r   ÚmoduleÚhooksr%   Ú
new_results
             r   Ú%call_module_hooks_from_backward_staterœ   Í   sC   € ô �XÓ+€FÜ�HÓ)€EÛˆÙ˜&Ð0¨4Ò0ˆ
ØÓ!ØŠFñ ð €Mr   c                 ó–   ^ • [         R                  " T 5      S[        R                  S[        R                  S[
        4U 4S jj5       nU$ )Nr   r   r   c                  óp   >• [         R                  R                  5       (       a  [        S5      eT" U 0 UD6$ )NzHNon-recursive torch.compiler.disable is not supported with torch.export.)r   r   Úis_exportingr*   r   s     €r   Únonrecursive_disable_wrapperÚFget_nonrecursive_disable_wrapper.<locals>.nonrecursive_disable_wrapperÝ   s8   ø€ ä�>‰>×&Ñ&×(Ñ(ÜØZóð ñ �4Ð"˜6Ñ"Ð"r   r!   )r   r    s   ` r   Ú get_nonrecursive_disable_wrapperr¢   Ú   sE   ø€ ô ‡_‚_�RÓð#¬B¯G©Gð #¼r¿y¹yð #ÌRö #ó ð#ð (Ð'r   rI   Úfuncc                 óh   ^ ^• S[         R                  S[         R                  S[        4UU 4S jjnU$ )z3
Apply self as a ctx manager around a call to func
r   r   r   c                  óN   >• T   T" U 0 UD6sS S S 5        $ ! , (       d  f       g = fr   r   )r   r   r£   rI   s     €€r   r   Ú+wrap_dunder_call_ctx_manager.<locals>.innerî   s   ø€ ÚÙ˜Ð( Ñ(÷ �T�Tús   „–
$©r   r   r   r   )rI   r£   r   s   `` r   Úwrap_dunder_call_ctx_managerr¨   è   s1   ù€ ð)”R—W‘Wð )¬¯	©	ð )´b÷ )ð )ð €Lr   c                 óf   • [        U [        R                  5      (       a  U R                  S5      $ U $ )Nrx   )rc   r   r:   rl   r2   s    r   Úunwrap_maybe_dynamic_intrª   ÷   s&   € Ü�!”U—\‘\×"Ñ"à�v‰v�a‹yÐØ€Hr   Úvariabler‘   Úhas_post_hooksc                 ó˜   • [         R                  R                  R                  R	                  U/X R
                  U5      nUS   U l        g )Nr   )r   Ú_dynamoÚcompiled_autogradÚopsÚAccumulateGradr‘   )r«   r‘   r¬   Úupdated_grads       r   Úcall_accumulate_gradr³   þ   s>   € ô —=‘=×2Ñ2×6Ñ6×EÑEØ	ˆ�Ÿ-™-¨ó€Lð ! ‘O€H…Mr   Úerror_on_graph_breakc                 óÒ   ^ • U(       a0  S[         R                  S[         R                  S[        4U 4S jjnU$ S[         R                  S[         R                  S[        4U 4S jjnU$ )Nr   r   r   c                  óˆ   >• [         R                  R                  S5         T" U 0 UD6sS S S 5        $ ! , (       d  f       g = f)NT©r   r®   r´   r   s     €r   ÚwrapperÚ6wrap_inline_with_error_on_graph_break.<locals>.wrapper  s.   ø€ Ü—‘×3Ñ3°DÕ9Ù˜4Ð* 6Ñ*÷ :×9×9úó	   ¡3³
Ac                  óˆ   >• [         R                  R                  S5         T" U 0 UD6sS S S 5        $ ! , (       d  f       g = f)NFr·   r   s     €r   r¸   r¹     s.   ø€ Ü—‘×3Ñ3°EÕ:Ù˜4Ð* 6Ñ*÷ ;×:×:úrº   r§   )r   r´   r¸   s   `  r   Ú%wrap_inline_with_error_on_graph_breakr¼     sZ   ø€ ö ð	+œ2Ÿ7™7ð 	+¬b¯i©ið 	+¼B÷ 	+ð €Nð		+œ2Ÿ7™7ð 	+¬b¯i©ið 	+¼B÷ 	+ð €Nr   ÚtupÚmasksc                 ó|   • / n[        U5       H!  u  p4U(       a  M  UR                  X   5        M#     [        U5      $ )z|
masks is a list of bools, where True means the corresponding element in tup
is a const value. Filter out the const values.
©Ú	enumeratert   rd   )r½   r¾   r=   Úmask_idxÚmasks        r   Úfilter_out_const_valuesrÄ     s9   € ð
 €CÜ# EÖ*‰ˆßˆtØ�J‰J�s‘}Ö%ñ +ô �‹:Ðr   Úvaluesc                 ó°   • / nSn[        U5       H9  u  pVU(       a  UR                  X%   5        M!  UR                  X   5        US-  nM;     [        U5      $ )zk
masks and values are of same length. For indices where the mask is True, use
the const_values to fill in.
r   rx   rÀ   )r½   r¾   rÅ   r=   ÚidxrÂ   rÃ   s          r   Úinsert_const_values_with_maskrÈ   (  sT   € ð €CØ
€CÜ# EÖ*‰ˆÞØ�J‰J�vÑ'Ö(à�J‰J�s‘xÔ Ø�1‰HŠCñ +ô �‹:Ðr   )6r”   r"   rO   Úcollections.abcr   Útypingr   r   r   r   r   Útyping_extensionsr	   r
   r   Útorch.utils._pytreeÚutilsÚ_pytreer8   r1   r;   ÚModuleNotFoundErrorr   r   ÚFutureWarningÚboolr   r$   r:   r,   rA   rC   rY   rZ   r[   r\   rd   rg   ri   Úintrm   ro   r]   r†   ÚFunctionrˆ   rœ   r¢   r¨   rª   r³   r¼   rÄ   rÈ   r   r   r   Ú<module>rÔ      sv  ðñó, Û Ý $ß ?Õ ?ß 3ã ß $Ð $ðÛñ ˆtƒ_€ÙˆTƒ]€æñ ØoØñð-˜$ó -ó	ñ-ð
-˜$ô -ð	�H˜R ˜VÑ$ð 	¨°"°b°&Ñ)9ô 	ðØ
�3˜ §¡Ñ.Ð.Ñ
/ðØ8;ðØGJðà
‡\�\ôð�(˜2˜r˜6Ñ"ð  x°°B°Ñ'7ô ÷((ñ (ð(ØŸ™×0Ñ0×BÑBðà˜Ÿ™Ñ%ðð ðð ˆ5�<‰<˜˜uŸ|™|¨SÐ0Ñ1Ð1Ñ2ô	ð˜ð   c¡ô ð&˜EŸL™Lð &¨Sô &÷ñ ð*9Øð9Øð9Ø*-ð9Ø9<ð9àô9ô˜Ÿ™×0Ñ0ô ð0	Ø
ð	Øð	Ø #ð	Ø/2ð	Ø@Cð	ØRUð	àô	ð(¨°"°b°&Ñ)9ð (¸hÀrÈ2ÀvÑ>Nô (ð
 sð 
°(¸2¸r¸6Ñ2Bð 
ÀxÐPRÐTVÐPVÑGWô 
ð  e§l¡l°CÐ&7Ñ 8ð ¸Sô ð$Ø�l‰lð$Ø"'§,¡,ð$Ø@Dð$à	ô$ðØ��R�ÑðØ04ðàˆb�"ˆfÑôð*	  s¨C x¡ð 	¸¸d¹ð 	ÈÈcÐSVÈhÉô 	ðØ	ˆs�Cˆx‰ðØ!% d¡ðØ5:¸3À¸8±_ðà
ˆ3�ˆ8�_õøðK ó Ø	ƒBðús   µH0 È0H<È;H<