
    sg>                   d   U 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mZ d dlmZmZ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mZmZmZmZmZm Z m!Z! d dlm"Z"m#Z#m$Z$ d dl
m%Z% d dl&Z&d dl'Z&d dl(m)Z) d dl*m)c mZ+ d dl,m-c m.Z/ d d	l&m0Z0m1Z1m2Z2 d d
l3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl(m@Z@mAZAmBZB d dlCmDZD d dlEmFZF d dlGmHZH d dlImJZJ d dlKmLZL d dlMmNZNmOZOmPZPmQZQ d dlRmSZS d dlTmUZU d dlVmWZW d dlXmYZYmZZZm[Z[ ddl\m]Z] ddl^m_Z_ er d dl`Z`d dlambZb d dlcZcd dl'mdZd d dlemfZf d d lgmhZh g d!Zie!d"   Zje&j                  e6fZle!e&j                  e6f   Zme&j                  j                  Zoe&j                  j                  Zp ej                  er      Zse&j                  j                  erd#      Zvi awd$exd%<   dZy e d&      Zz e d'      Z{ e#d(      Z| e d)      Z} e~e      Z e/j                   e&j                  d* d+ d, -       dd.Ze	 	 	 	 dd/       Z e       Z G d0 d1      Z e       Zd d2lgmZmZ  G d3 d4e      Zdd5Zedd7       Ze	 	 	 	 	 	 	 	 dd8       Ze	 	 	 	 	 	 	 	 dd9       Z	 	 	 	 	 	 	 	 dd:Zdd;ZeUeA   Ze	 	 	 	 	 	 dd<       Ze	 	 	 	 	 	 	 	 dd=       Ze	 	 	 	 	 	 	 	 	 	 dd>       Ze	 	 	 	 	 	 dd?       Ze	 	 	 	 	 	 	 	 dd@       Ze	 	 	 	 	 	 	 	 	 	 ddA       Ze	 	 	 	 	 	 ddB       Ze	 	 	 	 	 	 	 	 ddC       Ze	 	 	 	 	 	 	 	 	 	 ddD       ZedE f	 	 	 	 	 	 	 	 	 ddFZddGZee!eeme]edH   edI   eedHf   e2eeef
      ZddJZedKdL	 	 	 	 	 ddM       ZeddN       ZeddO       ZddPZ	 	 	 	 	 	 	 	 	 	 ddQZ	 	 	 	 	 	 	 	 	 	 ddRZe!eAedS   eedSf   f   Ze!e2edT   eedTf   f   Z	 	 	 	 	 	 	 	 	 	 ddUZe G dV d6             Z	 	 	 	 ddWZeddX       Ze	 	 	 	 	 	 ddY       Ze	 	 	 	 	 	 ddZ       Z	 	 	 	 	 	 dd[Ze2e&jF                  jH                  e:fZ	 	 	 	 	 	 dd]Z	 	 	 	 	 	 	 	 	 	 	 	 dd^Z G d_ d`      Z G da dbeB      Zeddc       Ze&jV                  	 d	 	 	 	 	 	 	 ddd       Z	 	 	 	 	 	 	 	 	 	 ddeZdadfexdg<   eddh       Z G di djeL      Z G dk dleL      Z G dm d\eQ      Z G dn doe)jf                  jh                        Z G dp dqe)jl                        Z	 	 	 	 	 	 	 	 ddrZedds       Z G dt due      Z G dv dw      Z G dx dye      Z G dz d{      Zdad|exd}<   edd~       Z	 	 	 dddddKd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZddZedd       Z	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZy)    )annotationsN)defaultdict)contextmanager	ExitStacknullcontext)	dataclass)AnyCallableDict	GeneratorListMappingOptionaloverloadProtocolSequenceTupleTypeTYPE_CHECKINGTypeVarUnion)Concatenate	ParamSpecSelf)WeakKeyDictionary)SymBoolSymIntTensor)enable_python_dispatcher)FakeScriptObject)fast_detach)
FakeTensorFakeTensorModeis_fakeunset_fake_temporarily)is_sparse_any)GraphModuleProxyTracer)_assign_attr)1_side_effectful_need_to_be_preserved_pre_dispatch)_extract_tensor_metadata)Module)TorchFunctionMode)_disable_infra_mode
_push_mode_unset_infra_modeTorchDispatchMode)count)Thunk)CapturedTraceback)_WeakHashRefWeakIdKeyDictionaryWeakTensorKeyDictionary   )BackwardState)SymNode)MutableMapping)
OpOverload)PHBase)IntLikeType)
PythonKeyTracerdispatch_tracemake_fxDecompositionInterpreterpy_sym_typesget_innermost_proxy_modeget_proxy_modehandle_sym_dispatchmaybe_enable_thunkifymaybe_disable_thunkify)r@   _GraphAppendingTracerExnot_implementedzMapping[OpOverload, Callable]CURRENT_DECOMPOSITION_TABLETU_PRc                    t        |       d fS N)list)xss    U/var/www/html/venv/lib/python3.12/site-packages/torch/fx/experimental/proxy_tensor.py<lambda>rV      s    R$     c                    t        |       S rR   )tuple)rT   _s     rU   rV   rV      s
    %) rW   c                x    t        |       D cg c]  \  }}t        j                  |      |f c}}d fS c c}}w rR   )	enumeratepytreeSequenceKey)rT   ixs      rU   rV   rV      s5    09">1&

Q
	#>% >s   !6)flatten_with_keys_fnc                n    dj                  d t        |      D              }t        d| d| dd| i      S )z*FX gets confused by varargs, de-confuse it,c              3  &   K   | ]	  }d |   yw)argN ).0r_   s     rU   	<genexpr>z!fake_signature.<locals>.<genexpr>   s     8a#aS	8s   zlambda z: fn()fn)joinrangeeval)rj   nargsargnamess      rU   fake_signaturerp      s:    xx85<88H'(5
!4tRjAArW   c              #  H   K   t         }| xs i a 	 t          |a y # |a w xY wwrR   )rL   )decomposition_tableold_decomposition_tables     rU   	decomposert      s1     
 :"5";>))&=#&=#s   " ""c                      e Zd Zy)
_NoDefaultN__name__
__module____qualname__rf   rW   rU   rv   rv          rW   rv   )rD   	PySymTypec                      e Zd ZU ded<   y)_HasMetazDict[str, PySymType]metaNrx   ry   rz   __annotations__rf   rW   rU   r~   r~      s    
rW   r~   c                    t        | d      sJ d       d| j                  v xr t        | j                  d   t              S )Nr   z3All nodes traced with proxy_tensor should have metaval)hasattrr   
isinstancerD   )nodes    rU   is_sym_noder      s<    4 W"WW DIIL*TYYu-=|"LLrW   _ProxyTensorc                     y rR   rf   objtracerproxys      rU   set_proxy_slotr          rW   c                     y rR   rf   r   s      rU   r   r           rW   c                     y rR   rf   r   s      rU   r   r      r   rW   c                ^   t         j                  d| t        |       |       t        | t              r"t        |t
              sJ ||j                  | <   y t        | t              r"t        |t              sJ ||j                  | <   y t        | t              sJ t        |              | |j                  vrzt        j                  t        |      |j                  | <   dd l}t        | j"                  j$                  |j&                        r$||j(                  | j"                  j$                  <   y y y )Nzset_proxy_slot %s (%s) %sr   )logdebugidr   r   r   tensor_tracker_AnyScriptObjectr(   script_object_trackerrD   typesymnode_trackertypingcast_PySymProxyTypesympyr   exprSymbolsympy_expr_tracker)r   r   r   r   s       rU   r   r      s    
 II)33?#v %...%*c"	C*	,%''',1$$S) #|,7d3i7,f,,,*0++ou*MF""3' #((--6;@))#((--8 7# -rW   c                ~    t        | t        t        f      sJ t        |              t	        t        | |dd             S )NFc                     yNTrf   rZ   s    rU   rV   z has_proxy_slot.<locals>.<lambda>   s    rW   )r   r   r;   r   boolget_proxy_slotr   r   s     rU   has_proxy_slotr      s6    cFG,-8tCy8-sFE>BCCrW   c                     y rR   rf   r   s     rU   r   r          
 rW   c                     y rR   rf   r   r   defaults      rU   r   r           rW   c                     y rR   rf   r   r   r   	transforms       rU   r   r   	       rW   c                     y rR   rf   r   s     rU   r   r     r   rW   c                     y rR   rf   r   s      rU   r   r     r   rW   c                     y rR   rf   r   s       rU   r   r   $  r   rW   c                     y rR   rf   r   s     rU   r   r   .  r   rW   c                     y rR   rf   r   s      rU   r   r   6  r   rW   c                     y rR   rf   r   s       rU   r   r   ?  r   rW   c                    | S rR   rf   r`   s    rU   rV   rV   P  s    A rW   c                   t        | t              r|j                  }nIt        | t              r|j                  }n,t        | t
              sJ t        |              |j                  }| |vrt        | t
              rF| j                  j                  |j                  v r$|j                  | j                  j                     }n3t        |t              rt        |  dt        |        d|       |S ||    } ||      }|S )Nz (z)is not tracked with proxy for )r   r   r   r   r   rD   r   r   r   r   r   rv   RuntimeErrorr   )r   r   r   r   trackervalueress          rU   r   r   L  s     #v''	C)	*..#|,7d3i7,((
'c<(SXX]]f>W>W-W--chhmm<E':."e2bgY&EfXN  N
E
CJrW   c                n    t        | t              rt        | j                  |       S | j	                         S rR   )r   r"   r!   	fake_modedetach)r   s    rU   snapshot_faker   k  s+     #z"3==#..zz|rW   _ExtractValType)r   .c                   t        |       rt        |       S t        | t              r| S t        | t              r| S t        | t
              r| S t        | t        t        f      r(| j                  | D cg c]  }t        |       c}      S t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t              rj| j                  s]t        d      }|5  t        j                   | j"                  | j%                         | j&                  | j(                        cd d d        S y t        | t*        t,        t.        f      r| S | y t1        j2                  |        y c c}w c c}}w # 1 sw Y   *xY w)NT)allow_fallback_kernels)devicedtype)r$   r   r   rD   r   r:   rS   rY   	__class__extract_valdictitemsr   	is_sparser#   torchempty_stridedshapestrider   r   intfloatr   typing_extensionsassert_never)r   r`   kvfake_tensor_modes        rU   r   r     s9   s|S!!	C	&
	C)	*
	C	'
	C$	'}}c:k!n:;;	C	.1iik:da;q>!::	C	 }}  .TJ! **IIszz|CJJcii 
 	C#ud+	,
	""3'/ ;: s   2E8.E=2AFFTenablec             #  b   K   | j                   }|| _         	 d || _         y# || _         w xY ww)a{  
    Enable thunkification inside the context manager.  Thunkification prevents
    SymNode computation from directly being traced into an FX graph; instead,
    the compute is only added to the graph if it is actually used.  This helps
    us track SymNode compute when it is computed (since we need /something/
    to put in the tracker) even if it is unlikely to be used.
    N)enable_thunkify)r   r   olds      rU   _enable_thunkifyr     s3      
 
 C#F%!$s   /# /	,/c               #     K   t               } | %t        | j                  d      5  d ddd       yd y# 1 sw Y   yxY ww)a[  Within a context, disable thunkification.  See :func:`maybe_enable_thunkify`
    for more details.  This is helpful if you have a wrapper function which
    you want to enable thunkification on, but in some segment on the inside (say,
    the original user function), you want to disable thunkification as you know
    it is not needed there.
    NFr   rF   r   r   
proxy_modes    rU   rI   rI     sG       !Jj//> 		 	 		 	s   $A9AAAc               #     K   t               } | #t        | j                        5  d ddd       yd y# 1 sw Y   yxY ww)a3  Within this context manager, if you are doing make_fx tracing, we will thunkify
    all SymNode compute and avoid tracing it into the graph unless it is actually needed.
    You should prefer to avoid using this as much as possible, as lazy evaluation of
    SymNode tracing can lead to long chains of thunks which will stack overflow
    if you evaluate them.  However, this is currently sometimes necessary as there
    are buggy parts of PT2 which will fail with "s0 is not tracked with proxy" error
    due to insufficient tracing of SymNode computation.
    Nr   r   s    rU   rH   rH     sE       !Jj//0 		 	 		 	s   "A7AA Ac                x   t        |      | j                  j                  d<   t        | j                        5  t        |      r#t        |      | j                  j                  d<   n>t        |t              r.|j                  s"t        |      | j                  j                  d<   d d d        | S # 1 sw Y   | S xY w)Nr   tensor_meta)
r   r   r   r   r   r$   r,   r   r   r   )r   r   s     rU   set_metar     s    (-EJJOOE	%,,	' K3<-Ec-JEJJOOM*V$S]]-Ec-JEJJOOM*K LK Ls   A-B//B9c                    | j                   r"t        t        j                  |g|i |      S  ||i |t        fd      S )zT
    Delays computation of f until it's called again
    Also caches the result
    c                      S rR   rf   )rs   rU   rV   zthunkify.<locals>.<lambda>  s    Q rW   )r   r4   	functoolspartial)r   fargskwargsr   s       @rU   thunkifyr     sH     Y&&q:4:6:;;tvYrW   c                  	 	 	 	 	 	 	 	 	 	 dfd}t        | j                        D ]  \  }} ||fd|        t        |       s/t        | j                               D ]  \  }} ||fd|         || j	                         fd       t        |       s || j                         fd       t        | t        |             y )Nc           
         t        |      sJ t        | t              r1t              5  t	        | t        || g|i |       d d d        y y # 1 sw Y   y xY wrR   )callabler   r   r   r   r   )outer_sproxy_callabler   r   r   s       rU   try_set_proxy_slotz(track_tensor.<locals>.try_set_proxy_slot  sh     '''gv&!&) V^WNtNvN  ' s   AAc                    t        j                  dt        j                  j                  j
                  j                  |fi       |       S Ncall_function)r   create_proxyr   opsatensym_sizer   r`   r_   r   r   s     rU   rV   ztrack_tensor.<locals>.<lambda>  s@    ###UYY^^%<%<%@%@5!*b 	 rW   c                    t        j                  dt        j                  j                  j
                  j                  |fi       |       S r   )r   r   r   r   r   
sym_strider   r   s     rU   rV   ztrack_tensor.<locals>.<lambda>&  sB    X''')B)B)F)FPQ
TV 	 rW   c                    t        j                  dt        j                  j                  j
                  j                  fi       |       S r   )r   r   r   r   r   	sym_numelr   r`   r   r   s    rU   rV   ztrack_tensor.<locals>.<lambda>1  s>    (!9!9!A!AE8R 	
 rW   c                    t        j                  dt        j                  j                  j
                  j                  fi       |       S r   )r   r   r   r   r   sym_storage_offsetr   r  s    rU   rV   ztrack_tensor.<locals>.<lambda>;  sA    h###IINN55==H	  rW   )
r   r?   r   z+Callable[Concatenate[PySymType, _P], Proxy]r   _P.argsr   	_P.kwargsreturnNone)r\   r   r&   r   numelstorage_offsetr   r   )tensorr   constantr   r   r_   ss    ` `   rU   track_tensorr    s    C  	
 
( &,,' 

1 		


  fmmo. 
	DAq 	
	 	
  !!#	
 66<x#@ArW   _NestedProxys_NestedTensorsc               T    t        | |       	 	 	 	 	 	 	 	 dfd | ||       | S )Nc           	        t        | t              rBt        t              sJ |t        |t              sJ t        | |       t	        |        y t        | t
              r9t        t              sJ t	        |        t        | t        fd             y t        | t              r,t        t              sJ t        |        t	        |        y t        | t        t        f      rXt        t        j                        rt	        |        	 	 	 	 	 	 dd}t        |       D ]  \  }} 	||    |||              y t        | t              rP|J t        t        j                        rt	        |        | j                         D ]  \  }} 	||   d         y t        | t              r&t        t              sJ t	        |        | _        y y )N)r   r  c                      S rR   rf   r   s   rU   rV   z<track_tensor_tree.<locals>.wrap_with_proxy.<locals>.<lambda>r  s    u rW   c                B    | y t        | t        t        f      sJ | |   S rR   )r   rS   rY   )cidxs     rU   get_constantz@track_tensor_tree.<locals>.wrap_with_proxy.<locals>.get_constant|  s)     9%a$777S6MrW   )r  Optional[_NestedTensors]r  r   r	  r  )r   r   r(   r  r   rD   r   r   r   rY   rS   fxr\   r   r   r:   r   )
er   r  r  r  eekeyr   r   wrap_with_proxys
    `      rU   r   z*track_tensor_tree.<locals>.wrap_with_proxyf  s    a eU+++#z(F'CCCE&8DUA<(eU+++UA1fhv}&EF+,eU+++1fe,UAE4=)%*""+"25")" %Q< MR  E#JXs0KLM
 4  ###%*"GGI 7SU3Z67 =)eU+++UAAG rW   )r  objectr   r  r  r  r	  r
  )_set_unbacked_bindings)	inner_res	proxy_resr  r   r   s      `@rU   track_tensor_treer%  P  sI    ( 9i0::':3K:	:x Iy(3rW   c                  "    e Zd ZU ded<   ded<   y)r   r(   r   Optional[Tensor]r  Nr   rf   rW   rU   r   r     s    LrW   c                     d fd}|S )Nc                   | j                   }|j                  |j                  S | j                   j                  j                  r}t	        | t
              rt        | j                   j                        S t	        | t              rt        | j                   j                        S t        | j                   j                        S t	        | t              sJ t        |       j                         S rR   )r   r  r   	is_numberr   r   r   r   r   r   rD   r   force)r  nr   s     rU   innerzfetch_sym_proxy.<locals>.inner  s    FF::!::66;;  !W%AFFKK((Av&166;;''%%a...!!V,2244rW   )r  r|   r	  zUnion[int, bool, float, Proxy]rf   )r   r-  s   ` rU   fetch_sym_proxyr.    s    5 LrW   c                     y rR   rf   r   ts     rU   fetch_object_proxyr2    r   rW   c                     y rR   rf   r0  s     rU   r2  r2    r   rW   c                     y rR   rf   r0  s     rU   r2  r2    r   rW   c                    t        || |      S rR   r   r0  s     rU   r2  r2    s     !VQ''rW   ProxyTorchDispatchModec                $   |j                   s|j                  syt        | t        j                  j
                        r&t        j                  j                  | j                  vryt        t        t        |j                  j                  j                                    }|j                  j!                  d      }t        |t        j"                        r,|j$                  t        j&                  t        j(                  fvryd|j                  d<   y)zd
    Records pointwise operators in user program (non decomposed) that were output in fp16/bf16
    Nr   Tlow_precision_pointwise_barrier)decomp_layersemulate_precision_castsr   r   _opsr=   Tag	pointwisetagsnextiterreversedr   graphnodesr   getr   r   bfloat16float16)funcr   	last_noder1  s       rU   _maybe_record_pointwise_barrierrJ    s     z'I'I tUZZ22399dii/T(:#4#4#:#:#@#@ABCI5!Aa&!'': + 	8<INN45rW   c           	         g t        j                  ||f      \  }}d fdt        fd|D              st        j	                  d       t
        S t         |||      }|t
        urt        |        |S |s|t        j                  j                  j                  j                  t        j                  j                  j                  j                  t        j                  j                  j                  j                  fvr1 5   |j                  |i |}|t
        ur|cd d d        S 	 d d d         j                   }|D 	cg c]&  }	t#        |	t$        t&        f      rt)        ||	      n|	( }
}	t+        d |
D               xr t+        d |D               }t        j,                  j.                  |j0                  v r|r`|
D cg c]   }t#        |t2              r|j4                  n|" }}t        j6                  ||      \  }}t9               5   ||i |cd d d        S  j:                  r-t        j<                  t$        d ||f      rt?        d| d      |
D cg c]   }t#        |t2              r|j@                  n|" }}|D cg c]/  }t#        |tB              r tE         j                         |      n|1 }}t        j6                  ||      \  }}|t        j                  j                  jF                  j                  u r.t        j                  j                  jH                  j                  } j                   jK                  d	||| j                   jL                  jO                  |jP                  jR                        
      }tU         j                         5   ||i |}d d d        t+        d |
D              }d }dd}|t        j                  j                  jH                  j                  u rjjW                         tX        k  rSt9               5  t#        |d   tZ        t$        f      sJ t]        |d                |d   j_                         }d d d        nt        j,                  j`                  |j0                  vr|r}|r{t        j<                  t$        |      r`t9               5  |
D cg c]   }t#        |t2              r|j4                  n|" }}t        j6                  ||      \  }} ||i |}d d d        nd }tc        |||       t        |        |S # 1 sw Y   xY wc c}	w c c}w # 1 sw Y   )xY wc c}w c c}w # 1 sw Y   xY w# 1 sw Y   axY wc c}w # 1 sw Y   rxY w)Nc                    t        |       t        v xs t        | j                        }j                  r*|xs& t        |       t
        j                  j                  fv }|sj                  t        |              |S rR   )	r   HANDLED_TYPESr   r   _allow_fake_constantr   _subclassesr"   append)r`   r   r   unrecognized_typess     rU   can_handle_tensorz%proxy_call.<locals>.can_handle_tensor  sh    G}$Lq*:K:K(L**?T!W!2!2!=!= ??A%%d1g.rW   c              3  P   K   | ]  }t        |t              s |        y wrR   )r   r   )rg   r`   rR  s     rU   rh   zproxy_call.<locals>.<genexpr>  s      WAvAV #Ws   &&zEProxyTensorMode tensors without proxy had unrecognized subclasses: %sc              3  X   K   | ]"  }t        |t              r|j                  d u  $ y wrR   r   r   r  rg   r1  s     rU   rh   zproxy_call.<locals>.<genexpr>1  s+      
!\* JJ$
   (*c              3  <   K   | ]  }t        |t                y wrR   )r   rD   )rg   r`   s     rU   rh   zproxy_call.<locals>.<genexpr>8  s     JAJq,/Js   c                    t        |        S rR   )r$   r1  s    rU   rV   zproxy_call.<locals>.<lambda>K  s    '!*n rW   zHIt appears that you're trying to get value out of a tracing tensor with z - erroring out! It's likely that this is caused by data-dependent control flow or similar.  It may be possible to trace this with dynamic shapes; try setting tracing_mode='symbolic' in your make_fx call.r   )namec              3  X   K   | ]"  }t        |t              r|j                  d u $ y wrR   rU  rV  s     rU   rh   zproxy_call.<locals>.<genexpr>  s+      a& 	


$rW  c                0    | j                         t        k  S rR   )r  CONSTANT_NUMEL_LIMITrZ  s    rU   tensor_numel_in_limitz)proxy_call.<locals>.tensor_numel_in_limit  s    wwy000rW   r   r  r   )r`   r   r	  r   )r1  r   r	  r   )2r]   tree_flattenallnot_implemented_logr   NotImplementedmaybe_handle_decomprJ  r   r   r   sizer   r   r  rt   r   r   r   r   r2  anyr=  data_dependent_outputr?  r   r  tree_unflattenr%   _error_on_data_dependent_opstree_all_onlyr   r   rD   r.  
lift_freshlift_fresh_copyr   rC  _target_to_stroverloadpacketrx   r   r  r^  r(   r   clonenondeterministic_seededr%  )r   rH  pre_dispatchr   r   flat_args_kwargsspecr   r   r`   f_flat_args_kwargsall_constantr1  const_flat_args_kwargs
const_argsconst_kwargsr  proxy_flat_args_kwargs
proxy_argsproxy_kwargs	proxy_outoutany_constantr  r_  rR  rQ  s   `                        @@rU   
proxy_callr    s`    &(#00$@d W-=WW!!S	
 JdF;A'j9 D		##		%%		%%--) 
  	//A&	 	&	
 F "  !f&678 vq)   
'
 
 	
 	K J9IJJJ  yy&&$))3 ,& )L9

q@&" & (.'<'<&($J () 9Z8<89 9
 22v7K7K,tVn8
 Z[_Z` a( (  @R:;:a.A5 
 ( 3=Q2M	+**	+A	.ST	T   &445KTRJF uyy~~((000yy~~--55!!..$$33D4G4G4P4PQ / I 
*++	, $D#F#$0  # L H1 			..666IIK//#% 	'd1gv7Fd1gF7Aw}}H	' 	' 			)):  )>D $% 	9 ,& )L9

q@&" & (.'<'<&($J Z8<8H	9 	9 c9xG#D*5J[	 	4&9 9d$ $T	' 	'&	9 	9sg   
T.	+T;
%U U#%U4U'	U!A U)9U:>%U5##U:.T8UU&)U25U::Vc                  V    e Zd ZdZd
dZddZddZddZ	 d	 	 	 	 	 ddZddZ	dd	Z
y)_SymNodeDictzM
    Wrapper around a dictionary that will hash SymInts with their nodes
    c                    i | _         y rR   )sym_node_dictselfs    rU   __init__z_SymNodeDict.__init__  s
    ?ArW   c                6    || j                   |j                  <   y rR   r  r   )r  r  r   s      rU   __setitem__z_SymNodeDict.__setitem__  s    ',388$rW   c                4    | j                   |j                     S rR   r  r  r  s     rU   __getitem__z_SymNodeDict.__getitem__  s    !!#((++rW   c                2    |j                   | j                  v S rR   )r   r  r  s     rU   __contains__z_SymNodeDict.__contains__  s    xx4----rW   Nc                N    | j                   j                  |j                  |      S rR   )r  rE  r   )r  r  r   s      rU   rE  z_SymNodeDict.get  s!    
 !!%%chh88rW   c                    t         rR   )NotImplementedErrorr  s    rU   __iter__z_SymNodeDict.__iter__  s    !!rW   c                ,    t        | j                        S rR   )lenr  r  s    rU   __len__z_SymNodeDict.__len__  s    4%%&&rW   r	  r
  )r  r|   r   r   r	  r
  )r  r|   r	  r   )r  r|   r	  r   rR   )r  r|   r   zOptional[_PySymProxyType]r	  r   )r	  r	   )r	  r   )rx   ry   rz   __doc__r  r  r  r  rE  r  r  rf   rW   rU   r  r    sJ    B-,. DH99'@9	9"'rW   r  c                       e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   dZded<   d fdZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZd fdZe	dd       Z
e	dd       Z
e		 	 	 	 dd       Z
ddZ
 xZS )r@   +MutableMapping[_AnyScriptObjectType, Proxy]r   r  r   Dict[sympy.Symbol, object]r   $MutableMapping[Tensor, _ProxyTensor]r   Dict[OpOverload, int]torch_fn_countsFr   r   c                    t         |   d       t               | _        t	               | _        t        d t              | _        t               | _
        d | _        i | _        d| _        y )Nrf   )autowrap_modulesr   ref_typeF)superr  r8   r   r  r   r7   r6   r   r   r   torch_fn_metadatar  r   )r  r   s    rU   r  zPythonKeyTracer.__init__  sb    "-57+~%8&
" #'& "&  "$rW   c                     ||i |S rR   rf   )r  mforwardr   r   s        rU   call_modulezPythonKeyTracer.call_module  s     '''rW   c                    |S rR   rf   )r  attrattr_valparameter_proxy_caches       rU   getattrzPythonKeyTracer.getattr  s	     rW   c                   t        |t        j                  j                        rx| j                  j                         D ]  \  }}||u s| j                  d|di       c S  | j                  d      }t        | j                  ||       | j                  d|di       S t        |t              r.|j                  j                  J |j                  j                  S t        | 5  |      S )Nget_attrrf   _param_constant)r   r   nn	Parameterrootnamed_parameterscreate_nodeget_fresh_qualnamesetattrrD   r   r  r  
create_arg)r  ar,  pqualnamer   s        rU   r  zPythonKeyTracer.create_arg  s    a++,		224 C16++J2rBBC ../@AHDIIx+##J"bAA<(66??...66??"w!!$$rW   c                     y rR   rf   r  r  s     rU   unwrap_proxyzPythonKeyTracer.unwrap_proxy&      rW   c                     y rR   rf   r  s     rU   r  zPythonKeyTracer.unwrap_proxy*  r  rW   c                     y rR   rf   r  s     rU   r  zPythonKeyTracer.unwrap_proxy.  s     	rW   c                    t        |t              rt        || |d       S t        |t              rt        || |d       S t        |t              rt        || |      S |S )Nc                    | j                   S rR   r  r   s    rU   rV   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>6  s
     rW   c                "    | j                         S rR   )r+  )r  s    rU   rV   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>8  s    	 rW   )r   r   r   rD   r   r  s     rU   r  zPythonKeyTracer.unwrap_proxy4  sY    a !!T1.?@@<(!!T1.ABB+,!!T1--HrW   r  )
r  r-   r  zCallable[..., Any]r   zTuple[Any, ...]r   zDict[str, Any]r	  r	   r  strr  r!  r  zDict[str, Proxy]r	  r!  )r  r!  r	  fx.node.Node)r  r   r	  zUnion[Proxy, Tensor])r  r|   r	  zUnion[Proxy, PySymType])r  _AnyScriptObjectTyper	  "Union[Proxy, _AnyScriptObjectType])r  rM   r	  r!  )rx   ry   rz   r   r   r  r  r  r  r   r  __classcell__r   s   @rU   r@   r@     s    FF!!2288**!OT!%&(( $( 	(
 ( 
(#)BR	
%     %	+ 
rW   r@   c               #  $  K   ddl m} m}m} g }d } |        dkD  r6 |       }t	        |t
              r|}n|j                  |        |        dkD  r6t        |      D ]
  } ||        	 d  |Lt        |      }|dkD  r |       }|dz  }|dkD  r|j                  |       t        |      D ]
  } ||        y y # |Lt        |      }|dkD  r |       }|dz  }|dkD  r|j                  |       t        |      D ]
  } ||        w w xY ww)Nr   )_len_torch_function_stack	_pop_moder0   r9   )	torch.overridesr  r  r0   r   PreDispatchTorchFunctionModerP  rB  r  )r  r  r0   temp_elementspre_dispatch_modemoder3   s          rU   -_temp_remove_pre_dispatch_torch_function_moder  ?  sE    PPM
#
%
){d89 $  & $
%
) ' 4! (&E!) {
 !)   !23 / !4 ! )(&E!) {
 !)   !23 / !4 ! )s0   ADD*B= .#D+D=$D"+DDc                &   |j                  | |      }dd}|j                  |       ddlm}  ||       t	        | t
              r| j                  j                  n| j                  }t        j                  j                  |j                  ||      S )Nc                    ddl m} | j                         ry ||       ryt        | j                  j                  d      t              rt        d | j                  D              ryy)Nr9   )is_accessor_nodeTFr   c              3     K   | ]G  }t        |t        j                        r+t        |j                  j	                  d       t
               I yw)r   N)r   r  Noder   rE  rD   )rg   r  s     rU   rh   z6dispatch_trace.<locals>.impure_pred.<locals>.<genexpr>{  s:      a) 166::e,l;s   AA)	symbolic_shapesr  	is_impurer   r   rE  rD   rb  r   )r,  r  s     rU   impure_predz#dispatch_trace.<locals>.impure_predj  s^    5 ;;= A
 qvvzz%(,7     rW   r   )dedupe_symints)r,  zfx.Noder	  r   )traceeliminate_dead_code,torch._inductor.fx_passes.dedupe_symint_usesr  r   r-   r   rx   r  _lazy_graph_module_make_graph_moduler  )r  r   concrete_argsrC  r  r  r[  s          rU   rA   rA   a  sq     LL}-E8 
k*K5&0v&>4>>""DMMD  33FKKMMrW   c                     t        j                        \  }t        j                         d fd       }|S )Nc                    t        j                  |       \  }}t        |      t        	      k(  sJ t               5 }t	        |t
              sJ t        	|d        d d d        dfd} 
 }t        j                  t        ||      }t        j                  t        fd|      }dfd}t        j                  t        ||      }|S # 1 sw Y   pxY w)Nr`  c                "    t        | | d       S )Nc                    | j                   S rR   r  r   s    rU   rV   zJwrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot.<locals>.<lambda>  s
    !'' rW   r6  r1  r   s    rU   get_tensor_proxy_slotz8wrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot  s    !!VQ0ABBrW   c                "    t        | | d       S )Nc                    | S rR   rf   r   s    rU   rV   z=wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>  s    q rW   r6  r  s    rU   rV   z+wrap_key.<locals>.wrapped.<locals>.<lambda>  s    q&![(Q rW   c                8    t        |       j                         S rR   )r   r+  r  s    rU   get_sym_proxy_slotz5wrap_key.<locals>.wrapped.<locals>.get_sym_proxy_slot  s    !!V,2244rW   )r1  r   r	  zUnion[Tensor, Proxy])r1  r|   r	  r(   )r]   ra  r  disable_proxy_modes_tracingr   r7  r%  tree_map_onlyr   r   rD   )proxies_unusedflat_proxiesproxies_specr  r  r~  r  r   flat_tensorstensorsr   s           rU   wrappedzwrap_key.<locals>.wrapped  s    %+%8%8%A"l< C$5555(* 	Xaa!7888lL4PVW	X	C k""6+@#F""QSV
	5 ""<1CSI
#	X 	Xs   "CC)r  r  r  r  r	  rP   )r]   ra  r   wraps)r   r  r   rr  tensors_specr  r  s   ```   @rU   wrap_keyr    s<     "(!4!4W!=L,__Q , NrW   zOptional[object]ORIGINAL_ATENc              #     K   t         Dt        j                         r0| a | t        j                  d<   	 d  d a d t        j                  d<   y d  y # d a d t        j                  d<   w xY ww)Noriginal_aten)r  fx_tracebackhas_preserved_node_metacurrent_meta)rH  s    rU   set_original_aten_opr     sf      !E!E!G59!!/2	> M9=L%%o6 !M9=L%%o6s   0A,A A,A))A,c                  4    e Zd ZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)TorchFunctionMetadataModec                    || _         y rR   r   r  r   s     rU   r  z"TorchFunctionMetadataMode.__init__  	    rW   Nc                    |xs i }|| j                   _        | j                   j                  j                  |d      dz   | j                   j                  |<    ||i |S )Nr   r9   )r   r  r  rE  r  rH  typesr   r   s        rU   __torch_function__z,TorchFunctionMetadataMode.__torch_function__  s[     2(,%,0KK,G,G,K,KDRS,TWX,X##D)T$V$$rW   r   _ProxyTracerr	  r
  rf   N
rH  r=   r	   Tuple[torch._C._TensorMeta, ...]r   Tuple[object, ...]r   Optional[Dict[str, object]]r	  r!  rx   ry   rz   r  r
  rf   rW   rU   r  r    sD     $&.2
%
% 0
% !	
%
 ,
% 

%rW   r  c                  4    e Zd ZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)r  c                    || _         y rR   r  r  s     rU   r  z%PreDispatchTorchFunctionMode.__init__  r  rW   Nc                    |xs i }|t         v rK| j                  j                  d||i       }|t        j                  j
                  u rd |j                  d<   |S  ||i |S )Nr   r   )r+   r   r  r   _C_set_grad_enabledr   )r  rH  r	  r   r   r   s         rU   r
  z/PreDispatchTorchFunctionMode.__torch_function__  si     2DD ;;**?D$KDuxx111#'		% K T$V$$rW   r  r  r  r  rf   rW   rU   r  r    sD     $&.2%% 0% !	%
 ,% 
%rW   r  c                       e Zd Zed	d       Z	 	 	 d
	 	 	 	 	 	 	 	 	 	 	 d fdZe	 	 d	 	 	 	 	 	 	 	 	 dd       Zd fdZ	 	 	 	 	 	 	 	 d fdZ	e
d	d       Z	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )r7  c                     yr   rf   r  s    rU   enable_tracingz%ProxyTorchDispatchMode.enable_tracing      rW   c                V   |r$t         j                  j                  j                  nd }t        |   |       || _        || _        || _        || _	        || _
        t         j                  j                  j                  | _        g | _        d| _        ddlm} |j$                  | _        y )Nr   )config)r   r  DispatchKeyPreDispatchr  r  r   tracing_moderr  rN  rj  _TorchDispatchModeKeyPROXY	_mode_keyenter_stackr:  torch._inductorr  r;  )	r  r   r   rr  rN  rj  dkr  r   s	           rU   r  zProxyTorchDispatchMode.__init__  s     2>UXX!!--4(($8!,H) 77== DF*'-'E'E$rW   c                    t        |      5  |xs i }|t        j                  j                  fv r ||i |cd d d        S t	        | || j
                  ||      cd d d        S # 1 sw Y   y xY wrR   )r   primr   r   r  rr  r  s        rU   __torch_dispatch__z)ProxyTorchDispatchMode.__torch_dispatch__  st     "$' 	K\rF++--T,V,		K 	K dD$*;*;T6J	K 	K 	Ks   +A#A##A,c                    t        t        j                  j                  j                        }| j
                  j                  |       t        | !         S rR   )	r1   r   r  r!  r"  r$  rP  r  	__enter__)r  maybe_prev_proxy_moder   s     rU   r+  z ProxyTorchDispatchMode.__enter__  sA     1%((2P2P2V2V W 56w ""rW   c                x    t         |   |||      }| j                  j                         }|t	        |       |S rR   )r  __exit__r$  popr0   )r  exc_type	exc_value	tracebackbmb_previous_proxy_moder   s         rU   r.  zProxyTorchDispatchMode.__exit__$  sC     GXy)< "&!1!1!5!5!7!--.rW   c                     yr   rf   )clss    rU   is_infra_modez$ProxyTorchDispatchMode.is_infra_mode3  r  rW   c                     t         fd|D              } j                  j                  d||i       }t        j                  | j                        }t        ||       |S )Nc              3     K   | ]D  }t        |t              r.t        |j                        j	                         j
                  n| F y wrR   )r   rD   r   r   r+  r   )rg   r  r  s     rU   rh   z8ProxyTorchDispatchMode._compute_proxy.<locals>.<genexpr>:  sI      
  !\* 1dkk*00277
s   A
Ar   )rY   r   r  r  r(   r   )r  rH  r   r~  n_argsn_outp_outs   `      rU   _compute_proxyz%ProxyTorchDispatchMode._compute_proxy7  s]      
 	
 
 ''vrJ,rW   c                Z   |t         j                  k(  r@t        |d   t              r|d   dk(  r|d   S t        |d   t              r|d   dk(  r|d   S |rJ  ||i |}t        |t              r;t        | j                  | j                  |||      }t        || j                  |       |S )Nr9   r   )rH  r   r~  )	operatormulr   r   rD   r   r   r=  r   )r  rH  r	  r   r   r~  p_out_thunks          rU   __sym_dispatch__z'ProxyTorchDispatchMode.__sym_dispatch__H  s     8<<$q'3'DGqLAwDGS)d1glAw
 zD#F# c<("T00t$CK 3[9
rW   )r	  r   )FFT)r   r  r   r  rr  r   rN  r   rj  r   r	  r
  r  r  )r	  r   )r0  zOptional[Type[BaseException]]r1  zOptional[BaseException]r2  zOptional[types.TracebackType]r	  zOptional[bool])rH  r=   r   r  r~  r|   r	  r(   )
rH  r=   r	  r  r   r  r   Dict[str, object]r	  r!  )rx   ry   rz   propertyr  r  r3   r)  r+  r.  classmethodr7  r=  rB  r  r  s   @rU   r7  r7    sW     #%*-1FF F 	F
 #F '+F 
F6 
 $&.2KK 0K !	K
 ,K 
K K#/ + 1	
 
  &8?H	" 0 !	
 " 
rW   c                  l     e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   dZded<   d fdZ xZS )rJ   r  r   z*MutableMapping[PySymType, _PySymProxyType]r   r  r   r  r   zOptional[OpOverload]r  r  r  Fr   r   c                    t         |   |       t        j                         | _        t               | _        i | _        t        d t              | _
        d | _        i | _        y )Nr  )r  r  weakrefr   r   r8   r   r   r7   r6   r   r  r  )r  rC  r   s     rU   r  z _GraphAppendingTracerEx.__init__s  sZ    &88:57"$%8&
" "&  "rW   )rC  zfx.graph.Graphr	  r
  )rx   ry   rz   r   r   r  r  r  s   @rU   rJ   rJ   j  s;    FF??8822++**!OT!" "rW   rJ   c                       e Zd Z	 d	 	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZd	 fdZ xZS )
rC   c                    t        |   |fi | || _        t        | j                        | _        |xs i | _        t        | j                  d      | _        y )Nreal)r   )r  r  	new_graphrJ   r   rr   r7  r  )r  modulerL  rr   r   r   s        rU   r  z!DecompositionInterpreter.__init__  sM     	*6*"-dnn=#6#<" *4;;VL	rW   c                    t         |   |||      }t        j                  | j                  j                  |      | j
                        }t        ||d | j
                         |S Nr`  )r  placeholderr  r(   rL  r   r%  r  targetr   r   r~  r   r   s         rU   rP  z$DecompositionInterpreter.placeholder  sR     g!&$733F;T[[I#utDKKH
rW   c                    t         |   |||      }t        j                  | j                  j                  |      | j
                        }t        ||d | j
                         |S rO  )r  r  r  r(   rL  r   r%  rQ  s         rU   r  z!DecompositionInterpreter.get_attr  sR     gvtV4008$++F#utDKKH
rW   c                     t            |||      }ddd fd} j                  j                  t        j                  ||             |S )Nc                .    | j                   j                  S rR   )r   r   r   s    rU   get_proxy_nodez7DecompositionInterpreter.output.<locals>.get_proxy_node  s    77<<rW   c                4    t        | j                  |       S rR   )r   r   )r  rV  r  s    rU   unwrapz/DecompositionInterpreter.output.<locals>.unwrap  s    !!T[[!^DDrW   )r`   r   r	  r  )r  r   r	  zUnion[Tensor, fx.Node])r  outputrL  r]   tree_map)r  rR  r   r   r~  rX  rV  r   s   `     @rU   rY  zDecompositionInterpreter.output  sF     gnVT62	 	E 	foofc:;
rW   c                    t        | j                        5  | j                  5  t        |   |i |cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY wrR   )rt   rr   r  r  run)r  r   r   r   s      rU   r\  zDecompositionInterpreter.run  sY     t//0 	0$)) 	07;//	0 	0 	0 	0 	0 	0 	0s!   AA	AA	AA$rR   )
rM  fx.GraphModulerL  fx.Graphrr   'Optional[Mapping[OpOverload, Callable]]r   r!  r	  r
  )rR  r  r   r  r   rC  r	  r!  )r   r!  r   r!  r	  r!  )	rx   ry   rz   r  rP  r  rY  r\  r  r  s   @rU   rC   rC     s    
 HL	MM M E	M
 M 
M!3=N	!3=N	!3=N	0 0rW   rC   c                P     t        j                  ||f      \  }d fd}||fS )Nc                F    t        j                  |       \  }} |i |S rR   )r]   ri  )	flat_argsfn_args	fn_kwargsrH  rt  s      rU   r  z-wrapper_and_args_for_make_fx.<locals>.wrapped  s*    #229dCW*	**rW   )rb  zList[object]r	  rP   )r]   ra  )rH  r   r   rb  r  rt  s   `    @rU   wrapper_and_args_for_make_fxre    s/    
 ))4.9OIt+ IrW   c               #     K   t        j                         } t        j                  d       	 d  t        j                  |        y # t        j                  |        w xY wwNF)r   is_autocast_cache_enabledset_autocast_cache_enabled)	old_values    rU   disable_autocast_cacherk    sF     //1I	$$U+4((3((3s   *A!A A!AA!c                      e Zd Zy)#_ModuleNotInstalledAsSubmoduleErrorNrw   rf   rW   rU   rm  rm    r{   rW   rm  c                      e Zd ZddZy)
_AttrProxyc                     y rR   rf   r  basepaths      rU   reset_proxy_mappingz_AttrProxy.reset_proxy_mapping  s    rW   Nrr  r-   rs  r  r	  r
  )rx   ry   rz   rt  rf   rW   rU   ro  ro    s    rW   ro  c                       e Zd ZdZd	 fdZd
dZ	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 	 	 ddZddZ	d fdZ
 xZS )_ModuleStackTracera  Customized version of PythonKeyTracer that retains module stack
    information in node.meta["nn_module_stack"].

    FX symbolic trace actually does this already, but it relies on `self.root`
    being the actual module being traced. Since make_fx traces a lambda of our
    creation, things don't work properly.

    So for this version we hold onto a reference to the original module
    (scope_root) and use that to match the path. Also when we see,
            A
           / \
          B   C
           \ /
            D
    we want to record the path as A.B.D by recording only one path.
    See Note [Preserving the nn module stack metadata during export non-strict mode]  # noqa: W605
    c                   t         |           || _        t               | _        t               | _        t               | _        d| _        t        t              | _
        | j                  j                  d      D ],  \  }}| j                  t        |         j                  |       . |  G fddt              | _        y )Nr   F)remove_duplicatec                  ^     e Zd ZddZdfdZd fdZdfdZed	fd       Z xZ	S )
._ModuleStackTracer.__init__.<locals>.AttrProxyc                V   t        |j                  j                  | j                  |j                  fi       | _        |j                  | _        |j                  j                  | j                  _        |j                  j
                  | j                  _        | j                  ||       y rR   )r   r   rx   __dict__ry   rz   rt  rq  s      rU   r  z7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__  sy     "&NN++^^T^^4"
 !%,0NN,E,E).2nn.I.I+((t4rW   c                B    |j                   | <   |j                  | <   y rR   )proxy_pathsproxy_modules)r  rr  rs  r   s      rU   rt  zB_ModuleStackTracer.__init__.<locals>.AttrProxy.reset_proxy_mapping  s#    +/""4(-1$$T*rW   c                   t        | t              sJ t        |   |      }t        |      rj                  |   }nt        |t              s|S |j
                  vr* |j                  |    dz   |z         j
                  |<   n2j
                  |   j                  |j                  |    dz   |z          j
                  |   S )N.)r   r-   r  __getattr__r  attr_proxy_mapr  rt  )r  r[  r  	AttrProxyr   r   s      rU   r  z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__  s    !$/// !7.t4h	2%33H=H#Hf5#O6#8#886? &"4"4T":S"@4"G7F))(3 ))(3GG &"4"4T":S"@4"G ,,X66rW   c                "    j                   |    S rR   )r  r  s    rU   get_basez7_ModuleStackTracer.__init__.<locals>.AttrProxy.get_base.  s    ++D11rW   c                    d| j                   v sJ | j                   d   }t        |t              sJ |j                         D ci c]+  \  }}| |j                  |    dz   t        |      z         - c}}S c c}}w )N_modulesr  )r}  r   r   r   r  r  )r  
submodulesr  r   r  r   s       rU   r  z7_ModuleStackTracer.__init__.<locals>.AttrProxy._modules1  s    !T]]222!]]:6
!*d333 '1&6&6&8"U 5&*<*<T*BS*H3s8*STT  s   0A:ru  )r[  r  r	  r  )r	  r-   )r	  zDict[str, AttrProxy])
rx   ry   rz   r  rt  r  r  rD  r  r  )r   r  r   s   @rU   r  r{    s+    52742  rW   r  )r  r  
scope_rootr   r  r  r  counterr   rS   module_id_cachenamed_modulesr   rP  ro  
proxy_type)r  r  r[  modr  r   r   s       @@rU   r  z_ModuleStackTracer.__init__  s    $?P?REVEXDUDW*40666N 	7ID#  C)006	7 8	
 8	t $rW   c                    || j                   u ryt        |t              r| j                  |   S 	 t	        j
                  | |      S # t        $ r}t        |d}~ww xY w)z
        Use tracked access path during tracing instead of the default BFS behavior.
        Still use all the possible module paths to verify the result.
         N)r  r   ro  r  r)   path_of_module	NameErrorrm  )r  r  r  s      rU   r  z!_ModuleStackTracer.path_of_module=  s^    
 $//!c:&##C((	=((s33 	=51<	=s   A 	AAAc                V   t        |t              rt        |t        j                        rt        |   |||      S t        |t              r|S || j                  vr | j                  ||      | j                  |<   n| j                  |   j                  ||       | j                  |   S rR   )
r   r-   r  r'   r  r  ro  r  r  rt  )r  r  r  r  r   s       rU   r  z_ModuleStackTracer.getattrM  s     (F+z(BNN/S7?43HIIh
+O 4...,0OOHd,KD))==hM""8,,rW   c                B   t         |   ||      }g }| j                  j                         D ]'  \  }}|| j                  v s|j                  ||f       ) dd}|D ]>  \  }}	 || j                  |       | j                  |	   }
t        |
| j                  |       @ |S )Nc                <   |j                  d      }|d d |d   }}t        | t              sJ | }|D ]4  }t        ||      s yt	        ||      }t        |t
        t        f      r4 y t        ||      syt        t	        ||      t
              syt        ||       y)Nr  FT)splitr   r-   r   r  ro  delattr)r   rR  atomsrs  target_submodr  items          rU   _delete_proxy_attrz4_ModuleStackTracer.trace.<locals>._delete_proxy_attrk  s     LL%E"'*eBi-Dc6***C  !sD) c4(!#
F';< ! 3. gc=9:FC'rW   )r   r-   rR  r  r	  r   )r  r  r  r  r  rP  r*   )r  r  r  r   !proxy_module_names_to_be_replacedr[  rM  r  proxy_module_nameproxy_moduleactual_moduler   s              rU   r  z_ModuleStackTracer.trace\  s     gmD-0 KM) II335 	ILD&+++188$H	I	8 0Q 	F+|tyy*;< ..|<M		3DE	F
 
rW   c                    ddl m} t        ||t        f      r ||i |S 	 t	        j
                  | ||||      S # t        $ r+}t        j                  d| d        ||i |cY d}~S d}~ww xY w)zlPythonKeyTracer overrides call_module to avoid the scope handling,
        but we actually want it.
        r   )OptimizedModulez&Unable to find the path of the module z. This might be because the module was not properly registered as a submodule, which is not good practice. We will trace through the module without recording stack information.N)	torch._dynamor  r   r'   r)   r  rm  warningswarn)r  r  r  r   r   r  r  s          rU   r  z_ModuleStackTracer.call_module  s     	2 a/;78D+F++		,%%dAwfEE2 	,MM8 <J J D+F++	,s   ; 	A/ A*$A/*A/c                     yrg  rf   )r  r  module_qualified_names      rU   is_leaf_modulez!_ModuleStackTracer.is_leaf_module  s    rW   c                   t        
|   |i |}|j                  dvrd|j                  vr| j                  |j                  d<   |j                  d   j                         D ]G  \  }\  }}t        |t              s||j                  dz   |j                  z   f|j                  d   |<   I |j                  dk(  r| j                  d|j                  vrx| j                  j                   d| j                  | j                      | j                  j                  j                   d| j                  j                   f|j                  d<   d|j                  vr|j                  dvrt        j                         j!                         }|r|D cg c].  }|j"                  dk(  s|j$                  j'                  d	      r|0 }	}|	D cg c]:  }|j$                  j'                  d
      s|j$                  j'                  d      s|< }	}|	rYt(        j*                  j-                  |	      }	dj/                  |	j1                               j3                         |j                  d<   |S c c}w c c}w )aF  
        Create node and add on metadata.
        Add nn_module_stack here instead of TracerBase,
        since calls to make_fx() might not want to record module stack metadata.
        Add torch_fn by looking at torch_fn_metadata and torch_fn_counts.
        Add stack_trace by filtering out forward() stack frames.
        )rP  rY  nn_module_stackr  r   torch_fnrZ   stack_tracer  ztorch/__init__.pyzfx/_symbolic_trace.pyzexport/_trace.pyr  )r  r  opr   module_stackr   r   r   ry   rz   r  rx   r  r   r5   extractsummaryr[  filenameendswithr2  StackSummary	from_listrk   formatstrip)r  r   r   r   r  fqnmod_clsuser_frame_summaryframer  r   s             rU   r  z_ModuleStackTracer.create_node  sN    w"D3F3 7733 		1/3/@/@		+,'+yy1B'C'I'I'K #^c7gt,**S073G3GG9DII/05 GG&&&2$))+ ))2231T5I5I$J`J`5a4bc))33<<=Qt?U?U?^?^>_`%DIIj! 		)dgg=V.V!2!:!:!<!D!D!F!
 "4

i/ >>223FG	   "-//0GH >>223EF	    "+"8"8"B"B;"OK/1ww{7I7I7K/L/R/R/TDIIm,1s   3I*?I/)r  r'   r	  r
  )r  r-   r	  r  r  )r  Union[Module, Callable]r  r  r	  r^  )
r  r-   r  r
   r   r  r   rC  r	  r
  )r  r-   r  r  r	  r   )r   r!  r   r!  r	  r  )rx   ry   rz   r  r  r  r  r  r  r  r  r  r  s   @rU   rw  rw    s    $K$Z= --#)-BR-	-0+0<W0	0d,, , !	,
 ", 
,B? ?rW   rw  c                      e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZe	 	 	 	 	 	 dd       ZddZe	 	 	 	 dd       Z	ddZ
ddZdd	Zy
)_MakefxTracerc                   t        |xs i       | _        | j                  j                  t        j                  j
                  j                  j                  t        j                  j                  j                         || _
        || _        || _        || _        || _        || _        d | _        t#               | _        t#               | _        d | _        t#               | _        t#               | _        y rR   )r   rr   
setdefaultr   r   r   r  r   _decompdecompositionsr   _allow_non_fake_inputsrr  record_module_stackrN  rj  r   r   r   proxy_function_mode	fx_tracerpython_dispatcher_modetorch_fn_metadata_mode)r  rr   r   r  rr  r  rN  rj  s           rU   r  z_MakefxTracer.__init__  s     @D%2@
  	  ++IINN$$,,emm.J.J.T.T	
 ".,B#".)< *>!2N) ;?FQm M 	  59?J}# M 	#rW   c                    | j                   | j                  | j                  | j                  | j                  | j
                  gS rR   r   r   r  r  r  r  r  s    rU   _checkpoint_modesz_MakefxTracer._checkpoint_modes  s>    !!OO$$NN''''
 	
rW   c                X    || _         || _        || _        || _        || _        || _        y rR   r  )r  prev_fake_tensor_modeprev_proxy_modeprev_proxy_function_modeprev_fx_tracerprev_python_dispatcher_modeprev_torch_fn_metadata_modes          rU   _restore_modesz_MakefxTracer._restore_modes'  s2     !6)#; '&A#&A#rW   c              #    K   | j                         }	 ddlm} t        |d      r)| j                  r|j
                  }t        |      | _        nt               | _        | j                  dk(  rudd l
}|j                  j                  j                  |      }|Bdd lmc m} |j#                  d      5  t%        d| j&                   |       d	      }d d d        || _        n| j                  d
k(  rdd l
}|j                  j                  j                  |      }|C |       }	dd lmc m} |j#                  d      5  t%        d| j&                  |	      }d d d        |j*                  J d       || _        n'| j                  dk(  st-        d| j                         | j/                  | j                         d   | j0                  |  y # 1 sw Y   xY w# 1 sw Y   xY w#  | j0                  |  w xY ww)Nr9   )ShapeEnv	_orig_modfaker   F)(fake_tensor_allow_unsafe_data_ptr_accessT)r   allow_non_fake_inputs	shape_envstatic_shapessymbolic)r   r  r  2shape_env should be set if tracing with 'symbolic'rK  zUnexpected tracing type: )r  r  r  r   r  r  rw  r  r@   r   r  _dynamoutilsdetect_fake_modetorch._functorch.config
_functorchr  patchr#   r  r   r  AssertionError_construct_modes_with_fx_tracerr  )
r  r   r   
prev_modesr  r  r   r   _configr  s
             rU   _init_modes_from_inputsz%_MakefxTracer._init_modes_from_inputs7  s     ++-
4	-1q+&4+C+C[[
!3J!?!0!2  F*$#(==#6#6#G#G#M #+== PUV +937262M2M&.j*.	,( )9%""j0$#(==#6#6#G#G#M #+ (
I== PUV +938262M2M&/,( %..:HGH:(8%((F2(3D4E4E3FG  00@D,G   &  D,sO   G<BG( 3GA,G( >GA)G(  G<GG( G%!G( (G99G<c                *   t        || j                  | j                  | j                  | j                        | _        | j                  rt        |      | _        | j                  dk(  s| j                  rt               | _	        t        |      | _        y )N)rr  rN  rj  r  )r7  r   rr  rN  rj  r   r  r  r   r  r  r  )r  r  s     rU   r  z-_MakefxTracer._construct_modes_with_fx_tracerr  s}    0**!%!:!:)-)J)J
 'CI'ND$ 
*d.?.?*B*DD'&?	&J#rW   c              #  &  K   | j                         }	 |j                  | _        dd}|j                  J  ||j                        | _        | j                  | j                         d   | j                  |  y #  | j                  |  w xY ww)Nc                    t        |       t        k(  r
t               S t        |       t        k(  rt        | j                        S t	        dt        |        d      )NzUnexpected tracer type: r  )r   r@   rw  r  r   )parent_tracers    rU   _create_sub_fx_tracerzD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracer  sV    &/9*,,-(,>>-m.F.FGG&243F2GqI rW   )r  r  r	  r@   )r  r   r  r  r  )r  r  r  r  s       rU   _init_modes_from_parentz%_MakefxTracer._init_modes_from_parent  s      ++-
	-$1$B$BD! !**6662=3J3JKDN00@D,D,s   BAA= -B=BBc           	         t        j                  d |      }d fd}dd} ||      } |||      }t        j                  t         j
                        }t               5 }|j                  t         j                                j                  r|j                   j                         |j                   j                         |j                   j                         |j                   j                         |j                  |       |j                  t                      |j                  t                       j                   J t#        t%        || j                    j&                         j                   t)        |            }	d d d         j*                  dk(  r) j                  J  j                  j,                  	_        	S # 1 sw Y   CxY w)Nc                J    t         j                  j                  j                  S rR   )r   r  _symbolic_tracePHr   s    rU   rV   z,_MakefxTracer._trace_inner.<locals>.<lambda>  s    (@(@(C(C rW   c                l    ddfd}d ||d}t        j                  |j                     |       S )Nr   c                   ddl m} j                  J  |d       }t        | t              r"dz  j                  j                  | |      S t        |       t        u rzj                  dk(  rkj                  j                  J d       j                  j                  j                  j                  j                  j                  | |d       | |	      S t        | t        j                        r4t        j                  j                  j!                  j                  |       S t        | t"              rJ d
|  d       | S )Nr   )ConstantSourceinputr9   )sourcer  r  )positive)hintr  zScriptObject z. has been fakified. Cannot wrap_fake it again.)torch._dynamo.sourcer  r   r   r   from_tensorr   r   r   r  create_symintnodecreate_symbolr   ScriptObject_libraryfake_class_registrymaybe_to_fake_objr    )r`   r  r  	arg_countr  s      rU   inner_wrap_fakezG_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.inner_wrap_fake  sZ    @,,888'%	{(;<a(NI00<<Qv<NN!W^(9(9Z(G--77CLKLC00::LL--77EEv F  % M    5#5#56 >>==OO--q  &' U"1#%STU  rW   c                    | S rR   rf   r   s    rU   rV   z@_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.<lambda>  s    ! rW   rK  r  r  )r`   r!  r	  r!  )r]   rZ  r   )r   r  wrap_fn_mapr  r  s      @rU   
_wrap_fakez._MakefxTracer._trace_inner.<locals>._wrap_fake  s>    I!H $'+K
 ??;t/@/@#A4HHrW   c                    t        t        j                  |       d      r:t        j                  |       j                  j                  t        j
                  z  rt        | t        |            S | S )N__code__)r   inspectrX  r
  co_flags
CO_VARARGSrp   r  )r   phss     rU   
_wrap_funcz._MakefxTracer._trace_inner.<locals>._wrap_func  sP    GNN1-z:>>!$--669K9KK &aS22HrW   )r   r  r  )r   rM   r	  rM   )r   Callable[_P, R]r  zSequence[PHBase]r	  r  )r]   rZ  r   r   r7  r   r   enter_contextrt   rr   r   r  r  r  rk  _set_make_fx_tracerr  rA   r  rr  rY   r   r  )
r  r   r   r  r  r  rH  r   stackr1  s
   `         rU   _trace_innerz_MakefxTracer._trace_inner  s   ooCTJ+	IZ	 $!S! .4[["DOO.

 [ 	E	$*B*B CD$$##D$9$9: ; ;< 8 89 ; ;<
+ 6 89 3D 9:>>---tT^^T5F5FG~~#CjA	& 
*((444//99AK-	 	s   "D0GGc                x    | j                  ||      5   | j                  |g| cd d d        S # 1 sw Y   y xY wrR   )r  r  )r  r   r   s      rU   r  z_MakefxTracer.trace  s<    ))!T2 	/$4$$Q..	/ 	/ 	/s   09c           	        t        | j                  d| j                  | j                  | j                  | j
                  | j                        }|j                  |       5   |j                  |g| cd d d        S # 1 sw Y   y xY w)NrK  )	r  rr   r  rr  r  rN  rj  r  r  )r  r   r   
sub_tracers       rU   trace_subgraphz_MakefxTracer.trace_subgraph  s    "$$''$$%%--

 //5 	5*:**14t4	5 	5 	5s   A<<BN)rr   r_  r   r  r  r   rr  r   r  r   rN  r   rj  r   r	  r
  )r	  z	List[Any])r  zOptional[FakeTensorMode]r  z*Union[nullcontext, ProxyTorchDispatchMode]r  z0Union[nullcontext, PreDispatchTorchFunctionMode]r  zOptional[PythonKeyTracer]r  zUnion[nullcontext, Any]r  z-Union[nullcontext, TorchFunctionMetadataMode]r	  r
  )r   r
   r   r  r	  Generator[None, None, None])r  r  r	  r
  )r  r  r	  r  )r   r
   r   r!  r	  r'   )r   r
   r   r!  r	  r]  )rx   ry   rz   r  r  r  r   r  r  r  r  r  r  rf   rW   rU   r  r    s   &D& & !%	&
 & "& #& '+& 
&P
B7B DB #S	B
 2B &=B &SB 
B  8-8-!38-	$8- 8-tK& -*-	$- -6[z/5rW   r  zOptional[_MakefxTracer]_CURRENT_MAKE_FX_TRACERc              #  8   K   t         }	 | a d  |a y # |a w xY wwrR   )r  )r   prev_tracers     rU   r  r    s'      *K."("-+s    F)rr  r  rN  rj  c          	     v    	 |dv sJ t        |||||||      	t        j                         d 	fd       }|S )z
    Given a function f, return a new function which when executed with valid
    arguments to f, returns an FX GraphModule representing the set of operations that
    were executed during the course of execution.
    r  c                 *     j                   g|  S rR   )r  )r   r   make_fx_tracers    rU   r  zmake_fx.<locals>.wrapped<  s    #~##A---rW   )r   r!  r	  r'   )r  r   r  )
r   rr   r   r  rr  r  rN  rj  r  r  s
   `        @rU   rB   rB     sW    " 7777"$N __Q. . NrW   c                 R    t         j                  j                  j                         S rR   )r   r  _python_dispatch _get_current_dispatch_mode_stackrf   rW   rU   get_torch_dispatch_modesr#  C  s    ;;''HHJJrW   c                     t               S rR   )rF   rf   rW   rU   rE   rE   I  s    rW   c                 4   t         j                  j                  t         j                  j                  j
                        } t         j                  j                  t         j                  j                  j
                        }| |J d|  d|        | xs |S )z
    Current the currently active proxy tracing mode, or None if
    we are not currently tracing.  This includes pre-dispatch proxy
    tracing.
    zpre_dispatch_mode=z, mode=)r   r<  _get_dispatch_mode_pre_dispatchr  r!  r"  _get_dispatch_mode)r  r  s     rU   rF   rF   M  s     

BB&&,, 88&&uxx'E'E'K'KLD!T\=	-.gdV<=1$$rW   c                    t               }|sJ t               5  g }|j                  | |||      cddd       S # 1 sw Y   yxY w)z
    Call into the currently active proxy tracing mode to do a
    SymInt/SymFloat/SymBool dispatch trace on a function that operates on
    these arguments.
    N)rF   r  rB  )rH  r   r   r  r	  s        rU   rG   rG   ]  sM     DK4 
%	& @$$T5$?@ @ @s	   9Ac                 \    t        t        j                  j                  j                        S rR   )r/   r   r  r!  r"  rf   rW   rU   r  r  m  s    uxx==CCDDrW   c                    |t         v rF| 5  | xj                  dz  c_        t        |   |i |}| xj                  dz  c_        |cd d d        S t        S # 1 sw Y   t        S xY w)Nr9   )rL   r:  rd  )r   r  r   r   r~  s        rU   re  re  r  sn     
(( 	$$)$-b14B6BC$$)$		 	 	 s   :AA#c                    t        | ||      \  }}t               5   t        |||      |      }ddd       |S # 1 sw Y   S xY w)a  A helper function used to get the GraphModule for the given func.

    It's expected to be used in the ProxyTensor tracing context.
    It detaches the args and kwargs from the current tracer so that the trace of
    the current graph module can be created without any side-effects.
    )rr   r   N)re  r  rB   )rH  r   r   r   rr   r  all_argsgms           rU   get_isolated_graphmoduler.    sY     5T4HGX	$	& 
W)<<

 I	 Is	   :Ac                >   ddl m} t        j                  j	                  t        j                  j
                  j                        }|rT|j                  rG ||j                  |       x}r1t        |t              sJ |       ||j                  j                  d<   yyyy)zOA helper function for setting up unbacked_bindings on the destination FX graph.r9   )compute_unbacked_bindingsunbacked_bindingsN)r  r0  r   r  r'  r!  FAKEr  r   r(   r   r   )r~  	out_proxyr0  r   symbol_to_paths        rU   r"  r"    s    : ++EHH,J,J,O,OPIY((6y7J7JCPP>Pi/::/7EINN 34 Q )yrW   )rj   r  rn   r   r	  r  )rr   r_  r	  z4Generator[Mapping[OpOverload, Callable], None, None])r   r~   r	  r   )r   r   r   r  r   r   r	  r
  )r   r  r   r  r   r(   r	  r
  )r   r|   r   r  r   r   r	  r
  )r   z.Union[PySymType, _AnyScriptObjectType, Tensor]r   r  r   r!  r	  r
  )r   r   r   r  r	  r   )r   r   r   r  r	  r   )r   r   r   r  r   rN   r	  zUnion[_ProxyTensor, U])
r   r   r   r  r   rN   r   zCallable[[_ProxyTensor], R]r	  Union[R, U])r   r  r   r  r	  r(   )r   r  r   r  r   rN   r	  zUnion[Proxy, U])
r   r  r   r  r   rN   r   zCallable[[Proxy], R]r	  r5  )r   r|   r   r  r	  r   )r   r|   r   r  r   rM   r	  zUnion[T, _PySymProxyType])
r   r|   r   r  r   rN   r   zCallable[[_PySymProxyType], R]r	  r5  )
r   .Union[Tensor, _AnyScriptObjectType, PySymType]r   r  r   r!  r   r
   r	  r!  )r   r   r	  r'  )r   r   r	  r   )r   r  r   r   r	  r  )r	  r  )r   r(   r   r   r	  r(   )
r   r  r   r  r   r  r   r  r	  zThunk[R])
r  r   r   r(   r  r'  r   r  r	  r
  )
r#  rM   r$  r  r  r  r   r  r	  rM   )r   r  r	  z5Callable[[PySymType], Union[bool, int, float, Proxy]])r   r  r1  r   r	  zUnion[_ProxyTensor, Tensor])r   r  r1  r  r	  r  )r   r  r1  r|   r	  z!Union[_PySymProxyType, PySymType])r   r  r1  r6  r	  r!  )rH  r!  r   r7  r	  r
  )r   r7  rH  r=   rr  r   r   r  r   rC  r	  r!  rR   )r  r  r   r)   r  zOptional[Tuple[Any, ...]]r	  r'   )
r   r  r  r  r   r  rr  r   r	  r  )rH  r=   r	  r  )rH  zCallable[..., R]r   r  r   rC  r	  z0Tuple[Callable[[List[object]], R], List[object]])r   r  r	  r  )NrK  F)r   r
   rr   r_  r   r  r  r   rr  r   r  r   rN  r   rj  r   r	  zCallable[..., GraphModule])r	  zList[TorchDispatchMode])r	  z Optional[ProxyTorchDispatchMode])rH  r  r   r  r   r  r	  rP   )r	  z-Generator[ProxyTorchDispatchMode, None, None])
r   r7  r  r=   r   r  r   rC  r	  r!  )rK  N)rH  r
   r   r  r   rC  r   r  rr   r_  r	  r'   )r~  r!  r3  r  r	  r
  )
__future__r   r   r  loggingr?  r2  r   r   r  rH  collectionsr   
contextlibr   r   r   dataclassesr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
torch._opstorch.fxr  torch.fx.tracebackr  torch.utils._pytreer  _pytreer]   r   r   r   torch._dispatch.pythonr   "torch._library.fake_class_registryr    torch._subclasses.fake_implsr!   torch._subclasses.fake_tensorr"   r#   r$   r%   torch._subclasses.meta_utilsr&   r'   r(   r)   torch.fx.graph_moduler*   torch.fx.noder+   torch.fx.passes.shape_propr,   torch.nnr-   r  r.   torch.utils._python_dispatchr/   r0   r1   r2   torch.utils._statsr3   torch.utils._thunkr4   torch.utils._tracebackr5   torch.utils.weakr6   r7   r8   _backward_stater:   sym_noder;   r	  collections.abcr<   r   r=   torch.fx._symbolic_tracer>   torch.typesr?   __all__r  r  r   r  r   r   r(  	getLoggerrx   r   _logginggetArtifactLoggerrc  rL   r   r^  rM   rN   rO   rP   r   null_ctx_typeregister_pytree_nodeSizerp   rt   r!  
proxy_slotrv   
no_defaultrD   r|   r~   r   r   r   r   r   r   r  r   r   r   r   r   r   rI   rH   r   r   r  r  r  r%  r   r.  r2  r  r  rM  rJ  r  r  r@   r  _disable_dynamorA   r  r  r   r  r  r7  r   GraphAppendingTracerrJ   InterpreterrC   re  rk  r  rm  ro  rw  r  r  r  rB   r#  rE   rF   rG   r  re  r.  r"  rf   rW   rU   <module>r`     s
   #          # = = !    " ; : %    ) ) $ $ ) ) ; ? 4  7 / / . K ?  -  % $ 4 W W *  .%/' AB&&(89 U//1AAB yy~~yy~~g!nn66xARS =? : ? CLCLt_CL[!   	JJ	B 	>@	>9	> 	> X
	 	 \
 /x M
 
 
 
	'3<A	 
 
	(1@	 
)A	7)A)A )A 
	)AXD
 , 
	  
 
	  	 
 
	  +	
  
 
	  
 
	  	 
 
	  $	
  
 
	  
 
	  	 
 
	  .	
  
 !%		7  	
 > 	$%S##$		 !(H ,0%%%)% % %$    0	  , 5< HQ  FBFB FB/?FBIUFB	FBR 	8O$gfo.E&FF 
H%&8H0H(II
TTT '	T
 T Tn   
:* 
 
 
1' 
 
&& 
((K(( ++Z8=
=4=	=4S&S
S S 	S
 S Sl' '>Of Od ! !B  04)N
!)N)N -)N 	)N )NX!(2>NR@ #' &  % 1 %(%#4 %2z. zz"bhh;; "440r~~ 40n
"4>O5 4 4	) 	
 
T TnZ5 Z5z 48 0 7 . . DH#(	!  %!&)-!!@! ! !	! ! ! ! #'!  !HK% @  E E&  	
 ( CG

  	
 A ,FrW   