§
    ŠŠtj(  ã                   óÂ  — d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZm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 ed¦  «        Z  ed¦  «        Z! G d„ d¦  «        Z"de	de"fd„Z#de$de%e&e	f         fd„Z'dee	e(e	         e	ge!f         de	fd„Z)dee	         dej*        fd„Z+dee	         dej,        fd„Z-dS )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)ÚCallableÚIterableÚSequence)ÚAny)Ú	ParamSpecÚTypeVar)Úpatch©Údisable)ÚTensorifyScalarRestartAnalysis)ÚcountersÚdefakeÚflatten_graph_inputs)Úaot_module_simplifiedÚSerializableAOTDispatchCompiler)Ú_disable_current_modesÚPÚRc            
       óf   — e Zd Zdeddfd„Zdej        j        dee         dede	def         fd„Z
dS )	ÚAotAutogradÚkwargsÚreturnNc                 ó"   — d| _         || _        d S )NÚcompiler_fn)Ú__name__r   )Úselfr   s     ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_dynamo/backends/common.pyÚ__init__zAotAutograd.__init__-   s   € Ø%ˆŒØˆŒˆˆó    ÚgmÚexample_inputs.c                 óœ  — |rt                                d|¦  «         t          d„ |D ¦   «         ¦  «        rt          ||| ¦  «        S t	          | j                             d¦  «        ¦  «        r | j        d         ¦   «         | j        d<   t          d         dxx         dz  cc<   d}|r7t                                d¦  «         t          d         d	xx         dz  cc<   |S d
t          t          t          f         dt          dt          f         fd„}| j                             d¦  «        p| j        d         }t          |t          ¦  «        r ||j        ¦  «        |_        n$t          |dd¦  «        r||_        n ||¦  «        }|| j        d<   | j                             d¦  «        p| j        d         | j        d<   ddlm} ddlm} | j                             dd ¦  «        |u rt)          dd¦  «        }	nt+          j        ¦   «         }		  |¦   «         5  |	5  t/          ||fi | j        ¤Ž}
t          d         dxx         dz  cc<   t1          |
d¬¦  «        cd d d ¦  «         cd d d ¦  «         S # 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S # t2          $ r ‚ t4          $ r t          d         d	xx         dz  cc<   ‚ w xY w)Nz3aot_autograd-based backend ignoring extra kwargs %sc              3   óZ   K  — | ]&}t          |t          t          t          f¦  «        V — Œ'd S ©N)Ú
isinstanceÚlistÚtupleÚdict)Ú.0Úxs     r   ú	<genexpr>z'AotAutograd.__call__.<locals>.<genexpr>7   s3   è è € ÐJÐJ°a�z˜!�d¥E­4Ð0Ñ1Ô1ÐJÐJÐJÐJÐJÐJr   ÚdecompositionsÚaot_autogradÚtotalé   Fz5Unable to use AOT Autograd because graph has mutationÚnot_okÚbw_compiler_fnr   .c                 ó`   ‡ — dt           j        dt           j        dt          fˆ fd„}d|_        |S )NÚargsr   r   c                  óP   •— t           t          ‰d¬¦  «        | i |¤Žd¬¦  «        S )Nz'do not trace backward compiler function©Úreasonz%do not trace generated backwards passr
   )r3   r   r1   s     €r   Ú_wrapped_bw_compilerzLAotAutograd.__call__.<locals>.wrap_bw_compiler.<locals>._wrapped_bw_compilerL   sS   ø€ õ ð•GØ&Ð/Xðñ ô àð'à%ð'ð 'ð Cð	ñ ô ð r   T)r   r3   r   r   Ú_is_wrapped_bw_compiler)r1   r7   s   ` r   Úwrap_bw_compilerz.AotAutograd.__call__.<locals>.wrap_bw_compilerK   sO   ø€ ð­A¬Fð ½a¼hð Í1ð ð ð ð ð ð ð ð !Ô8ð (Ð'r   Úbw_compilerÚfw_compilerr8   Úinference_compilerr   )Únop)Úenable_aot_loggingz%functorch.compile.config.debug_assertTÚokzdo not trace AOT-compiled graphr5   )ÚlogÚwarningÚanyr   Úcallabler   Úgetr   Údebugr   r   r   r%   r   r   ÚgetattrÚfunctorch.compiler=   Útorch._inductor.debugr>   r	   Ú
contextlibÚnullcontextr   r   r   Ú	Exception)r   r    r!   r   Úuse_fallbackr9   r:   r=   r>   Úpatch_configÚcgs              r   Ú__call__zAotAutograd.__call__1   s  € ð ð 	WÝ�KŠKÐMÈvÑVÔVÐVåÐJÐJ¸>ÐJÑJÔJÑJÔJð 	Ý'ØØØñô ð õ �D”K—O’OÐ$4Ñ5Ô5Ñ6Ô6ð 	LØ,I¨D¬KÐ8HÔ,IÑ,KÔ,KˆDŒKÐ(Ñ)õ 	�Ô  Ð)Ð)Ô)¨QÑ.Ð)Ð)Ñ)Øˆàð 	Ý�IŠIÐMÑNÔNÐNÝ�^Ô$ XÐ.Ð.Ô.°!Ñ3Ð.Ð.Ñ.ØˆIð	(­Xµa½°d¬^ð 	(ÅÈÍaÈÔ@Pð 	(ð 	(ð 	(ð 	(ð& ”k—o’o mÑ4Ô4ÐR¸¼ÀMÔ8Rˆå�kÕ#BÑCÔCð 	8Ø&6Ð&6°{Ô7NÑ&OÔ&OˆKÔ#Ð#Ý�[Ð";¸UÑCÔCð 	8Ø&1ˆKÔ#Ð#à*Ð*¨;Ñ7Ô7ˆKà%0ˆŒ�MÑ"àŒK�OŠOÐ0Ñ1Ô1ÐO°T´[ÀÔ5Oð 	ŒÐ(Ñ)ð 	*Ð)Ð)Ð)Ð)Ð)Ø<Ð<Ð<Ð<Ð<Ð<ð Œ;�?Š?˜=¨$Ñ/Ô/°3Ð6Ð6ÝCHØ7¸ñDô DˆLˆLõ &Ô1Ñ3Ô3ˆLð
	à#Ð#Ñ%Ô%ð Mð M |ð Mð MÝ*¨2¨~ÐMÐMÀÄÐMÐM�Ý˜Ô(¨Ð.Ð.Ô.°!Ñ3Ð.Ð.Ñ.Ý˜rÐ*KÐLÑLÔLðMð Mð Mð Mñ Mô Mð Mð Mð Mð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mð Mð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mð Mð Møõ .ð 	ð 	ð 	ØÝð 	ð 	ð 	Ý�^Ô$ XÐ.Ð.Ô.°!Ñ3Ð.Ð.Ñ.Øð	øøøsZ   È
J ÈJÈ?I5ÉJÉ(J É5I9	É9JÉ<I9	É=JÊ J ÊJÊJ ÊJÊJ Ê1K)r   Ú
__module__Ú__qualname__r   r   ÚtorchÚfxÚGraphModuler   r   rO   © r   r   r   r   ,   s†   € € € € € ð ð ¨ð ð ð ð ðQØ”(Ô&ðQØ8@À¼ðQØQTðQà	�#�s�(Ô	ðQð Qð Qð Qð Qð Qr   r   r   r   c                  ó   — t          di | ¤ŽS )NrU   )r   )r   s    r   r-   r-   …   s   € ÝÐ Ð ˜Ð Ð Ð r   Úuse_decompsc                 ó4   — ddl m}m}m} |||dœ}| r||d<   |S )Nr   )Údefault_decompositionsÚ#min_cut_rematerialization_partitionÚ
ts_compile)r;   r:   Úpartition_fnr,   )rG   rY   rZ   r[   )rW   rY   rZ   r[   r   s        r   Úmem_efficient_fusion_kwargsr]   ‰   se   € ðð ð ð ð ð ð ð ð ð ð "Ø!Ø;ð	ð €Fð ð :à#9ˆÐÑ à€Mr   Úfnc           	      ó€   ‡ — t          j        ‰ ¦  «        dt          dt          dt          dt          fˆ fd„¦   «         }|S )zg
    Decorator for backends that need real inputs.  We swap out fake
    tensors for zero tensors.
    ÚmodelÚinputsr   r   c                 ó¬   •— t          ¦   «         5  t          t          t          |¦  «        ¦  «        } ‰| |fi |¤Žcd d d ¦  «         S # 1 swxY w Y   d S r$   )r   r&   Úmapr   )r`   ra   r   r^   s      €r   Úwrapperz(fake_tensor_unsupported.<locals>.wrapper¤   s¡   ø€ å#Ñ%Ô%ð 	/ð 	/Ý�#�f fÑ-Ô-Ñ.Ô.ˆFØ�2�e˜VÐ.Ð. vÐ.Ð.ð	/ð 	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s   �,A	Á	AÁA)Ú	functoolsÚwrapsr   )r^   rd   s   ` r   Úfake_tensor_unsupportedrg   ž   s[   ø€ õ „_�RÑÔð/•sð /¥Cð /µ3ð /½3ð /ð /ð /ð /ð /ñ Ôð/ð
 €Nr   r!   c                 óf   — | D ]}t          |d¦  «        r	|j        c S Œt          j        d¦  «        S )NÚdeviceÚcpu)Úhasattrri   rR   ©r!   r*   s     r   Údevice_from_inputsrm   ­   sC   € Øð ð ˆÝ�1�hÑÔð 	Ø”8ˆOˆOˆOð	åŒ<˜ÑÔÐr   c                 óV   — | D ]}t          |d¦  «        r	|j        c S Œt          j        S )NÚdtype)rk   ro   rR   Úfloat32rl   s     r   Údtype_from_inputsrq   ´   s;   € Øð ð ˆÝ�1�gÑÔð 	Ø”7ˆNˆNˆNð	åŒ=Ðr   ).Ú__doc__rI   re   ÚloggingÚcollections.abcr   r   r   Útypingr   Útyping_extensionsr   r   Úunittest.mockr	   rR   Útorch._dynamor   Útorch._dynamo.excr   Útorch._dynamo.utilsr   r   r   Útorch._functorch.aot_autogradr   r   Útorch.utils._python_dispatchr   Ú	getLoggerr   r@   r   r   r   r-   Úboolr(   Ústrr]   r&   rg   ri   rm   ro   rq   rU   r   r   ú<module>r€      sP  ððð ð$ Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø Ð Ð Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø Ð Ð Ð Ð Ð à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø <Ð <Ð <Ð <Ð <Ð <Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fðð ð ð ð ð ð ð ð @Ð ?Ð ?Ð ?Ð ?Ð ?ð €gÔ˜Ñ!Ô!€à€Iˆc�N„N€Ø€GˆC�L„L€ðVð Vð Vð Vð Vñ Vô Vð Vðr!˜3ð ! ;ð !ð !ð !ð !ð¨Tð °d¸3À¸8´nð ð ð ð ð* ¨#¨t°C¬y¸#Ð)>ÀÐ)AÔ Bð Àsð ð ð ð ð x°¤}ð ¸¼ð ð ð ð ð h¨s¤mð ¸¼ð ð ð ð ð ð r   