
    Vh=                    *   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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jJ                  e&      Z'erd dl(Z(	  ejR                  d      Z* ejR                  d      Z+ ed       G d d             Z, G d de      Z- G d dej\                        Z/	  G d d      Z0 ej                   d       G d d             Z1 G d de      Z2eej                    G d d                    Z3 ed      Z4	 ej                    G d d             Z5	 ej                    G d  d!e5             Z6	 ej                    G d" d#e5             Z7	  G d$ d%ee4         Z8 G d& d'      Z9 G d( d)      Z: G d* d+e8e:         Z; G d, d-      Z< G d. d/e8e<         Z=	  G d0 d1      Z> G d2 d3e8e9         Z? G d4 d5      Z@ G d6 d7e@      ZA G d8 d9      ZB ej                         ZD	  G d: d;      ZE G d< d=      ZFedFd>       ZGedGd?       ZH ej                   d       G d@ dA             ZI ej                   d       G dB dCeI             ZJdHdIdDZKdE ZLy)J    )annotationsN)abstractmethod)contextmanager)	dataclass)AnyCallableGeneric
NamedTupleOptionalTYPE_CHECKINGTypeVarUnion)_pytree)dataclass_slots)CapturedTracebackformat_frame)WeakTensorKeyDictionaryz-^(?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                  H    e Zd ZU ded<   ded<   dZde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     =/home/dcms/DCMS/lib/python3.12/site-packages/torch/_guards.py__str__zCompileId.__str__S   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patternr)   groupskves           r!   from_stringzCompileId.from_string`   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)r0   Optional[str])__name__
__module____qualname____annotations__r   r"   classmethodr6   r&   r#   r!   r   r   D   s8    
 $# +/-.
> J Jr#   r   c                  (    e Zd ZU ded<   ded<   d Zy)TraceIdr   r0   r,   attemptc                    | j                   dk(  rt        | j                        S | j                   d| j                    S )Nr   _)r?   strr0   r   s    r!   r"   zTraceId.__str__}   s7    <<1t''oo&a~66r#   Nr8   r9   r:   r;   r"   r&   r#   r!   r>   r>   w   s     L7r#   r>   c                  r    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 Zy)GuardSourcer                           	   
                  c                F    | t         j                  t         j                  fv S N)rF   GLOBAL_FSDP_MODULELOCAL_FSDP_MODULErC   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_guardsrF   GLOBAL_SPECIALIZED_NN_MODULELOCAL_SPECIALIZED_NN_MODULErZ   )r   r_   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 rW   )rF   GLOBAL_UNSPECIALIZED_NN_MODULELOCAL_UNSPECIALIZED_NN_MODULE&GLOBAL_UNSPECIALIZED_BUILTIN_NN_MODULE%LOCAL_UNSPECIALIZED_BUILTIN_NN_MODULErC   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 rW   )rF   rg   rh   rC   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 rW   )rF   LOCALrb   rY   rf   rh   rC   s    r!   is_localzGuardSource.is_local   sA    33))55==
 
 	
r#   Nreturnbool)r8   r9   r:   rm   GLOBALrb   ra   CONSTANTRANDOM_VALUE	SHAPE_ENVrY   rX   BACKWARD_STATE	EPHEMERALSYNTHETIC_LOCALrf   re   rh   rg   rZ   rc   ri   rk   rn   r&   r#   r!   rF   rF      st    EF"##$ HLINIO$&!%'",.)-/*W
"


r#   rF   c                      e Zd Zy)GuardBuilderBaseNr8   r9   r:   r&   r#   r!   rz   rz      s    r#   rz   c                  (    e Zd ZU ded<   ded<   d Zy)SLocz,Optional[Union[traceback.FrameSummary, str]]framework_locr7   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#   NrD   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}   slocrq   size_obliviousNr8   r9   r:   r;   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 Zd Zd Zed!d       Zed"d       Zed        Zd Zd Zd#dZd Zd Zd Zd  Zy)$GuardSourceoriginating_sourcez)Callable[[GuardBuilderBase, Guard], None]	create_fnNzOptional[list[str]]guard_types	code_listzOptional[object]obj_weakrefzOptional[type]guarded_class_weakrefzOptional[CapturedTraceback]stackz Optional[traceback.StackSummary]
user_stackr   _hashc                    | j                   :t        | j                  | j                  t	        | j
                        f      | _         | j                   S rW   )r   hashnamesourceidr   rC   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torchr^   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 rW   )r   r   others     r!   __lt__zGuard.__lt__"  s    }}!111r#   c                    t        | j                  t        j                        r| j                  j                  S | j                  S rW   )r   r   r   r   r   rC   s    r!   r   zGuard.inner_create_fn%  s0    dnni&7&78>>&&&>>!r#   c                6    | j                   j                         S rW   )r   r   rC   s    r!   r   z
Guard.name+  s    &&++--r#   c                6    | j                   j                         S rW   )r   guard_sourcerC   s    r!   r   zGuard.source/  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__r8   rB   )r   objs     r!   weakref_to_strzGuard.weakref_to_str3  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   r8   r   r   r   r   r   )r   ss     r!   __repr__zGuard.__repr__L  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   r8   r   r   r   r   r   )r   outputr   s      r!   r"   zGuard.__str__X  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   r.   log	exceptionrB   rstripr   errorjoinformat)r   builders     r!   createzGuard.createc  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 rW   )r   rc   rC   s    r!   rc   zGuard.is_specialized_nn_modulel  s    {{3355r#   c                6    | j                   j                         S rW   )r   rZ   rC   s    r!   rZ   zGuard.is_fsdp_moduleo  s    {{))++r#   c                6    | j                   j                         S rW   )r   rn   rC   s    r!   rn   zGuard.is_localr  s    {{##%%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_infou  s    !D
+)).
 
 	9 9	9 
 &3"~~&DNNN!!), d 33(()  "*	P P		P+ 'r#   rp   rB   rp   rF   )r   rz   )r8   r9   r:   r;   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   staticmethodr   r   r"   r   rc   rZ   rn   r   r&   r#   r!   r   r      s    ( 88 (,K$+%)I")$(K!(,0>0)-E&-37J07E=

 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 Zy)DuplicateInputsr   input_source_ainput_source_bc                :    | j                   | j                  k7  sJ y rW   )r   r   rC   s    r!   __post_init__zDuplicateInputs.__post_init__  s    ""d&9&9999r#   N)r8   r9   r:   r;   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 rW   r&   rC   s    r!   copy_graphstatezCheckpointable.copy_graphstate  s    $'r#   c                     y rW   r&   r   states     r!   restore_graphstatez!Checkpointable.restore_graphstate  s    ,/r#   N)rp   r   )r   r   )r8   r9   r:   r   r   r   r&   r#   r!   r   r     s    ' '/ /r#   r   c                  <    e Zd ZU dZ e       Zded<   d Zd Zd Z	y)GuardsCheckpointStatezW
    The GuardCheckpointState - it is the T of Checkpointable[T] for GuardsContext
    
set[Guard]dynamo_guardsc                    || _         y rW   )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                  |      d u S rW   r   r   s     r!   __eq__zGuardsCheckpointState.__eq__      yy4''r#   N)
r8   r9   r:   __doc__setr   r;   r   r   r   r&   r#   r!   r   r     s$     !$M:%+
(r#   r   c                  .    e Zd ZU i Zded<   d Zd Zd Zy)ModuleContextCheckpointStatezdict[str, torch.nn.Module]
nn_modulesc                    || _         y rW   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                  |      d u S rW   r   r   s     r!   r   z#ModuleContextCheckpointState.__eq__  r  r#   N)r8   r9   r:   r  r;   r   r   r   r&   r#   r!   r  r    s    -/J*/%
(r#   r  c                       e Zd ZddZd Zd Zy)ModuleContextc                    i | _         y rW   r  rC   s    r!   r   zModuleContext.__init__
  s	    *,r#   c                >    t        t        | j                              S rW   )r  dictr  rC   s    r!   r   zModuleContext.copy_graphstate  s    +D,ABBr#   c                J    t        |t              sJ |j                  | _        y rW   )r   r  r  r   s     r!   r   z ModuleContext.restore_graphstate  s     %!=>>>**r#   Nrp   Noner8   r9   r:   r   r   r   r&   r#   r!   r  r  	  s    -C+r#   r  c                  .    e Zd ZU i Zded<   d Zd Zd Zy)GlobalContextCheckpointStatezdict[str, tuple[Callable, ...]]global_statec                    || _         y rW   r  )r   global_statess     r!   r   z%GlobalContextCheckpointState.__init__  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.diff  sO     !!&&()44S9K9K9P9P9R5STq6Q;r#   c                (    | j                  |      d u S rW   r   r   s     r!   r   z#GlobalContextCheckpointState.__eq__'  r  r#   N)r8   r9   r:   r  r;   r   r   r   r&   r#   r!   r  r    s    46L16*
(r#   r  c                  ,    e Zd ZdZh dZddZd Z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_enabledtorch_function_enabledc                    i | _         y rW   r  rC   s    r!   r   zGlobalContext.__init__;  s
    =?r#   c                >    t        t        | j                              S rW   )r  r  r  rC   s    r!   r   zGlobalContext.copy_graphstate>  s    +D1B1B,CDDr#   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_graphstateA  s    %!=>>>!..!!"c$*G*G&HHD%%**,-1N1NN	# #	#O ++224 	JD$J	r#   Nr  )r8   r9   r:   r  r)  r   r   r   r&   r#   r!   r  r  +  s     
 @Er#   r  c                  J    e Zd ZddZd Zd Zd Zd Zddd	dd
ZddZ	d Z
y)	GuardsSetNc                *    |
t               }|| _        y rW   )r  inner)r   r/  s     r!   r   zGuardsSet.__init__W  s    =EE
r#   c                ,    t        | j                        S rW   )iterr/  rC   s    r!   __iter__zGuardsSet.__iter__\      DJJr#   c                ,    t        | j                        S rW   )r   r/  rC   s    r!   __len__zGuardsSet.__len___  s    4::r#   c                F    t        | j                  |j                  z
        S rW   )r-  r/  r   s     r!   __sub__zGuardsSet.__sub__d  s    ekk122r#   c                ,    t        | j                        S rW   )rq   r/  rC   s    r!   __bool__zGuardsSet.__bool__g  r3  r#   Tr   )collect_debug_stackskipc                   || j                   v ry |rO|j                  t        j                  d|z         |_        |j                  t
        j                         |_        | j                   j                  |       y NrG   )r;  )r/  r   r   extractr   TracingContextextract_stackadd)r   guardr:  r;  s       r!   rA  zGuardsSet.addj  sa    DJJ{{"/77QXF'#1#?#?#A 

ur#   c                F    |D ]  }|D ]  }| j                  |d         y r=  )rA  )r   othersogs       r!   updatezGuardsSet.updatet  s0     	$A $#$	$r#   c                l    | j                   D ch c]  }|j                  |k7  s| c}| _         yc c}w )z%Delete all guards with a given sourceN)r/  r   )r   r   rF  s      r!   remove_guards_with_sourcez#GuardsSet.remove_guards_with_sourcey  s(    !%NAq/C/Cv/MaN
Ns   11rW   )rB  r   )rD  r   )r8   r9   r:   r   r2  r5  r7  r9  rA  rG  rI  r&   r#   r!   r-  r-  V  s2    
 
3  8<! $
Or#   r-  c                       e Zd ZddZd Zd Zy)GuardsContextc                0    t               | _        g | _        y rW   )r-  r   aotautograd_guardsrC   s    r!   r   zGuardsContext.__init__  s    (168r#   c                R    t        t        | j                  j                              S rW   )r   r  r   r/  rC   s    r!   r   zGuardsContext.copy_graphstate  s    $S););)A)A%BCCr#   c                \    t        |t              sJ t        |j                        | _        y rW   )r   r   r-  r   r   s     r!   r   z GuardsContext.restore_graphstate  s&    %!6777&u':':;r#   Nr  r  r&   r#   r!   rK  rK  ~  s    9D<r#   rK  c                  x    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	y)HopSubgraphCachec                     y rW   r&   r   	cache_key
identifiers      r!   add_dynamo_identifierz&HopSubgraphCache.add_dynamo_identifier      FIr#   c                     y rW   r&   r   rT  s     r!   get_dynamo_identifierz&HopSubgraphCache.get_dynamo_identifier  rW  r#   c                     y rW   r&   r   rU  keys      r!   add_autograd_key_entryz'HopSubgraphCache.add_autograd_key_entry  rW  r#   c                     y rW   r&   r   rU  s     r!   get_autograd_key_entryz'HopSubgraphCache.get_autograd_key_entry  s    7:r#   c                     y rW   r&   r\  s      r!   add_proxy_dispatch_entryz)HopSubgraphCache.add_proxy_dispatch_entry  s    HKr#   c                     y rW   r&   r`  s     r!   get_proxy_dispatch_entryz)HopSubgraphCache.get_proxy_dispatch_entry  s    9<r#   NrT  rB   rU  rB   rT  rB   rp   r7   rU  rB   r]  r   rU  rB   )
r8   r9   r:   r   rV  rZ  r^  ra  rc  re  r&   r#   r!   rQ  rQ    sV    I II II I: :K K< <r#   rQ  c                  D    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	y)InvokeSubgraphCachec                .    i | _         i | _        i | _        y rW   )autograd_cacheproxy_dispatch_cachedynamo_identifiersrC   s    r!   r   zInvokeSubgraphCache.__init__  s    359;!24r#   c                "    || j                   |<   y rW   )ro  rS  s      r!   rV  z)InvokeSubgraphCache.add_dynamo_identifier  s    -7	*r#   c                :    | j                   j                  |d       S rW   )ro  getrY  s     r!   rZ  z)InvokeSubgraphCache.get_dynamo_identifier  s    &&**9d;;r#   c                "    || j                   |<   y rW   )rm  r\  s      r!   r^  z*InvokeSubgraphCache.add_autograd_key_entry  s    *-J'r#   c                :    | j                   j                  |d       S rW   )rm  rr  r`  s     r!   ra  z*InvokeSubgraphCache.get_autograd_key_entry  s    ""&&z488r#   c                "    || j                   |<   y rW   )rn  r\  s      r!   rc  z,InvokeSubgraphCache.add_proxy_dispatch_entry  s    03!!*-r#   c                :    | j                   j                  |d       S rW   )rn  rr  r`  s     r!   re  z,InvokeSubgraphCache.get_proxy_dispatch_entry  s    ((,,Z>>r#   Nr  rf  rg  rh  ri  )
r8   r9   r:   r   rV  rZ  r^  ra  rc  re  r&   r#   r!   rk  rk    s%    5
8<.94?r#   rk  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_subgraphrz  rk  hop_cache_map)r   rz  s     r!   r   zHopDispatchSetCache.__init__  s    K-/B/DEr#   c                >    || j                   vry | j                   |   S rW   )r|  )r   ops     r!   	get_cachezHopDispatchSetCache.get_cache  s&     T'''!!"%%r#   Nr  )r~  ztorch._ops.HigherOrderOperatorrp   zOptional[HopSubgraphCache])r8   r9   r:   r   r  r&   r#   r!   rx  rx    s    F&0&	#&r#   rx  c                  V    e Zd Zedd       Zedd       Zd Zed        Zed        Zy)	CompileContextc                 F    t         j                  J t         j                  S rW   )_TLScompile_contextr&   r#   r!   rr  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 r\   )r   r   r0   r?   shape_env_guards)r   r0   s     r!   r   zCompileContext.__init__  s-    !Z
I%FFF/9+-r#   c                 H    t         j                         } | y | j                  S rW   )r  r  r0   rC   s    r!   current_compile_idz!CompileContext.current_compile_id  s"    %%'<r#   c                     t         j                         } | y | j                  y t        | j                  | j                        S rW   )r  r  r0   r>   r?   rC   s    r!   current_trace_idzCompileContext.current_trace_id  s:    %%'<??"t55r#   N)rp   r  )rp   Optional[CompileContext])	r8   r9   r:   r   rr  r  r   r  r  r&   r#   r!   r  r    sU    $ $ 6 6.   6 6r#   r  c                     e Zd ZdZedd       Zedd       Zd Zd Zee	d               Z
ed        Zeej                  d               Zeej                  d	               Zeej                  d
               Zed        Zy)r?  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_get  r  r#   c                 H    t         j                         x} r| S t        d      )Nz<TracingContext.get() must be called within an ongoing trace.)r?  r  RuntimeError)ctxs    r!   rr  zTracingContext.get  s+     ((**3*JJ
 	
r#   c                4   t               | _        t               | _        t	               | _        || _        g | _        d | _        d | _	        d | _
        d | _        d | _        d | _        d | _        d| _        t!               | _        d| _        t'               | _        y NF)rK  guards_contextr  module_contextr  global_context	fake_modeframe_summary_stackloc_in_framefw_metadata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_callrx  hop_dispatch_set_cache)r   r  s     r!   r   zTracingContext.__init__  s    +o+o+o"#%  !"-1*.2+ JN 490!8!:
 "'&9&;#r#   c                &    i | j                   _        y rW   )r  r  rC   s    r!   clearzTracingContext.clear@  s     ,.(r#   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rW   )r?  rr  r
  r  r+   setattr)kwargspriorr  r]  vals        r!   patchzTracingContext.patchE  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 rW   )r?  r  	tracebackStackSummaryr  r  	from_list)r   r   s     r!   r@  zTracingContext.extract_stackV  se    %%'<))++(((T..//E%%//66r#   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)	r?  rr  unittestmockr  objectr.   hasattrr  )tcr5   s     r!   clear_framezTracingContext.clear_frameb  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  )
r?  rr  r  r   r  r.   r  r@  r  pop)frame_summaryr  oldr5   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rW   )r?  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                d    t        j                  | ||d      t        j                         _        y )NF)lookup_line)r  FrameSummaryr?  rr  r  )filenamelineno
frame_names      r!   set_current_loczTracingContext.set_current_loc  s'    ,5,B,Bfje-
)r#   N)rp   Optional[TracingContext])rp   r?  )r8   r9   r:   r  r   r  rr  r   r  r   r  r@  
contextlibr  r  r  r  r&   r#   r!   r?  r?    s     6 6 
 
+<Z.
 '  ' 7 7   < "  "& 
3  
3 
 
r#   r?  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    s7     $ 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  r.   r  r@  r  r  	shape_envcleanup)r  r  r5   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                  D    e Zd Zd Zd Zd Zd
dZddZddZddZ	d Z
y	)r   c                     yr  r&   rC   s    r!   is_dict_keyzSource.is_dict_key      r#   c                     yr  r&   rC   s    r!   is_ephemeralzSource.is_ephemeral  r  r#   c                    t         rW   NotImplementedError)r   codegens     r!   reconstructzSource.reconstruct      !!r#   c                    t         rW   r  rC   s    r!   r   zSource.guard_source  r  r#   c                    t         rW   r  rC   s    r!   r   zSource.name  r  r#   c                f    | j                         t        j                  u rt        t	        | |      S rW   )r   rF   rs   r  r   )r   fns     r!   
make_guardzSource.make_guard  s+    +"6"66%%T2r#   c                >    | j                         j                         S rW   )r   rc   rC   s    r!   rc   zSource.is_specialized_nn_module  s      ";;==r#   c                D    | j                         t        j                  k7  S )z+True if you can guard on attributes of this)r   rF   rx   rC   s    r!   subguards_allowedzSource.subguards_allowed  s      "k&A&AAAr#   Nr   r   )rp   r   ro   )r8   r9   r:   r  r  r  r   r   r  rc   r  r&   r#   r!   r   r     s+    """
>Br#   r   c                  ,    e Zd ZU ded<   d Zd ZddZy)ChainedSourcer   basec                6    | j                   j                         S rW   )r  r  rC   s    r!   r  zChainedSource.is_dict_key  s    yy$$&&r#   c                6    | j                   j                         S rW   )r  r  rC   s    r!   r  zChainedSource.is_ephemeral  s    yy%%''r#   c                d    | }t        |t              r|j                  }t        |t              r|S rW   )r   r  r  )r   currents     r!   get_basezChainedSource.get_base  s+    -0llG -0r#   N)rp   r   )r8   r9   r:   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   )
FakeTensorFakeTensorModeNztracing context _get_current_dispatch_mode_stackzactive fake modezfake tensor inputrG   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  r?  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_moder    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  rA   r   s       r!   active_fake_moder	  0  s?    
 =M(#C#EFG 1a(H r#   )r  r  )r  r  rW   )r  r   )M
__future__r   r  dataclassesenumr   loggingre	threadingr  unittest.mockr  r   abcr   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   	getLoggerr8   r   sympycompiler'   r(   r   r>   EnumrF   rz   r}   r   r   r   r   r   r   r   r   r  r  r  r  r-  rK  rQ  rk  rx  localr  r  r?  r  r  r   r  r  r	  r&   r#   r!   <module>r     s   "      	      % !	 	 	  ) 7 B 4 g!   RZZ PQ "

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

0WQZ 0( (4( (,	+N#?@ 	+( (,N#?@ B%O %OP<N#89 <= =(?* ?2& & y&6 6Dj
 j
Z + + + +8 d#B B $B< d#F  $")Xr#   