Ë
    g^(hÒ  ã                   ó  — d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ  ej(                  e«      Z G d	„ d
«      Zdefd„Zd„ Zd„ Zdej6                  fd„Zdej:                  fd„Zy)a†  
This module provides common utilities and base classes for TorchDynamo backends.

Key components:
- AotAutograd: Base class for implementing AOT (Ahead-of-Time) autograd backends
- Backend utilities for handling:
  - Fake tensor conversion
  - Device/dtype detection from inputs
  - Memory efficient fusion
  - Graph flattening
  - Common compiler configurations

The utilities here are used by various backend implementations to handle
common operations and provide consistent behavior across different backends.
AOT autograd functionality is particularly important as it enables ahead-of-time
optimization of both forward and backward passes.
é    N)Úpatch©Údisable)ÚTensorifyScalarRestartAnalysis)ÚcountersÚdefakeÚflatten_graph_inputs)Úaot_module_simplifiedÚSerializableAOTDispatchCompiler)Ú_disable_current_modesc                   óH   — e Zd Zdd„Zdej
                  j                  fd„Zy)ÚAotAutogradNc                 ó    — d| _         || _        y )NÚcompiler_fn)Ú__name__Úkwargs)Úselfr   s     ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_dynamo/backends/common.pyÚ__init__zAotAutograd.__init__)   s   € Ø%ˆŒØˆ�ó    Úgmc                 ó¦  — |rt         j                  d|«       t        d„ |D «       «      rt        ||| «      S t	        | j
                  j                  d«      «      r! | j
                  d   «       | j
                  d<   t        d   dxx   dz  cc<   d}|r+t         j                  d«       t        d   d	xx   dz  cc<   |S d
„ }| j
                  j                  d«      xs | j
                  d   }t        |t        «      r ||j                  «      |_        n ||«      }|| j
                  d<   | j
                  j                  d«      xs | j
                  d   | j
                  d<   ddlm} ddlm} | j
                  j                  dd «      |k(  rt!        dd«      }	nt#        j$                  «       }		  |«       5  |	5  t'        ||fi | j
                  ¤Ž}
t        d   dxx   dz  cc<   t)        |
«      cd d d «       cd d d «       S # 1 sw Y   nxY wd d d «       y # 1 sw Y   y xY w# t*        $ r ‚ t,        $ r t        d   d	xx   dz  cc<   ‚ w xY w)Nz3aot_autograd-based backend ignoring extra kwargs %sc              3   óR   K  — | ]  }t        |t        t        t        f«      –— Œ! y ­w©N)Ú
isinstanceÚlistÚtupleÚdict)Ú.0Úxs     r   ú	<genexpr>z'AotAutograd.__call__.<locals>.<genexpr>1   s   è ø€ ÒJ°aŒz˜!œd¤E¬4Ð0×1ÑJùs   ‚%'ÚdecompositionsÚaot_autogradÚtotalé   Fz5Unable to use AOT Autograd because graph has mutationÚnot_okc                 ó   ‡ — ˆ fd„}|S )Nc                  ó8   •— t         t        ‰«      | i |¤Ž«      S r   r   )Úargsr   Úbw_compiler_fns     €r   Ú_wrapped_bw_compilerzLAotAutograd.__call__.<locals>.wrap_bw_compiler.<locals>._wrapped_bw_compilerF   s    ø€ äÐ6œw ~Ó6¸ÐGÀÑGÓHÐHr   © )r*   r+   s   ` r   Úwrap_bw_compilerz.AotAutograd.__call__.<locals>.wrap_bw_compilerE   s   ø€ ôIð (Ð'r   Úbw_compilerÚfw_compilerÚinference_compilerr   )Únop)Úenable_aot_loggingz%functorch.compile.config.debug_assertTÚok)ÚlogÚwarningÚanyr	   Úcallabler   Úgetr   Údebugr   r   r   Úfunctorch.compiler1   Útorch._inductor.debugr2   r   Ú
contextlibÚnullcontextr
   r   r   Ú	Exception)r   r   Úexample_inputsr   Úuse_fallbackr-   r.   r1   r2   Úpatch_configÚcgs              r   Ú__call__zAotAutograd.__call__-   s  € ÙÜ�K‰KÐMÈvÔVäÑJ¸>ÔJÔJÜ'ØØØóð ô �D—K‘K—O‘OÐ$4Ó5Ô6Ø,I¨D¯K©KÐ8HÑ,IÓ,KˆD�K‰KÐ(Ñ)ô 	�Ñ  Ó)¨QÑ.Ó)ØˆáÜ�I‰IÐMÔNÜ�^Ñ$ XÓ.°!Ñ3Ó.ØˆIò	(ð —k‘k—o‘o mÓ4ÒR¸¿¹ÀMÑ8Rˆä�kÔ#BÔCÙ&6°{×7NÑ7NÓ&OˆKÕ#á*¨;Ó7ˆKà%0ˆ�‰�MÑ"à�K‰K�O‰OÐ0Ó1ÒO°T·[±[ÀÑ5Oð 	�‰Ð(Ñ)õ 	*Ý<ð �;‰;�?‰?˜=¨$Ó/°3Ò6Ü Ð!HÈ$ÓO‰Lä%×1Ñ1Ó3ˆLð
	á#Ó%ñ # |ñ #Ü*¨2¨~ÑMÀÇÁÑM�Ü˜Ñ(¨Ó.°!Ñ3Ó.Ü˜r“{÷#÷ #÷ #ó #ú÷ #÷ #ñ #ûô .ò 	ØÜò 	Ü�^Ñ$ XÓ.°!Ñ3Ó.Øð	úsH   Æ4H( Æ;HÆ>6HÇ4	HÇ=	H( ÈH	ÈHÈH( ÈH%È!H( È%H( È((I)ÚreturnN)r   Ú
__module__Ú__qualname__r   ÚtorchÚfxÚGraphModulerC   r,   r   r   r   r   (   s   „ óð?˜5Ÿ8™8×/Ñ/ô ?r   r   rD   c                  ó   — t        di | ¤ŽS )Nr,   )r   )r   s    r   r#   r#   o   s   € ÜÑ ˜Ñ Ð r   c                 ó4   — ddl m}m}m} |||dœ}| r||d<   |S )Nr   )Údefault_decompositionsÚ#min_cut_rematerialization_partitionÚ
ts_compile)r/   r.   Úpartition_fnr"   )r:   rL   rM   rN   )Úuse_decompsrL   rM   rN   r   s        r   Úmem_efficient_fusion_kwargsrQ   s   s3   € ÷ñ ð "Ø!Ø;ñ	€Fñ Ø#9ˆÐÑ à€Mr   c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )zg
    Decorator for backends that need real inputs.  We swap out fake
    tensors for zero tensors.
    c                 óŠ   •— t        «       5  t        t        t        |«      «      } ‰| |fi |¤Žcd d d «       S # 1 sw Y   y xY wr   )r   r   Úmapr   )ÚmodelÚinputsr   Úfns      €r   Úwrapperz(fake_tensor_unsupported.<locals>.wrapper�   s>   ø€ ä#Ó%ñ 	/Üœ#œf fÓ-Ó.ˆFÙ�e˜VÑ. vÑ.÷	/÷ 	/ò 	/ús	   Œ#9¹A)Ú	functoolsÚwraps)rW   rX   s   ` r   Úfake_tensor_unsupportedr[   ‡   s'   ø€ ô ‡_�_�RÓó/ó ð/ð
 €Nr   c                 óF   — | D ]  }t        |d«      sŒ|j                  c S  y )NÚdevice)Úhasattrr]   ©r?   r    s     r   Údevice_from_inputsr`   –   s$   € Øò ˆÜ�1�hÕØ—8‘8ŠOñr   c                 óF   — | D ]  }t        |d«      sŒ|j                  c S  y )NÚdtype)r^   rb   r_   s     r   Údtype_from_inputsrc   œ   s$   € Øò ˆÜ�1�gÕØ—7‘7ŠNñr   )Ú__doc__r<   rY   ÚloggingÚunittest.mockr   rG   Útorch._dynamor   Útorch._dynamo.excr   Útorch._dynamo.utilsr   r   r	   Útorch._functorch.aot_autogradr
   r   Útorch.utils._python_dispatchr   Ú	getLoggerr   r4   r   r#   rQ   r[   r]   r`   rb   rc   r,   r   r   ú<module>rm      s‰   ðñó$ Û Û Ý ã Ý !Ý <ß FÑ F÷õ @ð €g×Ñ˜Ó!€÷Dñ DðN!˜kó !òò(ð¨%¯,©,ó ð¨¯©ô r   