Ë
    ÄÓ^jÚß ã            	      ó¦  — 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
mZmZ d dlmZmZmZmZ d dlmZ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! d dl	m"Z"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/m0c m1Z2 d d
l(m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d dl)mCZCmDZD d dlEmFZF d dlGmHZHmIZImJZJmKZKmLZL d dlMmNZN d dlOmPZP d dl*mQZQmRZRmSZS d dlTmUZU d dlVmWZWmXZXmYZY d dlZm[Z[ d dl\m]Z] d dl^m_Z_ d dl`maZambZbmcZcmdZdmeZemfZf d dlgmhZh d dlimjZj d dlkmlZlmmZmmnZn ddlompZp dd lqmrZr erd dlsZsd d!lmtZt d dluZud d"lvmwZw d d#lxmyZymzZzm{Z{ g d$¢Z|e!d%   Z}ed&   Z~d'ed(<   e(�j                   e9fZ�e(�j                   e9z  Z‚e(�j                  �j                  Z„e(�j                  �j
                  Z… e�j                  e‡«      Zˆe(�j                  �j                  e‡d)«      Z‹dZŒ e d*«      Z� e d+«      ZŽ e"d,«      Z� e d-«      Z� e$d.«      Z‘ e2�j$                  e(�j&                  d/„ d0„ d1„ d2¬3«       e(�j&                  e”iZ•d«d4„Z–e	 	 	 	 d¬d5„«       Z— e˜«       Z™ G d6„ d7«      Zš eš«       Z›d d8lxmœZœm�Z�  G d9„ d:e«      Zžd­d;„ZŸ G d<„ d=e�j@                  «      Z¡ e¡«       Z¢i a£d>ed?<   d®d@„Z¤ed¯dA„«       Z¥ed°dC„«       Z¦e	 	 	 	 	 	 	 	 d±dD„«       Z¦e	 	 	 	 	 	 	 	 d²dF„«       Z¦	 	 	 	 	 	 	 	 d³dG„Z¦d´dH„Z§ejeR   Z¨d'edE<   eRZ©d'edI<   e	 	 	 	 	 	 dµdJ„«       Zªe	 	 	 	 	 	 	 	 d¶dK„«       Zªe	 	 	 	 	 	 	 	 	 	 d·dL„«       Zªe	 	 	 	 	 	 d¸dM„«       Zªe	 	 	 	 	 	 	 	 d¹dN„«       Zªe	 	 	 	 	 	 	 	 	 	 dºdO„«       Zªe	 	 	 	 	 	 d»dP„«       Zªe	 	 	 	 	 	 	 	 d¼dQ„«       Zªe	 	 	 	 	 	 	 	 d½dR„«       Zªe	 	 	 	 	 	 	 	 	 	 d¾dS„«       Zªe›dT„ f	 	 	 	 	 	 	 	 	 d¿dU„ZªdÀdV„Z«dÁdW„Z¬dÁdX„Z­e�j\                  dÂdY„«       Z¯	 dÃ	 	 	 	 	 	 	 dÄdZ„Z°dÅdÆd\„Z±de�z  e?z  e‚z  epz  e²d]   z  e”d^   z  e³e´d]f   z  e5z  eµz  e¶z  e·z  Z¸d'ed]<   dÅdÇd_„Z¹ed`daœ	 	 	 	 	 dÈdb„«       Zºed¯dc„«       Z»ed¯dd„«       Z¼dÉde„Z½	 	 	 	 	 	 	 	 	 	 dÊdf„Z¾	 	 	 	 	 	 	 	 	 	 dËdg„Z¿e!eRedh   ee˜dhf   f   ZÀe!e5edi   ee˜dif   f   ZÁ	 	 	 	 	 	 	 	 	 	 dÌdj„ZÂe G dk„ dB«      «       ZÃ	 	 	 	 dÍdl„ZÄedÎdm„«       ZÅe	 	 	 	 	 	 dÏdn„«       ZÅe	 	 	 	 	 	 dÐdo„«       ZÅe	 	 	 	 	 	 dÑdp„«       ZÅ	 	 	 	 	 	 dÒdq„ZÅe5e(�jŒ                  �jŽ                  eHfZÈ	 	 	 	 	 	 dÓds„ZÉ	 	 	 	 	 	 dÔdt„ZÊ	 	 	 	 	 	 	 	 	 	 	 	 dÕdu„ZË G dv„ dw«      ZÌe G dx„ dy«      «       ZÍdÖdz„ZÎ G d{„ d|eS«      ZÏ	 dÃ	 	 	 	 	 d×d}„ZÐ	 	 	 	 dØd~„ZÑe(�j¤                  	 dÃ	 	 	 	 	 	 	 dÙd„«       ZÓ	 	 	 	 	 	 	 	 	 	 dÚd€„ZÔ e�jª                  d�d¬‚«      ZÖdƒed�<   e	 	 	 	 dÛd„„«       Z× G d…„ d†e_«      ZØ eÑeØ«      ZÙ G d‡„ dˆe_«      ZÚ eÑeÚ«      ZÛ eÜe(�jº                  �j¼                  �j¾                  e(�jº                  �j¼                  �jÀ                  e(�jº                  �j¼                  �jÂ                  e(�jº                  �j¼                  �jÄ                  e(�jº                  �j¼                  �jÆ                  e(�jº                  �j¼                  �jÈ                  e(�jº                  �j¼                  �jÊ                  h«      Zæd d‰lVmçZç  eç�jÐ                  e(�jº                  �j¼                  �jÂ                  e(�jº                  �j¼                  �jÄ                  e(�jº                  �j¼                  �jÈ                  e(�jº                  �j¼                  �jÊ                  h«        G dŠ„ dree«      Zé	 	 	 	 	 	 	 	 	 	 dÜd‹„Zê	 	 	 	 	 	 	 	 	 	 dÝdŒ„Zë G d�„ dŽe+�jØ                  �jÚ                  «      Zî G d�„ d�e+�jÞ                  «      Zð G d‘„ d’e+�jÞ                  «      Zñ	 	 	 	 	 	 	 	 	 	 	 	 dÞd“„Zò	 	 	 	 	 	 	 	 dßd”„Zóed¯d•„«       Zô G d–„ d—eõ«      Zö G d˜„ d™«      Z÷ G dš„ d›eÏ«      Zø G dœ„ d�«      ZùdaúdžedŸ<   edàd „«       Zû	 	 	 dád[d[d[d`d[d[d[d¡œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dâd¢„Züdãd£„Zýdäd¤„Zþdäd¥„Zÿ	 	 	 	 	 	 	 	 dåd¦„�Z edæd§„«       �Z	 	 	 	 	 	 	 	 	 	 dçd¨„�Z	 	 dè	 	 	 	 	 	 	 	 	 	 	 déd©„�Zdêdª„�Zy)ëé    )ÚannotationsN)ÚdefaultdictÚOrderedDict)ÚCallableÚ	GeneratorÚMappingÚSequence)Ú_GeneratorContextManagerÚcontextmanagerÚ	ExitStackÚnullcontext)Ú	dataclass)	ÚAnyÚConcatenateÚLiteralÚoverloadÚProtocolÚTYPE_CHECKINGÚ	TypeAliasÚTypeVarÚUnion)Ú	ParamSpecÚSelfÚTypeVarTupleÚUnpack)ÚWeakKeyDictionary)ÚSymBoolÚSymIntÚTensor)Úenable_python_dispatcher)ÚFakeScriptObject)Úget_reconstruct_fnÚis_opaque_reference_typeÚis_opaque_valueÚis_opaque_value_typeÚ
OpaqueBaseÚshould_hoist)Útrace_structured)ÚHigherOrderOperatorÚ
OpOverload)Úfast_detach)Ú
FakeTensorÚFakeTensorModeÚget_plain_tensorsÚis_fakeÚunset_fake_temporarily)ÚFunctionalTensor)Úis_sparse_any)ÚGraphModuleÚProxyÚTracer)Ú_assign_attr)Ú1_side_effectful_need_to_be_preserved_pre_dispatchÚArgumentÚTarget)Ú_extract_tensor_metadata)ÚModule)ÚTorchFunctionMode)Ú_disable_infra_modeÚ
_push_modeÚ_unset_infra_modeÚautograd_would_have_decomposedÚTorchDispatchModeÚTraceableWrapperSubclass)Úcount)ÚThunk)Ú_WeakHashRefÚWeakIdKeyDictionaryÚWeakTensorKeyDictionaryé   )ÚBackwardState)ÚSymNode)ÚMutableMapping)ÚFunctionalizeCtxWrapper)ÚBoolLikeTypeÚFloatLikeTypeÚIntLikeType)ÚPythonKeyTracerÚdispatch_traceÚmake_fxÚDecompositionInterpreterÚselective_decomposeÚpy_sym_typesÚget_innermost_proxy_modeÚget_proxy_modeÚhandle_sym_dispatchÚmaybe_enable_thunkifyÚmaybe_disable_thunkify)rP   Ú_GraphAppendingTracerEx©ÚrealÚfakeÚsymbolicr   Ú_TracingModeÚnot_implementedÚTÚUÚ_PÚRÚ_Tsc                ó   — t        | «      d fS ©N)Úlist)Úxss    úm/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/experimental/proxy_tensor.pyú<lambda>rl   ˆ   s   € ”�R“˜$Ð€ ó    c                ó   — t        | «      S rh   )Útuple)rj   Ú_s     rk   rl   rl   ‰   s
   € ”%˜“)€ rm   c                óx   — t        | «      D ��cg c]  \  }}t        j                  |«      |f‘Œ c}}d fS c c}}w rh   )Ú	enumerateÚpytreeÚSequenceKey)rj   ÚiÚxs      rk   rl   rl   ‹   s5   € Ü09¸"³×>©¨¨1Œ&×
Ñ
˜QÓ
 Ò	#Ó>Øð%€ ùÛ>s   �!6z
torch.Size)Úflatten_with_keys_fnÚserialized_type_namec                ó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© )Ú.0ru   s     rk   ú	<genexpr>z!fake_signature.<locals>.<genexpr>œ   s   è ø€ Ò8 a˜#˜a˜Sœ	Ñ8ùs   ‚zlambda z: fn(ú)Úfn)ÚjoinÚrangeÚeval)r�   ÚnargsÚargnamess      rk   Úfake_signaturer‡   š   s:   € à�x‰xÑ8¬5°«<Ô8Ó8€HÜ�'˜(˜ 5¨¨
°!Ð4°t¸R°jÓAÐArm   c              #  óŽ   K  — t        «       }|€t        d«      ‚|j                  | «      5 }|–— d d d «       y # 1 sw Y   y xY w­w)NúExpected proxy mode to be set)rW   ÚAssertionErrorÚenable_decompositions)Údecomposition_tableÚmodeÚtables      rk   Ú	decomposer�       sK   è ø€ ô Ó€DØ€|ÜÐ<Ó=Ð=Ø	×	#Ñ	#Ð$7Ó	8ð ¸EØŠ÷÷ ñ üs   ‚)A«9°	A¹A¾Ac                  ó   — e Zd Zy)Ú
_NoDefaultN©Ú__name__Ú
__module__Ú__qualname__r}   rm   rk   r‘   r‘   ¯   ó   „ Ørm   r‘   )rU   Ú	PySymTypec                  ó   — e Zd ZU ded<   y)Ú_HasMetazdict[str, PySymType]ÚmetaN©r“   r”   r•   Ú__annotations__r}   rm   rk   r™   r™   ¸   s   … Ø
Ôrm   r™   c                óŠ   — t        | d«      st        d«      ‚d| j                  v xr t        | j                  d   t        «      S )Nrš   z3All nodes traced with proxy_tensor should have metaÚval)ÚhasattrrŠ   rš   Ú
isinstancerU   )Únodes    rk   Úis_sym_noder¢   ¼   s<   € Ü�4˜Ô ÜÐRÓSÐSØ�D—I‘IÐÒL¤*¨T¯Y©Y°uÑ-=¼|Ó"LÐLrm   c                  ó   — e Zd ZU dZded<   y)Ú_DisableUpdateTensorTrackerFÚboolÚvalueN)r“   r”   r•   r¦   rœ   r}   rm   rk   r¤   r¤   Â   s   … Ø€Eˆ4Ôrm   r¤   zdict[int, torch.fx.Node]Ú'_FAKE_TENSOR_ID_TO_PROXY_MAP_FOR_EXPORTc                 ó"   — t         j                  S )zC
    Returns current state of disabling update tensor tracker.
    ©Ú"_disable_update_tensor_tracker_tlsr¦   r}   rm   rk   Ú/_is_proxy_tensor_update_tensor_tracker_disabledr«   Ì   s   € ô .×3Ñ3Ð3rm   c               #  ó‚   K  — t         j                  } dt         _        	 d–— | t         _        y# | t         _        w xY w­w)aä  
    NOTE "Do not clobber inplace ops"
    By default tensor_tracker is updated every time.
    This leads to chaining every operation by the FakeTensor.
    For example for mutable ops if we have several consecutive mutable operations:

    def f(x, y, z):
        x.copy_(y)
        x.copy_(z)
        return x

    Default graph result:
    def f_graph(x, y, z)
        x_1 = x.copy_(y)
        x_2 = x_1.copy_(z)
        return x_2

    This chaining simplifies the fx passes and helps to prevent the reordering.
    But in some cases, we want those nodes to be disconnected.
    E.g. in case of splitting joint graph into forward and backward.
    If first inplace op happened in forward, second in backward,
    we want them after split to be properly placed.

    Enabling this context manager for copy_ will result in:
    def f_graph_2(x, y, z):
        x_1 = x.copy_(y)
        x_2 = x.copy_(z)
        return x

    Results of copy_ x1 and x2 will have empty users in the graph.
    The reason why this behavior is not enabled for all inplace ops is that
    some fx passes (e.g. fx quantization) rely on chaining inplace ops like add_
    in their fusions passes.
    We could revisit enabling this logic for all inplace ops in future.
    TNr©   )Ú
orig_values    rk   Ú+_proxy_tensor_disable_update_tensor_trackerr®   Ó   s7   è ø€ ôJ 4×9Ñ9€JØ/3Ô&Ô,ð>Ûà3=Ô*Õ0ø°:Ô*Õ0üs   ‚?Ÿ/ £?¯<¼?Ú_ProxyTensorc                 ó   — y rh   r}   ©ÚobjÚtracerÚproxys      rk   Úset_proxy_slotrµ      s   € ØTWrm   c                 ó   — y rh   r}   r±   s      rk   rµ   rµ     ó   € ð rm   Ú_PySymProxyTypec                 ó   — y rh   r}   r±   s      rk   rµ   rµ   
  r·   rm   c                ó¦  — t         j                  d| t        | «      |«       t        | t        «      rPt        |t
        «      st        dt        |«      › �«      ‚| |j                  vs
t        «       s||j                  | <   y y t        | t        «      st        | «      rêt        |t        «      st        dt        |«      › �«      ‚t        | t        j                  «      r||j                  | <   y d }t        | t         «      r	 t"        j%                  | d«      }|�^|j(                  j+                  t        |«      «      }|�||j,                  | <   y ||j,                  | <   ||j(                  t        |«      <   y ||j,                  | <   y t        | t.        «      st        dt        | «      › �«      ‚| |j0                  vr†t3        j4                  t6        |«      }||j0                  | <   dd l}t        | j:                  j<                  |j>                  «      r.tA        || «      |jB                  | j:                  j<                  <   y y y # t&        $ r Y �Œ8w xY w)Nzset_proxy_slot %s (%s) %szExpected _ProxyTensor, got úExpected Proxy, got Úreal_objúExpected py_sym_types, got r   )"ÚlogÚdebugÚidr    r   r¯   rŠ   ÚtypeÚtensor_trackerr«   Ú_AnyScriptObjectr$   r4   ÚtorchÚScriptObjectÚscript_object_trackerr!   ÚobjectÚ__getattribute__ÚAttributeErrorÚ_opaque_real_obj_proxyÚgetÚopaque_trackerrU   Úsymnode_trackerÚtypingÚcastr¸   Úsympyr¡   ÚexprÚSymbolÚ_SympyExprTrackerValueÚsympy_expr_tracker)r²   r³   r´   r¼   ÚexistingrÐ   s         rk   rµ   rµ     s  € ô
 ‡I�IÐ)¨3´°3³¸Ô?Ü�#”vÔô ˜%¤Ô.Ü Ð#>¼tÀE»{¸mÐ!LÓMÐMð �v×,Ñ,Ñ,ÜBÔDà).ˆF×!Ñ! #Ò&ð Eô 
�CÔ*Ô	,´ÀÔ0DÜ˜%¤Ô'Ü Ð#7¼¸U»°}Ð!EÓFÐFô
 �cœ5×-Ñ-Ô.Ø05ˆF×(Ñ(¨Ò-ð ˆHÜ˜#Ô/Ô0ðÜ%×6Ñ6°s¸JÓG�Hð Ð#Ø!×8Ñ8×<Ñ<¼RÀ»\ÓJ�ØÐ'Ø19�F×)Ñ)¨#Ò.à16�F×)Ñ)¨#Ñ.ØBG�F×1Ñ1´"°X³,Ò?à-2�×%Ñ% cÒ*ô ˜#œ|Ô,Ü Ð#>¼tÀC»y¸kÐ!JÓKÐKØ�f×,Ñ,Ñ,Ü—K‘K¤°Ó7ˆEØ*/ˆF×"Ñ" 3Ñ'ó ä˜#Ÿ(™(Ÿ-™-¨¯©Ô6Ü;QØ˜3ó<�×)Ñ)¨#¯(©(¯-©-Ò8ð 7ð% -øô+ &ò Úðús   ÄI É	IÉIc                óŒ   — t        | t        t        f«      st        dt	        | «      › �«      ‚t        t        | |dd„ «      «      S )Nz Expected Tensor or SymNode, got Fc                 ó   — y©NTr}   )rp   s    rk   rl   z has_proxy_slot.<locals>.<lambda>h  ó   � rm   )r    r   rJ   rŠ   rÁ   r¥   Úget_proxy_slot©r²   r³   s     rk   Úhas_proxy_slotrÜ   d  s>   € Ü�cœF¤GÐ,Ô-ÜÐ?ÄÀSÃ	¸{ÐKÓLÐLä”˜s F¨E±>ÓBÓCÐCrm   Ú_OpaqueObjectProxyTypec                 ó   — y rh   r}   rÛ   s     rk   rÚ   rÚ   o  s   € ð rm   c                 ó   — y rh   r}   ©r²   r³   Údefaults      rk   rÚ   rÚ   v  s   € ð
 rm   c                 ó   — y rh   r}   ©r²   r³   rá   Ú	transforms       rk   rÚ   rÚ   ~  ó   € ð rm   c                 ó   — y rh   r}   rÛ   s     rk   rÚ   rÚ   ‡  s   € ð rm   c                 ó   — y rh   r}   rà   s      rk   rÚ   rÚ   Ž  s   € ð
 rm   c                 ó   — y rh   r}   rã   s       rk   rÚ   rÚ   –  rå   rm   c                 ó   — y rh   r}   rÛ   s     rk   rÚ   rÚ   Ÿ  s   € ð rm   c                 ó   — y rh   r}   rà   s      rk   rÚ   rÚ   ¦  s   € ð
 rm   c                 ó   — y rh   r}   rà   s      rk   rÚ   rÚ   ®  s   € ð
 "%rm   c                 ó   — y rh   r}   rã   s       rk   rÚ   rÚ   ¶  rå   rm   c                ó   — | S rh   r}   ©rv   s    rk   rl   rl   Æ  s   € ¨a€ rm   c           	     ó¦  — t        | t        «      r|j                  }n‚t        | t        «      st	        | «      r4t        | t
        j                  «      r|j                  }n@|j                  }n3t        | t        «      st        dt        | «      › �«      ‚|j                  }|j                  | «      }|€št        | t        «      rŠ| j                  j                  «       rp|j                   j                  | j                  j"                  «      x}�|j$                  }n2t'        || j                  j"                  | «       |j                  | «      }|€>t        | t(        «      r.|j*                  j                  t-        | j.                  «      «      }|€:t        |t0        «      r(t3        | › dt        | «      › dt-        | «      › d|› �«      ‚|S  ||«      }|S )Nr½   z (z, z)is not tracked with proxy for )r    r   rÂ   rÃ   r$   rÄ   rÅ   rÆ   rÌ   rU   rŠ   rÁ   rÍ   rË   r¡   Úis_symbolicrÔ   rÑ   r´   Ú_build_proxy_for_sym_exprr!   rÊ   rÀ   r¼   r‘   ÚRuntimeError)r²   r³   rá   rä   Útrackerr¦   ÚtmpÚress           rk   rÚ   rÚ   Â  sƒ  € ô �#”vÔØ×'Ñ'‰Ü	�CÔ)Ô	*¬o¸cÔ.BÜ�cœ5×-Ñ-Ô.Ø×2Ñ2‰Gà×+Ñ+‰Gä˜#œ|Ô,Ü Ð#>¼tÀC»y¸kÐ!JÓKÐKØ×(Ñ(ˆð �K‰K˜Ó€Eà€}œ C¬Ô6Ø�8‰8×ÑÔ!ð ×0Ñ0×4Ñ4°S·X±X·]±]ÓCÐC�ÐPØŸ	™	‘ô *¨&°#·(±(·-±-ÀÔEàŸ™ CÓ(�à€}œ CÔ)9Ô:ð
 ×-Ñ-×1Ñ1´"°S·\±\Ó2BÓCˆà€}ä�gœzÔ*ÜØ�%�rœ$˜s›)˜ B¤r¨#£w iÐ/NÈvÈhÐWóð ð ˆá
�EÓ
€CØ€Jrm   c                ó  — g }t         j                  j                  t         j                  j                  j                  «      }|€|S t        |t        «      st        dt        |«      › �«      ‚|j                  }t        | g ¬«      D ]v  }t        |t        «      rt        j                  |j                  «      }t        |t         j                  «      sŒMt        ||«      }|€Œ\|j!                  |j"                  «       Œx |S )Nú%Expected ProxyTorchDispatchMode, got )Úout)rÄ   Ú_CÚ_get_dispatch_modeÚ_TorchDispatchModeKeyÚPROXYr    ÚProxyTorchDispatchModerŠ   rÁ   r³   r.   r1   Ú_from_functional_tensorÚelemr   rÚ   Úappendr´   )ÚtÚproxiesr�   r³   Út_innerÚproxy_tensors         rk   Ú_get_proxiesr  ý  sÑ   € Ø€GÜ�8‰8×&Ñ&¤u§x¡x×'EÑ'E×'KÑ'KÓL€DØ€|ØˆÜ�dÔ2Ô3ÜÐDÄTÈ$ÃZÀLÐQÓRÐRØ�[‰[€FÜ$ Q¨BÔ/ò /ˆÜ�gÔ/Ô0Ü×3Ñ3°G·L±LÓAˆGÜ˜'¤5§<¡<Ô0ØÜ% g¨vÓ6ˆØÑ#Ø�N‰N˜<×-Ñ-Õ.ð/ð €Nrm   c                 óJ   — t        j                  t        j                  | «      S rh   )Ú	functoolsÚreducerÄ   Úsym_max©Úargss    rk   Ú_nary_sym_maxr    ó   € Ü×ÑœEŸM™M¨4Ó0Ð0rm   c                 óJ   — t        j                  t        j                  | «      S rh   )r  r  rÄ   Úsym_minr
  s    rk   Ú_nary_sym_minr    r  rm   c                 óB  — ddl } ddl}i }|j                  j                  j                  j                  «       j                  «       D ]<  \  }}t        t        |d«      }|�|||<   Œ|dk(  r
t        ||<   Œ.|dk(  sŒ4t        ||<   Œ> |j                  || j                  <   |S )z’
    Returns a dict mapping sympy types to Python callables
    (e.g. ``sympy.Mul`` -> ``operator.mul``, ``sympy.Add`` -> ``torch.sym_sum``).
    r   NÚmaximumÚminimum)rÐ   Útorch.utils._sympy.interpÚutilsÚ_sympyÚinterpÚhandlersÚitemsÚgetattrÚoperatorr  r  Úsym_sumÚAdd)rÐ   rÄ   r  ÚkÚvÚops         rk   Ú_sympy_handlersr!    s›   € ó ã$à€HØ—‘×"Ñ"×)Ñ)×2Ñ2Ó4×:Ñ:Ó<ò (‰ˆˆ1Ü”X˜q $Ó'ˆØˆ>ØˆH�QŠKð �)Š^Ü'ˆH�QŠKØ�)‹^Ü'ˆH�QŠKð(ð"  Ÿ-™-€HˆU�Y‰YÑØ€Orm   c                óü  — | j                   j                  |«      x}�|rt        d«      ‚|j                  S t	        |t
        t        t        f«      r|S |j                  rt        |«      S |j                  rt        |«      S g }|j                  D ]#  }t        | |«      x}€ y|j                  |«       Œ% t        «       j                  |j                  «      }|sy|€ ||Ž }|S t        | |t!        |«      |«       |S )a  
    Decompose `expr` and look for the pieces as inputs. If `out` is provided
    then that will be the resulting SymNode (and `out.expr` must be the same as
    `expr`).

    This function is used when the ProxyTorchDispatchMode sees a SymNode
    that it hasn't seen before to try to associate it with traced inputs.

    How can this happen?

    First thing to remember is that although sympy.Exprs are interned (so
    `sympy.Expr("s3*s4")` will always have the same `id` and will always compare
    equal) SymNode does not (so doing `SymNode("s3")*SymNode("s4")` twice in a
    row will give two unique SymNodes).

    - On way for this to happen is if we turn off tracing to compute an
      intermediate value and then USE that value with tracing turned on - for
      example if we turn off tracing to do some FakeTensor propagation to
      compute a size (dtensor does this) but then turn tracing back on and use
      that computed size.

    - Another way is if we compute a size in one graph and stash it somewhere
      hidden (such as in some meta-data) and later use it in a different graph
      (dtensor does this too). Since the size was computed in the first graph
      and it's not an official input to the second graph it's not tracked
      properly. This is often going to show up as it usually works in fullgraph
      but a graph break causes a failure.

    To handle this we decompose the sympy.Expr and look for the pieces as
    inputs. But there are problems with this approach:

    - We lose operation provanance: We end up figuring out where to get the
      inputs - but those may not actually be correct. If we have "s1" coming in
      from both tensor1 and tensor2 and we pick the wrong one we could end up
      keeping a tensor alive longer than intended.

    - There's no guarantee that those values are inputs to the graph: If we have
      "s1*s2" computed in a graph #1 and used in graph #2 there's no guarantee
      that the input that holds "s1" is actually an input on graph #2.

    - The decomposition isn't guaranteed to be the same: Sympy can "simplify"
      expressions so it's possible that our inputs are "s1*s2" and "s3" but we
      decompose it into "s1" and "s2*s3" - which wouldn't be found.

    Other ways we could handle this:

    - Don't: Just require that all inputs are tracked properly. This is the
      "correct" solution but harder because you need to track down each
      potential problem one by one and fix them. And when it fails it's a lot of
      work to figure out both why it's failing and the right way to fix it. This
      is complicated by the fact that a stashed value could be incorrect but
      work fine until we happen to get an graph break in the wrong place - so it
      may be a while before the bug is found. (Maybe we need a "dynamo abuse
      mode" where we run tests with as many graph breaks inserted as possible?)

    - Track SymNode ops separately from proxy tracing: Right now SymNode
      operations are tracked as part of the proxy tracing - so when we disable
      proxy tracing we also disable SymNode tracing. But we don't have to do
      that - we could instead always have SymNodes track where they came from
      and just use that when needed. This solves the problem of tracing being
      temporarily turned off but doesn't help if an input isn't present after a
      graph break.

    - Better decomposition: Right now the decomposition is pretty simple. We do
      have a sat-solver available to us so we could theoretically do a better
      job figuring out a "correct" decomposition. But that still relies on
      having the inputs available at all - which isn't a guarantee.
    Nz6out should be empty when expr is in sympy_expr_tracker)rÔ   rË   rŠ   r¦   r    ÚintÚfloatr¥   Ú
is_IntegerÚis_Floatr  rñ   r   r!  ÚfuncÚ_sym_registerro   )r³   rÑ   rø   r¦   r  r|   Ú	arg_valuer'  s           rk   rñ   rñ   =  sþ   € ðP ×*Ñ*×.Ñ.¨tÓ4Ð4ˆÐAÙÜ ØHóð ð �{‰{Ðä�$œœe¤TÐ*Ô+ØˆØ‡‚Ü�4‹yÐØ‡}‚}Ü�T‹{Ðà€DØ�y‰yò ˆÜ2°6¸3Ó?Ð?ˆIÐHÙØ�‰�IÕðô
 .Ó/×3Ñ3°D·I±IÓ>€DÙØà
€{Ù�Dˆkˆð €Jô 	�f˜d¤E¨$£K°Ô5Ø€Jrm   Fc                óp   — t        | t        «      rt        | j                  | |«      S | j	                  «       S rh   )r    r,   r+   Ú	fake_modeÚdetach)rž   Úinclude_reals     rk   Úsnapshot_faker.  ¤  s-   € ô �#”zÔ"Ü˜3Ÿ=™=¨#¨|Ó<Ð<à�z‰z‹|Ðrm   Ú_ExtractValType)r/  .c                óh  — t        | «      rt        | |¬«      S t        | t        «      r| S t        | t        t
        f«      r| S t        | t        «      r| S 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        «      rz| j                  smddlm}  || «      }|st%        d¬«      }|5  t'        j(                  | j*                  | j-                  «       | j.                  | j0                  ¬«      cd d d «       S y t        | t2        t4        t6        f«      r| S | €y t9        j:                  | «       y c c}w c c}}w # 1 sw Y   Œ*xY w)N©r-  r   )Údetect_fake_modeT)Úallow_fallback_kernels)ÚdeviceÚdtype)r/   r.  r    rU   rÃ   r&   rI   r$   ri   ro   Ú	__class__Úextract_valÚdictr  r   Ú	is_sparseÚtorch._guardsr2  r-   rÄ   Úempty_stridedÚshapeÚstrider4  r5  r#  r$  r¥   Útyping_extensionsÚassert_never)rž   r-  rv   r  r  r2  Úfake_tensor_modes          rk   r7  r7  ¾  s^  € Üˆs„|Ü˜S¨|Ô<Ð<Ü	�CœÔ	&Øˆ
Ü	�CÔ*¬JÐ7Ô	8Øˆ
Ü	�CœÔ	'Øˆ
Ü	˜Ô	Øˆ
Ü	�Cœ$¤˜Ô	'Ø�}‰}°cÖ:°œk¨!�nÒ:Ó;Ð;Ü	�CœÔ	Ø.1¯i©i«k×:¡d a¨�”;˜q“>Ñ!Ó:Ð:Ü	�CœÔ	 Ø�}Š}õ 7á/°Ó4ÐÙ#Ü#1ÈÔ#NÐ Ø!ñ Ü×*Ñ*Ø—I‘I˜sŸz™z›|°C·J±JÀcÇiÁiô÷ñ ð
 Ü	�Cœ#œu¤dÐ+Ô	,Øˆ
Ø	ˆØä×"Ñ" 3Õ'ùò7 ;ùã:÷ð ús   ÂFÃF"ÄAF(Æ(F1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³   rB  Úolds      rk   Ú_enable_thunkifyrF  è  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.
    NFrA  ©rW   rF  r³   ©Ú
proxy_modes    rk   rZ   rZ   û  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.
    NrH  rI  s    rk   rY   rY     sE   è ø€ ô  Ó!€JØÐÜ˜j×/Ñ/Ó0ñ 	Û÷	ð 	ô 	÷	ð 	üs   ‚"A¤7©A·A ¼Ac                óª  — t        || j                  j                  dk(  ¬«      | 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)NÚplaceholderr1  rž   Útensor_meta)r7  r¡   r   rš   rF  r³   r/   r:   r    r   r9  )r´   rž   s     rk   Úset_metarO  $  sŸ   € Ü(Ø˜5Ÿ:™:Ÿ=™=¨MÑ9ô€E‡J�J‡O�O�EÑô 
˜%Ÿ,™,Ó	'ñ Kä�3Œ<Ü-EÀcÓ-JˆE�J‰J�O‰O˜MÒ*Ü˜œVÔ$¨S¯]ª]Ü-EÀcÓ-JˆE�J‰J�O‰O˜MÑ*÷Kð €L÷Kð €Lús   ÁA-CÃC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 rh   r}   )Úrs   €rk   rl   zthunkify.<locals>.<lambda>=  s   ø€ ˜Q€ rm   )rD  rD   r  Úpartial)r³   Úfr  ÚkwargsrR  s       @rk   ÚthunkifyrV  2  sH   ø€ ð ×ÒÜ”Y×&Ñ& qÐ:¨4Ò:°6Ñ:Ó;Ð;áˆtÐ�vÑˆÜ“YÓÐrm   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t        d«      ‚t        | t        «      r1t	        ‰«      5  t        | ‰t        ‰|| g|¢­i |¤Ž«       d d d «       y y # 1 sw Y   y xY w)Nzproxy_callable must be callable)ÚcallablerŠ   r    r   rF  rµ   rV  )Úouter_sÚproxy_callabler  rU  r³   s       €rk   Útry_set_proxy_slotz(track_tensor.<locals>.try_set_proxy_slotC  sn   ø€ ô ˜Ô'Ü Ð!BÓCÐCÜ�gœvÔ&Ü! &Ó)ñ ÜØØÜ˜V ^°WÐN¸tÒNÀvÑNô÷ð ð '÷ð ús   ³AÁA#c                óœ   •— t        ‰j                  dt        j                  j                  j
                  j                  ‰|fi «      | «      S ©NÚcall_function)rO  Úcreate_proxyrÄ   ÚopsÚatenÚsym_sizer#  ©rv   ru   r´   r³   s     €€rk   rl   ztrack_tensor.<locals>.<lambda>[  s@   ø€ œØ×#Ñ#Ø#¤U§Y¡Y§^¡^×%<Ñ%<×%@Ñ%@À5È!À*Èbóð ó	€ rm   c                óœ   •— t        ‰j                  dt        j                  j                  j
                  j                  ‰|fi «      | «      S r^  )rO  r`  rÄ   ra  rb  Ú
sym_strider#  rd  s     €€rk   rl   ztrack_tensor.<locals>.<lambda>h  sB   ø€ œXØ×'Ñ'Ø'¬¯©¯©×)BÑ)B×)FÑ)FÈÐPQÈ
ÐTVóð ó	€ rm   c                óš   •— t        ‰j                  dt        j                  j                  j
                  j                  ‰fi «      | «      S r^  )rO  r`  rÄ   ra  rb  Ú	sym_numelrá   ©rv   r´   r³   s    €€rk   rl   ztrack_tensor.<locals>.<lambda>s  s>   ø€ ”(Ø×ÑØ¤§¡§¡×!9Ñ!9×!AÑ!AÀEÀ8ÈRóð ó	
€ rm   c                óš   •— t        ‰j                  dt        j                  j                  j
                  j                  ‰fi «      | «      S r^  )rO  r`  rÄ   ra  rb  Úsym_storage_offsetrá   ri  s    €€rk   rl   ztrack_tensor.<locals>.<lambda>}  sA   ø€ ”hØ×#Ñ#Ø#Ü—I‘I—N‘N×5Ñ5×=Ñ=Ø�HØó	ð ó€ rm   )
rZ  rO   r[  z+Callable[Concatenate[PySymType, _P], Proxy]r  ú_P.argsrU  ú	_P.kwargsÚreturnÚNone)rr   r<  r2   r=  ÚnumelÚstorage_offsetrµ   r¯   )Útensorr´   Úconstantr³   r\  ru   Úss    ` `   rk   Útrack_tensorru  @  sö   ù€ ðØðàCðð ðð ð	ð
 
õô* ˜&Ÿ,™,Ó'ò 

‰ˆˆ1ÙØôð õ		
ð

ô ˜Ô Ü˜fŸm™m›oÓ.ò 
	‰DˆAˆqÙØôð õ	ð
	ñ Ø�‰‹ô	
ôô ˜Ô ÙØ×!Ñ!Ó#ôô	
ô �6˜6¤<°°xÓ#@ÕArm   Ú_NestedProxysÚ_NestedTensorsc               óT   ‡‡— t        | |«       	 	 	 	 	 	 	 	 dˆˆfd„Š ‰| ||«       | S )Nc           	     ó"  •‡— t        | t        «      rlt        ‰t        «      st        dt	        ‰«      › �«      ‚|�'t        |t        «      st        dt	        |«      › �«      ‚t        | ‰‰|¬«       t        ‰| «       y t        | t        «      rNt        ‰t        «      st        dt	        ‰«      › �«      ‚t        ‰| «       t        | ‰t        ‰ˆfd„«      «       y t        | t        «      st        | «      rvt        ‰t        «      st        dt	        ‰«      › �«      ‚t        t	        | «      «      r!t        t	        | «      «      st        ‰| «       y t        | ‰‰«       t        ‰| «       y t        | t        t        f«      rXt        ‰t         j                  «      rt        ‰| «       	 	 	 	 	 	 dd„}t#        | «      D ]  \  }} ‰	|‰|    |||«      «       Œ y t        | t$        «      rY|�t        d«      ‚t        ‰t         j                  «      rt        ‰| «       | j'                  «       D ]  \  }} ‰	|‰|   d «       Œ y t        | t(        «      r;t        ‰t        «      st        dt	        ‰«      › �«      ‚t        ‰| «       ‰| _        y y )Nr»   zExpected None or Tensor, got )r³   rs  c                 ó   •— ‰ S rh   r}   ©r´   s   €rk   rl   z<track_tensor_tree.<locals>.wrap_with_proxy.<locals>.<lambda>·  s   ø€ ¸u€ rm   c                ól   — | €y t        | t        t        f«      st        dt	        | «      › �«      ‚| |   S )NzExpected list or tuple, got )r    ri   ro   rŠ   rÁ   )ÚcÚidxs     rk   Úget_constantz@track_tensor_tree.<locals>.wrap_with_proxy.<locals>.get_constantË  s;   € ð �9Øä% a¬$´¨Ô7Ü,Ð/KÌDÐQRËGÈ9Ð-UÓVÐVà˜S™6�Mrm   zExpected constant to be None)r}  ú_NestedTensors | Noner~  r#  rn  r€  )r    r   r4   rŠ   rÁ   ru  rO  rU   rµ   rV  rÃ   r$   r%   r'   ro   ri   Úfxrr   r8  r  rI   r´   )
Úer´   rs  r  r~  ÚeeÚkeyrž   r³   Úwrap_with_proxys
    `      €€rk   r…  z*track_tensor_tree.<locals>.wrap_with_proxy¨  sB  ù€ ô �aœÔ Ü˜e¤UÔ+Ü$Ð';¼DÀ»K¸=Ð%IÓJÐJØÐ$¬
°8¼VÔ(DÜ$Ð'DÄTÈ(Ã^ÐDTÐ%UÓVÐVÜ˜˜E¨&¸8ÕDÜ�U˜AÕÜ˜œ<Ô(Ü˜e¤UÔ+Ü$Ð';¼DÀ»K¸=Ð%IÓJÐJä�U˜AÔÜ˜1˜f¤h¨v³}Ó&EÕFÜ˜Ô+Ô,´ÀÔ0BÜ˜e¤UÔ+Ü$Ð';¼DÀ»K¸=Ð%IÓJÐJô
 %¤T¨!£WÔ-Ü$¤T¨!£WÔ-ä˜ Ô"ØÜ˜1˜f eÔ,Ü�U˜AÕÜ˜œE¤4˜=Ô)ä˜%¤§¡Ô*Ü˜ Ô"ð	"Ø(ð	"Ø/2ð	"à&ó	"ô % Q›<ò M‘��Rñ    E¨#¡J±¸XÀsÓ0KÕLñMô
 ˜œ4Ô ð Ð#Ü$Ð%CÓDÐDä˜%¤§¡Ô*Ü˜ Ô"àŸG™G›Iò 7‘��SÙ  U¨3¡Z°Õ6ñ7ô ˜œ=Ô)Ü˜e¤UÔ+Ü$Ð';¼DÀ»K¸=Ð%IÓJÐJÜ�U˜AÔØˆA�Gð rm   )r‚  rÇ   r´   rv  rs  r€  rn  ro  )Ú_set_unbacked_bindings)Ú	inner_resÚ	proxy_resrs  r³   r…  s      `@rk   Útrack_tensor_treer‰  ’  sN   ù€ ô( ˜9 iÔ0ðKØðKØ'ðKØ3HðKà	öKñZ �I˜y¨(Ô3àÐrm   c                  ó"   — e Zd ZU ded<   ded<   y)r¯   r4   r´   úTensor | Noners  Nr›   r}   rm   rk   r¯   r¯   ú  s   … àƒLØÔrm   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t        dt        | «      › �«      ‚t        | ‰«      j                  «       S )Nr½   )r¡   rs  rÑ   Ú	is_numberr    r   r¥   r   r#  r$  rU   rŠ   rÁ   rÚ   Úforce)r‚  Únr³   s     €rk   Úinnerzfetch_sym_proxy.<locals>.inner  sµ   ø€ Ø�F‰FˆØ�:‰:Ð!Ø—:‘:ÐØ�6‰6�;‰;× Ò Ü˜!œWÔ%Ü˜AŸF™FŸK™KÓ(Ð(Ü˜AœvÔ&Ü˜1Ÿ6™6Ÿ;™;Ó'Ð'Ü˜Ÿ™Ÿ™Ó%Ð%ä˜a¤Ô.Ü$Ð'BÄ4ÈÃ7À)Ð%LÓMÐMä! ! VÓ,×2Ñ2Ó4Ð4rm   )r‚  r—   rn  zint | bool | float | Proxyr}   )r³   r‘  s   ` rk   Úfetch_sym_proxyr’     s   ø€ õ5ð  €Lrm   c                 ó   — y rh   r}   ©r³   r  s     rk   Úfetch_object_proxyr•    s   € ØRUrm   c                 ó   — y rh   r}   r”  s     rk   r•  r•    s   € ð $'rm   c                 ó   — y rh   r}   r”  s     rk   r•  r•     s   € ð #&rm   c                 ó   — y rh   r}   r”  s     rk   r•  r•  &  s   € ð *-rm   c                ó   — t        || |«      S rh   ©rÚ   r”  s     rk   r•  r•  ,  s   € ô ˜!˜V QÓ'Ð'rm   rý   c                ó¶  — |j                   s|j                  syt        | t        j                  j
                  «      syt        t        t        |j                  j                  j                  «      «      «      }|j                  j                  d«      }t        j                  t        j                  f}t        |t        j                   «      xr |j"                  |v }|sg|j$                  D ]X  }t'        |d«      r|j                  j                  d«      nd}t        |t        j                   «      sŒG|j"                  |v sŒVd} n |syd|j                  d<   y)z¸
    Records operators whose tensor outputs or inputs are fp16/bf16 so downstream pointwise code can
    emulate eager's rounding behavior when emulate_precision_casts is enabled.
    Nrž   rš   TÚlow_precision_pointwise_barrier)Údecomp_layersÚemulate_precision_castsr    rÄ   Ú_opsr*   ÚnextÚiterÚreversedr³   ÚgraphÚnodesrš   rË   Úbfloat16Úfloat16r   r5  Úall_input_nodesrŸ   )r'  rJ  Ú	last_noder  Ú	low_pr_fpÚoutput_low_precisionÚ
input_noderž   s           rk   Ú_maybe_record_pointwise_barrierr¬  6  s  € ð ×Ò z×'IÒ'IØä�dœEŸJ™J×1Ñ1Ô2Øä”Tœ( :×#4Ñ#4×#:Ñ#:×#@Ñ#@ÓAÓBÓC€IØ�‰×Ñ˜5Ó!€AÜ—‘¤§¡Ð/€Iä% a¬¯©Ó6ÒO¸1¿7¹7ÀiÐ;OÐáØ#×3Ñ3ò 	ˆJÜ07¸
ÀFÔ0K�*—/‘/×%Ñ% eÔ,ÐQUˆCÜ˜#œuŸ|™|Õ,°·±¸iÒ1GØ'+Ð$Ùð		ñ  Øà8<€I‡N�NÐ4Ò5rm   c                óº  — | D �cg c]1  }t        |t        t        f«      st        |«      rt	        ||«      n|‘Œ3 }}t        d„ |D «       «       xr t        d„ | D «       «       }|D �cg c]   }t        |t        «      r|j                  n|‘Œ" }}|D �cg c]%  }t        |t        «      r t        |«      |«      n|‘Œ' }}|t        |«      |fS c c}w c c}w c c}w )zÉ
    Given flat arguments, fetch the proxies and whether they are all constants.
    This is later used in proxy_call or when someone is trying to stitch together
    graph node in tf or td modes.
    c              3  óX   K  — | ]"  }t        |t        «      r|j                  d u –— Œ$ y ­wrh   ©r    r¯   rs  ©r~   r  s     rk   r   z7_fetch_proxies_and_all_constant_flag.<locals>.<genexpr>k  s+   è ø€ ò 
àÜ˜!œ\Ô*ð �J‰J˜$Ôñ
ùó   ‚(*c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrh   ©r    rU   )r~   rv   s     rk   r   z7_fetch_proxies_and_all_constant_flag.<locals>.<genexpr>r  s   è ø€ ÒJ°A”J˜q¤,×/ÑJùó   ‚)r    r   rÃ   r$   r•  Úanyr¯   r´   rU   r’  ro   )Úflat_args_kwargsr³   rv   Úf_flat_args_kwargsÚall_constantr‚  Úproxy_flat_args_kwargss          rk   Ú$_fetch_proxies_and_all_constant_flagrº  V  s  € ð "öð ô ˜!œfÔ&6Ð7Ô8¼OÈAÔ<Nô ˜v qÔ)àñðÐð ô ñ 
à'ô
ó 
ð 	
ò 	Kô ÑJÐ9IÔJÓJÐJð ð @RöØ:;”:˜a¤Ô.ˆ�Š°AÑ5ðÐð ð (öàô (2°!´\Ô'BÐ	 Œ˜Ó	  Ô	#ÈÑ	IðÐð ð
 œuÐ%;Ó<¸lÐJÐJùòAùò.ùòs   …6CÁ)%CÂ*C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r=t        ||«      r1‰ 5   |j                   |i |¤Ž}|t
        ur|cd d d «       S 	 d d d «       |t        j                  j                  j"                  j                  u rM‰ 5  t        j$                  |d   j'                  «       dk(  d„ «       |d   dk7  j)                  «       cd d d «       S ‰ j*                  }t-        ||«      \  }	}
}t        j.                  j0                  |j2                  v r›|r`|	D �cg c]   }t5        |t6        «      r|j8                  n|‘Œ" }}t        j:                  ||«      \  }}t=        «       5   ||i |¤Žcd d d «       S ‰ j>                  r-t        j@                  tB        d„ ||f«      rtE        d|› d	�«      ‚t        j:                  |
|«      \  }}|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 «       tW        d„ |	D «       «      }d }dd„}|t        j                  j                  jH                  j                  u rqj'                  «       tX        k  rZt=        «       5  t5        |d   tZ        tB        f«      st]        dt_        |d   «      › �«      ‚|d   ja                  «       }d d d «       n§t        j.                  jb                  |j2                  vr|r}|r{t        j@                  tB        |«      r`t=        «       5  |	D �cg c]   }t5        |t6        «      r|j8                  n|‘Œ" }}t        j:                  ||«      \  }} ||i |¤Ž}d d d «       nd }te        |||¬«       t        |‰ «       |S # 1 sw Y   �ŒÕxY w# 1 sw Y   �ŒexY wc c}w # 1 sw Y   �ŒÓxY w# 1 sw Y   �Œ³xY w# 1 sw Y   Œ_xY wc c}w # 1 sw Y   ŒpxY w)Nc                óü   •— t        | «      t        v xs t        | ‰j                  «      }‰j                  r)|xs% t        | «      t
        j                  j                  u }|s‰j                  t        | «      «       |S rh   )	rÁ   ÚHANDLED_TYPESrÜ   r³   Ú_allow_fake_constantrÄ   Ú_subclassesr,   r   )rv   rR  rJ  Úunrecognized_typess     €€rk   Úcan_handle_tensorz%proxy_call.<locals>.can_handle_tensor‹  se   ø€ Ü�‹G”}Ð$ÒL¬°q¸*×:KÑ:KÓ(LˆØ×*Ò*ØÒ<”T˜!“W¤× 1Ñ 1× <Ñ <Ð<ˆAÙØ×%Ñ%¤d¨1£gÔ.Øˆrm   c              3  óP   •K  — | ]  }t        |t        «      sŒ ‰|«      –— Œ y ­wrh   )r    r   )r~   rv   rÁ  s     €rk   r   zproxy_call.<locals>.<genexpr>•  s    øè ø€ ÒW¨ÄÈAÌvÕAVÑ  ×#ÑWùs   ƒ&™&zEProxyTensorMode tensors without proxy had unrecognized subclasses: %sr   rH   c                  ó   — y)Nz=Boolean value of Tensor with more than one value is ambiguousr}   r}   rm   rk   rl   zproxy_call.<locals>.<lambda>µ  rÙ   rm   c                ó   — t        | «       S rh   )r/   ©r  s    rk   rl   zproxy_call.<locals>.<lambda>Î  s   € ¤'¨!£*˜n€ rm   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rh   r¯  r°  s     rk   r   zproxy_call.<locals>.<genexpr>  s+   è ø€ ò àÜ�aœÔ&ð 	
�
‰
˜$Ôñùr±  c                ó0   — | j                  «       t        k  S rh   )rp  ÚCONSTANT_NUMEL_LIMITrÅ  s    rk   Útensor_numel_in_limitz)proxy_call.<locals>.tensor_numel_in_limit%  s   € Ø�w‰w‹yÔ0Ñ0Ð0rm   zExpected Proxy or Tensor, got ©rs  r³   )rv   r   rn  r¥   )r  r   rn  r¥   )3rs   Útree_flattenÚallÚnot_implemented_logr¿   ÚNotImplementedÚmaybe_handle_decompr¬  rÄ   ra  rb  Úsizerá   r=  rq  r@   r�   Ú
is_nonzeroÚ_checkrp  Úitemr³   rº  ÚTagÚdata_dependent_outputÚtagsr    r¯   rs  Útree_unflattenr0   Ú_error_on_data_dependent_opsÚtree_all_onlyr   rò   Ú
lift_freshÚlift_fresh_copyr`  r£  Ú_target_to_strÚoverloadpacketr“   rF  rµ  rÉ  r4   rŠ   rÁ   ÚcloneÚnondeterministic_seededr‰  )rJ  r'  Úpre_dispatchr  rU  r¶  ÚspecrR  r³   r·  r¹  r¸  r  Úconst_flat_args_kwargsÚ
const_argsÚconst_kwargsÚ
proxy_argsÚproxy_kwargsÚ	proxy_outrø   Úany_constantrs  rÊ  rÁ  rÀ  s   `                      @@rk   Ú
proxy_callrê  �  s  ú€ ð &(ÐÜ#×0Ñ0°$¸°Ó@ÑÐ�döô ÓWÐ-=ÔWÔWÜ×!Ñ!ØSØô	
ô Ðä˜J¨¨d°FÓ;€AØ”ÑÜ'¨¨jÔ9Øˆñ Øä�I‰I�N‰N×Ñ×'Ñ'Ü�I‰I�N‰N×!Ñ!×)Ñ)Ü�I‰I�N‰N×)Ñ)×1Ñ1ð
ñ
ô +¨4Ð1AÔBàñ 	Ø�—‘ Ð/¨Ñ/ˆAØœÑ&Ø÷	ñ 	à&÷	ð
 Œu�y‰y�~‰~×(Ñ(×0Ñ0Ñ0Øñ 	)Ü�L‰LØ�Q‘—‘“ 1Ñ$ÙWôð ˜‘G˜q‘L×&Ñ&Ó(÷	)ñ 	)ð ×Ñ€Fä,Ð-=¸vÓFñ =ÐÐ.°ô ‡y�y×&Ñ&¨$¯)©)Ñ3áð ,ö&àô )¨¬LÔ9�—
’
¸qÑ@ð&Ð"ð &ô (.×'<Ñ'<Ø&¨ó(Ñ$ˆJ˜ô (Ó)ñ 9Ù˜ZÐ8¨<Ñ8÷9ñ 9ð
 ×2Ò2´v×7KÑ7KÜÑ,¨t°V¨nô8
ô ØZÐ[_ÐZ`ð a(ð (óð ô  &×4Ñ4Ð5KÈTÓRÑ€J�ðF Œu�y‰y�~‰~×(Ñ(×0Ñ0Ñ0Ü�y‰y�~‰~×-Ñ-×5Ñ5ˆà×!Ñ!×.Ñ.ØØØØØ×Ñ×$Ñ$×3Ñ3°D×4GÑ4G×4PÑ4PÓQð /ó €Iô 
˜*×+Ñ+Ó	,ñ $Ù�DÐ#˜FÑ#ˆ÷$ô0 ñ à#ôó €Lð €Hó1ð 	”—	‘	—‘×.Ñ.×6Ñ6Ñ6Ø�I‰I‹KÔ/Ò/ä#Ó%ñ 	'Ü˜d 1™g¬¬v Ô7Ü$Ð'EÄdÈ4ÐPQÉ7ÃmÀ_Ð%UÓVÐVØ˜A‘w—}‘}“ˆH÷	'ð 	'ô
 	�	‰	×)Ñ)°·±Ñ:ÙÙÜ× Ñ ¤Ð)>ÀÔDô $Ó%ñ 	9ð ,ö&àô )¨¬LÔ9�—
’
¸qÑ@ð&Ð"ð &ô (.×'<Ñ'<Ø&¨ó(Ñ$ˆJ˜ñ ˜ZÐ8¨<Ñ8ˆH÷	9ð 	9ð ˆäØØàØõô $ D¨*Ô5Ø€J÷E	ñ 	ú÷	)ñ 	)üò&÷9ñ 9ú÷z$ñ $ú÷T	'ð 	'üò&÷	9ð 	9úsb   ÄTÅ7ATÈ
%T*ÉT/Î	T<Ï<AU	ÒUÒ %UÓ#UÔTÔT'Ô/T9Ô<UÕ	UÕUÕU#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 rh   )Úsym_node_dict©Úselfs    rk   Ú__init__z_SymNodeDict.__init__V  s
   € Ø?AˆÕrm   c                ó6   — || j                   |j                  <   y rh   ©rî  r¡   )rð  r„  r¦   s      rk   Ú__setitem__z_SymNodeDict.__setitem__Y  s   € Ø',ˆ×Ñ˜3Ÿ8™8Ò$rm   c                ó4   — | j                   |j                     S rh   ró  ©rð  r„  s     rk   Ú__getitem__z_SymNodeDict.__getitem__\  s   € Ø×!Ñ! #§(¡(Ñ+Ð+rm   c                ó2   — |j                   | j                  v S rh   )r¡   rî  rö  s     rk   Ú__contains__z_SymNodeDict.__contains___  s   € Ø�x‰x˜4×-Ñ-Ð-Ð-rm   Nc                óN   — | j                   j                  |j                  |«      S rh   )rî  rË   r¡   )rð  r„  rá   s      rk   rË   z_SymNodeDict.getb  s!   € ð
 ×!Ñ!×%Ñ% c§h¡h°Ó8Ð8rm   c                ó   — t         ‚rh   )ÚNotImplementedErrorrï  s    rk   Ú__iter__z_SymNodeDict.__iter__i  s   € Ü!Ð!rm   c                ó,   — t        | j                  «      S rh   )Úlenrî  rï  s    rk   Ú__len__z_SymNodeDict.__len__l  s   € Ü�4×%Ñ%Ó&Ð&rm   ©rn  ro  )r„  r—   r¦   r¸   rn  ro  )r„  r—   rn  r¸   )r„  r—   rn  r¥   rh   )r„  r—   rá   z_PySymProxyType | Nonern  r¸   )rn  r   )rn  r#  )r“   r”   r•   Ú__doc__rñ  rô  r÷  rù  rË   rý  r   r}   rm   rk   rì  rì  Q  sJ   „ ñóBó-ó,ó.ð AEð9Øð9Ø'=ð9à	ó9ó"ô'rm   rì  c                  ó"   — e Zd ZU ded<   ded<   y)rÓ   r¸   r´   r—   r¦   Nr›   r}   rm   rk   rÓ   rÓ   p  s   … àÓØÔrm   rÓ   c                óÐ   — t        «       | _        t        «       | _        t	        dt
        ¬«      | _        t	        «       | _        i | _        i | _	        d| _
        i | _        d| _        y)zZInitialize the tracker dictionaries shared by PythonKeyTracer and _GraphAppendingTracerEx.N)r8  Úref_typeF)rG   rÂ   rì  rÍ   rF   rE   rÆ   rÌ   rÊ   rÔ   Útorch_fn_metadataÚtorch_fn_countsrD  ©r³   s    rk   Ú_init_proxy_trackersr	  v  s[   € ä3Ó5€FÔÜ)›^€FÔÜ#6¸DÌ<Ô#X€FÔ Ü/Ó1€FÔØ$&€FÔ!Ø "€FÔà#€FÔð  €FÔØ"€FÕrm   c                  ó:  ‡ — e Zd ZU ded<   ded<   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	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 d d„Zd!ˆ fd„Z	 	 	 	 d"d„Z	e
d#d„«       Ze
d$d„«       Ze
d%d„«       Zd&d„Z	 	 d'	 	 	 	 	 	 	 	 	 	 	 	 	 d(ˆ fd„Zˆ xZS ))rP   ú)MutableMapping[torch.ScriptObject, Proxy]rÆ   ú4MutableMapping[FakeScriptObject | OpaqueBase, Proxy]rÌ   údict[int, Proxy]rÊ   rì  rÍ   ú*dict[sympy.Symbol, _SympyExprTrackerValue]rÔ   ú$MutableMapping[Tensor, _ProxyTensor]rÂ   úOpOverload | Noner  údict[OpOverload, int]r  Fr¥   rD  c                ó<   •— t         ‰| �  d¬«       t        | «       y )Nr}   )Úautowrap_modules©Úsuperrñ  r	  )rð  r6  s    €rk   rñ  zPythonKeyTracer.__init__—  s   ø€ Ü‰Ñ¨"ÐÔ-Ü˜TÕ"rm   c                ó   —  ||i |¤ŽS rh   r}   )rð  ÚmÚforwardr  rU  s        rk   Úcall_modulezPythonKeyTracer.call_modulež  s   € ñ ˜Ð' Ñ'Ð'rm   c                ó   — |S rh   r}   )rð  ÚattrÚattr_valÚparameter_proxy_caches       rk   r  zPythonKeyTracer.getattr¨  s	   € ð ˆrm   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        «      r7|j                  j                  €t        d«      ‚|j                  j                  S t        |t        t        f«      r| j                  |«      }|�|S t         ‰| �E  |«      S )NÚget_attrr}   Ú_param_constantz"a.node.constant should not be None)r    rÄ   ÚnnÚ	ParameterÚrootÚnamed_parametersÚcreate_nodeÚget_fresh_qualnameÚsetattrrU   r¡   rs  rŠ   r!   r&   Ú_try_reconstruct_opaquer  Ú
create_arg)rð  Úar�  ÚpÚqualnamer¡   r6  s         €rk   r)  zPythonKeyTracer.create_arg­  s   ø€ Ü�aœŸ™×+Ñ+Ô,ØŸ	™	×2Ñ2Ó4ò C‘��1Ø˜’6Ø×+Ñ+¨J¸¸2¸rÓBÒBðCð ×.Ñ.Ð/@ÓAˆHÜ�D—I‘I˜x¨Ô+à×#Ñ# J°¸"¸bÓAÐAÜ˜œ<Ô(Ø�v‰v�‰Ð&Ü$Ð%IÓJÐJØ—6‘6—?‘?Ð"ô �aÔ*¬JÐ7Ô8Ø×/Ñ/°Ó2ˆDØÐØ�ä‰wÑ! !Ó$Ð$rm   c                ó–  ‡ — t        |t        «      r|j                  n|}t        t	        |«      «      syt        t	        |«      «      }|€ydˆ fd„} |||‰ «      }|€yd|j                  j                  vrt        ||«       t        |‰ |«       t        |«      ‰ j                  vr|‰ j                  t        |«      <   |j                  S )a·  Try to reconstruct an opaque object from existing graph inputs.

        When make_fx encounters an untracked opaque reference type (e.g. a
        DeviceMesh submesh captured by a backward closure), this method checks
        if the type has a registered reconstruct_fn that can derive the object
        from inputs already in the graph.  Returns an FX Node on success,
        None on failure (falls back to get_attr constant).
        Nc                ó  •— ‰j                   j                  t        | «      «      }|�|S t        | ‰d «      }|�|S ‰j                  j                  «       D ])  \  }}t        |t        «      sŒ|j                  | k(  sŒ'|c S  y rh   )	rÊ   rË   rÀ   rÚ   rÌ   r  r    r!   r¼   )r²   r´   Útracked_objr+  rð  s       €rk   Úget_tracked_proxyzBPythonKeyTracer._try_reconstruct_opaque.<locals>.get_tracked_proxyÙ  s‹   ø€ Ø×/Ñ/×3Ñ3´B°s³GÓ<ˆEØÐ Ø�Ü" 3¨¨dÓ3ˆEØÐ Ø�ð #'×"5Ñ"5×";Ñ";Ó"=ò ‘�˜QÜ! +Ô/?Ô@ØØ×'Ñ'¨3Ó.Ø’Hð	ð
 rm   rž   )r²   r&   rn  zProxy | None)r    r!   r¼   r#   rÁ   r"   r¡   rš   rO  rµ   rÀ   rÊ   )rð  r*  r¼   Úreconstruct_fnr0  Úresults   `     rk   r(  z'PythonKeyTracer._try_reconstruct_opaqueÅ  s»   ø€ ô .8¸Ô;KÔ-L˜qŸzšzÐRSˆä'¬¨X«Ô7Øä+¬D°«NÓ;ˆØÐ!Øõ	ñ&   Ð*;¸TÓBˆØˆ>Øð ˜Ÿ™×(Ñ(Ñ(Ü�V˜QÔô 	�q˜$ Ô'Üˆh‹<˜t×:Ñ:Ñ:Ø8>ˆD×'Ñ'¬¨8«Ñ5à�{‰{Ðrm   c                 ó   — y rh   r}   ©rð  r‚  s     rk   Úunwrap_proxyzPythonKeyTracer.unwrap_proxy   s   € Ø9<rm   c                 ó   — y rh   r}   r4  s     rk   r5  zPythonKeyTracer.unwrap_proxy  s   € Ø?Brm   c                 ó   — y rh   r}   r4  s     rk   r5  zPythonKeyTracer.unwrap_proxy  s   € ØUXrm   c                óÒ   — t        |t        «      rt        || |d„ «      S t        |t        «      rt        || |d„ «      S t        |t        «      st        |«      rt        || |«      S |S )Nc                ó   — | j                   S rh   r{  rî   s    rk   rl   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>  s
   € ¸¿¹€ rm   c                ó"   — | j                  «       S rh   )r�  )r‚  s    rk   rl   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>  s   € ¸¿¹»	€ rm   )r    r   rÚ   rU   rÃ   r$   r4  s     rk   r5  zPythonKeyTracer.unwrap_proxy	  s`   € Ü�aœÔ Ü! ! T¨1Ñ.?Ó@Ð@Ü˜œ<Ô(Ü! ! T¨1Ñ.AÓBÐBÜ˜Ô+Ô,´ÀÔ0BÜ! ! T¨1Ó-Ð-àˆHrm   c                óL  •— t         ‰| �  ||||||«      }|j                  dv rd|j                  v r|j                  d= |dk(  r‚t	        |t
        «      st        dt        |«      › �«      ‚t        | j                  |«      }t	        |t        j                  «      r+t        «       5  t        |«      |j                  d<   d d d «       dd„}	t        |||f«      r@t        j                  j                   j#                  ||f|	«      \  }
}|
|f|j                  d<   |S # 1 sw Y   Œ]xY w)	N©rM  ÚoutputÚstack_tracer  zExpected str, got rž   c                ó  — t        | t        j                  j                  «      rd| j                  vry | j                  d   }t        |t        j
                  «      rt        |t        «      sy t        | j                  d   «      S )Nrž   )r    rÄ   r�  ÚNoderš   r   r,   r7  )r  rž   s     rk   Úmap_fnz+PythonKeyTracer.create_node.<locals>.map_fn)  s^   € Ü˜a¤§¡§¡Ô/°5ÀÇÁÑ3FØØ—&‘&˜‘-ˆCô ˜#œuŸ|™|Ô,´ZÀÄZÔ5PØÜ˜qŸv™v e™}Ó-Ð-rm   Úeager_input_vals)r  r   rn  z_ExtractValType | None)r  r%  r   rš   r    ÚstrrŠ   rÁ   r  r#  rÄ   r   Údisable_proxy_modes_tracingr7  Ú_should_save_eager_input_valsr�  r¡   Úmap_aggregate)rð  ÚkindÚtargetr  rU  rÆ  Ú	type_exprr¡   r  rA  Úarg_inpÚ	kwarg_inpr6  s               €rk   r%  zPythonKeyTracer.create_node  s
  ø€ ô ‰wÑ" 4¨°°v¸tÀYÓOˆà�7‰7Ð/Ñ/°MÀTÇYÁYÑ4NØ—	‘	˜-Ð(à�:ÒÜ˜f¤cÔ*Ü$Ð'9¼$¸v»,¸Ð%HÓIÐIÜ˜4Ÿ9™9 fÓ-ˆDÜ˜$¤§¡Ô-Ü0Ó2ñ 9Ü'2°4Ó'8�D—I‘I˜eÑ$÷9ó	.ô )¨°$¸°Ô@ô "'§¡§¡×!<Ñ!<¸dÀF¸^ÈVÓ!TÑˆG�YØ-4°iÐ,@ˆD�I‰IÐ(Ñ)àˆ÷-9ð 9ús   Â%DÄD#r  )
r  r;   r  úCallable[..., Any]r  ztuple[Any, ...]rU  zdict[str, Any]rn  r   ©r  rC  r  rÇ   r  zdict[str, Proxy]rn  rÇ   )r*  rÇ   rn  úfx.node.Node)r*  zFakeScriptObject | OpaqueBasern  zfx.node.Node | None)r‚  r   rn  zProxy | Tensor)r‚  r—   rn  zProxy | PySymType)r‚  Ú_AnyScriptObjectTypern  úProxy | _AnyScriptObjectType)r‚  rb   rn  rÇ   )NN)rG  rC  rH  r9   r  ztuple[Argument, ...]rU  zdict[str, Argument]rÆ  z
str | NonerI  z
Any | Nonern  ztorch.fx.Node)r“   r”   r•   rœ   rD  rñ  r  r  r)  r(  r   r5  r%  Ú__classcell__©r6  s   @rk   rP   rP   †  sF  ø… ð EÓDð IÓHð -Ó,Ø!Ó!ØBÓBØ8Ó8Ø(Ó(Ø*Ó*Ø!€O�TÓ!õ#ð(àð(ð $ð(ð ð	(ð
 ð(ð 
ó(ðØðØ#)ðØBRðà	óõ
%ð09Ø.ð9à	ó9ðv Ú<ó Ø<àÚBó ØBàÚXó ØXóð   Ø $ð)àð)ð ð)ð #ð	)ð
 $ð)ð ð)ð ð)ð 
÷)ñ )rm   rP   c                óà  — ddl m} t        | «      syt        | t        j
                  j                  j                  t        j
                  j                  j                  |f«      ry|�»| t        j                  j                  j                  u s&| t        j                  j                  j                  u ro|d   }t        |d   t        j                  j                  t        j                  j                  f«      st!        dt#        |d   «      › �«      ‚t%        |d   d «      S | t        j                  j                  j&                  u ryt        | t        j                  j                  «      r)t)        j*                  t$        |«      rt-        d| › d�«      ‚t        | t        j                  j                  «      r3ddlm}  || «      t        j2                  j4                  j6                  k(  S y)	Nr   )ÚInvokeSubgraphHOPFTz0Expected OpOverload or HigherOrderOperator, got zNYI: The HOP z” has an input that is an OpOverload that needs exact strides. We probably need special logic to propagate the FakeTensor vals. Please file an issue.)Úget_layout_constraint_tag)Ú'torch._higher_order_ops.invoke_subgraphrT  rY  r    rÄ   Ú_higher_order_opsÚtriton_kernel_wrapÚTritonKernelWrapperFunctionalÚTritonKernelWrapperMutationra  Úhigher_orderÚauto_functionalizedÚauto_functionalized_v2rŸ  r*   r)   rŠ   rÁ   rE  Úwith_effectsrs   Útree_anyrò   Útorch._library.utilsrU  rù   rÕ  Úneeds_exact_strides)rH  Úargs_kwargsrT  r  rU  s        rk   rE  rE  ?  sŒ  € õ Jä�FÔØÜØä×#Ñ#×6Ñ6×TÑTÜ×#Ñ#×6Ñ6×RÑRØð	
ôð ØÐØ”%—)‘)×(Ñ(×<Ñ<Ñ<Ø”U—Y‘Y×+Ñ+×BÑBÑBà˜1‰~ˆÜØ�‰G”e—j‘j×+Ñ+¬U¯Z©Z×-KÑ-KÐLô
ô !ØBÄ4ÈÈQÉÃ=À/ÐRóð ô -¨T°!©W°dÓ;Ð;Ø”—‘×'Ñ'×4Ñ4Ñ4ð Ü�&œ%Ÿ*™*×8Ñ8Ô9Ü�?‰?Ô8¸+ÔFÜØ ˜xð (Gð Hóð ô
 �&œ%Ÿ*™*×/Ñ/Ô0ÝBá(¨Ó0´E·H±H·L±L×4TÑ4TÑTÐTØrm   c                ó&   ‡ — t         dˆ fd„«       }|S )Nc               3  ó  •K  — ddl m} m}m} g }d } | «       dkD  r2 |«       }t	        |‰«      r|}n|j                  |«        | «       dkD  rŒ2t        |«      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_moder>   rH   )Útorch.overridesre  rf  r>   r    r   r¢  rÿ  )re  rf  r>   Útemp_elementsÚremoved_moder�   rC   Úmode_tys          €rk   Úcontext_manager_fnzB_make_temp_remove_mode_context_manager.<locals>.context_manager_fnq  sC  øè ø€ çTÑTàˆØˆá'Ó)¨AÒ-Ù“;ˆDÜ˜$ Ô(Ø#�Øà×$Ñ$ TÔ*ñ (Ó)¨AÓ-ô ˜]Ó+ò 	ˆDÙ�tÕð	ð	%ØÒð Ð'Ü˜MÓ*�Ø˜a’iÙ$›;�DØ˜Q‘J�Eð ˜a“ið ×$Ñ$ \Ô2ä$ ]Ó3ò %�DÙ˜tÕ$ñ%ð (øˆ|Ð'Ü˜MÓ*�Ø˜a’iÙ$›;�DØ˜Q‘J�Eð ˜a“ið ×$Ñ$ \Ô2ä$ ]Ó3ò %�DÙ˜tÕ$ñ%ð (üs0   ƒA
DÁDÁ'B: Á+#DÂ+DÂ:$D
Ã+D
Ä
D)rn  z/Generator[TorchFunctionMode | None, None, None])r   )rj  rk  s   ` rk   Ú&_make_temp_remove_mode_context_managerrl  n  s    ø€ ô ô%ó ð%ð@ Ðrm   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)NrH   )Úis_accessor_nodeTFrž   c              3  ó¢   K  — | ]G  }t        |t        j                  «      r+t        |j                  j	                  d «      t
        «      –— ŒI y­w)rž   N)r    r�  r@  rš   rË   rU   )r~   r*  s     rk   r   z6dispatch_trace.<locals>.impure_pred.<locals>.<genexpr>¯  s:   è ø€ ò àÜ˜a¤§¡Ô)ô ˜1Ÿ6™6Ÿ:™: eÓ,¬l×;ñùs   ‚AA)	Úsymbolic_shapesro  Ú	is_impurer    rš   rË   rU   rÍ  r  )r�  ro  s     rk   Úimpure_predz#dispatch_trace.<locals>.impure_predž  s^   € Ý5ð �;‰;Œ=Øñ ˜AÔØô
 �q—v‘v—z‘z %Ó(¬,Ô7ô ñ àŸ™ôô ð ð rm   r   )Údedupe_symints)r�  úfx.Nodern  r¥   )ÚtraceÚeliminate_dead_codeÚ,torch._inductor.fx_passes.dedupe_symint_usesrt  r    r;   r6  r“   r�  Ú_lazy_graph_moduleÚ_make_graph_moduler#  )r#  r³   Úconcrete_argsr£  rs  rt  rÆ  s          rk   rQ   rQ   •  sq   € ð �L‰L˜˜}Ó-€Eóð8 
×Ñ˜kÔ*ÝKá�5ÔÜ&0°´vÔ&>ˆ4�>‰>×"Ò"ÀDÇMÁM€DÜ× Ñ ×3Ñ3°F·K±KÀÈÓMÐMrm   c                ó€   ‡ ‡‡‡— t        j                  ‰«      \  Š}t        j                  ‰ «      dˆ ˆˆˆfd„«       }|S )Nc                 ó  •— t        j                  | «      \  }}t        |«      t        ‰«      k7  r#t        dt        |«      › dt        ‰«      › �«      ‚t	        «       5 }t        |t        «      st        dt        |«      › �«      ‚t        ‰|d ‰¬«       d d d «       t        ‰dd«      rEt        ‰| «      D ��cg c]-  \  }}t        |t        j                  j                  «      r|n|‘Œ/ c}}Šdˆfd„} ‰
‰Ž }t        j                  t        ||«      }t        j                  t         ˆfd„|«      }t        j                  t"        ˆfd	„|«      }dˆfd
„}	t        j                  t$        |	|«      }|S # 1 sw Y   ŒàxY wc c}}w )NzExpected same length: z vs r÷   rË  Úproxy_module_inputsFc                ó"   •— t        | ‰| d„ «      S )Nc                ó   — | j                   S rh   r{  rî   s    rk   rl   zJwrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot.<locals>.<lambda>ß  s
   € ¸!¿'¹'€ rm   rš  ©r  r³   s    €rk   Úget_tensor_proxy_slotz8wrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slotÞ  s   ø€ Ü! ! V¨QÑ0AÓBÐBrm   c                ó"   •— t        | ‰| d„ «      S )Nc                ó   — | S rh   r}   rî   s    rk   rl   z=wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>ä  s   € Èq€ rm   rš  r�  s    €rk   rl   z+wrap_key.<locals>.wrapped.<locals>.<lambda>ä  s   ø€ ¬°q¸&À!Á[Ó(Q€ rm   c                ó"   •— t        | ‰| d„ «      S )Nc                ó   — | S rh   r}   rî   s    rk   rl   z=wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>ç  s   € È€ rm   rš  r�  s    €rk   rl   z+wrap_key.<locals>.wrapped.<locals>.<lambda>ç  s   ø€ ¤.°°F¸A¹{Ó"K€ rm   c                ó8   •— t        | ‰«      j                  «       S rh   )rÚ   r�  r�  s    €rk   Úget_sym_proxy_slotz5wrap_key.<locals>.wrapped.<locals>.get_sym_proxy_slotê  s   ø€ Ü! ! VÓ,×2Ñ2Ó4Ð4rm   )r  r   rn  zTensor | Proxy)r  r—   rn  r4   )rs   rÌ  rÿ  rŠ   rD  r    rý   rÁ   r‰  r  ÚziprÄ   r!  r;   Útree_map_onlyr   rÃ   r&   rU   )r  Ú_unusedÚflat_proxiesÚ_proxies_specr  r  r+  r‚  rø   rˆ  rT  Úflat_tensorsÚtensorsr³   s             €€€€rk   Úwrappedzwrap_key.<locals>.wrappedÊ  sr  ø€ ô '-×&9Ñ&9¸'Ó&BÑ#ˆ�mÜˆ|Ó¤ LÓ 1Ò1Ü Ø(¬¨\Ó):Ð(;¸4ÄÀLÓ@QÐ?RÐSóð ô )Ó*ð 	X¨aÜ˜aÔ!7Ô8Ü$Ð'LÌTÐRSËWÈIÐ%VÓWÐWÜ˜l¨LÀ4ÐPVÕW÷	Xô
 �6Ð0°%Ô8ô   ¨Ó1÷á�A�qô   ¤5§8¡8§?¡?Ô3‘¸Ñ:óˆGõ
	Cñ �ˆkˆÜ×"Ñ"¤6Ð+@À#ÓFˆÜ×"Ñ"ÜÓQÐSVó
ˆô ×"Ñ"ÜÓKÈSó
ˆõ	5ô ×"Ñ"¤<Ð1CÀSÓIˆØˆ
÷7	Xð 	Xüós   Á7E4Â92F Å4E=)r  rl  r‹  rm  rn  re   )rs   rÌ  r  Úwraps)rT  r�  r³   rá  Ú_tensors_specr�  rŽ  s   ```   @rk   Úwrap_keyr“  Â  s=   û€ ô #)×"5Ñ"5°gÓ">Ñ€L�-ä‡_�_�QÓ÷#ó ð#ðJ €Nrm   ÚORIGINAL_ATEN)rá   z%contextvars.ContextVar[object | None]c              #  ój  K  — t         j                  «       €jt        j                  «       rVt         j	                  | «      }| t        j
                  d<   	 d –— t         j                  |«       d t        j
                  d<   y d –— y # t         j                  |«       d t        j
                  d<   w xY w­w)NÚoriginal_aten)r”  rË   Úfx_tracebackÚhas_preserved_node_metaÚsetÚcurrent_metaÚreset)r'  Útokens     rk   Úset_original_aten_opr�  ù  sŒ   è ø€ ô ×ÑÓÐ"¤|×'KÑ'KÔ'MÜ×!Ñ! $Ó'ˆØ59Œ×!Ñ! /Ñ2ð	>Ûä×Ñ Ô&Ø9=ŒL×%Ñ% oÒ6äøô ×Ñ Ô&Ø9=ŒL×%Ñ% oÒ6üs   ‚AB3ÁB Á.B3Â*B0Â0B3c                  ó4   — e Zd Zdd„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Zy)ÚTorchFunctionMetadataModec                ó   — || _         y rh   r  ©rð  r³   s     rk   rñ  z"TorchFunctionMetadataMode.__init__
  s	   € Øˆ�rm   Nc                ó  — |xs i }|| j                   _        | j                   j                  j                  |d«      dz   | j                   j                  |<   |t        j
                  j                  j                  j                  u rwt        |«      dk(  rit        |d   t        «      rVt        d„ |d   j                  «       D «       «      r3t	        j
                  j                  j                  j                  |i |¤ŽS  ||i |¤ŽS )Nr   rH   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrh   r³  )r~   rt  s     rk   r   z?TorchFunctionMetadataMode.__torch_function__.<locals>.<genexpr>  s   è ø€ ÒH°A”J˜q¤,×/ÑHùr´  )r³   r  r  rË   rÄ   ra  rb  rÑ  rá   rÿ  r    r   rµ  rc  ©rð  r'  Útypesr  rU  s        rk   Ú__torch_function__z,TorchFunctionMetadataMode.__torch_function__  sÌ   € ð ’˜2ˆà(,ˆ�‰Ô%Ø,0¯K©K×,GÑ,G×,KÑ,KÈDÐRSÓ,TÐWXÑ,Xˆ�‰×#Ñ# DÑ)à”E—I‘I—N‘N×'Ñ'×/Ñ/Ñ/Ü�D“	˜Q’Ü˜4 ™7¤FÔ+ÜÑH¸¸a¹¿¹»ÔHÔHä—9‘9—>‘>×*Ñ*×2Ñ2°DÐC¸FÑCÐCÙ�TÐ$˜VÑ$Ð$rm   ©r³   Ú_ProxyTracerrn  ro  ©r}   N©
r'  r*   r¥  ú tuple[torch._C._TensorMeta, ...]r  útuple[object, ...]rU  údict[str, object] | Nonern  rÇ   ©r“   r”   r•   rñ  r¦  r}   rm   rk   rŸ  rŸ  	  sD   „ óð $&Ø+/ð%àð%ð 0ð%ð !ð	%ð
 )ð%ð 
ô%rm   rŸ  c                  ó4   — e Zd Zdd„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Zy)ÚPreDispatchTorchFunctionModec                ó    — || _         g | _        y rh   )r³   Úenter_autocast_nodesr¡  s     rk   rñ  z%PreDispatchTorchFunctionMode.__init__+  s   € ØˆŒð :<ˆÕ!rm   Nc                óX  — |xs i }|t         v �r:|t        j                  j                  j                  u r| j
                  j                  «       }|f}| j                  j                  d||i «      }|t        j                  j                  j                  u r| j
                  j                  |«       |t        j                  j                  t        j                  j                  j                  t        j                  j                  j                  fv rd |j                  d<   |t        j                  j                  u r ||i |¤Ž |S |t        j                  j                  j                   t        j                  j                  j"                  t        j                  j                  j$                  t        j                  j                  j&                  t        j                  j(                  j*                  t        j                  j                  j,                  t        j                  j                  j.                  t        j                  j                  j0                  t        j                  j                  j2                  t        j                  j                  j4                  t        j                  j                  j6                  t        j                  j                  j8                  fv r¥t;        || j                  «      \  }}}| j                  j=                  d|||«      }	 ||i |¤Ž}
|t>        v rBt        j                  jA                  «       5  tC        |
|	d | j                  ¬«       d d d «       |
S tC        |
|	d | j                  ¬«       |
S  ||i |¤ŽS # 1 sw Y   |
S xY w)Nr_  rž   rË  )"r7   rÄ   ÚampÚautocast_modeÚ_exit_autocastr²  Úpopr³   r%  Ú_enter_autocastr   rù   Ú_set_grad_enabledrš   Ú
_functorchÚpredispatchÚ_add_batch_dimÚ_remove_batch_dimÚ_vmap_increment_nestingÚ_vmap_decrement_nestingÚvmapÚlazy_load_decompositionsÚ
_make_dualÚ_unpack_dualÚ_jvp_increment_nestingÚ_jvp_decrement_nestingÚ_unwrap_for_gradÚ_enter_dual_levelÚ_exit_dual_levelrº  r`  Ú_jvp_predispatch_functionsÚ_DisableFuncTorchr‰  )rð  r'  r¥  r  rU  Ú
enter_noder¡   rp   r  Ú	out_proxyrõ   s              rk   r¦  z/PreDispatchTorchFunctionMode.__torch_function__2  sÓ  € ð ’˜2ˆØÔDÒDð
 ”u—y‘y×.Ñ.×=Ñ=Ñ=Ø!×6Ñ6×:Ñ:Ó<�
Ø"�}�Ø—;‘;×*Ñ*¨?¸DÀ$ÈÓKˆDØ”u—y‘y×.Ñ.×>Ñ>Ñ>Ø×)Ñ)×0Ñ0°Ô6ØÜ—‘×*Ñ*Ü—	‘	×'Ñ'×7Ñ7Ü—	‘	×'Ñ'×6Ñ6ðñ ð
 $(�—	‘	˜%Ñ ð ”u—x‘x×1Ñ1Ñ1á�dÐ%˜fÒ%ØˆKð Ü×Ñ×(Ñ(×7Ñ7Ü×Ñ×(Ñ(×:Ñ:Ü×Ñ×(Ñ(×@Ñ@Ü×Ñ×(Ñ(×@Ñ@Ü×Ñ×!Ñ!×:Ñ:Ü×Ñ×(Ñ(×3Ñ3Ü×Ñ×(Ñ(×5Ñ5Ü×Ñ×(Ñ(×?Ñ?Ü×Ñ×(Ñ(×?Ñ?Ü×Ñ×(Ñ(×9Ñ9Ü×Ñ×(Ñ(×:Ñ:Ü×Ñ×(Ñ(×9Ñ9ð
ñ 
ô AÀÀtÇ{Á{ÓS‰MˆAˆw˜ØŸ™×0Ñ0ØØØØó	ˆIñ ˜Ð' Ñ'ˆCð Ô1Ñ1Ü—X‘X×/Ñ/Ó1ñ YÜ% c¨9¸tÈDÏKÉKÕX÷Yð ˆJô " # y¸4ÈÏÉÕTØˆJÙ�TÐ$˜VÑ$Ð$÷Yð ˆJús   ÍNÎN)r§  r©  )
r'  zOpOverload | Callable[..., Any]r¥  r«  r  r¬  rU  r­  rn  rÇ   r®  r}   rm   rk   r°  r°  *  sJ   „ ó<ð $&Ø+/ðC%à-ðC%ð 0ðC%ð !ð	C%ð
 )ðC%ð 
ôC%rm   r°  )Ú_side_effectful_functionsc                  óð   ‡ — 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e	 	 	 	 dd„«       Z	 	 	 	 	 	 	 	 	 	 dd„Zˆ xZS )rý   c                 ó   — yrØ   r}   rï  s    rk   Úenable_tracingz%ProxyTorchDispatchMode.enable_tracingž  ó   € àrm   c                ó¦  •— |r$t         j                  j                  j                  nd }t        ‰	| �  |«       || _        || _        || _        || _	        || _
        t         j                  j                  j                  | _        g | _        |xs i | _        g | _        d| _        t%        «       | _        i | _        ddlm} |j.                  | _        y )Nr   ©Úconfig)rÄ   rù   ÚDispatchKeyÚPreDispatchr  rñ  r³   Útracing_moderá  r¾  rÙ  rû   rü   Ú	_mode_keyÚenter_stackrŒ   Ú_decomposition_table_stackr�  r™  Ú_invoke_subgraph_namesÚ_invoke_subgraph_cacheÚtorch._inductorrÔ  rž  )
rð  r³   r×  rá  r¾  rÙ  rŒ   ÚdkrÔ  r6  s
            €rk   rñ  zProxyTorchDispatchMode.__init__¢  sÈ   ø€ ñ 2>ŒU�X‰X×!Ñ!×-Ò-À4ˆÜ‰Ñ˜ÔØˆŒØ(ˆÔØ(ˆÔØ$8ˆÔ!Ø,HˆÔ)ô Ÿ™×7Ñ7×=Ñ=ˆŒð ACˆÔàÒ% 2ð 	Ô ð
 ð 	Ô'ð #$ˆÔä03³ˆÔ#ð ð 	Ô#õ 	+à-3×-KÑ-KˆÕ$rm   c                óÞ   — t        |«      5  |xs i }|t        j                  j                  k(  r ||i |¤Žcd d d «       S t	        | || j
                  ||«      cd d d «       S # 1 sw Y   y xY wrh   )r�  Úprimr4  rá   rê  rá  r¤  s        rk   Ú__torch_dispatch__z)ProxyTorchDispatchMode.__torch_dispatch__É  sq   € ô " $Ó'ñ 	KØ’\˜rˆFà”t—{‘{×*Ñ*Ò*Ù˜TÐ, VÑ,÷		Kñ 	Kô ˜d D¨$×*;Ñ*;¸TÀ6ÓJ÷	K÷ 	Kò 	Kús   Œ+A#ÁA#Á#A,c                ó°   •— t        t        j                  j                  j                  «      }| j
                  j                  |«       t        ‰| �!  «       S rh   )	r?   rÄ   rù   rû   rü   rÙ  r   r  Ú	__enter__)rð  Úmaybe_prev_proxy_moder6  s     €rk   rã  z ProxyTorchDispatchMode.__enter__Ù  sA   ø€ ä 1´%·(±(×2PÑ2P×2VÑ2VÓ WÐØ×Ñ×ÑÐ 5Ô6Ü‰wÑ Ó"Ð"rm   c                óx   •— t         ‰| �  |||«      }| j                  j                  «       }|�t	        |«       |S rh   )r  Ú__exit__rÙ  r·  r>   )rð  Úexc_typeÚ	exc_valueÚ	tracebackÚbÚmb_previous_proxy_moder6  s         €rk   ræ  zProxyTorchDispatchMode.__exit__ß  sC   ø€ ô ‰GÑ˜X y°)Ó<ˆð "&×!1Ñ!1×!5Ñ!5Ó!7ÐØ!Ð-ÜÐ-Ô.àˆrm   c                 ó   — yrØ   r}   )Úclss    rk   Úis_infra_modez$ProxyTorchDispatchMode.is_infra_modeî  rÑ  rm   c              #  ó   K  — |xs i }| j                   j                  | j                  «       || _        	 |–— | j                   j                  «       | _        y # | j                   j                  «       | _        w xY w­wrh   )rÚ  r   rŒ   r·  )rð  rŒ   rŽ   s      rk   r‹   z,ProxyTorchDispatchMode.enable_decompositionsò  sm   è ø€ ð
 $Ò) rˆØ×'Ñ'×.Ñ.¨t×/GÑ/GÔHØ#(ˆÔ ð	MØŠKà'+×'FÑ'F×'JÑ'JÓ'LˆDÕ$ø t×'FÑ'F×'JÑ'JÓ'LˆDÕ$üs   ‚3A>¶A º A>Á!A;Á;A>c                ó  — |t         j                  u r@t        |d   t        «      r|d   dk(  r|d   S t        |d   t        «      r|d   dk(  r|d   S |rt	        d«      ‚ ||i |¤Ž}t        | j                  |||«       |S )NrH   r   zExpected no keyword arguments)r  Úmulr    r#  rŠ   r(  r³   )rð  r'  r¥  r  rU  rø   s         rk   Ú__sym_dispatch__z'ProxyTorchDispatchMode.__sym_dispatch__ÿ  s‰   € ð ”8—<‘<ÑÜ˜$˜q™'¤3Ô'¨D°©G°qªLØ˜A‘w�Ü˜D ™G¤SÔ)¨d°1©g¸ªlØ˜A‘w�ñ
 Ü Ð!@ÓAÐAÙ�DÐ#˜FÑ#ˆÜ�d—k‘k 4¨¨sÔ3Øˆ
rm   ©rn  r¥   )FFTN)r³   r¨  r×  r`   rá  r¥   r¾  r¥   rÙ  r¥   rŒ   ú.Mapping[OpOverload, Callable[..., Any]] | Nonern  ro  r©  rª  )rn  r   )rç  ztype[BaseException] | Nonerè  zBaseException | Noneré  ztypes.TracebackType | Nonern  zbool | None©rŒ   rô  rn  z>Generator[Mapping[OpOverload, Callable[..., Any]], None, None])
r'  r*   r¥  r«  r  r¬  rU  údict[str, object]rn  rÇ   )r“   r”   r•   ÚpropertyrÐ  rñ  rC   rá  rã  ræ  Úclassmethodrî  r   r‹   rò  rQ  rR  s   @rk   rý   rý   œ  sm  ø„ àòó ðð #Ø%*Ø-1ØNRð%Làð%Lð #ð%Lð ð	%Lð
 #ð%Lð '+ð%Lð Lð%Lð 
õ%LðN ð
 $&Ø+/ðKàðKð 0ðKð !ð	Kð
 )ðKð 
òKó ðKõ#ðà,ðð (ðð .ð	ð
 
õð òó ðð ð
MàKð
Mð 
Hò
Mó ð
Mðàðð 0ðð !ð	ð
 "ðð 
÷rm   c                ój   — t        |t        «      r#t        | t        | |||¬«      }t	        || |«       y y )N)r'  r  rø   )r    rU   rV  Ú_compute_proxyrµ   )r³   r'  r  rø   Úp_out_thunks        rk   r(  r(    s8   € ô �#”|Ô$ÜØ”N F°¸DÀcô
ˆô 	�s˜F KÕ0ð	 %rm   c                ó  ‡ — t        |«      dk(  r2t        |d   t        t        f«      rt        ˆ fd„|d   D «       «      f}nt        ˆ fd„|D «       «      }‰ j	                  d||i «      }t        j                  |‰ «      }t        ||«       |S )NrH   r   c              3  óŠ   •K  — | ]:  }t        |t        «      r$t        |‰«      j                  «       j                  n|–— Œ< y ­wrh   ©r    rU   rÚ   r�  r¡   ©r~   r*  r³   s     €rk   r   z!_compute_proxy.<locals>.<genexpr>-  sE   øè ø€ ò ð ô " !¤\Ô2ô # 1 fÓ-×3Ñ3Ó5×:Ò:àóñùó   ƒA Ac              3  óŠ   •K  — | ]:  }t        |t        «      r$t        |‰«      j                  «       j                  n|–— Œ< y ­wrh   rþ  rÿ  s     €rk   r   z!_compute_proxy.<locals>.<genexpr>7  sE   øè ø€ ò 
ð ô ˜a¤Ô.ô ˜q &Ó)×/Ñ/Ó1×6Ò6àóñ
ùr   r_  )rÿ  r    ri   ro   r%  r�  r4   rO  )r³   r'  r  rø   Ún_argsÚn_outÚp_outs   `      rk   rú  rú  &  s•   ø€ ô
 ˆ4ƒy�A‚~œ* T¨!¡W¬t´U¨mÔ<äó ð ˜a™ôó ð	
‰ô ó 
ð ô
ó 
ˆð ×Ñ˜°°f¸bÓA€EÜ�H‰H�U˜FÓ#€EÜˆU�CÔØ€Lrm   c                  ó€   ‡ — e Zd ZU ded<   ded<   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 )r[   r  rÆ   r  rÌ   r  rÊ   rì  rÍ   r  rÂ   r  rÔ   r  r  r  r  Fr¥   rD  c                ó:   •— t         ‰| �  |«       t        | «       y rh   r  )rð  r£  r6  s     €rk   rñ  z _GraphAppendingTracerEx.__init__U  s   ø€ Ü‰Ñ˜ÔÜ˜TÕ"rm   )r£  zfx.graph.Graphrn  ro  )r“   r”   r•   rœ   rD  rñ  rQ  rR  s   @rk   r[   r[   H  sI   ø… ØDÓDØHÓHð -Ó,Ø!Ó!Ø8Ó8ØBÓBØ(Ó(Ø*Ó*Ø!€O�TÓ!÷#ñ #rm   r[   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 )
rS   c                óÌ   •— t        ‰| �  |fi |¤Ž || _        t        | j                  «      | _        |xs i | _        t        | j                  d| j
                  ¬«      | _        y )Nr]   )r×  rŒ   )r  rñ  Ú	new_graphr[   r³   rŒ   rý   r�   )rð  Úmoduler	  rŒ   rU  r6  s        €rk   rñ  z!DecompositionInterpreter.__init__]  sZ   ø€ ô 	‰Ñ˜Ñ* 6Ò*Ø"ˆŒÜ-¨d¯n©nÓ=ˆŒà#6Ò#<¸"ˆÔ Ü*Ø�K‰KØØ $× 8Ñ 8ô
ˆ�	rm   c                óÎ   •— t         ‰| �  |||«      }t        j                  | j                  j                  |«      | j
                  «      }t        ||d | j
                  ¬«       |S ©NrË  )r  rM  r�  r4   r	  r³   r‰  ©rð  rH  r  rU  rø   r´   r6  s         €rk   rM  z$DecompositionInterpreter.placeholderp  sR   ø€ ô ‰gÑ! &¨$°Ó7ˆÜ—‘˜Ÿ™×3Ñ3°FÓ;¸T¿[¹[ÓIˆÜ˜#˜u¨t¸D¿K¹KÕHàˆ
rm   c                óÎ   •— t         ‰| �  |||«      }t        j                  | j                  j                  |«      | j
                  «      }t        ||d | j
                  ¬«       |S r  )r  r  r�  r4   r	  r³   r‰  r  s         €rk   r  z!DecompositionInterpreter.get_attr}  sR   ø€ ô ‰gÑ˜v t¨VÓ4ˆÜ—‘˜Ÿ™×0Ñ0°Ó8¸$¿+¹+ÓFˆÜ˜#˜u¨t¸D¿K¹KÕHØˆ
rm   c                ó¢   •‡ ‡— t         ‰‰ �  |||«      }dd„Šdˆˆ fd„}‰ j                  j                  t        j                  ||«      «       |S )Nc                ó.   — | j                   j                  S rh   )r´   r¡   rî   s    rk   Úget_proxy_nodez7DecompositionInterpreter.output.<locals>.get_proxy_node“  s   € Ø—7‘7—<‘<Ðrm   c                ó4   •— t        | ‰j                  | ‰«      S rh   )rÚ   r³   )r‚  r  rð  s    €€rk   Úunwrapz/DecompositionInterpreter.output.<locals>.unwrap–  s   ø€ Ü! ! T§[¡[°!°^ÓDÐDrm   )rv   r¯   rn  rN  )r‚  r   rn  zTensor | fx.Node)r  r=  r	  rs   Útree_map)rð  rH  r  rU  rø   r  r  r6  s   `     @€rk   r=  zDecompositionInterpreter.output‹  sF   ú€ ô ‰g‰n˜V T¨6Ó2ˆó	 ö	Eð 	�‰×ÑœfŸo™o¨f°cÓ:Ô;Øˆ
rm   c                óf   •— | j                   5  t        ‰| �  |i |¤Žcd d d «       S # 1 sw Y   y xY wrh   )r�   r  Úrun)rð  r  rU  r6  s      €rk   r  zDecompositionInterpreter.runœ  s2   ø€ ð �Y‰Yñ 	0Ü‘7‘; Ð/¨Ñ/÷	0÷ 	0ò 	0ús   Ž'§0rh   )
r
  úfx.GraphModuler	  úfx.GraphrŒ   rô  rU  rÇ   rn  ro  )rH  rC  r  r¬  rU  rö  rn  rÇ   )r  rÇ   rU  rÇ   rn  rÇ   )	r“   r”   r•   rñ  rM  r  r=  r  rQ  rR  s   @rk   rS   rS   \  sË   ø„ ð
 OSð	
àð
ð ð
ð Lð	
ð
 ð
ð 
õ
ð&
àð
ð !ð
ð "ð	
ð
 
õ
ð	àð	ð !ð	ð "ð		ð
 
õ	ðàðð !ðð "ð	ð
 
õ÷"0ñ 0rm   rS   c                  óf   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 dˆ fd„Ze	 	 	 	 	 	 	 	 	 	 dd„«       Zdˆ fd„Zˆ xZS )Ú_SelectiveDecomposeInterpreterc                óB   •— t        ‰| �  |fi |¤Ž || _        || _        y)z�
        For all nodes in `module`, selectively decompose if is `should_decompose`,
        following the given `decomposition_table`.
        N)r  rñ  Úshould_decomposerŒ   )rð  r
  r  rŒ   rU  r6  s        €rk   rñ  z'_SelectiveDecomposeInterpreter.__init__¤  s'   ø€ ô 	‰Ñ˜Ñ* 6Ò*Ø 0ˆÔØ#6ˆÕ rm   c                ó|  — | j                   j                  D ]–  }|j                  dk(  sŒt        |j                  t
        «      sŒ.g }|j                  D ]H  }t        |t        j                  «      rt        j                  |||fi |¤Ž}n|}|j                  |«       ŒJ t        |«      |_        Œ˜ t        | ||fi |¤ŽS )aâ  
        Recursively wrap gm and its sub graph modules. Specifically, HOP takes
        sub graph module as args. We may not want to decompose all nodes within
        these sub graph modules. So we also need to wrap these sub graph modules.
        As a result:
        - if should_decompose(hop) is True, we decompose all nodes within the hop.
        - if should_decompose(hop) is False, we check each node within the hop
            and decide whether decompose or not.
        r_  )r£  r¤  r   r    rH  r)   r  r�  r3   r  Úrecursive_wrapr   ro   )Úgmr  rŒ   rU  r¡   Únew_argsr|   Únew_args           rk   r  z-_SelectiveDecomposeInterpreter.recursive_wrap³  sÁ   € ð  —H‘H—N‘Nò 	,ˆDØ�w‰w˜/Ó)¬jØ—‘Ô0õ/ð �ØŸ9™9ò -�CÜ! #¤r§~¡~Ô6Ü"@×"OÑ"OØÐ!1Ð3Fñ#ØJPñ#™ð #&˜Ø—O‘O GÕ,ð-ô " (›O�•	ð	,ô .ØÐ Ð"5ñ
Ø9?ñ
ð 	
rm   c                óÀ   •— | j                  |«      r/t        | j                  «      5  t        ‰| �  |«      }d d d «       |S t        ‰| �  |«      }|S # 1 sw Y   S xY wrh   )r  r�   rŒ   r  Úrun_node)rð  r�  r2  r6  s      €rk   r#  z'_SelectiveDecomposeInterpreter.run_nodeÖ  sb   ø€ Ø× Ñ  Ô#Ü˜4×3Ñ3Ó4ñ -Ü™Ñ)¨!Ó,�÷-ð ˆô ‘WÑ% aÓ(ˆFØˆ÷	-ð ˆús   ¨AÁA)
r
  r  r  úCallable[[fx.Node], bool]rŒ   rô  rU  rÇ   rn  ro  )
r  r  r  r$  rŒ   rô  rU  rÇ   rn  r  )r�  ru  rn  r   )r“   r”   r•   rñ  Ústaticmethodr  r#  rQ  rR  s   @rk   r  r  £  s‡   ø„ ð7àð7ð 4ð7ð Lð	7ð
 ð7ð 
õ7ð ð 
Øð 
à3ð 
ð Lð 
ð ð	 
ð
 
(ò 
ó ð 
÷Dñ rm   r  c               óR   ‡ ‡‡‡— |r
dˆˆˆ ˆfd„}ndˆˆ ˆfd„} t        |i ¬«      ‰Ž S )zARetrace a joint graph module and selectively apply decomposition.c                óJ   •— t        j                  ‰‰‰«      j                  ‰Ž S rh   ©r  r  r  )ÚprimalsÚtangentsr  ÚdecompositionÚjoint_gmr  s     €€€€rk   Úwrap_fnz$selective_decompose.<locals>.wrap_fnì  ó*   ø€ Ü1×@Ñ@ØÐ*¨Móç‰c�4ðð rm   c                 óJ   •— t        j                  ‰‰‰«      j                  | Ž S rh   r(  )r  r+  r,  r  s    €€€rk   r-  z$selective_decompose.<locals>.wrap_fnò  r.  rm   )rŒ   )r)  ú	list[Any]r*  r0  rn  r   ©r  r   rn  r   )rR   )r,  r+  r  Útrace_joint_graphr  r-  s   ``` ` rk   rT   rT   ß  s-   û€ ñ ÷	ñ 	÷	ð
 4Œ7�7°Ô3°TÐ:Ð:rm   c                óP   ‡ ‡— t        j                  ||f«      \  }Šdˆ ˆfd„}||fS )Nc                óF   •— t        j                  | ‰«      \  }} ‰|i |¤ŽS rh   )rs   rØ  )Ú	flat_argsÚfn_argsÚ	fn_kwargsr'  râ  s      €€rk   r�  z-wrapper_and_args_for_make_fx.<locals>.wrapped	  s*   ø€ Ü#×2Ñ2°9¸dÓCÑˆ�Ù�WÐ* 	Ñ*Ð*rm   )r5  zlist[object]rn  re   )rs   rÌ  )r'  r  rU  r5  r�  râ  s   `    @rk   Úwrapper_and_args_for_make_fxr8  ú  s/   ù€ ô
 ×)Ñ)¨4°¨.Ó9�O€Iˆtö+ð �IÐÐrm   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    rk   Údisable_autocast_cacher>  	  sF   è ø€ ä×/Ñ/Ó1€IÜ	×$Ñ$ UÔ+ð4Ûä×(Ñ(¨Õ3øŒ×(Ñ(¨Õ3üs   ‚*A!­A ±A!ÁAÁA!c                  ó   — e Zd Zy)Ú#_ModuleNotInstalledAsSubmoduleErrorNr’   r}   rm   rk   r@  r@  	  r–   rm   r@  c                  ó   — e Zd Zdd„Zy)Ú
_AttrProxyc                 ó   — y rh   r}   )rð  ÚbaseÚpaths      rk   Úreset_proxy_mappingz_AttrProxy.reset_proxy_mapping	  s   € Ørm   N)rD  r;   rE  rC  rn  ro  )r“   r”   r•   rF  r}   rm   rk   rB  rB  	  s   „ ôrm   rB  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        j                  j                   | _        d| _        || _        d| _        i | _	        | j                  j                  d¬«      D ]N  \  }}|| j                  v r,t        j                  d| j                  |   |«       d| _        Œ@|| j                  |<   ŒP t        «       | _        t        «       | _        t        «       | _        d| _        t%        t&        «      | _        | j                  j                  d¬«      D ],  \  }}| j(                  t+        |«         j-                  |«       Œ. | Š G ˆˆfd„dt.        «      Š‰| _        y )NTF)Úremove_duplicatez<Shared module found between %s and %s, AttrProxy is enabled.r   c                  óf   •‡ — e Zd Zdˆf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                óþ  •— t        |t        «      r|j                  «       }t        |t        «      st	        dt        |«      › �«      ‚t        |j                  j                  | j                  |j                  fi «      | _        |j                  | _        |j                  j                  | j                  _	        |j                  j                  | j                  _
        |‰j                  | <   |‰j                  | <   y )NúExpected Module, got )r    rB  Úget_baser;   rŠ   rÁ   r6  r“   Ú__dict__r”   r•   Úproxy_pathsÚproxy_modules)rð  rD  rE  r³   s      €rk   rñ  z7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__P	  sÂ   ø€ Ü˜d¤JÔ/ØŸ=™=›?�Dä! $¬Ô/Ü(Ð+@ÄÀdÃÀÐ)MÓNÐNô "&Ø—N‘N×+Ñ+Ø—^‘^ T§^¡^Ð4Øó"�”ð
 !%§¡�”Ø,0¯N©N×,EÑ,E�—‘Ô)Ø.2¯n©n×.IÑ.I�—‘Ô+ð ,0�×"Ñ" 4Ñ(Ø-1�×$Ñ$ TÒ*rm   c                óÌ   •— t        | t        «      st        dt        | «      › �«      ‚t        ‰| �  |«      }t        |t        «      s|S  ‰|‰j                  |    dz   |z   «      S )NrN  ú.)r    r;   rŠ   rÁ   r  Ú__getattr__rQ  )rð  rÆ  r  Ú	AttrProxyr6  r³   s      €€€rk   rU  z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__h	  sf   ø€ Ü! $¬Ô/Ü(Ð+@ÄÀdÃÀÐ)MÓNÐNô !™7Ñ.¨tÓ4�Ü! (¬FÔ3Ø#�Oá  ¨6×+=Ñ+=¸dÑ+CÀcÑ+IÈDÑ+PÓQÐQrm   c                ó"   •— ‰j                   |    S rh   )rR  r¡  s    €rk   rO  z7_ModuleStackTracer.__init__.<locals>.AttrProxy.get_baset	  s   ø€ Ø×+Ñ+¨DÑ1Ð1rm   c                ó^  •— t        |t        «      �rt        | t        j                  j                  «      rgt        j                  j	                  t        t        | j                  j                  «       «      |   «      «      } ‰|‰j                  |    › d|› �«      S t        | t        j                  j                  «      r^t        j                  j                  t        | j                  j                  «       «      |   «      } ‰|‰j                  |    › d|› �«      S t        ‰| �5  |«      S )NrT  )r    ÚslicerÄ   r!  Ú
Sequentialr   ri   Ú_modulesr  rQ  Ú
ModuleListÚvaluesr  r÷  )rð  r~  rõ   rV  r6  r³   s      €€€rk   r÷  z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getitem__w	  sí   ø€ Ü˜c¤5Õ)Ü! $¬¯©×(;Ñ(;Ô<ä#Ÿh™h×1Ñ1Ü'¬¨T¯]©]×-@Ñ-@Ó-BÓ(CÀCÑ(HÓIó˜ñ  )¨°×1CÑ1CÀDÑ1IÐ0JÈ!ÈCÈ5Ð.QÓRÐRÜ# D¬%¯(©(×*=Ñ*=Ô>ä#Ÿh™h×1Ñ1´$°t·}±}×7KÑ7KÓ7MÓ2NÈsÑ2SÓT˜á(¨°×1CÑ1CÀDÑ1IÐ0JÈ!ÈCÈ5Ð.QÓRÐRä‘wÑ*¨3Ó/Ð/rm   c                óD  •— d| j                   vrt        d«      ‚| j                   d   }t        |t        «      st        dt	        |«      › �«      ‚|j                  «       D ��ci c]/  \  }}||�% ‰|‰j                  |    dz   t        |«      z   «      n|“Œ1 c}}S c c}}w )Nr[  z_modules not in __dict__zExpected dict, got rT  )rP  rŠ   r    r8  rÁ   r  rQ  rC  )rð  Ú
submodulesr„  r¦   rV  r³   s       €€rk   r[  z7_ModuleStackTracer.__init__.<locals>.AttrProxy._modulesˆ	  s°   ø€ à T§]¡]Ñ2Ü(Ð)CÓDÐDØ!Ÿ]™]¨:Ñ6�
Ü! *¬dÔ3Ü(Ð+>¼tÀJÓ?OÐ>PÐ)QÓRÐRð '1×&6Ñ&6Ó&8÷ñ #˜˜Uð à Ð,ñ " %¨×);Ñ);¸DÑ)AÀCÑ)GÌ#ÈcË(Ñ)RÔSà"ñ#óð ùó s   Á$4B)rD  zModule | _AttrProxyrE  rC  rn  ro  )rÆ  rC  rn  rV  )rn  r;   )r~  zint | slicern  rV  )rn  zdict[str, AttrProxy])
r“   r”   r•   rñ  rU  rO  r÷  r÷  r[  rQ  )r6  rV  r³   s   @€€rk   rV  rL  O	  s,   ù„ õ2÷0
Rõ2÷0ð" õó ôrm   rV  )r  rñ  r�  rÔ  Údo_not_emit_stack_tracesÚrecord_stack_tracesÚ!_record_forward_stack_traces_onlyÚ
scope_rootÚenable_attr_proxyÚsubmodule_pathsÚnamed_modulesr¾   Úinfor   rQ  Úattr_proxy_maprR  Úcounterr   ri   Úmodule_id_cacherÀ   r   rB  Ú
proxy_type)rð  rc  rÆ  r  ÚmodrV  r³   r6  s        @@€rk   rñ  z_ModuleStackTracer.__init__/	  sI  ú€ Ü‰ÑÔÜ')§y¡y×'IÑ'IÐ#IˆÔ Ø15ˆÔ.Ø$ˆŒØ!&ˆÔØ!ˆÔØ—‘×4Ñ4ÀeÐ4ÓLò 		/‰GˆD�!Ø�D×(Ñ(Ñ(Ü—‘ØRØ×(Ñ(¨Ñ+Øôð
 *.�Õ&à*.�×$Ñ$ QÒ'ð		/ô @QÓ?RˆÔÜEVÓEXˆÔÜDUÓDWˆÔØˆŒä*¬4Ó0ˆÔØŸ™×6Ñ6ÈÐ6ÓNò 	7‰IˆD�#Ø× Ñ ¤ C£Ñ)×0Ñ0°Õ6ð	7ð ˆ÷H	œ
ô H	ðT $ˆ�rm   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)rc  r    rB  rQ  r5   Úpath_of_moduleÚ	NameErrorr@  )rð  rl  r‚  s      rk   ro  z!_ModuleStackTracer.path_of_module›	  s^   € ð
 �$—/‘/Ñ!Øä�cœ:Ô&Ø×#Ñ# CÑ(Ð(ð	=Ü×(Ñ(¨¨sÓ3Ð3øÜò 	=Ü5¸1Ð<ûð	=ús   °A Á	AÁAÁAc                ón  •— t        |t        «      r&t        |t        j                  «      s| j                  st
        ‰| �  |||«      S t        |t        «      r|S || j                  vr | j                  ||«      | j                  |<   n| j                  |   j                  ||«       | j                  |   S rh   )r    r;   r�  r3   rd  r  r  rB  rh  rk  rF  )rð  r  r  r  r6  s       €rk   r  z_ModuleStackTracer.getattr«	  s    ø€ ô ˜8¤VÔ,Ü˜(¤B§N¡NÔ3Ø×)Ò)ä‘7‘? 4¨Ð3HÓIÐIÜ�h¤
Ô+ØˆOð ˜4×.Ñ.Ñ.Ø,0¯O©O¸HÀdÓ,KˆD×Ñ Ò)à×Ñ Ñ)×=Ñ=¸hÈÔMØ×"Ñ" 8Ñ,Ð,rm   c                óú  •— t         ‰| �  ||«      }t        j                  «        | j                  j                  «       D ]+  \  }}|j                  j                  t        t        |«      <   Œ- g }| j                  j                  «       D ]'  \  }}|| j                  v sŒ|j                  ||f«       Œ) dd„}	|D ]>  \  }
} |	| j                  |
«       | j                  |   }t        || j                  |
«       Œ@ |S )Nc                óf  — |j                  d«      }|d d |d   }}t        | t        «      st        dt	        | «      › �«      ‚| }|D ]4  }t        ||«      s yt        ||«      }t        |t        t        f«      rŒ4 y t        ||«      syt        t        ||«      t        «      syt        ||«       y)NrT  éÿÿÿÿrN  FT)	Úsplitr    r;   rŠ   rÁ   rŸ   r  rB  Údelattr)r²   rH  ÚatomsrE  Útarget_submodrl  rÔ  s          rk   Ú_delete_proxy_attrz4_ModuleStackTracer.trace.<locals>._delete_proxy_attrÞ	  s¹   € ð —L‘L Ó%ˆEØ"'¨¨ *¨e°B©i�-ˆDÜ˜c¤6Ô*Ü$Ð'<¼TÀ#»Y¸KÐ%HÓIÐIØˆCð ò !�Ü˜s DÔ)Ù ä˜c 4Ó(�ä! #¬
´FÐ';Õ<Ù ð!ô ˜3 Ô.Øô œg c¨=Ó9¼:ÔFØä�C˜Ô'Ørm   )r²   r;   rH  rC  rn  r¥   )r  rv  r§   ÚclearrÂ   r  r´   r¡   rÀ   r#  rf  rR  r   r6   )rð  r#  r{  rõ   r„  rž   Ú!proxy_module_names_to_be_replacedrÆ  r
  ry  Úproxy_module_nameÚproxy_moduleÚactual_moduler6  s                €rk   rv  z_ModuleStackTracer.trace¾	  s   ø€ ô ‰g‰m˜D -Ó0ˆô 	0×5Ñ5Ô7à×+Ñ+×1Ñ1Ó3ò 	N‰HˆC�Ø?B¿y¹y¿~¹~Ô3´B°s³GÒ<ð	Nð KMÐ)Ø ŸI™I×3Ñ3Ó5ò 	I‰LˆD�&Ø˜×+Ñ+Ò+Ø1×8Ñ8¸$À¸ÕHð	Ió	ð< 0Qò 	FÑ+Ð˜|Ù˜tŸy™yÐ*;Ô<Ø ×.Ñ.¨|Ñ<ˆMÜ˜¨¯	©	Ð3DÕEð	Fð
 ˆ
rm   c                óÐ   — ddl m} t        ||t        f«      r ||i |¤ŽS 	 t	        j
                  | ||||«      S # t        $ r! t        j                  d|«        ||i |¤ŽcY S 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 %s. 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.)	Útorch._dynamor€  r    r3   r5   r  r@  r¾   r¿   )rð  r  r  r  rU  r€  s         rk   r  z_ModuleStackTracer.call_module
  s~   € õ 	2ô �a˜/¬;Ð7Ô8Ù˜DÐ+ FÑ+Ð+ð
	,Ü×%Ñ% d¨A¨w¸¸fÓEÐEøÜ2ò 	,Ü�I‰IðJð ôñ ˜DÐ+ FÑ+Ò+ð	,ús   ¢; »'A%Á$A%c                 ó   — yr:  r}   )rð  r  Úmodule_qualified_names      rk   Úis_leaf_modulez!_ModuleStackTracer.is_leaf_module%
  s   € Ørm   c                óŠ  •— t        ‰| �  |i |¤Ž}|j                  dvr©|j                  j	                  d«      €'| j
                  j                  «       |j                  d<   |j                  d   j                  «       D ]G  \  }\  }}t        |t        «      sŒ||j                  dz   |j                  z   f|j                  d   |<   ŒI |j                  dk(  rl| j                  x}�^d|j                  vrP|j                  › d| j                  |   › �|j                  j                  › d|j                  › �f|j                  d<   |S )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.
        r<  Únn_module_stackrT  r_  Útorch_fnrp   )r  r%  r   rš   rË   Úmodule_stackÚcopyr  r    rÁ   r”   r•   r  r“   r  r6  )	rð  r  rU  r¡   r„  ÚfqnÚmod_clsr‡  r6  s	           €rk   r%  z_ModuleStackTracer.create_node(
  sH  ø€ ô ‰wÑ" DÐ3¨FÑ3ˆð �7‰7Ð3Ñ3Ø�y‰y�}‰}Ð.Ó/Ð7Ø/3×/@Ñ/@×/EÑ/EÓ/G�—	‘	Ð+Ñ,à'+§y¡yÐ1BÑ'C×'IÑ'IÓ'Kò Ñ#�‘^�c˜7Ü˜g¤tÕ,àØ×*Ñ*¨SÑ0°7×3GÑ3GÑGð9�D—I‘IÐ/Ñ0°Ò5ðð �G‰G�Ò&Ø!×3Ñ3Ð3�Ð@Ø $§)¡)Ñ+ð ×$Ñ$Ð% Q t×';Ñ';¸HÑ'EÐ&FÐGà×%Ñ%×.Ñ.Ð/¨q°×1BÑ1BÐ0CÐDð	%ˆD�I‰I�jÑ!ð ˆrm   )rc  r3   rn  ro  )rl  r;   rn  rC  rM  )r#  úModule | Callable[..., Any]r{  r­  rn  r  )
r  r;   r  rL  r  r¬  rU  rö  rn  ro  )r  r;   rƒ  rC  rn  r¥   )r  rÇ   rU  rÇ   rn  rN  )r“   r”   r•   r  rñ  ro  r  rv  r  r„  r%  rQ  rR  s   @rk   rH  rH  	  s    ø„ ñõ$j$óX=ð -Øð-Ø#)ð-ØBRð-à	õ-ð&CØ/ðCØ@XðCà	õCðJ ,àð ,ð $ð ,ð !ð	 ,ð
 "ð ,ð 
ó ,óD÷#ñ #rm   rH  c                  ó  — e Zd Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 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dd„Z	 	 d	 	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 	 	 dd„Zy)Ú_MakefxTracerNc                ó   — t        |xs i «      | _        | j                  j                  t        j                  j
                  j                  j                  t        j                  j                  j                  «       || _
        || _        || _        || _        || _        || _        d | _        t#        «       | _        t#        «       | _        d | _        t#        «       | _        t#        «       | _        || _        |	| _        |
| _        || _        y rh   )r8  rŒ   Ú
setdefaultrÄ   ra  rb  rh  rá   Ú_decompÚdecompositionsr×  Ú_allow_non_fake_inputsrá  Úrecord_module_stackr¾  rÙ  r@  r   rJ  Úproxy_function_modeÚ	fx_tracerÚpython_dispatcher_modeÚtorch_fn_metadata_modera  Úparent_tracerr~  Ú_disable_torch_fn_metadata_mode)rð  rŒ   r×  r“  rá  r”  r¾  rÙ  ra  r™  r~  rš  s               rk   rñ  z_MakefxTracer.__init__O
  sï   € ô  JNØÒ% 2óJ
ˆÔ ð 	× Ñ ×+Ñ+Ü�I‰I�N‰N×$Ñ$×,Ñ,¬e¯m©m×.JÑ.J×.TÑ.Tô	
ð +7ˆÔØ,BˆÔ#Ø".ˆÔØ)<ˆÔ Ø*>ˆÔ!Ø2NˆÔ)ð 8<ˆÔÜFQÃmˆŒä‹Mð 	Ô ð 26ˆŒÜ?J»}ˆÔ#ä‹Mð 	Ô#ð $7ˆÔ Ø3@ˆÔØ#6ˆÔ Ø/NˆÕ,rm   c                óŠ   — | j                   | j                  | j                  | j                  | j                  | j
                  gS rh   ©r@  rJ  r•  r–  r—  r˜  rï  s    rk   Ú_checkpoint_modesz_MakefxTracer._checkpoint_modes
  s>   € à×!Ñ!Ø�O‰OØ×$Ñ$Ø�N‰NØ×'Ñ'Ø×'Ñ'ð
ð 	
rm   c                óX   — || _         || _        || _        || _        || _        || _        y rh   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          rk   Ú_restore_modesz_MakefxTracer._restore_modes‰
  s2   € ð !6ˆÔØ)ˆŒØ#;ˆÔ Ø'ˆŒØ&AˆÔ#Ø&AˆÕ#rm   c              #  óÄ  K  — | j                  «       }	 ddlm} t        |d«      r)| j                  r|j
                  }t        |«      | _        nnt        «       | _        | j                  xr t        j                  j                   | j                  _	        | j                  j                  rd| j                  _        | 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(  r�dd l}|j                   j"                  j%                  |«      }|€C |«       }	dd lmc m} |j+                  d¬«      5  t-        d| j.                  |	¬«      }d d d «       |j2                  €t5        d«      ‚|| _        n'| j                  dk(  st5        d| j                  › �«      ‚| j7                  | j                  «       d –—  | j8                  |Ž  y # 1 sw Y   �ŒxY w# 1 sw Y   Œ‹xY w#  | j8                  |Ž  w xY w­w)NrH   )ÚShapeEnvÚ	_orig_modTr^   r   F)Ú(fake_tensor_allow_unsafe_data_ptr_access)r3  Úallow_non_fake_inputsÚ	shape_envÚstatic_shapesr_   )r3  rª  r«  ú2shape_env should be set if tracing with 'symbolic'r]   zUnexpected tracing type: )r�  rq  r§  rŸ   r”  r¨  rH  r–  rP   ra  r�  rÔ  r`  rb  r×  r�  Ú_dynamor  r2  Útorch._functorch.configrº  Úpatchr-   r“  r@  r«  rŠ   Ú_construct_modes_with_fx_tracerr¥  )
rð  rT  r  Ú
prev_modesr§  rc  rÄ   r@  Ú_configr«  s
             rk   Ú_init_modes_from_inputsz%_MakefxTracer._init_modes_from_inputs™
  s#  è ø€ ð ×+Ñ+Ó-ˆ
ð<	-å1ä�q˜+Ô&¨4×+CÒ+CØŸ[™[�
ô "4°JÓ!?�•ä!0Ó!2�”à×,Ñ,ÒW´R·Y±Y×5WÑ5WÐ1Wð —‘Ô2ð —>‘>×5Ò5ØGK�D—N‘NÔDà× Ñ  FÒ*Û$à#(§=¡=×#6Ñ#6×#GÑ#GÈÓ#MÐ Ø#Ð+ß=Ð=à Ÿ™ÐPU˜ÓVñ Ü+9Ø37Ø26×2MÑ2MÙ&.£jØ*.ô	,Ð(÷ð )9�Õ%Ø×"Ñ" jÒ0Û$à#(§=¡=×#6Ñ#6×#GÑ#GÈÓ#MÐ Ø#Ð+Ù (£
�Iß=Ð=à Ÿ™ÐPU˜ÓVñ Ü+9Ø38Ø26×2MÑ2MØ&/ô,Ð(÷ð $×-Ñ-Ð5Ü(ØLóð ð )9�Õ%à×(Ñ(¨FÒ2Ü(Ø3°D×4EÑ4EÐ3FÐGóð ð ×0Ñ0°·±Ô@ÛàˆD×Ñ Ò,÷Iñ ú÷ ð ûð(  ˆD×Ñ Ò,üsO   ‚I ”C>I ÄH3Ä1A,I ÆI Æ6A-I È#I È3H=È8I É I	ÉI ÉIÉI c                óz  — t        || j                  | j                  | j                  | j                  | j
                  ¬«      | _        | j                  rt        |«      | _        | j                  dk(  s| j                  rt        «       | _
        | j                  st        |«      | _        | j                  |_        y )N)rŒ   rá  r¾  rÙ  r_   )rý   r×  rŒ   rá  r¾  rÙ  rJ  r°  r•  r    r—  rš  rŸ  r˜  r~  )rð  r–  s     rk   r±  z-_MakefxTracer._construct_modes_with_fx_tracerÜ
  s�   € Ü0ØØ×ÑØ $× 8Ñ 8Ø×*Ñ*Ø!%×!:Ñ!:Ø)-×)JÑ)Jô
ˆŒð ×ÒÜ'CÀIÓ'NˆDÔ$ð ×Ñ 
Ò*¨d×.?Ò.?Ü*BÓ*DˆDÔ'à×3Ò3Ü*CÀIÓ*NˆDÔ'Ø(,×(@Ñ(@ˆ	Õ%rm   c              #  ó8  K  — | j                  «       }	 |j                  | _        dd„}|j                  €t        d«      ‚ ||j                  «      | _        | j	                  | j                  «       d –—  | j
                  |Ž  y #  | j
                  |Ž  w xY w­w)Nc                ó´   — t        | «      t        u r
t        «       S t        | «      t        u rt        | j                  «      S t	        dt        | «      › d�«      ‚)NzUnexpected tracer type: rT  )rÁ   rP   rH  rc  rò   ©r™  s    rk   Ú_create_sub_fx_tracerzD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracerý
  sV   € Ü˜Ó&¬/Ñ9Ü*Ó,Ð,Ü˜-Ó(Ô,>Ñ>Ü-¨m×.FÑ.FÓGÐGä&Ø2´4¸Ó3FÐ2GÀqÐIóð rm   z*parent_tracer.fx_tracer should not be None)r™  r¨  rn  rP   )r�  r@  r–  rŠ   r±  r¥  )rð  r™  r²  r¹  s       rk   Ú_init_modes_from_parentz%_MakefxTracer._init_modes_from_parentò
  s�   è ø€ ð ×+Ñ+Ó-ˆ
ð	-Ø$1×$BÑ$BˆDÔ!óð ×&Ñ&Ð.Ü$Ð%QÓRÐRÙ2°=×3JÑ3JÓKˆDŒNØ×0Ñ0°·±Ô@ÛàˆD×Ñ Ò,øÐˆD×Ñ Ò,üs   ‚B”A"B Á6BÂBÂBc                óf   ‡ ‡— ‰ j                   dk(  r|S dŠdˆˆ fd„}t        j                  ||«      S )Nr]   r   c                óö  •— ddl m} ‰j                  €t        d«      ‚ |d‰› �«      }t	        | t
        «      r"‰dz  Š‰j                  j                  | |¬«      S t        | «      t        u r~‰j                  dk(  ro‰j                  j                  €t        d«      ‚‰j                  j                  j                  ‰j                  j                  j                  | |d ¬	«      | |¬
«      S t	        | t        j                  «      st        | «      rJt!        t        | «      «      r| S t        j"                  j$                  j'                  ‰j                  | «      S t	        | t(        «      rt        d| › d�«      ‚| S )Nr   )ÚConstantSourceú#fake_tensor_mode should not be NoneÚinputrH   )Úsourcer_   r­  )Úpositive)ÚhintrÀ  zScriptObject z. has been fakified. Cannot wrap_fake it again.)Útorch._dynamo.sourcer½  r@  rŠ   r    r   Úfrom_tensorrÁ   r#  r×  r«  Úcreate_symintnodeÚcreate_symbolrÄ   rÅ   r$   r%   Ú_libraryÚfake_class_registryÚmaybe_to_fake_objr!   )rv   r½  rÀ  Ú	arg_countrð  s      €€rk   Úinner_wrap_fakez<_MakefxTracer._convert_args_to_fake.<locals>.inner_wrap_fake  su  ø€ õ <à×$Ñ$Ð,Ü$Ð%JÓKÐKÙ# e¨I¨;Ð$7Ó8ˆFÜ˜!œVÔ$Ø˜Q‘�	Ø×,Ñ,×8Ñ8¸À6Ð8ÓJÐJä�a“œC‘ D×$5Ñ$5¸Ò$CØ×(Ñ(×2Ñ2Ð:Ü(ØLóð ð ×,Ñ,×6Ñ6×HÑHØ×)Ñ)×3Ñ3×AÑAØ˜6¨Dð Bó ð Ø!ð Ió ð ô ˜Aœu×1Ñ1Ô2´oÀaÔ6HÜ'Ü˜“Gôð �HÜ—~‘~×9Ñ9×KÑKØ×)Ñ)¨1óð ô ˜!Ô-Ô.Ü$Ø# A 3Ð&TÐUóð ð ˆHrm   )rv   rÇ   rn  rÇ   )r×  rs   r  )rð  r  rË  rÊ  s   `  @rk   Ú_convert_args_to_fakez#_MakefxTracer._convert_args_to_fake  s4   ù€ Ø×Ñ Ò&ØˆKàˆ	ö(	ôT �‰˜°Ó5Ð5rm   c           	     ó€  ‡ ‡
— dd l Š
t        j                  ˆ
fd„|«      }‰ j                  |«      }|}t	        t        j                  |«      d«      r:t        j                  |«      j                  j                  t
        j                  z  rt        |t        |«      «      }t        j                  t        ‰ j                  «      }t!        «       5 }‰ j"                  r|j%                  ‰ j"                  «       |j%                  ‰ j&                  «       |j%                  ‰ j(                  «       |j%                  ‰ j*                  «       |j%                  |«       |j%                  t-        «       «       |j%                  t/        ‰ «      «       ‰ j0                  €t3        d«      ‚	 t5        t7        ||‰ j0                  ‰ j8                  «      ‰ j0                  t;        |«      ¬«      }	 d d d «       ‰ jA                  «       rS‰
jB                  jE                  |«      x}r6|jF                  �*dd
l$m%}	  |	|jF                  d«       |jM                  «        ‰ jN                  dk(  r2‰ j"                  €t3        d«      ‚‰ j"                  jF                  _#        S # t<        $ r t?        dd„ ˆ fd„¬	«       ‚ w xY w# 1 sw Y   ŒÏxY w)Nr   c                óD   •— ‰j                   j                  j                  S rh   )r�  Ú_symbolic_traceÚPH)rp   rÄ   s    €rk   rl   z,_MakefxTracer._trace_inner.<locals>.<lambda>I  s   ø€ ¨¯©×(@Ñ(@×(CÑ(C€ rm   Ú__code__zfx_tracer should not be None)r³   r{  Úartifactc                 ó   — dddœS )NÚmake_fx_fail_partialÚstring)rÆ  Úencodingr}   r}   rm   rk   rl   z,_MakefxTracer._trace_inner.<locals>.<lambda>s  s   € Ø 6Ø$,ñ)€ rm   c                 ój   •— ‰ j                   j                  j                  dddd¬«      j                  S )Nrð  T)Úroot_moduleÚverboseÚinclude_strideÚinclude_device)r–  r£  Úpython_codeÚsrcrï  s   €rk   rl   z,_MakefxTracer._trace_inner.<locals>.<lambda>w  s8   ø€  t§~¡~×';Ñ';×'GÑ'GØ$*Ø $Ø'+Ø'+ð	 (Hó (÷
 ‘cð rm   )Úmetadata_fnÚ
payload_fn)Úinsert_deferred_runtime_assertsÚreenter_make_fxr_   r¾  )(r�  rs   r  rÌ  rŸ   Úinspectr  rÑ  Úco_flagsÚ
CO_VARARGSr‡   rÿ  rÎ   rÏ   rý   rJ  r   r@  Úenter_contextr—  r•  r˜  r>  Ú_set_make_fx_tracerr–  rŠ   rQ   r“  rá  ro   Ú	Exceptionr(   Úis_hop_subgraph_tracerÚ_guardsr2  r«  Útorch.fx.passes.runtime_assertrà  Ú	recompiler×  )rð  rT  r  Úphsr'  rJ  Ústackr  r+  rà  rÄ   s   `         @rk   Ú_trace_innerz_MakefxTracer._trace_innerA  sB  ù€ ó 	ä�o‰oÓCÀTÓJˆà×)Ñ)¨$Ó/ˆð $%ˆäœŸ™ qÓ)¨:Ô6Ü�~‰~˜aÓ ×)Ñ)×2Ñ2´W×5GÑ5GÒGä! !¤S¨£XÓ.ˆDô .4¯[©[Ü" D§O¡Oó.
ˆ
ô ‹[ð  	˜EØ×$Ò$Ø×#Ñ# D×$9Ñ$9Ô:Ø×Ñ × ;Ñ ;Ô<Ø×Ñ × 8Ñ 8Ô9Ø×Ñ × ;Ñ ;Ô<Ø×Ñ 
Ô+Ø×ÑÔ 6Ó 8Ô9Ø×ÑÔ 3°DÓ 9Ô:à�~‰~Ð%Ü$Ð%CÓDÐDðÜ"Ü˜T 4¨¯©¸×9JÑ9JÓKØŸ>™>Ü"'¨£*ô‘÷ 	ðF ×'Ñ'Ô)Ø#Ÿm™m×<Ñ<¸TÓBÐB�ÐBØ×#Ñ#Ð/åVá+¨A¨y×/BÑ/BÐDUÔVØ�K‰KŒMà×Ñ 
Ò*Ø×$Ñ$Ð,Ü$Ð%JÓKÐKØ×/Ñ/×9Ñ9ˆAŒKØˆøô= ò Ü Øñ!ó õð ðú÷% 	ð  	ús    ÃCJ4Æ$AJÊJ1Ê1J4Ê4J=c                óx   — | j                  ||«      5   | j                  |g|¢­Ž cd d d «       S # 1 sw Y   y xY wrh   )r´  rî  )rð  rT  r  s      rk   rv  z_MakefxTracer.trace�  s<   € Ø×)Ñ)¨!¨TÓ2ñ 	/Ø$�4×$Ñ$ QÐ.¨Ò.÷	/÷ 	/ò 	/ús   “0°9c                ó   — | j                   d uS rh   r¸  rï  s    rk   rè  z$_MakefxTracer.is_hop_subgraph_tracer”  s   € Ø×!Ñ!¨Ð-Ð-rm   c           
     ó¨   — t        |�|n| j                  || j                  | j                  | j                  | j
                  | j                  | ¬«      S )Nr¸  )rŽ  rŒ   r“  rá  r”  r¾  rÙ  )rð  Údecomp_tabler×  s      rk   Ú_make_sub_tracerz_MakefxTracer._make_sub_tracer—  sT   € ô
 Ø(Ð4‰L¸$×:RÑ:RØØ×'Ñ'Ø×ÑØ×$Ñ$Ø×%Ñ%Ø×-Ñ-Øô	
ð 		
rm   c                ó–   — | j                  «       }|j                  | «      5   |j                  |g|¢­Ž cd d d «       S # 1 sw Y   y xY wrh   )ró  rº  rî  )rð  rT  r  Ú
sub_tracers       rk   Útrace_subgraphz_MakefxTracer.trace_subgraph§  sH   € Ø×*Ñ*Ó,ˆ
Ø×/Ñ/°Ó5ñ 	5Ø*�:×*Ñ*¨1Ð4¨tÒ4÷	5÷ 	5ò 	5ús	   ¢?¿Ac                óè   — t        |t        «      st        dt        |«      › �«      ‚| j	                  |¬«      }|j                  | «      5   |j                  |g|¢­Ž cd d d «       S # 1 sw Y   y xY w)NzExpected Mapping, got )rò  )r    r   rŠ   rÁ   ró  rº  rî  )rð  rT  rò  r  rõ  s        rk   Útrace_subgraph_custom_decompz*_MakefxTracer.trace_subgraph_custom_decomp¬  sr   € ô ˜,¬Ô0Ü Ð#9¼$¸|Ó:LÐ9MÐ!NÓOÐOØ×*Ñ*¸Ð*ÓEˆ
Ø×/Ñ/°Ó5ñ 	5Ø*�:×*Ñ*¨1Ð4¨tÒ4÷	5÷ 	5ò 	5ús   ÁA(Á(A1)FNFF)rŒ   rô  r×  r`   r“  r¥   rá  r¥   r”  r¥   r¾  r¥   rÙ  r¥   ra  r¥   r™  ú_MakefxTracer | Noner~  r¥   rš  r¥   rn  ro  )rn  r0  )rŸ  zFakeTensorMode | Noner   z*nullcontext[None] | ProxyTorchDispatchModer¡  z0nullcontext[None] | PreDispatchTorchFunctionModer¢  zPythonKeyTracer | Noner£  znullcontext[None] | Anyr¤  z-nullcontext[None] | TorchFunctionMetadataModern  ro  )rT  rL  r  r¬  rn  úGenerator[None, None, None])r–  r¨  rn  ro  )r™  rŽ  rn  rú  )r  rb   rn  rb   )rT  rL  r  rÇ   rn  r3   )rT  rL  r  rÇ   rn  r  ró  )Nr]   )rò  rô  r×  r`   rn  rŽ  )rT  rL  rò  z'Mapping[OpOverload, Callable[..., Any]]r  rÇ   rn  r3   )r“   r”   r•   rñ  r�  r¥  r   r´  r±  rº  rÌ  rî  rv  rè  ró  rö  rø  r}   rm   rk   rŽ  rŽ  N
  sÀ  „ ð %*Ø.2Ø$)Ø05ð.OàKð.Oð #ð.Oð !%ð	.Oð
 ð.Oð "ð.Oð #ð.Oð '+ð.Oð "ð.Oð ,ð.Oð "ð.Oð *.ð.Oð 
ó.Oó`
ðBà4ðBð DðBð #Sð	Bð
 /ðBð &=ðBð &SðBð 
óBð  ð@-Ø#ð@-Ø+=ð@-à	$ò@-ó ð@-óDAð, ð-Ø*ð-à	$ò-ó ð-ó806ódMó^/ó.ð
 HLØ%+ð
àDð
ð #ð
ð 
ó	
ó 5ð

5àð
5ð >ð
5ð ð	
5ð
 
ô
5rm   rŽ  rù  Ú_CURRENT_MAKE_FX_TRACERc              #  ó8   K  — t         }	 | a d –— |a y # |a w xY w­wrh   )rû  )r³   Úprev_tracers     rk   ræ  ræ  ¼  s'   è ø€ ô *€Kð.Ø"(ÐÛà"-Ñø +Ñüs   ‚Š �“—)rá  r”  r¾  rÙ  ra  r~  rš  c               óØ   ‡ ‡— |dvrt        d|› �«      ‚ddlm} t        ||||||||xs |j                  j
                  dk(  |	|
¬«
      Št        j                  ‰ «      dˆ ˆfd„«       }|S )	a=  
    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.

    If record_stack_traces is True, the stack trace will be preserved on node.meta["stack_trace"]
    r\   z-tracing_mode must be real/fake/symbolic, got r   rÓ  rH   )ra  r~  rš  c                 ó*   •—  ‰j                   ‰g| ¢­Ž S rh   )rv  )r  rT  Úmake_fx_tracers    €€rk   r�  zmake_fx.<locals>.wrappedò  s   ø€ à#ˆ~×#Ñ# AÐ-¨Ò-Ð-rm   )r  rÇ   rn  r3   )rŠ   rÝ  rÔ  rŽ  rv  Úprovenance_tracking_levelr  r‘  )rT  rŒ   r×  r“  rá  r”  r¾  rÙ  ra  r~  rš  rÔ  r�  r   s   `            @rk   rR   rR   Ç  s�   ù€ ð, Ð7Ñ7ÜØ;¸L¸>ÐJó
ð 	
õ 'ä"ØØØØØØØ$Ø/ò 7Ø�<‰<×1Ñ1°QÑ6Ø/Ø(Gô€Nô ‡_�_�QÓõ.ó ð.ð €Nrm   c                 óR   — t         j                  j                  j                  «       S rh   )rÄ   r  Ú_python_dispatchÚ _get_current_dispatch_mode_stackr}   rm   rk   Úget_torch_dispatch_modesr  ù  s   € Ü�;‰;×'Ñ'×HÑHÓJÐJrm   c                 ó   — t        «       S rh   )rW   r}   rm   rk   rV   rV   ÿ  s   € ÜÓÐrm   c                 ó<  — t         j                  j                  t         j                  j                  j
                  «      } t         j                  j                  t         j                  j                  j
                  «      }| �|�t        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ü   rú   rŠ   )Úpre_dispatch_moder�   s     rk   rW   rW     s‚   € ô Ÿ
™
×BÑBÜ�‰×&Ñ&×,Ñ,óÐô �8‰8×&Ñ&¤u§x¡x×'EÑ'E×'KÑ'KÓL€DØÐ%¨¨ÜÐ1Ð2CÐ1DÀGÈDÈ6ÐRÓSÐSØÒ$ Ð$rm   c                óœ   — t        «       }|st        d«      ‚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.
    r‰   N)rW   rŠ   rD  rò  )r'  r  rU  r�   r¥  s        rk   rX   rX     sU   € ô Ó€DÙÜÐ<Ó=Ð=ô 
%Ó	&ñ @àˆØ×$Ñ$ T¨5°$¸Ó?÷@÷ @ò @ús   ¢AÁAc                 ó\   — t        t        j                  j                  j                  «      S rh   )r=   rÄ   rù   rû   rü   r}   rm   rk   rD  rD  '  s   € äœuŸx™x×=Ñ=×CÑCÓDÐDrm   c                ó  ‡— ddl m} | j                  }‰|v r_|j                  ddˆfd„«      rt        S | 5  | xj
                  dz  c_         |‰   |i |¤Ž}| xj
                  dz  c_        |cd d d «       S t        S # 1 sw Y   t        S xY w)Nr   )ÚCompilerBisectorÚaot_eager_decomp_partitionr+  c                 ó   •— t        ‰ «      S rh   )Úrepr)r   s   €rk   rl   z%maybe_handle_decomp.<locals>.<lambda>7  s   ø€ Ä4ÈÃ8€ rm   rH   )Ú!torch._inductor.compiler_bisectorr  rŒ   Údisable_subsystemrÏ  r�  )rJ  r   r  rU  r  rò  rø   s    `     rk   rÐ  rÐ  ,  s�   ø€ õ Cà×1Ñ1€LØ	ˆ\ÑØ×-Ñ-Ø(¨/Ó;Kô
ô "Ð!àñ 	Ø×$Ò$¨Ñ)Õ$Ø"�,˜rÑ" DÐ3¨FÑ3ˆCØ×$Ò$¨Ñ)Õ$Ø÷		ñ 	ô Ð÷	ô Ðús   ¶7A=Á=B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.
    )rŒ   r×  N)r8  rD  rR   )r'  r  rU  r×  rŒ   r�  Úall_argsr  s           rk   Úget_isolated_graphmoduler  D  sY   € ô 5°T¸4ÀÓHÑ€GˆXä	$Ó	&ñ ð
ŒWØÐ)<È<ô
à
óˆ÷ð €I÷	ð €Iús	   ›:ºAc                óL  — ddl m} t        j                  j	                  t        j                  j
                  j                  «      }|r[|j                  rN ||j                  | «      x}r8t        |t        «      st        d|› �«      ‚||j                  j                  d<   yyyy)zOA helper function for setting up unbacked_bindings on the destination FX graph.rH   )Úcompute_unbacked_bindingsr»   Úunbacked_bindingsN)rq  r  rÄ   rù   rú   rû   ÚFAKEr«  r    r4   rŠ   r¡   rš   )rø   rÌ  r  r+  Úsymbol_to_paths        rk   r†  r†  Z  s�   € å:ô —‘×+Ñ+¬E¯H©H×,JÑ,J×,OÑ,OÓP€IÙ�Y×(Ò(Ù6°y×7JÑ7JÈCÓPÐPˆ>ÐPÜ˜i¬Ô/Ü$Ð';¸I¸;Ð%GÓHÐHØ7EˆI�N‰N×ÑÐ 3Ò4ð Qð )€yrm   )r�   úCallable[_P, R]r…   r#  rn  r  rõ  )r¡   r™   rn  r¥   ró  )rn  rú  )r²   r   r³   r¨  r´   r¯   rn  ro  )r²   z!_AnyScriptObjectType | OpaqueBaser³   r¨  r´   r4   rn  ro  )r²   r—   r³   r¨  r´   r¸   rn  ro  )r²   z6PySymType | _AnyScriptObjectType | Tensor | OpaqueBaser³   r¨  r´   rÇ   rn  ro  )r²   r   r³   r¨  rn  r¥   )r²   r   r³   r¨  rn  r¯   )r²   r   r³   r¨  rá   rc   rn  z_ProxyTensor | U)
r²   r   r³   r¨  rá   rc   rä   zCallable[[_ProxyTensor], R]rn  úR | U)r²   rO  r³   r¨  rn  r4   )r²   rO  r³   r¨  rá   rc   rn  z	Proxy | U)
r²   rO  r³   r¨  rá   rc   rä   zCallable[[Proxy], R]rn  r  )r²   r—   r³   r¨  rn  r¸   )r²   r—   r³   r¨  rá   rb   rn  zT | _PySymProxyType)r²   r&   r³   r¨  rá   rb   rn  zT | _OpaqueObjectProxyType)
r²   r—   r³   r¨  rá   rc   rä   zCallable[[_PySymProxyType], R]rn  r  )
r²   ú6Tensor | _AnyScriptObjectType | PySymType | OpaqueBaser³   r¨  rá   rÇ   rä   rL  rn  rÇ   )r  z'torch.Tensor | TraceableWrapperSubclassrn  zlist[Proxy]r1  )rn  z*dict[type[sympy.Expr], Callable[..., Any]]rh   )r³   r¨  rÑ   z
sympy.Exprrø   zPySymType | Nonern  z1IntLikeType | FloatLikeType | BoolLikeType | None)F)rž   r   r-  r¥   rn  r‹  )rž   r/  r-  r¥   rn  r/  )r³   r¨  rB  r¥   rn  rú  )r´   r4   rž   r/  rn  r4   )
r³   r¨  rT  r  r  rl  rU  rm  rn  zThunk[R])
rr  r   r´   r4   rs  r‹  r³   r¨  rn  ro  )
r‡  rb   rˆ  rv  rs  r€  r³   r¨  rn  rb   )r³   r¨  rn  z1Callable[[PySymType], bool | int | float | Proxy])r³   r¨  r  r   rn  z_ProxyTensor | Tensor)r³   r¨  r  rO  rn  rP  )r³   r¨  r  r—   rn  z_PySymProxyType | PySymType)r³   r¨  r  r&   rn  z"_OpaqueObjectProxyType | PySymType)r³   r¨  r  r  rn  rÇ   )r'  rÇ   rJ  rý   rn  ro  )r¶  z!list[object] | tuple[object, ...]r³   r¨  rn  z-tuple[list[object], tuple[object, ...], bool])rJ  rý   r'  r*   rá  r¥   r  r¬  rU  rö  rn  rÇ   )r³   z)PythonKeyTracer | _GraphAppendingTracerExrn  ro  )rH  r   rb  z7tuple[tuple[Argument, ...], dict[str, Argument]] | Nonern  r¥   )rj  ztype[TorchFunctionMode]rn  z@Callable[[], _GeneratorContextManager[TorchFunctionMode | None]])r#  rŒ  r³   r5   r{  ztuple[object, ...] | Nonern  r3   )
rT  zCallable[[Unpack[_Ts]], R]r�  ztuple[Unpack[_Ts]]r³   r¨  rá  r¥   rn  r  )r'  z+OpOverload | torch._ops.HigherOrderOperatorrn  rú  )
r³   r¨  r'  r*   r  r¬  rø   rÇ   rn  ro  )
r³   r¨  r'  r*   r  r¬  rø   r—   rn  r4   )r,  r  r  rÇ   r+  rô  r  zCallable[..., bool]r2  r¥   rn  r  )r'  zCallable[..., R]r  r¬  rU  rö  rn  z0tuple[Callable[[list[object]], R], list[object]])r³   rŽ  rn  rú  )Nr]   F)rT  rL  rŒ   rô  r×  r`   r“  r¥   rá  r¥   r”  r¥   r¾  r¥   rÙ  r¥   ra  r¥   r~  r¥   rš  r¥   rn  zCallable[..., GraphModule])rn  zlist[TorchDispatchMode])rn  zProxyTorchDispatchMode | None)r'  r  r  rl  rU  rm  rn  re   )rn  z-Generator[ProxyTorchDispatchMode, None, None])
rJ  rý   r   r*   r  r¬  rU  rö  rn  rÇ   )r]   N)r'  rL  r  r¬  rU  rö  r×  r`   rŒ   rô  rn  r3   )rø   rÇ   rÌ  rv  rn  ro  (  Ú
__future__r   Úcontextvarsr  râ  Úloggingr  Ú	threadingrÎ   r>  Úcollectionsr   r   Úcollections.abcr   r   r   r	   Ú
contextlibr
   r   r   r   Údataclassesr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úweakrefr   rÄ   Ú
torch._opsÚtorch.fxr�  Útorch.fx.tracebackré  r—  Útorch.utils._pytreer  Ú_pytreers   r   r   r   Útorch._dispatch.pythonr    Ú"torch._library.fake_class_registryr!   Útorch._library.opaque_objectr"   r#   r$   r%   r&   r'   Útorch._loggingr(   r)   r*   Útorch._subclasses.fake_implsr+   Útorch._subclasses.fake_tensorr,   r-   r.   r/   r0   Ú#torch._subclasses.functional_tensorr1   Útorch._subclasses.meta_utilsr2   r3   r4   r5   Útorch.fx.graph_moduler6   Útorch.fx.noder7   r8   r9   Útorch.fx.passes.shape_propr:   Útorch.nnr;   rg  r<   Útorch.utils._python_dispatchr=   r>   r?   r@   rA   rB   Útorch.utils._statsrC   Útorch.utils._thunkrD   Útorch.utils.weakrE   rF   rG   Ú_backward_staterI   Úsym_noderJ   r¥  rK   rÐ   Útorch._higher_order_ops.utilsrL   Útorch.typesrM   rN   rO   Ú__all__r¨  r`   rœ   rÅ   rÃ   rO  ra  rb  rà  Ú	getLoggerr“   r¾   Ú_loggingÚgetArtifactLoggerrÎ  rÉ  rb   rc   rd   re   rf   Úregister_pytree_nodeÚSizero   Ú!_pytree_subclasses_that_lose_infor‡   r�   rÇ   Ú
proxy_slotr‘   Ú
no_defaultrU   r—   r™   r¢   Úlocalr¤   rª   r§   r«   r®   rµ   rÜ   r¸   rÝ   rÚ   r  r  r  Úcacher!  rñ   r.  ri   r8  rC  r#  r$  r¥   r/  r7  rF  rZ   rY   rO  rV  ru  rv  rw  r‰  r¯   r’  r•  r!  r"  r½  r¬  rº  rê  rì  rÓ   r	  rP   rE  rl  Ú_disable_dynamorQ   r“  Ú
ContextVarr”  r�  rŸ  Ú)_temp_remove_metadata_torch_function_moder°  Ú-_temp_remove_pre_dispatch_torch_function_modeÚ	frozensetrº  r»  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÍ  Úupdaterý   r(  rú  r´   ÚGraphAppendingTracerr[   ÚInterpreterrS   r  rT   r8  r>  rp  r@  rB  rH  rŽ  rû  ræ  rR   r  rV   rW   rX   rD  rÐ  r  r†  r}   rm   rk   ú<module>rS     sì  ðö #ã Û Û Û Û Û Û Û ß 0ß BÓ Bß WÓ WÝ !÷
÷ 
õ 
÷ DÓ CÝ %ã Û Ý ß )Ð )ß $Ð $ß )Ñ )Ý ;Ý ?÷÷ õ ,ß 6Ý 4÷õ õ AÝ 6ß /Ñ /Ý .÷ñ õ
 @Ý Ý -÷÷ õ %Ý $ß WÑ Wå *Ý ñ ÛÝ.ãåEßDÑDò€ð ÐAÑB€Ø!Ð"<Ñ=€ˆiÓ =à×&Ò&Ð(8Ð9Ð Ø×)Ò)Ð,<Ñ<Ð à‡y‚y‡~‚~€Ø‡y‚y‡~‚~€à€g×Ò˜Ó!€Ø—n’n×6Ò6°xÐARÓSÐ àÐ áˆCƒL€ÙˆCƒL€Ùˆtƒ_€ÙˆCƒL€Ù�5Ó€ð €× Ò Ø	‡J‚JÙÙñð &õ
ð" &+§Z¢Z°Ð$7Ð !óBð ðØGðàCòó ðñ ‹X€
÷	ñ 	ñ ‹\€
ç /ôˆxô óMô )§/¢/ô ñ &AÓ%BÐ "ð EGÐ 'Ð)AÓ Fó4ð ò)>ó ð)>ðX 
Ú Wó 
Ø Wð 
ðØ	*ðØ4@ðØINðà	òó 
ðð
 
ðØ	ðØ(ðØ1@ðà	òó 
ðð
QØ	?ðQàðQð ðQð 
ó	QóhDð # 5™\€�Ó )Ø$)Ð ˜	Ó )ð 
ðØ	ðàðð òó 
ðð 
ðØ	ðàðð ðð ò	ó 
ðð 
ðØ	ðàðð ðð +ð	ð
 òó 
ðð 
ðØ	ðàðð òó 
ðð 
ðØ	ðàðð ðð ò	ó 
ðð 
ðØ	ðàðð ðð $ð	ð
 òó 
ðð 
ðØ	ðàðð òó 
ðð 
ðØ	ðàðð ðð ò	ó 
ðð 
ð%Ø	ð%àð%ð ð%ð  ò	%ó 
ð%ð 
ðØ	ðàðð ðð .ð	ð
 òó 
ðð !Ù$/ð	4Ø	?ð4àð4ð ð4ð "ð	4ð
 ó4óvó01ó1ð ‡‚òó ðð@ EIðdØðdØ *ðdØ1Aðdà6ódôNð 	Øñàñð ñð ñ	ð
 ÐÑñð Ð"Ñ#ñ$ð ˆ3Ð!Ð!Ñ"ñ#ð ñð 
ñ	
ð ñ
ð ñð �ó ô '(ðT à,0ñ%Øð%Ø%)ð%à ò%ó ð%ð$ òó ðð òó ðó0ð Øð Ø,ð Ø5<ð ØHQð àó ðGBØðGBØ ðGBØ/<ðGBØFRðGBà	óGBðT Ø	ˆ8�OÑ$ g¨f°oÐ.EÑ&FÐFñ€ð Ø
ˆHÐ%Ñ&¨°Ð8HÐ0HÑ(IÐIñ€ð
eØðeàðeð $ð	eð
 ðeð óeðP ÷ð ó ðð
Øðà6óð, 
Ú Uó 
Ø Uð 
ð'Øð'Ø1ð'à!ò'ó 
ð'ð
 
ð&Øð&Ø&ð&à ò&ó 
ð&ð
 
ð-Øð-Ø'ð-à'ò-ó 
ð-ð
(Øð(à=ð(ð ó(ð ˜Ÿš×+Ò+¨ZÐ8€ð=Ø
ð=Ø4ð=à	ó=ð@(KØ7ð(KØAMð(Kà2ó(KðVMØ&ðMà
ðMð ðMð ð	Mð
 ðMð óM÷`'ñ 'ð> ÷ð ó ðó
#ô v�fô vðv LPð,Øð,àHð,ð 
ó,ð^$Ø$ð$àEó$ðN ×Òð 04ð)NØ
%ð)Nàð)Nð -ð)Nð ò	)Nó ð)NðX.Ø!ð.àð.ð ð.ð ð	.ð
 ó.ðd 8N°{×7MÒ7MØ˜Tô8€Ð4ó ð
 ðØ
5ðà òó ðô%Ð 1ô %ñ2 -SØó-Ð )ôK%Ð#4ô K%ñ\ 1WØ ó1Ð -ñ 'à×Ò×$Ò$×/Ò/Ø×Ò×$Ò$×1Ò1Ø×Ò×$Ò$×;Ò;Ø×Ò×$Ò$×;Ò;Ø×Ò×$Ò$×5Ò5Ø×Ò×$Ò$×6Ò6Ø×Ò×$Ò$×5Ò5ðó
Ð õ  4ð !Ð ×  Ò  à×Ò×$Ò$×;Ò;Ø×Ò×$Ò$×;Ò;Ø×Ò×$Ò$×6Ò6Ø×Ò×$Ò$×5Ò5ð	ôôyÐ.ô yðx1Øð1Ø *ð1Ø2Dð1ØKQð1à	ó1ðØðØ *ðØ2DðØKTðà
óôD#˜bŸhšh×;Ò;ô #ô(D0˜rŸ~š~ô D0ôN9 R§^¢^ô 9ðx;Øð;àð;ð Bð;ð *ð	;ð
 ð;ð ó;ð6Ø
ðØ"4ðØ>Oðà5óð ò4ó ð4ô	¨)ô 	÷
ñ ô
o˜ô o÷d	h5ñ h5ðV 15Ð Ð-Ó 4ð ò.ó ð.ð KOØ!'Ø#(ð	/ð Ø %Ø!&Ø)-Ø %Ø %Ø,1ñ/Øð/àGð/ð ð/ð !ð	/ð ð/ð ð/ð ð/ð #'ð/ð ð/ð ð/ð &*ð/ð  ó/ódKóó%ð@Ø
ð@à
ð@ð ð@ð ô	@ð* òEó ñEðØ&ðàðð ðð ð	ð
 ôð8 "(ØJNðØ
ðà
ðð ðð ð	ð
 Hðð ôõ,Frm   