
    i                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Zd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlZd dlmZ d d	l m!Z! d d
l"m#Z#m$Z$ d dl%m&Z&  ejN                  e(      Z)er*d dl*m+Z+m,Z, d dl-m.Z. d dl/Z/d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 	  ejp                  d      Z9 ejp                  d      Z: ed       G d d             Z; G d de      Z< G d dejz                        Z>	  G d d      Z? ej$                  d       G d d             Z@ G d  d!e      ZAe!ej$                   G d" d#                    ZB ed$      ZC	  ej$                  d       G d% d&             ZD	  ej$                  d       G d' d(eD             ZE	  ej$                  d       G d) d*eD             ZF	  G d+ d,eeC         ZG G d- d.      ZH G d/ d0      ZI G d1 d2eGeI         ZJ G d3 d4      ZK G d5 d6eGeK         ZL G d7 d8      ZM	  G d9 d:eGeH         ZN G d; d<      ZO G d= d>eO      ZP G d? d@      ZQ ej                         ZS	  G dA dB      ZT G dC dD      ZUe	 	 	 	 dMdE       ZVe	 	 	 	 dNdF       ZW ej$                  d       G dG dH             ZX ej$                  d       G dI dJeX             ZYdOdPdKZZdQdLZ[y)R    )annotationsN)abstractmethod)defaultdict)contextmanager)	dataclass)AnyCallableGeneric
NamedTupleOptionalTYPE_CHECKINGTypeVarUnion)_pytree)dataclass_slots)CapturedTracebackformat_frame)WeakTensorKeyDictionary)	GeneratorIterator)CodeType)DDPOptimizerContext)	PyCodegen)ViewAndMutationMetaFakeTensorModez-^(?P<frame_id>\d+)/(?P<frame_compile_id>\d+)$zQ^!(?P<compiled_autograd_id>\d+)(?:/(?P<frame_id>\d+)/(?P<frame_compile_id>\d+))?$T)frozenc                  J    e Zd ZU ded<   ded<   dZded<   ddZed	d       Zy)
	CompileIdOptional[int]frame_idframe_compile_idNcompiled_autograd_idc                8   | j                   Z| j                  d u | j                  d u k(  sJ d}| j                  d| j                   d| j                   }d| j                    | S | j                  | j                  J | j                   d| j                   S )N /!)r#   r!   r"   )self	frame_strs     G/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_guards.py__str__zCompileId.__str__[   s    $$0MMT)t/D/D/LMMMI}}(a0E0E/FG	t001)====,1F1F1RRRmm_Ad&;&;%<==    c                &   |y	 t         t        fD ]X  }|j                  |      x}s|j                         }|j	                         D ]  \  }}|	t        |      ||<     | di |c S  t        # t        $ r}t        d| d      |d}~ww xY w)z
        Factory method that creates a CompileId from its string representation.
        Keep this in sync with the __str__ method.
        NzInvalid compile_id '' )COMPILE_ID_PATTERNCA_COMPILE_ID_PATTERNmatch	groupdictitemsint
ValueError	Exception)cls
compile_idpatternr2   groupskves           r*   from_stringzCompileId.from_stringh   s     	J.0EF !#MM*5555"__.F & /1=(+AF1I/ ==(! !  	J3J<qABI	Js(   "A2 (A2 A2 +A2 2	B;BBreturnstr)r9   Optional[str]rA   Optional[CompileId])__name__
__module____qualname____annotations__r#   r+   classmethodr?   r/   r,   r*   r   r   L   s8    
 $# +/-.
> J Jr,   r   c                  *    e Zd ZU ded<   ded<   ddZy)TraceIdr   r9   r5   attemptc                    | j                   dk(  rt        | j                        S | j                   d| j                    S )Nr   _)rL   rB   r9   r(   s    r*   r+   zTraceId.__str__   s7    <<1t''oo&a~66r,   Nr@   rE   rF   rG   rH   r+   r/   r,   r*   rK   rK      s     L7r,   rK   c                  t    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZddZddZddZddZddZy)GuardSourcer                           	   
                  c                F    | t         j                  t         j                  fv S N)rR   GLOBAL_FSDP_MODULELOCAL_FSDP_MODULErO   s    r*   is_fsdp_modulezGuardSource.is_fsdp_module   s    668U8UVVVr,   c                    dd l mc m} |j                  r4| t        j
                  t        j                  fv xs | j                         S | t        j
                  t        j                  fv S Nr   )torch._dynamo.config_dynamoconfig_unsafe_skip_fsdp_module_guardsrR   GLOBAL_SPECIALIZED_NN_MODULELOCAL_SPECIALIZED_NN_MODULErf   )r(   rk   s     r*   is_specialized_nn_modulez$GuardSource.is_specialized_nn_module   sn    --11<<;; )
 &&( 4433
 
 	
r,   c                    | t         j                  t         j                  t         j                  t         j                  fv S rc   )rR   GLOBAL_UNSPECIALIZED_NN_MODULELOCAL_UNSPECIALIZED_NN_MODULE&GLOBAL_UNSPECIALIZED_BUILTIN_NN_MODULE%LOCAL_UNSPECIALIZED_BUILTIN_NN_MODULErO   s    r*   is_unspecialized_nn_modulez&GuardSource.is_unspecialized_nn_module   s8    6655>>==	
 
 	
r,   c                F    | t         j                  t         j                  fv S rc   )rR   rs   rt   rO   s    r*   "is_unspecialized_builtin_nn_modulez.GuardSource.is_unspecialized_builtin_nn_module   s&    >>==
 
 	
r,   c                    | t         j                  t         j                  t         j                  t         j                  t         j
                  fv S rc   )rR   LOCALrn   re   rr   rt   rO   s    r*   is_localzGuardSource.is_local   sA    33))55==
 
 	
r,   NrA   bool)rE   rF   rG   ry   GLOBALrn   rm   CONSTANTRANDOM_VALUE	SHAPE_ENVre   rd   BACKWARD_STATE	EPHEMERALSYNTHETIC_LOCALrr   rq   rt   rs   rf   ro   ru   rw   rz   r/   r,   r*   rR   rR      st    EF"##$ HLINIO$&!%'",.)-/*W
"


r,   rR   c                      e Zd Zy)GuardBuilderBaseNrE   rF   rG   r/   r,   r*   r   r      s    r,   r   c                  *    e Zd ZU ded<   ded<   ddZy)SLocz,Optional[Union[traceback.FrameSummary, str]]framework_locrC   maybe_user_locc                    t        | j                  t              r| j                  nt        | j                        }| j                  | j                   d| dS d| dS )Nz ()()
isinstancer   rB   r   r   )r(   flocs     r*   r+   zSLoc.__str__   sh     $,,c2 d001 	
 *))*"TF!44tfA;r,   Nr@   rP   r/   r,   r*   r   r      s    ??!!	r,   r   c                  ,    e Zd ZU ded<   ded<   ded<   y)
ShapeGuardzsympy.logic.boolalg.Booleanexprr   slocr|   size_obliviousNrE   rF   rG   rH   r/   r,   r*   r   r      s    
%%
Jr,   r   c                  <   e Zd ZU ded<   ded<   dZded<   dZded<   dZd	ed
<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   d%dZd&dZd'dZd(dZed)d       Zed*d       Zed+d       Zd)dZd)dZd,dZd-d Zd-d!Zd-d"Zd)d#Z	 	 	 	 	 	 	 	 	 	 d.d$Zy)/GuardSourceoriginating_sourcez)Callable[[GuardBuilderBase, Guard], None]	create_fnNzOptional[list[str]]guard_types	code_listzOptional[object]obj_weakref$Optional[weakref.ReferenceType[Any]]guarded_class_weakrefzOptional[CapturedTraceback]stackz Optional[traceback.StackSummary]
user_stackr    _hashFr|   _unserializablec                    | j                   :t        | j                  | j                  t	        | j
                        f      | _         | j                   S rc   )r   hashnamesourceidr   rO   s    r*   __hash__zGuard.__hash__  s:    ::tyy$++r$..7IJKDJzzr,   c                   t        | j                  t        j                        xrD | j                  j                  t
        j                  j                  j                  j                  u }|| j                  r| j                  j                  ndt        | j                        | j                  | j                         j                  j                   fS )N)r   r   	functoolspartialfunctorchrj   guardsGuardBuilderDUPLICATE_INPUTr   valuelenr   inner_create_fn__code__co_firstlineno)r(   is_duplicate_inputs     r*   sort_keyzGuard.sort_key  s    
 t~~y'8'89 Y##u}}';';'H'H'X'XX 	
 !%DKK"		NII  "++::
 	
r,   c                D    | j                         |j                         k  S rc   )r   r(   others     r*   __lt__zGuard.__lt__+  s    }}!111r,   c                    t        | j                  t        j                        r| j                  j                  S | j                  S rc   )r   r   r   r   r   rO   s    r*   r   zGuard.inner_create_fn.  s0    dnni&7&78>>&&&>>!r,   c                6    | j                   j                         S rc   )r   r   rO   s    r*   r   z
Guard.name4  s    &&++--r,   c                6    | j                   j                         S rc   )r   guard_sourcerO   s    r*   r   zGuard.source8  s    &&3355r,   c           
        t        | t        j                        re |        }|Ddt        t	        |              d|j
                  j                   dt        t	        |             dS dt        t	        |              dS t        |       S )a  
        This is a workaround of a Python weakref bug.

        `obj_weakref` is instance returned by `weakref.ref`,
        `str(obj_weakref)` is buggy if the original obj overrides __getattr__, e.g:

            class MyConfig(dict):
                def __getattr__(self, x):
                    return self[x]

            obj = MyConfig(offset=5)
            obj_weakref = weakref.ref(obj)
            str(obj_weakref)  # raise error: KeyError: '__name__'
        z<weakref at z; to 'z' at >z; dead>)r   weakrefReferenceTypehexr   	__class__rE   rB   )r   objs     r*   weakref_to_strzGuard.weakref_to_str<  s      k7#8#89-C%c"[/&:%;6#--BXBXAYY^_bceficj_k^llmnn%c"[/&:%;7CC{##r,   c                Z   d| j                   r$| j                   j                  j                         nd dt        | j                         d| j	                         j
                   d| j                   d| j                   d| j                  | j                         d| j                   d}|S )	Nz	
        r%    z&
        {
            'guard_types': z,
            'code': z,
            'obj_weakref': z
            'guarded_class': z
        }
        )r   r   lowerreprr   rE   r   r   r   r   r   )r(   ss     r*   __repr__zGuard.__repr__U  s    	%)[[					!b94		?:K1TMaMaMcMlMlLm n ,,- .^^$ % //0@0@AB C"889 :	 r,   c                   dt        | j                         d}| j                  r$| j                  j                  j                         nd}|d| dz  }|d| j	                         j
                   dz  }|d| j                   dz  }|d| j                   dz  }|d| j                  | j                         dz  }|d	| j                   dz  }|S )
NzName: 
r%   z    Source: z    Create Function: z    Guard Types: z    Code List: z    Object Weakref: z    Guarded Class Weakref: )r   r   r   r   r   rE   r   r   r   r   r   )r(   outputr   s      r*   r+   zGuard.__str__a  s    $tyy/*"--1[[!!'')bL++)$*>*>*@*I*I)J"MM%d&6&6%7r::ODNN#3266()<)<T=M=M)N(OrRR/0J0J/K2NNr,   c           	     R   	 | j                  ||       S # t        $ r t        j                  dt	        |       j                                | j                  rNt        j                  ddj                  | j                  j                         dd        j                                 w xY w)NzError while creating guard:
%szCreated at:
%sr%   )
r   r7   log	exceptionrB   rstripr   errorjoinformat)r(   builders     r*   createzGuard.createl  s    	>>'400 	MM;SY=M=M=OPzz		+RWWTZZ5F5F5H5M-N-U-U-WX		s
    BB&c                6    | j                   j                         S rc   )r   ro   rO   s    r*   ro   zGuard.is_specialized_nn_moduleu  s    {{3355r,   c                6    | j                   j                         S rc   )r   rf   rO   s    r*   rf   zGuard.is_fsdp_modulex  s    {{))++r,   c                6    | j                   j                         S rc   )r   rz   rO   s    r*   rz   zGuard.is_local{  s    {{##%%r,   c                    t        | j                  t        j                        r"| j                  j                  }|j
                  S | j                  }|j
                  S rc   )r   r   r   r   r   rE   )r(   r   s     r*   create_fn_namezGuard.create_fn_name~  sJ    dnni&7&78++I !!! I!!!r,   c                   | j                   sg | _         | j                   j                  |       | j                  |d fv sJ d       || _        | j                  s|| _        n| j                  j	                  |       | j
                  |d fv s,t        | j
                        r| j                         J d       || _        y )Nz+Guarded class id must be identical, or NonezBGuarded object must be identical, None or ephemeral (dead weakref))r   appendr   r   extendr   callable)r(   
guard_typeguarded_classr   r   s        r*   set_export_infozGuard.set_export_info  s     !D
+)).
 
 	9 9	9 
 &3"~~&DNNN!!), d 33(()  "*	P P		P+ 'r,   rA   r5   )rA   ztuple[bool, int, int, str, int])r   r   rA   r|   )rA   z(Callable[[GuardBuilderBase, Guard], Any]r@   rA   rR   )r   objectrA   rB   )r   r   rA   r   r{   )
r   rB   r   r   r   	list[str]r   r   rA   None)rE   rF   rG   rH   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   staticmethodr   r   r+   r   ro   rf   rz   r   r   r/   r,   r*   r   r      s   ( 88 (,K$+%)I")$(K!(BF?F)-E&-37J07E=!OT!

 2" . . 6 6 $ $0
	6,&" ' ' < ' 	 '
  ' 
 'r,   r   Tc                      e Zd Zy)GuardEnvExprNr   r/   r,   r*   r   r     s    r,   r   c                  *    e Zd ZU ded<   ded<   ddZy)DuplicateInputsr   input_source_ainput_source_bc                :    | j                   | j                  k7  sJ y rc   )r   r   rO   s    r*   __post_init__zDuplicateInputs.__post_init__  s    ""d&9&9999r,   NrA   r   )rE   rF   rG   rH   r   r/   r,   r*   r   r     s    :r,   r   c                  "    e Zd ZU ded<   ded<   y)StorageOverlapzlist[Source]overlapping_sourcesnon_overlapping_sourcesNr   r/   r,   r*   r   r     s    %%))r,   r   c                  0    e Zd Zedd       Zedd       Zy)Checkpointablec                     y rc   r/   rO   s    r*   copy_graphstatezCheckpointable.copy_graphstate  s    $'r,   c                     y rc   r/   r(   states     r*   restore_graphstatez!Checkpointable.restore_graphstate  s    47r,   N)rA   r   )r  r   rA   r   )rE   rF   rG   r   r  r  r/   r,   r*   r   r     s    ' '7 7r,   r   c                  B    e Zd ZU dZ e       Zded<   ddZd	dZd
dZ	y)GuardsCheckpointStatezW
    The GuardCheckpointState - it is the T of Checkpointable[T] for GuardsContext
    
set[Guard]dynamo_guardsc                    || _         y rc   )r	  )r(   r	  s     r*   __init__zGuardsCheckpointState.__init__  s
    *r,   c                n    | j                   j                  |j                         }t        |      dk(  ry|S )z
        Produces a delta against another GuardsCheckpointState.

        Returns None if no delta is found, otherwise, return a set() of mismatched
        Guard type objects.
        r   N)r	  
differencer   r(   r   rs      r*   diffzGuardsCheckpointState.diff  s3     ))%*=*=>q6Q;r,   c                J    t        |t              sy| j                  |      d u S NF)r   r  r  r   s     r*   __eq__zGuardsCheckpointState.__eq__  s$    %!67yy4''r,   N)r	  r  rA   r   )r   r  rA   Optional[set[Guard]]r   r   rA   r|   )
rE   rF   rG   __doc__setr	  rH   r  r  r  r/   r,   r*   r  r    s$     !$M:%+
(r,   r  c                  4    e Zd ZU i Zded<   ddZddZd	dZy)
ModuleContextCheckpointStatedict[str, torch.nn.Module]
nn_modulesc                    || _         y rc   r  )r(   r  s     r*   r  z%ModuleContextCheckpointState.__init__  s	    $r,   c                    t        | j                  j                               j                  t        |j                  j                                     }t	        |      dk(  ry|S )z
        Produces a delta against another ModuleContextCheckpointState.

        Returns None if no delta is found, otherwise, return a set() of mismatched
        module key names.
        r   N)r  r  keysr  r   r  s      r*   r  z!ModuleContextCheckpointState.diff  sM     $$&'223u7G7G7L7L7N3OPq6Q;r,   c                J    t        |t              sy| j                  |      d u S r  )r   r  r  r   s     r*   r  z#ModuleContextCheckpointState.__eq__  $    %!=>yy4''r,   N)r  r  rA   r   )r   r  rA   Optional[set[str]]r  )rE   rF   rG   r  rH   r  r  r  r/   r,   r*   r  r    s    -/J*/%
(r,   r  c                  $    e Zd ZddZddZddZy)ModuleContextc                    i | _         y rc   r  rO   s    r*   r  zModuleContext.__init__$  s	    *,r,   c                >    t        t        | j                              S rc   )r  dictr  rO   s    r*   r  zModuleContext.copy_graphstate'  s    +D,ABBr,   c                J    t        |t              sJ |j                  | _        y rc   )r   r  r  r  s     r*   r  z ModuleContext.restore_graphstate*  s     %!=>>>**r,   Nr   )rA   r  )r  r  rA   r   rE   rF   rG   r  r  r  r/   r,   r*   r$  r$  #  s    -C+r,   r$  c                  4    e Zd ZU i Zded<   ddZddZd	dZy)
GlobalContextCheckpointStatedict[str, tuple[Callable, Any]]global_statec                    || _         y rc   r-  )r(   global_statess     r*   r  z%GlobalContextCheckpointState.__init__2  s
    )r,   c                    t        | j                  j                               j                  t        |j                  j                                     }t	        |      dk(  ry|S )z
        Produces a delta against another GlobalContextCheckpointState.

        Returns None if no delta is found, otherwise, return a set() of mismatched
        global key names.
        r   N)r  r-  r  r  r   r  s      r*   r  z!GlobalContextCheckpointState.diff5  sO     !!&&()44S9K9K9P9P9R5STq6Q;r,   c                J    t        |t              sy| j                  |      d u S r  )r   r+  r  r   s     r*   r  z#GlobalContextCheckpointState.__eq__A  r!  r,   N)r0  r,  rA   r   )r   r+  rA   r"  r  )rE   rF   rG   r-  rH   r  r  r  r/   r,   r*   r+  r+  /  s    46L16*
(r,   r+  c                  0    e Zd ZdZh dZddZddZd	dZy)
GlobalContextzz
    This keeps track of the global torch state during tracing of a function.
    For example, torch.is_grad_enabled.
    >   grad_enabledautocast_enabledautocast_cpu_dtypeautocast_gpu_dtypeautocast_cpu_enabledautocast_cache_enabledc                    i | _         y rc   r/  rO   s    r*   r  zGlobalContext.__init__V  s
    =?r,   c                ,    t        | j                        S rc   )r+  r-  rO   s    r*   r  zGlobalContext.copy_graphstateY  s    +D,=,=>>r,   c                b   t        |t              sJ |j                  | _        t        | j                        t        | j                        k(  r0t        | j                  j                               | j                  k(  sJ d       | j                  j                         D ]  \  }} ||        y )NzGlobal state mismatch)r   r+  r-  r   _supported_global_statesr  r  values)r(   r  r   argss       r*   r  z GlobalContext.restore_graphstate\  s    %!=>>>!..!!"c$*G*G&HHD%%**,-1N1NN	# #	#O ++224 	JD$J	r,   Nr   )rA   r+  )r  r+  rA   r   )rE   rF   rG   r  r>  r  r  r  r/   r,   r*   r4  r4  G  s    
 @?r,   r4  c                  d    e Zd ZdddZddZddZddZddZddd		 	 	 	 	 	 	 dd
ZddZ	ddZ
y)	GuardsSetNc                *    |
t               }|| _        y rc   )r  inner)r(   rD  s     r*   r  zGuardsSet.__init__j  s    =EE
r,   c                ,    t        | j                        S rc   )iterrD  rO   s    r*   __iter__zGuardsSet.__iter__o      DJJr,   c                ,    t        | j                        S rc   )r   rD  rO   s    r*   __len__zGuardsSet.__len__r  s    4::r,   c                F    t        | j                  |j                  z
        S rc   )rB  rD  r   s     r*   __sub__zGuardsSet.__sub__w  s    ekk122r,   c                ,    t        | j                        S rc   )r|   rD  rO   s    r*   __bool__zGuardsSet.__bool__z  rH  r,   Tr   )collect_debug_stackskipc                   || j                   v ry |r*|j                  t        j                  d|z         |_        |j                  t
        j                         |_        | j                   j                  |       y NrS   )rP  )rD  r   r   extractr   TracingContextextract_stackadd)r(   guardrO  rP  s       r*   rV  zGuardsSet.add}  sc     DJJ{{"/77QXF#-;;=E

ur,   c                F    |D ]  }|D ]  }| j                  |d         y rR  )rV  )r(   othersogs       r*   updatezGuardsSet.update  s0     	$A $#$	$r,   c                    ddl m} | j                  D ch c]  } ||j                  |      r| c}| _        yc c}w )z.Delete all guards that contains a given sourcerS   )is_from_sourceN)_dynamo.sourcer^  rD  r   )r(   r   r^  r[  s       r*   remove_guards_with_sourcez#GuardsSet.remove_guards_with_source  s6    2 zz
8L8Lf)UA

 
s   ;;rc   )rD  r  rA   r   )rA   zIterator[Guard]r   )r   rB  rA   rB  r{   )rW  r   rO  r|   rP  r5   rA   r   )rY  r  rA   r   )r   r   rA   r   )rE   rF   rG   r  rG  rJ  rL  rN  rV  r\  r`  r/   r,   r*   rB  rB  i  sR    
 
3  <@Q

48
GJ
	
$

r,   rB  c                  $    e Zd ZddZddZddZy)GuardsContextc                0    t               | _        g | _        y rc   )rB  r	  aotautograd_guardsrO   s    r*   r  zGuardsContext.__init__  s    (168r,   c                R    t        t        | j                  j                              S rc   )r  r  r	  rD  rO   s    r*   r  zGuardsContext.copy_graphstate  s    $S););)A)A%BCCr,   c                \    t        |t              sJ t        |j                        | _        y rc   )r   r  rB  r	  r  s     r*   r  z GuardsContext.restore_graphstate  s&    %!6777&u':':;r,   Nr   )rA   r  )r  r  rA   r   r)  r/   r,   r*   rb  rb    s    9D<r,   rb  c                      e Zd Zed
d       Zedd       Zedd       Zedd       Zedd       Zedd       Z	e	 	 	 	 	 	 	 	 dd       Z
e	 	 	 	 	 	 dd       Zy	)HopSubgraphCachec                     y rc   r/   r(   fn_id
identifiers      r*   add_dynamo_installed_submodulez/HopSubgraphCache.add_dynamo_installed_submodule  s    SVr,   c                     y rc   r/   r(   rk  s     r*   get_dynamo_installed_submodulesz0HopSubgraphCache.get_dynamo_installed_submodules  s    HKr,   c                     y rc   r/   r(   rl  keys      r*   add_autograd_key_entryz'HopSubgraphCache.add_autograd_key_entry  s    NQr,   c                     y rc   r/   r(   rl  s     r*   get_autograd_key_entryz'HopSubgraphCache.get_autograd_key_entry  s    MPr,   c                     y rc   r/   rr  s      r*   add_proxy_dispatch_entryz)HopSubgraphCache.add_proxy_dispatch_entry  s    PSr,   c                     y rc   r/   rv  s     r*   get_proxy_dispatch_entryz)HopSubgraphCache.get_proxy_dispatch_entry  s    ORr,   c                     y rc   r/   )r(   rl  tangent_metadatagmods       r*   add_lazy_bwd_entryz#HopSubgraphCache.add_lazy_bwd_entry  s     r,   c                     y rc   r/   r(   rl  r}  s      r*   get_lazy_bwd_entryz#HopSubgraphCache.get_lazy_bwd_entry  s	     @Cr,   Nrk  r5   rl  rB   rA   r   rk  r5   rA   r   rl  rB   rs  r	   rA   r   rl  rB   rA   zOptional[Callable]rl  rB   r}  tuple[object]r~  ztorch.fx.GraphModulerA   r5   rl  rB   r}  r  rA   z4tuple[Optional[torch.fx.GraphModule], Optional[int]])rE   rF   rG   r   rm  rp  rt  rw  ry  r{  r  r  r/   r,   r*   rh  rh    s    V VK KQ QP PS SR R ( #	
 
  CC1>C	=C Cr,   rh  c                  p    e Zd ZddZddZddZddZddZddZddZ		 	 	 	 	 	 	 	 ddZ
	 	 	 	 	 	 dd	Zy
)InvokeSubgraphCachec                p    i | _         i | _        t        t              | _        t        t
              | _        y rc   )autograd_cacheproxy_dispatch_cacher   listdynamo_installed_submodulesr'  lazy_bwd_cacherO   s    r*   r  zInvokeSubgraphCache.__init__  s1    359;!ALTAR(  	r,   c                @    | j                   |   j                  |       y rc   )r  r   rj  s      r*   rm  z2InvokeSubgraphCache.add_dynamo_installed_submodule  s    ((/66zBr,   c                :    | j                   j                  |g       S rc   )r  getro  s     r*   rp  z3InvokeSubgraphCache.get_dynamo_installed_submodules  s    //33E2>>r,   c                "    || j                   |<   y rc   )r  rr  s      r*   rt  z*InvokeSubgraphCache.add_autograd_key_entry  s    *-J'r,   c                :    | j                   j                  |d       S rc   )r  r  rv  s     r*   rw  z*InvokeSubgraphCache.get_autograd_key_entry  s    ""&&z488r,   c                "    || j                   |<   y rc   )r  rr  s      r*   ry  z,InvokeSubgraphCache.add_proxy_dispatch_entry  s    03!!*-r,   c                :    | j                   j                  |d       S rc   )r  r  rv  s     r*   r{  z,InvokeSubgraphCache.get_proxy_dispatch_entry  s    ((,,Z>>r,   c                ^    t        | j                  |         }||f| j                  |   |<   |S rc   )r   r  )r(   rl  r}  r~  	num_gmodss        r*   r  z&InvokeSubgraphCache.add_lazy_bwd_entry  s:     ++J78	=A9<MJ'(89r,   c                ^    || j                   vry| j                   |   j                  |d      S )N)NN)r  r  r  s      r*   r  z&InvokeSubgraphCache.get_lazy_bwd_entry  s4     T000"":.223C\RRr,   Nr   r  r  r  r  r  r  )rE   rF   rG   r  rm  rp  rt  rw  ry  r{  r  r  r/   r,   r*   r  r    sr    C?.94?		 (	 #		
 
	SS1>S	=Sr,   r  c                  $    e Zd ZddZ	 	 	 	 ddZy)HopDispatchSetCachec                2    ddl m} |t               i| _        y )Nr   )invoke_subgraph)'torch._higher_order_ops.invoke_subgraphr  r  hop_cache_map)r(   r  s     r*   r  zHopDispatchSetCache.__init__  s    K-/B/DEr,   c                >    || j                   vry | j                   |   S rc   )r  )r(   ops     r*   	get_cachezHopDispatchSetCache.get_cache  s&     T'''!!"%%r,   Nr   )r  ztorch._ops.HigherOrderOperatorrA   zOptional[HopSubgraphCache])rE   rF   rG   r  r  r/   r,   r*   r  r    s    F&0&	#&r,   r  c                  \    e Zd Zedd       Zedd       Zd	dZed
d       Zedd       Zy)CompileContextc                 F    t         j                  J t         j                  S rc   )_TLScompile_contextr/   r,   r*   r  zCompileContext.get"  s     ##///###r,   c                 $    t        t        dd       S Nr  getattrr  r/   r,   r*   try_getzCompileContext.try_get'      t.55r,   c                V    |t        |t              sJ || _        d| _        g | _        y rh   )r   r   r9   rL   shape_env_guards)r(   r9   s     r*   r  zCompileContext.__init__+  s-    !Z
I%FFF/9+-r,   c                 H    t         j                         } | y | j                  S rc   )r  r  r9   rO   s    r*   current_compile_idz!CompileContext.current_compile_id2  s"    %%'<r,   c                     t         j                         } | y | j                  y t        | j                  | j                        S rc   )r  r  r9   rK   rL   rO   s    r*   current_trace_idzCompileContext.current_trace_id9  s:    %%'<??"t55r,   N)rA   r  )rA   Optional[CompileContext])r9   rD   rA   r   )rA   rD   )rA   zOptional[TraceId])	rE   rF   rG   r   r  r  r  r  r  r/   r,   r*   r  r  !  sU    $ $ 6 6.   6 6r,   r  c                  6   e Zd ZdZedd       Zedd       ZddZddZee	dd              Z
edd       ZddZeej                  dd	              Zeej                  	 	 	 	 dd
              Zeej                  dd              Zedd       Zedd       Zy)rT  z
    Provides the currently installed TracingContext, or None.

    Note that it is a staticmethod, and invocations outside of `with tracing()` (see below), are valid but
    will return None.
    c                 $    t        t        dd       S )Ntracing_contextr  r/   r,   r*   r  zTracingContext.try_getK  r  r,   c                 H    t         j                         x} r| S t        d      )Nz<TracingContext.get() must be called within an ongoing trace.)rT  r  RuntimeError)ctxs    r*   r  zTracingContext.getO  s+     ((**3*JJ
 	
r,   c                   t               | _        t               | _        t	               | _        t               | _        t               | _        || _	        g | _
        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        t)               | _        d| _        t/               | _        g | _        y r  )rb  guards_contextr$  module_contextr4  global_contextr'  previously_inlined_functionspreviously_cleaned_instructions	fake_modeframe_summary_stackloc_in_framefw_metadataddp_optimizer_ctxaot_graph_nameparams_flatparams_flat_unwrap_subclassesparams_unwrapped_to_flat_indexoutput_strides#force_unspec_int_unbacked_size_liker   tensor_to_contextfakify_first_callr  hop_dispatch_set_cachetraced_code)r(   r  s     r*   r  zTracingContext.__init__W  s    +o+o+o<@F)?Cv,3<AC  =A:>@D3704BF*CG+ JN 490!8!:
 "'&9&;#+-r,   c                    i | j                   _        | j                  j                          | j                  j                          y rc   )r  r-  r  clearr  rO   s    r*   r  zTracingContext.clear  s6     ,.())//1,,224r,   c               +  r  K   i }t         j                         }| j                         D ]  }t        ||      ||<    | j	                         D ]  \  }}t        |||        	 d  |j	                         D ]  \  }}t        |||        y # |j	                         D ]  \  }}t        |||        w xY wwrc   )rT  r  r  r  r4   setattr)kwargspriorr  rs  vals        r*   patchzTracingContext.patch  s        ";;= 	+C c*E#J	+  	#HCCc"	#	'!KKM 'SS#&'EKKM 'SS#&'s   A B7#B '&B7'B44B7c                     t         j                         } | t        j                         S | j                  }| j
                  || j                         gz   }t        j                  j                  |      S rc   )rT  r  	tracebackStackSummaryr  r  _populate_loc_in_frame_summary	from_list)r(   r   s     r*   rU  zTracingContext.extract_stack  sh    %%'<))++(((T@@BCCE%%//66r,   c                p    | j                   J | j                   \  }}}t        j                  |||d      S )NF)lookup_line)r  r  FrameSummary)r(   filenamelineno
frame_names       r*   r  z-TracingContext._populate_loc_in_frame_summary  s>      ,,,'+'8'8$&*%%h
PUVVr,   c               #    K   t         j                         } t        j                  j                  j                  | dg       5  t        j                  j                  j                  | dd       5  	 d  	 d d d        d d d        y # t        $ r}t        |d      sd |_         d }~ww xY w# 1 sw Y   7xY w# 1 sw Y   y xY ww)Nr  r  
real_stack)	rT  r  unittestmockr  r   r7   hasattrr  )tcr>   s     r*   clear_framezTracingContext.clear_frame  s      !MM&&r+@"E	MM&&r>4@		 	 	  $ q,/#'AL)	 	 	 	sT   A C,B7.B+0B5B7=	C	B(B##B((B++B4	0B77C <Cc              #    K   t         j                         }| |j                  j                  |        |j                  }d |_        	 d  	 | |j                  j                          ||_        y # t
        $ r'}t        |d      s|j                         |_         d }~ww xY w# | |j                  j                          ||_        w xY ww)Nr  )
rT  r  r  r   r  r7   r  rU  r  pop)frame_summaryr  oldr>   s       r*   current_framezTracingContext.current_frame  s      !$""))-8oo		" (&&**,!BO  	1l+!//1	
 (&&**,!BOs6   ACA1 $C1	B!:"BB!!B$ $%C		Cc               #     K   t         j                         } | d  y | j                  }g | _        	 | j                   || _        y # || _        w xY wwrc   )rT  r  r  )r  old_output_stridess     r*   report_output_stridesz$TracingContext.report_output_strides  sY     
 ##%:J..	3### 2B 2Bs   /AA  A	AAc                <    | ||ft         j                         _        y rc   )rT  r  r  )r  r  r  s      r*   set_current_loczTracingContext.set_current_loc  s     .6vz,J)r,   c                 H    t         j                         } | y | j                  S rc   )rT  r  r  )r  s    r*   get_traced_codezTracingContext.get_traced_code   s"    ##%:~~r,   N)rA   Optional[TracingContext])rA   rT  )r  Optional[FakeTensorMode]rA   r   r   )r  r   rA   Generator[None, None, None])rA   ztraceback.StackSummary)rA   ztraceback.FrameSummary)rA   r  )r  z Optional[traceback.FrameSummary]rA   r  )rA   z@Generator[Optional[list[Optional[tuple[int, ...]]]], None, None])r  rB   r  r5   r  rB   rA   r   )rA   zOptional[list[CodeType]])rE   rF   rG   r  r   r  r  r  r  r   r  rU  r  
contextlibr  r  r  r  r  r/   r,   r*   rT  rT  C  s    6 6 
 
1.f5 '  ' 7 7W   < "7"	$"  "* 3  3 K K
  r,   rT  c              #     K   t        t        dd       }| t        _        	 |  |t        _        y # |t        _        w xY wwr  )r  r  r  )contextold_contexts     r*   r  r    s9      $ 148K"D+*{s   A 0 A =A c              #    K   t        t        dd      }| t        _        	 |  	 | F| j                  :| j                  j                  $| j                  j                  j                          |t        _        y# t        $ r)}t	        |d      s| | j                         |_         d}~ww xY w# | F| j                  :| j                  j                  $| j                  j                  j                          |t        _        w xY ww)z
    This function installs the passed in tracing context as a dynamic scoped
    global variable.

    Calls to TracingContext.get() while not under a `with tracing()` context
    will return None.
    r  Nr  )
r  r  r  r7   r  rU  r  r  	shape_envcleanup)r  r  r>   s      r*   tracingr    s      $ 148K"D+ !!-!!++7''//1*  q,'G,?"002AL !!-!!++7''//1*s5   DA9 AD9	B+$B&&B++B. .ADDc                  L    e Zd Zd
dZd
dZddZddZddZddZd
dZ	d
dZ
y	)r   c                     yr  r/   rO   s    r*   is_dict_keyzSource.is_dict_key5      r,   c                     yr  r/   rO   s    r*   is_ephemeralzSource.is_ephemeral8  r  r,   c                    t         rc   NotImplementedError)r(   codegens     r*   reconstructzSource.reconstruct;      !!r,   c                    t         rc   r
  rO   s    r*   r   zSource.guard_source>  r  r,   c                    t         rc   r
  rO   s    r*   r   zSource.nameA  r  r,   c                f    | j                         t        j                  u rt        t	        | |      S rc   )r   rR   r~   r  r   )r(   fns     r*   
make_guardzSource.make_guardD  s+    +"6"66%%T2r,   c                >    | j                         j                         S rc   )r   ro   rO   s    r*   ro   zSource.is_specialized_nn_moduleI  s      ";;==r,   c                D    | j                         t        j                  k7  S )z+True if you can guard on attributes of this)r   rR   r   rO   s    r*   subguards_allowedzSource.subguards_allowedL  s      "k&A&AAAr,   Nr{   )r  r   rA   r   r   r@   )r  zCallable[..., Any]rA   r   )rE   rF   rG   r  r  r  r   r   r  ro   r  r/   r,   r*   r   r   3  s+    """
>Br,   r   c                  0    e Zd ZU ded<   ddZddZddZy)	ChainedSourcer   basec                6    | j                   j                         S rc   )r  r  rO   s    r*   r  zChainedSource.is_dict_keyV  s    yy$$&&r,   c                6    | j                   j                         S rc   )r  r  rO   s    r*   r  zChainedSource.is_ephemeralZ  s    yy%%''r,   c                d    | }t        |t              r|j                  }t        |t              r|S rc   )r   r  r  )r(   currents     r*   get_basezChainedSource.get_base]  s+    -0llG -0r,   Nr{   )rA   r   )rE   rF   rG   rH   r  r  r  r/   r,   r*   r  r  R  s    
L'(r,   r  c                z   ddl m}m} g }t        j	                         x}r"|j
                  }||j                  |ddf       ddlm} t        t         |                   D ]&  \  }}t        ||      s|j                  |d|f       ( t        j                  |       }	t        |	      D ]0  \  }}
t        |
|      s|j                  |
j
                  d|f       2 |r\|d   \  }}}|dd D ]I  \  }}}||u rJ d	| d
| d| d| d
| d| d| d| d|j                   d| d| d|j                           |S y)a  
    Attempts to "detect" what the current fake mode is.  If there is one ambiently
    available from TracingContext, we preferentially use that.  Otherwise, we
    heuristically detect the fake mode via the following sources, in order of
    priority:

        - Currently active fake mode on stack
        - Fake mode associated with passed in tensors (inputs does not
          have to be flattened)
    r   )
FakeTensorr   Nztracing context _get_current_dispatch_mode_stackzactive fake modezfake tensor inputrS   zfake mode (z) from r   z doesn't match mode (z

fake mode from z allocated at:
z
fake mode from )torch._subclasses.fake_tensorr   r   rT  r  r  r   torch.utils._python_dispatchr"  	enumeratereversedr   pytreetree_leavesr   )inputsr   r   
fake_modesr  r  r"  imflat_inputs
flat_inputdesc1i1desc2i2s                  r*   detect_fake_moder3  d  s    IJ ((**w*%%	 y*;Q?@M(#C#EFG :1a(q"4a89: $$V,K";/ N:j*-z335H!LMN )!}	5"&qrN 	LAub> i[wat;PQRPSSZ[`Zaabcebf g""'"-=ioo=N O""'"-=aggYH>	 r,   c                 ~    ddl m}  ddlm} t	        t         |                   D ]  \  }}t        ||       s|c S  y)z~
    Inspects the dispatch mode stack for an active fake mode and returns it.
    Returns None if no fake mode is active.
    r   r   r!  N)r#  r   r$  r"  r%  r&  r   )r   r"  rN   r,  s       r*   active_fake_moder5    s?    
 =M(#C#EFG 1a(H r,   )r  r  rA   z/Generator[Optional[CompileContext], None, None])r  r  rA   z/Generator[Optional[TracingContext], None, None]rc   )r)  r   rA   r  )rA   r  )\
__future__r   r  dataclassesenumr   loggingre	threadingr  unittest.mockr  r   abcr   collectionsr   r   r   typingr   r	   r
   r   r   r   r   r   r   torch.utilsr   r'  torch.utils._backport_slotsr   torch.utils._tracebackr   r   torch.utils.weakr   	getLoggerrE   r   collections.abcr   r   typesr   sympy"torch._dynamo.backends.distributedr   torch._dynamo.codegenr   &torch._functorch._aot_autograd.schemasr   r#  r   compiler0   r1   r   rK   EnumrR   r   r   r   r   r   r   r   r   r   r  r  r$  r+  r4  rB  rb  rh  r  r  localr  r  rT  r  r  r   r  r3  r5  r/   r,   r*   <module>rN     sZ   "      	      # % !	 	 	  ) 7 B 4 g! 3F/J<  RZZ PQ "

X $ $/J /J /Jd7j 7;
$)) ;
|	 	 d#  $   o' o'  o'd CL d#	 	 $	 d#:l : $: d#*\ * $*

8WQZ 8( (8( (0	+N#?@ 	+( (0N#?@ D+
 +
\<N#89 <C CB,S* ,S^& & y&6 6DB BJ +%+4+ + +%+4+ +< d#B B $B< d#F  $")Xr,   