
    i=                     t   U 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 d dlmZmZmZmZmZmZ d dlmZmZ d dlZd dlmc mZ d dlmZ d dlmZmZ d dl m!Z!m"Z" d d	l#m$Z$ erd d
l%m&Z&  ede      Z' edd      Z( e)ed      xr	  e)ed      Z*ejV                  d        Z, G d d      Z-de-defdZ.i Z/e0e1df   e2d<   ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  ejr                  gZ: G d de-e jv                        Z<d Z=d Z>d Z?d Z@ G d d      ZA eA       aBdAd ZCd! ZDd" ZEd# ZFd$ ZGd% ZHd& ZI eJ       aKeJd'   e2d(<   d) ZLd* ZMd+ ZN G d, d'e-ee(e'f         ZO G d- d.eOe(e'f         ZPd/ ZQd0ej                  d1eSfd2ZT G d3 d4ee(e'f         ZUdeUe(e'f   d5e(j                  d6e(j                  d1e'fd7ZX G d8 d9ej                        ZZd: Z[d; Z\ G d< d=ej                        Z] G d> d?ej                        Z^ e^       Z_e^e2d@<   y)B    N)CallableIterator)cached_property)AnyClassVarConcatenatefinalGenericTYPE_CHECKING)	ParamSpecTypeVar)_utils_internal)_dispatch_is_included_in_aliasDispatchKey)dispatch_functorchTransformType)TorchDispatchMode)BaseFunctionalizeAPI_T)default_P.getdlopenflagssetdlopenflagsc               #      K   t         sd yt        j                         } t        j                  | t        j
                  z         	 d t        j                  |        y# t        j                  |        w xY ww)z
    Context manager to set the RTLD_GLOBAL dynamic linker flag while we open a
    shared library to load custom operators.
    N)_SET_GLOBAL_FLAGSsysr   r   ctypesRTLD_GLOBAL)	old_flagss    D/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_ops.pydl_open_guardr!   "   s\      ""$Iy6#5#556&9%9%s   AA=	A# A=#A::A=c                       e Zd ZdZd Zd Zd Zd Zdee	   ee
j                     z  ez  ez  deeeef   geeef   f   fdZd	eed
ef   ef   deed
ef   ef   fdZd Zy)OperatorBasez
    Base class for OpOverload (which represents C++ ATen operators) and HigherOrderOperator
    (which represents Python-only operators that are unrepresentable in TorchScript).
    c                 <    i | _         i | _        i | _        i | _        y N)_dispatch_cache
py_kernelspython_key_tablefunctorch_tableselfs    r    __init__zOperatorBase.__init__9   s0      UW BD  	  "    c                     t         r%   NotImplementedErrorr+   argskwargss      r    __call__zOperatorBase.__call__c       !!r-   c                     || j                   v S r%   )r'   )r+   ks     r    has_kernel_for_dispatch_keyz(OperatorBase.has_kernel_for_dispatch_keyf   s    DOO##r-   c                     | j                   D ]5  }t        j                  j                  |      r#|j	                  |      s5 y y)NTF)r'   torch_C_dispatch_is_alias_keyhas)r+   ksr7   s      r    has_kernel_for_any_dispatch_keyz,OperatorBase.has_kernel_for_any_dispatch_keyi   s9     	A882215"&&)	 r-   r7   returnc                 d     dt         t        t        f   dt         t        t        f   f fd}|S )Nfnr@   c                 b   t        j                        ret        t              st        t        j
                        r;j                  vsJ | j                  <   j                  j                          | S t        t              r!j                  vsJ | j                  <   | S t        t              sJ t        j                  k7  sJ d       j                  v rt        d dj!                                | j                  <   j                  j                          | S )Nz>Please register a mode for the DispatchKey.Python key instead.z%Trying to override a python impl for z on operator )inspectisclass
issubclassr   r:   Tensorr(   r&   clear
isinstancer   r)   r   Pythonr'   RuntimeErrorname)rB   r7   r+   s    r    innerz#OperatorBase.py_impl.<locals>.inners   s   q!1/0Jq%,,4O 5 5555+-%%a($$**,	!]+ 4 4444*,$$Q'	a---*** P* DOO#";A3mDIIK=Y  "$DOOA  &&(Ir-   )r   r   r   )r+   r7   rM   s   `` r    py_implzOperatorBase.py_implo   s/    	hr2v& 	8BF+; 	8 r-   rB   r   c                     ddl mm}mm dt
        j                  dt
        j                  dt        ffd}d|d z  dt
        j                  dt
        j                  dt        ffd}dt
        j                  dt
        j                  dt        ffd	} | j                  t        j                        |        | j                  |      |        | j                  t        j                        |       S )
Nr   )CppFunctionalizeAPIFunctionalTensorModeFunctorchFunctionalizeAPIPythonFunctionalizeAPIr2   r3   r@   c                  &             g| i |S r%    )r2   r3   rP   rB   s     r    functionalize_dk_fnz?OperatorBase.py_functionalize_impl.<locals>.functionalize_dk_fn   s    )+=d=f==r-   modec                 (      |       g|i |S r%   rU   )rW   r2   r3   rS   rB   s      r    functionalize_dispatch_mode_fnzJOperatorBase.py_functionalize_impl.<locals>.functionalize_dispatch_mode_fn   s      ,T2DTDVDDr-   c                 (      |       g|i |S r%   rU   )interpreterr2   r3   rR   rB   s      r    functionalize_functorch_fnzFOperatorBase.py_functionalize_impl.<locals>.functionalize_functorch_fn   s      /<NtNvNNr-   )#torch._subclasses.functional_tensorrP   rQ   rR   rS   r   r2   r3   r   rN   r   Functionalizer   )	r+   rB   rQ   rV   rY   r\   rP   rR   rS   s	    `    @@@r    py_functionalize_implz"OperatorBase.py_functionalize_impl   s    	
 	
	>rww 	>")) 	> 	>	E&-	E68gg	EIK	E	E
	O "	O3599	O	O
 	0[../0CD*)*+IJ1]0012LM	r-   c                     t         r%   r/   r*   s    r    rL   zOperatorBase.name   r5   r-   N)__name__
__module____qualname____doc__r,   r4   r8   r?   typer   r:   rG   r   r   r   r   r   rN   r   r_   rL   rU   r-   r    r#   r#   3   s    
("T"$ !"T%,,%77-G+U  
8BF#$hr2v&66	7 Z;'=r'ABBFG	+4b892=	>>"r-   r#   opr7   c                    | j                  |      r|S t        j                  }|t        j                  k(  st	        ||      r| j                  |      r|S t        j
                  }|t        j                  k(  st	        ||      r| j                  |      r|S | j                  t        j                  j                  |            xs | j                  t        j
                        }t        j                  }|t        j                  k7  r!t	        ||      r| j                  |      r|s|S t        j                  }|t        j                  k(  st	        ||      r\| j                  |      rK|t        j                  k(  r4| j                  t        j                  j                        rt        d      |s|S t        j                  }t	        ||      r| j                  |      r|S t        j                   }t	        ||      r| j                  |      r|S t        j                  j#                  |      r|S t%        d|  d|       )Nzambiguous autogradother kernelzcould not find kernel for  at dispatch key )r8   r   &CompositeExplicitAutogradNonFunctional	Undefinedis_included_in_aliasCompositeExplicitAutogradr?   r:   r;   *_dispatch_get_backend_keyset_from_autograd%CompositeImplicitAutogradNestedTensorCompositeImplicitAutogradAutogradOther _dispatch_autogradother_backendsrK   AutogradFuncTorchBatchedDecomposition_dispatch_has_backend_fallbackr0   )rf   r7   candhas_backend_kernels       r    resolve_keyrw      s   	%%a(==D	["""&:1d&C

(
(
.00D	["""&:1d&C

(
(
.;;;;A> O		'	'(M(M	N  <<D	
k##	#(<Q(E**40"00D	["""&:1d&C

(
(
.)))b.P.PHH55/
 ?@@#KDAt$)G)G)M44DAt$)G)G)Mxx..q1 
 :2$>OPQsS
TTr-   HigherOrderOperator_higher_order_opsc                       e Zd Zdd fd
Zdee   eej                     z  ez  e	z  de
e
eef   ge
eef   f   f fdZde
eef   de
eef   fdZed	        Zedefd
       Zd Zd Zej.                  d        Zd Zd Zd ZddZ xZS )rx   F)	cacheablec                0   t         |           t        |       t        u rt	        d      || _        || _        | t        |<   d| _        d| _	        || _
        t        j                  j                         | _        t        D ]  }| j!                  |        y )NzODirect instantiation of HigherOrderOperator is not allowed. Please subclass it.higher_ordertorch.ops.higher_order)superr,   re   rx   rK   _namera   ry   _nsrb   
_cacheabler:   r;   _dispatch_keyset_fullnon_fallthrough_keys2_HIGHER_ORDER_OP_DEFAULT_FALLTHROUGH_DISPATCH_KEYSfallthrough)r+   rL   r{   dispatch_key	__class__s       r    r,   zHigherOrderOperator.__init__  s    :,,a  
 "&$!2#$)HH$B$B$D!N 	+L\*	+r-   r7   r@   c                     t        |t              r;| j                  j                  |      s | j                  j	                  |      | _        t
        |   |      S r%   )rI   r   r   r=   addr   rN   r+   r7   r   s     r    rN   zHigherOrderOperator.py_impl$  sJ     a%d.G.G.K.KA.N(,(A(A(E(Ea(HD%wq!!r-   rB   c                      dt         j                  dt         j                  dt        f fd}  j	                  t
        j                        |       S )Nr2   r3   r@   c                     t        j                         r+t        j                  t         j                  d g | |      r0t         j
                  j                         5   | i |cd d d        S ddlm}  |      rK j                  | i |}t        d |j                  D              rt        dj                          d       | i |S # 1 sw Y   jxY w)Nc                     | j                    S r%   )requires_grad)ts    r    <lambda>zRHigherOrderOperator.py_autograd_impl.<locals>.maybe_run_autograd.<locals>.<lambda>3  s    aoo- r-   r   )_has_gen_schemac              3   4   K   | ]  }|j                     y wr%   )is_write.0args     r    	<genexpr>zSHigherOrderOperator.py_autograd_impl.<locals>.maybe_run_autograd.<locals>.<genexpr>=  s     @s||@s   zThe z HigherOrderOperator does not currently support training with in-place input or buffer mutations If you require this feature, please submit an issue to PyTorch. Alternatively, consider creating your own custom autograd.Function. )r:   is_grad_enabledpytreetree_all_onlyrG   r;   _AutoDispatchBelowAutogradtorch._higher_order_ops.utilsr   
gen_schemaany	argumentsrK   rL   )r2   r3   r   schemarB   r+   s       r    maybe_run_autogradz@HigherOrderOperator.py_autograd_impl.<locals>.maybe_run_autograd0  s    ((*f.B.B-$/
 XX88: 1001 1 Ft$($9&9@v/?/?@@&tyy{m ,_ _  t&v&&1 1s   CC)r   r2   r3   r   rN   r   rr   )r+   rB   r   s   `` r    py_autograd_implz$HigherOrderOperator.py_autograd_impl,  sF    	'bgg 	' 	'r 	'. 	+[))*+=>	r-   c                     | j                   S r%   )r   r*   s    r    	namespacezHigherOrderOperator.namespaceK      xxr-   c                    ddl m} | j                  xss | j                   d| j                   t
        j                  j                  j                  v xs2 t        | |      xr$ t
        j                  j                  j                  S )Nr   )AutogradFunctionApply.)"torch._functorch.autograd_functionr   r   rb   ra   r:   	_inductorconfig!unsafe_marked_cacheable_functionsrI   
_functorch.autograd_cache_allow_custom_autograd_functions)r+   r   s     r    r{   zHigherOrderOperator.cacheableO  su    L OO //"!DMM?3%%GGH 4!67 [$$++ZZ	
r-   c                 D    | j                   j                  |      | _         y r%   )r   remove)r+   r   s     r    r   zHigherOrderOperator.fallthrough]  s    $($=$=$D$D\$R!r-   c                   ddl m} || j                  v r)| j                  |   }t        |t              rJ  ||i |S |t        j
                  k(  rt        | ||      S |t        j                  k(  rpg d fd}g ||j                         D ]0  } ||       t        |t        t        f      s"|D ]
  } ||        2 t              }	ddl m}
  |       }|t        |      | j                  v r5| j                  t        |         } |
       5 } ||g|i |}d d d        nc|j                  r% |
       5 }|j                  | g ||      cd d d        S t!        d| j"                   d| d| d	| d
| j"                   d| d      t$        ur|S |	D ]  }t        |      }|j                  t&        j(                  j*                  u r5|t&        j,                  j.                  j0                  u rMt&        j,                  j.                  j2                  }| j                  |   } ||j4                  g|i |}|c S || j                  v r| j                  |   } ||i |}nt!        d| j"                   d| d      |t$        us|c S  t7        d| j"                   d| d|	D cg c]  }t        |      j8                   c} d| j"                   d| d      t&        j(                  j;                  |      }|t        j<                  k(  rddl m}
 t?               dkD  rt&        j(                  jA                  t        j                        sktC               }|J d       t        |      | j                  v sJ d| d       | j                  t        |         } |
|      5 } ||g|i |cd d d        S tE        | |      }|| jF                  vrt!        d| j"                   d| d| d      |t        j<                  k7  r| jF                  |   | j                  |<   | jF                  |   }t        |t              rJ  ||i |S # 1 sw Y   xY w# 1 sw Y   xY wc c}w # 1 sw Y   xY w)Nr   _get_current_dispatch_modec                 ^    t         j                  j                  |       j                  d      S )NrJ   )r:   r;   _dispatch_keysr=   )tensors    r    has_python_keyz4HigherOrderOperator.dispatch.<locals>.has_python_keys  s"    xx..v6::8DDr-   c                 p    t        | t        j                        r |       rj                  |        y y y r%   )rI   r:   rG   append)r   r   overloaded_args_lists    r    check_overloadedz6HigherOrderOperator.dispatch.<locals>.check_overloadedv  s/    c5<<0^C5H(//4 6I0r-   )_pop_mode_temporarilyz5There was no rule registered for HigherOrderOperator z
 and mode z.Hint: set zc's supports_higher_order_operators to True. This causes all higher order operators to pass through zk's __torch_dispatch__, so handle them accordingly by adding support for HigerOrderOperators (in this case, z) in zC.__torch_dispatch__ or returning NotImplemented when not supported.z%There was no rule registered for HOP z and subclass z. We recommend filing an issue.zHigherOrderOperator 'z' is not supported for the given input types. This typically happens when using custom tensor types or dispatch modes that don't have implementations for this operation.

Current mode: z
Input types: z$

To fix this, can add support for 'z' in z's __torch_dispatch__
zIIllegal invocation of dispatch on DispatchKey.PreDispatch without a mode.zCurrent active mode z not registeredz.could not find kernel for HigherOrderOperator rh   z (resolved from ))$torch.utils._python_dispatchr   r&   rI   r   FuncTorchDynamicLayerFrontModer   rJ   valueslisttupler   re   r(   supports_higher_order_operators__torch_dispatch__r0   r   NotImplementedr:   r;   _disabled_torch_dispatch_impl_subclassesfake_tensor
FakeTensorFakeTensorMode	fake_mode	TypeErrorra   _to_functionality_keyPreDispatch&_len_torch_dispatch_stack_pre_dispatch&_dispatch_tls_is_dispatch_key_excluded'_get_current_dispatch_mode_pre_dispatchrw   r'   )r+   r   r2   r3   r   kernelr   r   aoverloaded_argsr   	curr_modehandlerrW   resultsubclass_typefunctionality_key	final_keyr   r   s                     @@r    dispatchzHigherOrderOperator.dispatchb  s   K4///)),7F!&+6664*6**;EEE%dD&99;--- $& E5 100 , %cD%=1  ,(+,, $$89O K24I$	?d&;&;;"33DODG.0 @D ")!?!?!?@ @
 !@@24 X#,#?#?b$PV#WX X 2STXT^T^S__ijsit u))2 4WW`Va bVVZV`V`Ua b  ){ +LM  /!M ' " $S	!44xx==>  !E$5$5$A$A$L$LL$)$5$5$A$A$P$PM"33MBG$S]]DTDVDF!M D$9$99"33MBG %d5f5F-?

|>ZgYh i8 9  /!M="B '

| 4! "+ , ;J Kaa!1!1 KL M559ZZLi[Pgi  "HH::<H 7 77J
 781<hhEE"" DE	 , _, I$*?*?? *9+_E? //Y@*+<= :"49$9&9: :  l3	 DOO+%@ M##,+-=l^1N  ;222151KD  .+ fk222t&v&&U@ @X Xl !L.: :s*   Q Q.Q,+Q1QQ)1Q:c                   t        ||      }t        j                  j                  |      r$t        j                  j                  | |g|i |S t        ||| j                        } | j                  |j                         g|i |S r%   )	_to_flat_tupler:   	overrideshas_torch_functionhandle_torch_function_compute_keysetr   r   highestPriorityTypeId)r+   r2   r3   	flat_argsdispatch_key_sets        r    r4   zHigherOrderOperator.__call__  s    "40	??--i8??88i"&*0  +49R9RSt}}-CCEWWPVWWr-   c                 4    t        d| j                   d      )NzHigherOrderOperator z does not implement a gen_schema. This is OK as long as the hop is functional. e.g. it should not mutate its inputs and there are no input, output aliasing via views or direct referencing.)r0   r   r1   s      r    r   zHigherOrderOperator.gen_schema  s$    !"4::, // 0
 	
r-   c                 $    | j                          S r%   )rL   r*   s    r    __str__zHigherOrderOperator.__str__  s    ))+r-   c                     | j                   S r%   r   r*   s    r    rL   zHigherOrderOperator.name      zzr-   c                     | S r%   rU   r+   memos     r    __deepcopy__z HigherOrderOperator.__deepcopy__      r-   r%   )ra   rb   rc   r,   re   r   r:   rG   r   r   r   r   r   rN   r   propertyr   r	   boolr{   r   r   abcabstractmethodr4   r   r   rL   r   __classcell__r   s   @r    rx   rx     s     +0 +8"!"T%,,%77-G+U" 
8BF#$hr2v&66	7"RV 
"b&	>   
4 
 
S
Q'f 	X X,
 r-   c                 ,    t        j                  | i |S r%   )r   arg_tree_leavesr2   r3   s     r    r   r     s    !!42622r-   c                 2    t        | |      }t        ||      S r%   )_get_tensorskey_extractor)r2   r3   r   tensorss       r    r   r   #  s    4(G"677r-   c                     t        | |      }|D cg c]  }t        |t        j                        s|! }}t	        |      S c c}w r%   )r   rI   r:   rG   r   )r2   r3   flat_allr   tensor_argss        r    r   r   (  s?    dF+H&F*Q*E1FKF Gs
   AAc                     t         j                  j                         }| D ]$  }|t         j                  j                  |      z  }& |t         j                  j	                         z
  }||z  }|S r%   )r:   r;   _dispatch_tls_local_include_setr   _dispatch_tls_local_exclude_set)r   key_maskkey_setr   s       r    r   r   0  sb    hh668G <EHH33F;;<@@BBG GNr-   c                   $    e Zd Zd Zd Zd Zd Zy)_ModeStackStateForPreDispatchc                 $    d d g| _         d | _        y r%   )*_ModeStackStateForPreDispatch__infra_modes_schema_check_moder*   s    r    r,   z&_ModeStackStateForPreDispatch.__init__G  s    "D\"&r-   c                 V    |t        | j                        k  sJ || j                  |<   y r%   lenr	  )r+   indexrW   s      r    setz!_ModeStackStateForPreDispatch.setK  s+    s4--....$(5!r-   c                 T    |t        | j                        k  sJ | j                  |   S r%   r  )r+   r  s     r    getz!_ModeStackStateForPreDispatch.getO  s,    s4--....!!%((r-   c                     t        | j                  D cg c]  }||	 c}      t        | j                  d u      z   S c c}w r%   )r  r	  intr
  )r+   is     r    countz#_ModeStackStateForPreDispatch.countS  sB    t11C!Q]ACDs##4/H
 
 	
Cs   ??N)ra   rb   rc   r,   r  r  r  rU   r-   r    r  r  F  s    '))
r-   r  c                 Z    t                L t        j                  j                  j                  t        j                  j                  j
                  fv sJ |r J  fd} |       }t               }|dk(  r.t        j                  j                  t        j                  d       |S )Nc                     t         j                  j                  j                  u r-j	                  d      } t               j                  dd        | S t         j                  j                  j                  u r-j	                  d      } t               j                  dd        | S t               j                  } d t               _        | S Nr      )	r:   r;   _TorchDispatchModeKeyPROXYr  !mode_stack_state_for_pre_dispatchr  
FUNCTIONALr
  )current_modecurrent_mode_stack_pre_dispatchmode_keys    r    _unset_modez,unset_mode_pre_dispatch.<locals>._unset_modee  s     uxx55;;;:>>qAL-/33At<77BBB:>>qAL-/33At<<>QQLEI-/Br-   r   F)
r  r:   r;   r  r  r  r   '_dispatch_tls_set_dispatch_key_includedr   r   )r   schema_checkr!  r  new_pre_dispatch_lenr  s   `    @r    unset_mode_pre_dispatchr%  \  s    &G&I#x&&,,&&11,        =LAC
 q 889P9PRWXr-   c                 <   ddl m} ddlm} ddlm} t        | |||f      sJ t               }t        | |      r4t               j                  }|dkD  rt        d      | t               _	        n{t        | |      r8t               j                  d      }|J t               j                  d|        n7t               j                  d      }|J t               j                  d|        |dk(  r/t        j                  j                  t         j"                  d       y y )Nr   )rQ   )SchemaCheckMode)ProxyTorchDispatchModezYSchemaCheckMode for pre-dispatch must be used exclusively, found other modes on the stackr  T)r]   rQ   #torch._subclasses.schema_check_moder'  "torch.fx.experimental.proxy_tensorr(  rI   r   r  r
  AssertionErrorr  r  r:   r;   r"  r   r   )rW   rQ   r'  r(  previous_mode_stack_lenr  s         r    _set_mode_pre_dispatchr-    s   HCI "	
   EF$(8:MM"Q& k  BF)+>	D.	/8:>>qA###)+//488:>>qA###)+//48 !#889P9PRVW $r-   c                  v   t               } t               }|dk(  rt        d      | j                  t	        d d      S | j                  d      -t	        t        j                  j                  j                        S | j                  d      -t	        t        j                  j                  j                        S y )Nr   zTrying to pop empty mode stackT)r#  r  )r  r   r+  r
  r%  r  r:   r;   r  r  r  )
mode_stackpre_dispatch_lens     r    _pop_mode_from_pre_dispatchr1    s    24J=?1=>>$$0&t$??~~a$&uxx'E'E'P'PQQ~~a$&uxx'E'E'K'KLL %r-   c                  2    t               j                         S r%   )r  r  rU   r-   r    r   r     s    ,.4466r-   c                    | t         j                  j                  j                  u rt	               j                  d      S | t         j                  j                  j                  u sJ t	               j                  d      S r  )r:   r;   r  r  r  r  r  )r   s    r    _get_dispatch_mode_pre_dispatchr4    s`    588117770266q9958899DDDDD0266q99r-   c                  `   t               j                  t               j                  S t               j                         } | dk(  rt               j                  d      S | dk(  rKt               j                  d      t               j                  d      S t               j                  d      S y )N   r  r   )r  r
  r  r  )	stack_lens    r    r   r     s    (*==I02EEE57==?	>46::1==> 56::1=I 2377: 78<<Q?
 r-   c                      t         S r%   )"_mode_stack_state_for_pre_dispatchrU   r-   r    r  r    s    --r-   
OpOverload
cached_opsc                 .    t         j                  |        y r%   )r;  r   )op_overloads    r    add_cached_opr>    s    NN;r-   c                  ,    t         j                          y r%   )r;  rH   rU   r-   r    reset_cached_opsr@    s    r-   c                      t         S r%   )r;  rU   r-   r    get_cached_opsrB    s    r-   c                       e Zd Zdddeeef   deeeef   ef   dej                  j                  dee   ddf fd	Zedefd
       Zedefd       Zedej                  j$                  fd       Zd$dZd Zdej,                  dej.                  defdZdej                  j2                  dej,                  dej.                  defdZd Zd Zdedef fdZdej                  j2                  def fdZe defd       Z!defdZ"dej,                  dej.                  defdZ#deddfdZ$dedeeeef   z  fdZ%d  Z&e d!        Z'e d"        Z(e d#        Z) xZ*S )%r:  overloadpacketOpOverloadPacketrf   op_dkr   tagsr@   Nc                    t         |           || _        || _        || _        || _        || _        |j                  dk(  rdn|j                  | _        |r!t        j                  j                  |v | _        | j                  j                  | _        |j                  r"| xj                  d|j                  z   z  c_        | j                  j                  j                  d      d    d| j                   | _        |j"                  | _        |j"                  |_        | j                  | _        i | _        | j$                  t        j(                  j*                  v | _        d }| j                  j.                  D ]B  }|j0                  ||j0                  j2                  })|j0                  j2                  xs |}D |d uxr | | _        y )N r   r   ::r  )r   r,   _op_op_dk_schema_overloadpacket_tagsoverload_name_overloadnamer:   Tagnondeterministic_seeded_nondeterministic_seededrL   r   splitra   rb   rc   __annotations__library_defs_defined_in_pythonr   
alias_infor   is_view)	r+   rD  rf   rF  r   rG  r   r   r   s	           r    r,   zOpOverload.__init__  s    	-
--3I9M9M 	 ,1II,M,MQU,UD)\\&&
JJ# 4 444J<<,,2248;<Ad>P>P=QR(33&11 JJ! #'"3"3u}}7J7J"J '' 	=A||#<<00 <<00<H	=  t+<Hr-   c                 V    | j                   j                  j                  dd      d   S )NrJ  r  maxsplitr   rM  rL   rU  r*   s    r    
_namespacezOpOverload._namespace  '    ||  &&ta&8;;r-   c                 V    | j                   j                  j                  dd      d   S )NrJ  r  r]  r_  r*   s    r    _opnamezOpOverload._opname  ra  r-   c                     t         j                  j                  | j                  j                  | j                  j
                        S r%   )r:   r;   _dispatch_find_schema_or_throwrM  rL   rP  r*   s    r    _handlezOpOverload._handle#  s2    xx66LLt||99
 	
r-   c                     | S r%   rU   r   s     r    r   zOpOverload.__deepcopy__*  r   r-   c                 V    d| j                    d| j                   d| j                   dS )Nz<OpOverload(op='r   z', overload='z')>)r`  rc  rQ  r*   s    r    __repr__zOpOverload.__repr__-  s.    !$//!2!DLL>tOaOaNbbeffr-   r2   r3   c                &     | j                   |i |S r%   rK  r1   s      r    r4   zOpOverload.__call__2  s    txx(((r-   keysetc                B     | j                   j                  |g|i |S r%   )rf  redispatch_boxed)r+   rl  r2   r3   s       r    
redispatchzOpOverload.redispatch7  s%     -t||,,VEdEfEEr-   c                 ,    t        | j                        S r%   hashrK  r*   s    r    __hash__zOpOverload.__hash__<      DHH~r-   c                      dj                   g | j                  j                  j                  d      | j                   S )Nz{}.{}.{}rJ  )formatrM  rL   rU  rQ  r*   s    r    r   zOpOverload.__str__@  s8     z  T$,,"3"3"9"9$"?TASASTTr-   r7   c                     t         |   |      xs. t        j                  j	                  | j                         |      S r%   )r   r8   r:   r;   %_dispatch_has_kernel_for_dispatch_keyrL   r   s     r    r8   z&OpOverload.has_kernel_for_dispatch_keyC  s9    w2
 LXX;;DIIKK	Lr-   r>   c                     t         j                  j                  | j                         |      xs t        |   |      S r%   )r:   r;   )_dispatch_has_kernel_for_any_dispatch_keyrL   r   r?   )r+   r>   r   s     r    r?   z*OpOverload.has_kernel_for_any_dispatch_keyH  s7    xxAAIIK
 9W4R8	9r-   c                     | j                   S r%   )r`  r*   s    r    r   zOpOverload.namespaceM  s    r-   c                     t         j                  }|| j                  v xs. t        j                  j                  | j                         |      S r%   )r   ro   r'   r:   r;   rx  rL   )r+   dks     r    _can_decomposezOpOverload._can_decomposeQ  s?    22T__$ 
(V(VIIK)
 	
r-   c                     t         j                  }|| j                  v r | j                  |   |i |S t        j                  j                  | j                         |      r | j                  |g|i |S t        S r%   )	r   ro   r'   r:   r;   rx  rL   rL  r   )r+   r2   r3   r}  s       r    	decomposezOpOverload.decomposeW  sq    22 
 '4??2&777XX;;DIIKL4;;r3D3F33!!r-   keyc                 <    | j                   j                  |d        y r%   )r&   pop)r+   r  s     r    _uncache_dispatchzOpOverload._uncache_dispatchl  s      d+r-   c                      j                   vsJ   d        t        j                  k(  rt         t              s( j
                  s j                   <   t                S dt        j                  dt        j                  dt        f fd}| j                   <   t                |S t        j                  j                        }|t        j                  k(  rjt               }|dkD  r[t        j                  j!                  t        j                        s.dt        j                  dt        j                  dt        f fd}|S t#               }t        j                  k7  }t        j$                  k(  rEdd lmc m} |j,                  r0|j/                   |      }|r| j                   <   t                |S  j0                  j3                  ||      }|r| j                   <   t                |S )N r2   r3   r@   c                  0   ddl m} t         |             }|J d       |j                  vrt	        t
              r`t        j                  j                  j                         5 }t        j                  j                  j                  |g| i |cd d d        S  j                  g| i |S t        j                  j                  j                         5 } j                  |   |g| i |cd d d        S # 1 sw Y   TxY w# 1 sw Y   y xY w)Nr   r   zDIllegal invocation of dispatch on DispatchKey.Python without a mode.)r   r   re   r(   rI   TorchBindOpOverloadr:   utils_python_dispatchr   _libraryhandle_dispatch_moderL  )r2   r3   r   r   rW   r  r+   s        r    r   z)OpOverload._get_dispatch.<locals>.handlerz  s   S !!;!=>	 , Z, D$9$99!$(;<!KK88NNPTX#(>>#7#7#L#L $d$-1$5;$   +t{{3@@@@[[11GGI ST;400;DR4R6RS S S Ss   '.D D D	Dr   c                      t         j                  d        } |       5 }t        j                  j                  j
                  |g| i |cd d d        S # 1 sw Y   y xY w)Nc               3   `   K   t               } 	 |  t        |        y # t        |        w xY wwr%   )r1  r-  )top_modes    r    (_temporarily_pop_modes_from_pre_dispatchz[OpOverload._get_dispatch.<locals>.handler.<locals>._temporarily_pop_modes_from_pre_dispatch  s)     #>#@="*N28<28<s   . .+.)
contextlibcontextmanagerr:   r  r  r  )r2   r3   r  r   r+   s       r    r   z)OpOverload._get_dispatch.<locals>.handler  sh    ..= /= BC y$~~33HH%t .2 6<   s   .AA )r&   r   rJ   rI   r  r(   r>  r   r2   r3   r   r:   r;   r   r   r   r   rw   r^   torch._dispatch.python	_dispatchpythonCROSSREF_FUNCTIONALIZEmake_crossref_functionalizer'   r  )	r+   r  r   r   curr_stack_lenr   cache_result
pydispatchrs	   ``       r    _get_dispatchzOpOverload._get_dispatchp  s   $...?4&#?.+$$$d$78AVAV,/$$S)d#
Srww S")) S S0 )0D  %$N!HH::3? 7 77CEN "GG&&
277 bii B & c*	 k555
 ++++7700$@@yQ07D((-!$'OO	95()D  %$r-   c                     | j                   S r%   r   r*   s    r    rL   zOpOverload.name  r   r-   c                     | j                   S r%   )rN  r*   s    r    rD  zOpOverload.overloadpacket  s    ###r-   c                     | j                   S r%   rk  r*   s    r    rf   zOpOverload.op  r   r-   c                     | j                   S r%   )rO  r*   s    r    rG  zOpOverload.tags  s    zzr-   r%   )+ra   rb   rc   r   r   r   r   r   r:   r;   FunctionSchemar   r   r,   r   strr`  rc  _DispatchOperatorHandlerf  r   ri  r2   r3   r4   DispatchKeySetro  rs  r   r   r8   r?   r   r   r~  r  r  r  rL   rD  rf   rG  r   r   s   @r    r:  r:    s1   *=**= RV*= KO4b89	*=
 ''*= 3i*= 
*=X <C < < < < < 
99 
 
g
) )BII )" )
F00F9;FLNIIF	F
UL[ LT L
9%((2I2I 9d 9
 3  
 
"rww "")) " "*,[ ,T ,] ]xB?O1O ]~ $ $    r-   c                       e Zd Zdee   fdZdej                  dej                  de	fdZ
dee   dej                  dej                  de	fdZy)	r  r@   c                 J    t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  g}dt         f fd}|D cg c]  } ||      r| c}S c c}w )Nr  c                 .   t         j                  j                  j                         |       r.t         j                  j	                  j                         |       S | j
                  vxs) j
                  |    t         j                  j                  u S r%   )r:   r;   rx  rL   0_dispatch_kernel_for_dispatch_key_is_fallthroughr'   rW  fallthrough_kernel)r  r+   s    r    (_may_use_fallthrough_instead_of_fallbackzWTorchBindOpOverload._fallthrough_keys.<locals>._may_use_fallthrough_instead_of_fallback  ss    xx==diik3OxxPPIIK 
 4??* L??3'5==+K+KKr-   )	r   rr   AutogradCPUAutogradCUDAADInplaceOrViewBackendSelectPythonTLSSnapshotPythonDispatcherr^   )r+   _DEFAULT_FALLTHROUGH_KEYSr  r  s   `   r    _fallthrough_keysz%TorchBindOpOverload._fallthrough_keys  s       ##$$''%%))((%%	%
!		+ 		 1
7< 
 	
 
s   B r2   r3   c                    t        ||      r$ | j                  | j                         g|i |S  | j                  |i |S r%   )_must_dispatch_in_python_dispatch_in_pythonr  rK  r1   s      r    r4   zTorchBindOpOverload.__call__  sJ    #D&1 ,4++D,B,B,DVtVvVVtxx(((r-   fallthrough_keysc           	         t         j                  j                         }|D ]  }|j                  |      } t	        |||      }|j                         }|| j                  vr| j                  |      n| j                  |   }t        |t              r]t         j                  j                  | j                         |      r | j                  ||gz   g|i |S t        d|  d| d| d      t        |t              sJ  ||i |S )NzTorchbind op z4 received a FakeScriptObject input when dispatching z. but no python implementation is found. Please file an issue on this when you encounter this error. This error can happen when you export or compile the model. It can still happen even if a C++ implementation for zz.  has been registered. That's because FakeScriptObject purely lives in python and cannot work  with a C++ implementation.)r:   r;   r   r   r   r   r&   r  rI   r   r  rL   r  rK   r   )	r+   r  r2   r3   r   r  r   r   r   s	            r    r  z'TorchBindOpOverload._dispatch_in_python  sF     %xx==?# 	DC#7#>#>s#C 	D +49MN'==? 4#7#77 |,%%l3 	 g{+ xxHH		\ 0t//$~5   v%YZaYb cI JV W.	/  '8,,,'''r-   N)ra   rb   rc   r   r   r  r   r2   r3   r   r4   r  rU   r-   r    r  r    sh    
4#4 
B) )BII )" )'( $[ 1'(:<'''(MOYY'(	'(r-   r  c                 4    t        j                  d | |f      S )Nc                 ^    t        | t        j                  j                  j                        S r%   )rI   r:   r  fake_class_registryFakeScriptObject)objs    r    r   z*_must_dispatch_in_python.<locals>.<lambda>;  s     J33DD
 r-   )r   tree_anyr   s     r    r  r  9  s!    ??	
 
v	 r-   r   r@   c                 :    t        d | j                  D              S )Nc              3   d   K   | ](  }t        |j                  t        j                         * y wr%   )rI   re   r:   	ClassTyper   s     r    r   z)_has_script_object_arg.<locals>.<genexpr>C  s     Qz#((EOO4Qs   .0)r   r   )r   s    r    _has_script_object_argr  B  s    Q@P@PQQQr-   c            
           e Zd ZU dZee   ed<   dededeee	f   de
e   ddf
d	Zdd
Zd Zd Zd Zed        Zed        Zdedeee	f   fdZdee   fdZdej.                  dej0                  de	fdZd Zy)rE  	torch.ops__file__qualified_op_nameop_namerf   overload_namesr@   Nc                     || _         || _        || _        || _        g | _        t        d | j                  j                         D              | _        y )Nc              3   2   K   | ]  }t        |        y wr%   )r  )r   r   s     r    r   z,OpOverloadPacket.__init__.<locals>.<genexpr>Y  s      .
/5"6*.
s   )	_qualified_op_namera   rK  _overload_names_dirr   _schemasr   _has_torchbind_op_overload)r+   r  r  rf   r  s        r    r,   zOpOverloadPacket.__init__K  sP     #4-!	*- .
9=9M9M9O.
 +
'r-   c                     | S r%   rU   r   s     r    r   zOpOverloadPacket.__deepcopy__^  r   r-   c                 R     dj                   | j                  j                  d       S )Nz<OpOverloadPacket(op='{}.{}')>rJ  rv  r  rU  r*   s    r    ri  zOpOverloadPacket.__repr__a  s,    6/66$$**40
 	
r-   c                 ,    t        | j                        S r%   rq  r*   s    r    rs  zOpOverloadPacket.__hash__f  rt  r-   c                 R     dj                   | j                  j                  d       S )Nz{}.{}rJ  r  r*   s    r    r   zOpOverloadPacket.__str__i  s$    w~~t66<<TBCCr-   c                     | j                   S r%   rk  r*   s    r    rf   zOpOverloadPacket.opl  r   r-   c                     | j                   D ci c]-  }|t        j                  j                  | j                  |      / c}S c c}w r%   )r  r:   r;   _get_schemar  )r+   rP  s     r    r  zOpOverloadPacket._schemasp  sF     "&!5!5
 588//0G0GWW
 	
 
s   2Ar  c           
         	 |j                  d      rt        | j                  |      S 	 	 |dk(  rdn|}t
        j                  j                  | j                  |      }|t        dt	        |        d	| d      |\  }}}t
        j                  j                  | j                  |      }t        |      st        | ||||      nt        | ||||      }t        | ||       | j                  j                  |       |S # t        $ r3 t        dt	        |        dt	        | j                         d| d      d w xY w# t         $ r t        dt	        |        d	| d      d w xY w)
N__'zH' can't have an overload name beginning with '__' and the underlying op z has no attribute z either.r   rI  zThe underlying op of 'z' has no overload name ')
startswithgetattrrK  AttributeErrorr  r:   r;   _get_operation_overloadr  r  r  r:  r  setattrr  r   rK   )	r+   r  use_key
op_dk_tagsop_op_dk_rG  r   overloads	            r    __getattr__zOpOverloadPacket.__getattr__w  s   	~~d#txx-- $	9,b#G99''J !$,SYK7OPSuTUV  !+CXX))$*A*A7KF .f5 4ffd;(sFFDI  D#x(IIS!OA  	
 !CI; !!$TXX/A#hP 	B  	 (T3KC5PQR	s   &C> CD= ><D:=&E#c                 ,    t        | j                        S r%   iterr  r*   s    r    __iter__zOpOverloadPacket.__iter__      DIIr-   r2   r3   c                t    | j                   rt        ||      rt        | g|i |S  | j                  |i |S r%   )r  r  !_call_overload_packet_from_pythonrK  r1   s      r    r4   zOpOverloadPacket.__call__  sB     **/Gf/U4TKDKFKKtxx(((r-   c                 H    | j                   D cg c]  }|r|nd
 c}S c c}w )Nr   )r  )r+   ns     r    	overloadszOpOverloadPacket.overloads  s#    /3/C/CD!QI%DDDs   r%   )ra   rb   rc   r  r   r  rV  r   r   r   r   r,   r   ri  rs  r   r   rf   r  r:  r  r   r  r2   r3   r4   r  rU   r-   r    rE  rE  H  s    )Hhsm)

 
 RV	

 S	
 

&

D   
 
/s /z"b&'9 /b(3- 
) )BII )" )Er-   rE  r2   r3   c                    t        j                  j                  | g|i |\  }}|r|S i }d }| j                         D ]?  }t	        | |      }	 t        j                  j
                  |j                  g|i |}	|} n |r ||i |S d|  d}|j                         D ]  \  }}|d| d| dz  } t        |      # t        $ r}
|
||<   Y d }
~
d }
~
ww xY w)Nz'Fail to match any TorchBindOverload of z with following exceptions:
zOverload name z:
 
)	r:   r;   (_maybe_call_torch_function_for_op_packetr  r  &_check_schema_allow_fake_script_objectrM  rK   items)rf   r2   r3   torch_function_calledret
exceptionsfound_oprP  r=  _eerr_msgr  msgs                 r    r  r    s+    "'!R!R
"""3 
 JH 	*b-0	*??##&*.4A #H	* ((( 2"5RS  $$& 5S^C5SE445
w
  	*()J}%	*s   /C  	C	CCc                   R     e Zd ZdZdZdeddf fdZdee   fdZdede	fd	Z
 xZS )
_OpNamespacea0  
    An op namespace to dynamically bind Operators into Python.

    Say a user has created a custom Operator called "my_namespace::my_op". To
    call this op, the user will write torch.ops.my_namespace.my_op(...).
    At startup, this operation will not yet be bound into Python. Instead, the
    following sequence of magic tricks will occur:
    1. `torch.ops.my_namespace` will invoke the `__getattr__` magic method
       on the `torch.ops` object, which will create a new `_OpNamespace`
       object called `my_namespace` and set it as an attribute on the `ops`
       object.
    2. `torch.ops.my_namespace.my_op` will then invoke `__getattr__` on
       the `my_namespace` object, which will retrieve the operation via
       `torch.get_operation`, a function bound from C++, and then in a similar
       fashion bind this new object onto the `my_namespace` object.
    3. `torch.ops.my_namespace.my_op(...)` then calls this new operation
        and subsequent accesses will incur no further lookup (the namespace and
        operation will already exist).
    r  rL   r@   Nc                 F    t         |   d|z          || _        g | _        y )Nz
torch.ops.)r   r,   rL   r  )r+   rL   r   s     r    r,   z_OpNamespace.__init__  s#    ,-	!	r-   c                 ,    t        | j                        S r%   r  r*   s    r    r  z_OpNamespace.__iter__  r  r-   r  c                    |dv rt        d| d| j                   d      | j                  }| d| }| j                  dz   |z   }	 t        ||      \  }}|t        d| j                   d| d      	 ||_        t        ||||      }| j                  dz   |z   |_        t        | ||       | j                  j                  |       |S # t        $ r"}t        d| j                   d| d      |d }~ww xY w)	N)
__origin____self__zInvalid attribute 'z' for '_OpNamespace' 'r  rJ  r   z'_OpNamespace' 'z' object has no attribute ')	r  rL   rb   _get_packetrK   rE  r  r  r   )	r+   r  namespace_namer  module_namerf   r  r  opoverloadpackets	            r    r  z_OpNamespace.__getattr__  s>   00 %gY.DTYYKqQ  -.b	:oo+n<	!,->!LBz$&tyyk1LWIUVW   $+wN
 '+oo&;n&L# 	g/0		!!  	 !"499+-H	QRS	s   -C 	C6C11C6)ra   rb   rc   rd   r  r  r,   r   r  rE  r  r   r   s   @r    r  r    sF    ( H"S "T "
(3- " 3 " +; " r-   r  c                     t         j                  j                  |       \  }}|1t         j                  j                  j                  ||        ||_        ||fS r%   )r:   r;   _jit_get_operationjit	_builtins_register_builtinrb   )qualname	op_modulerf   r  s       r    r  r  =  sN    44X>B	~ 			--b(;!~r-   c                     t        | j                  | j                  j                        \  }}|J || _        || _        y r%   )r  r  rK  rb   r  )packetrf   r  s      r    _refresh_packetr  G  s<    $V%>%>

@U@UVB>>FJ+Fr-   c                   F     e Zd ZdZd fdZdee   fdZdedefdZ	 xZ
S )_HigherOrderNamespacer  r@   c                 2    t         |   d       g | _        y )Nr~   )r   r,   r  r+   r   s    r    r,   z_HigherOrderNamespace.__init__Q  s    12!	r-   c                 ,    t        | j                        S r%   r  r*   s    r    r  z_HigherOrderNamespace.__iter__U  r  r-   rL   c                     t         j                  |      }|t        d| d      t        | ||       | j                  j                  |       |S )NzJ'_HigherOrderNamespace' 'torch.ops.higher_order' object has no attribute 'r  )ry   r  r  r  r  r   )r+   rL   rf   s      r    r  z!_HigherOrderNamespace.__getattr__X  sX    ""4(: \]a\bbcd  	dB			r-   )r@   N)ra   rb   rc   r  r,   r   r  r  rx   r  r   r   s   @r    r  r  N  s1    H"(3- 	 	(; 	r-   r  c                   P     e Zd ZdZ fdZdedefdZdee   fdZ	d Z
d Z xZS )	_Opsz_ops.pyc                 n    t         |   d       t               | _        t	               | _        g | _        y )Nr  )r   r,   r  loaded_librariesr  r}   r  r  s    r    r,   z_Ops.__init__g  s,    % #13	r-   rL   r@   c                 l    t        |      }t        | ||       | j                  j                  |       |S r%   )r  r  r  r   )r+   rL   r   s      r    r  z_Ops.__getattr__m  s0     &	dI&		r-   c                 ,    t        | j                        S r%   r  r*   s    r    r  z_Ops.__iter__t  r  r-   c                 .    t        j                  |       y)a{  
        Imports a Python module that has torch.library registrations.

        Generally, to extend PyTorch with custom operators, a user will
        create a Python module whose import triggers registration of
        the custom operators via a torch.ops.load_library call or a call
        to one or more torch.library.* APIs.

        It is unexpected for Python modules to have side effects, so some
        linters and formatters will complain. Use this API to import Python
        modules that contain these torch.library side effects.

        Args:
            module (str): The name of the Python module to import

        N)	importlibimport_module)r+   modules     r    r  z_Ops.import_modulew  s    " 	'r-   c                    t        j                  |      }t               5  	 t        j                  |       	 ddd       | j                  j                  |       y# t
        $ r}t        d|       |d}~ww xY w# 1 sw Y   ExY w)a  
        Loads a shared library from the given path into the current process.

        The library being loaded may run global initialization code to register
        custom operators with the PyTorch JIT runtime. This allows dynamically
        loading custom operators. For this, you should compile your operator
        and the static registration code into a shared library object, and then
        call ``torch.ops.load_library('path/to/libcustom.so')`` to load the
        shared object.

        After the library is loaded, it is added to the
        ``torch.ops.loaded_libraries`` attribute, a set that may be inspected
        for the paths of all libraries loaded using this function.

        Args:
            path (str): A path to a shared library to load.
        zCould not load this library: N)	r   resolve_library_pathr!   r   CDLL	ExceptionOSErrorr  r   )r+   pathr  s      r    load_libraryz_Ops.load_library  s    $ 33D9_ 	MMD!	M 	!!$'  M =dVDE1LM	M 	Ms(   A<A	A9%A44A99A<<B)ra   rb   rc   r  r,   r  r  r  r   r  r  r'  r   r   s   @r    r  r  d  s:    H  (3- (&(r-   r  ops)F)`r   r  r   r  rD   r   typescollections.abcr   r   	functoolsr   typingr   r   r   r	   r
   r   typing_extensionsr   r   r:   torch.utils._pytreer  _pytreer   r   torch._Cr   rk   r   torch._functorch.pyfunctorchr   r   r   r   r]   r   r   r   hasattrr   r  r!   r#   rw   ry   dictr  rV  r  r  r  r  AutocastCPUAutocastCUDAAutocastXPUr   ABCrx   r   r   r   r   r  r9  r%  r-  r1  r   r4  r   r  r  r;  r>  r@  rB  r:  r  r  r  r   r  rE  r2   r3   r  
ModuleTyper  r  r  r  r  r(  rU   r-   r    <module>r9     s   
     
  . % L L 0  $ $ ! X J : H T3tS! C!12UwsDT7U  & & I" I"Z2UL 2U[ 2Uj 79 4223 8   !!6 2Z, Zz38
,
 
& &C%D "#L$XNM7: .
 !$
C % 

nwr2v nnQ(*RV, Q(hR5#7#7 RD RuEwr2v uEt% R % )+% <>II% % nA 5## A H,E,, ,A(5 A(J FT r-   