
    ^jO                   N   U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d d	l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d d
l+m,Z, d dl-Z-d dl-m.Z.m/Z/m0Z0 d dl1m2c m3c m4Z5 d dl6m7c m8Z8 d dl9m7c m:Z; d dl<Z=d dl>Z=d dl?m:c m@ZA d dlBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZM d dlNmOZO d dlPmQZQmRZR d dlSmTZTmUZUmVZVmWZWmXZXmYZY d dlZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZe d dlfmgZg d dlhmiZi d dljmkZk d dllmmZmmnZnmoZompZpmqZqmrZr d dlsmtZt ddlumvZvmwZw ddlxmyZymzZzm{Z{m|Z|m}Z} ddlwm~Z~mZmZmZmZmZ ddlmZ dd lmZmZmZmZ dd!lmZ dd"lmZmZ dd#l:mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd$lmZmZmZ e r+d d%lZmZ d d&lfmZ d d'lmZ dd(lmZ dd)lmZ dd*lmZ dd+l:mZ neZd,ed-<   	 d dlZejp                  Zd.Z e(d0      Z e"d1      Z e"d2      Z e"d3      Zee.z  Zd,ed4<   eez  e.z  Zd,ed5<   e=j                  j                  e=j                  j                  z  Zd,ed6<    ej                  eɫ      Z ej*                  e	j                  d78      Ze=jN                  j                  Z	 e#ed9eed9f   d:d;ee#eeed9f   d9d:d;f   dz     f   Zd,ed<<   dBd=Z ej                  d.>       G d? d@             ZҐdCdAZӐdDdBZԐdEdCZՐdEdDZ	 	 	 	 	 	 dFdEZg dFZg dGZ	 dG	 	 	 	 	 dHdHZڐdIdIZ	 dG	 	 	 	 	 dHdJZedJdKdK       Ze	 dJ	 	 	 	 	 dLdL       Z	 dJ	 	 	 	 	 dMdMZ	 	 	 	 dNdNZ	 	 	 	 dOdOZߐdPdPZdPdQZdQdRZ	 	 	 	 	 	 	 	 dRdSZ	 	 	 	 	 	 dSdTZdTdUZdUdVZdW Z G dX d;      Z ed/>       G dY dZ             Ze G d[ d\e             ZdVd]Ze G d^ d_e             Ze G d` dae             Z edb       edc       edd       ede       edf       edf       edg      dhZdiedj<   	 dW	 	 	 	 	 	 	 dXdkZe G dl dme             Zd e/d       f	 	 	 	 	 	 	 dYdnZeee.   ee.   gef   Zd,edo<    G dp dqe      Z G dr dse      Z G dt due      Z G dv dwe      Ze G dx dye             Ze G dz d{e             Ze G d| d}e             ZdZd~ZdZdZdZdZ	 	 	 	 	 d[	 	 	 	 	 	 	 	 	 	 	 	 	 d\dZ	 	 	 	 	 	 d]dZd^dZe G d de             Z e G d de              Ze G d de              Ze G d de              Ze G d de              Ze G d de             Ze G d de              Ze G d de              Z G d de      Ze G d de             Z	e G d de	             Z
e G d de	             Z	 	 	 	 	 	 d_dZd`dZ G d d      Ze G d de             Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Ze G d de             Z G d de      Z ed/>       G d deez             Z ed/>       G d dee             Z G d de      Z G d de      Z G d de      Ze G d de             Ze G d de             Z ed/>       G d de             Z ej                  d.>       G d d             Z G d dÐe      Z  G dĄ dŐe       Z!eez  e"z  ez  e#eez  ez  e"z     z  Z$ G dƄ dǫ      Z% G dȄ dɐe%      Z& G dʄ dːe!      Z' G d̄ d͐e       Z( G d΄ dϐe       Z) G dЄ dѐe       Z* G d҄ dӐe       Z+	 	 	 	 dadԄZ, ed/>       G dՄ d֐e             Z- G dׄ dؐe-      Z. G dل dڐe.      Z/ej`                  dbdۄ       Z1	 	 	 	 dcd܄Z2 ed/>       G d݄ dސe-             Z3 ed/>       G d߄ de3             Z4 G d de4      Z5 G d de3      Z6 G d de      Z7 G d de3      Z8 G d de8      Z9 G d de8      Z: G d de3      Z; G d de3      Z< G d de3      Z= G d de3      Z> G d de3      Z? G d de?      Z@ G d de6      ZA G d de3      ZB G d de3      ZC G d d e4      ZD G d de3      ZE G d de3      ZF G d de3      ZG G d de3      ZH ed/>       G d	 d
             ZI G d de6      ZJ ed/>       G d deJ             ZK G d deJ      ZLe G d de             ZM G d de3      ZN G d deN      ZO G d deN      ZPdddZQ G d deJ      ZRej                   G d de             ZS G d d9eS      ZT G d d eS      ZU ed/>       G d! d"e             ZVded#ZW ed/>       G d$ d%e3             ZX ed/>       G d& d'e3             ZY	 	 	 	 dfd(ZZ ed/>       G d) d*e3             Z[ G d+ d,eJ      Z\ G d- d.e      Z]e G d/ d0e]             Z^e G d1 d2e]             Z_e G d3 d4e]             Z`e G d5 d6e]             Za G d7 d8eJ      Zb G d9 d:eb      Zc G d; d<eb      Zd G d= d>eb      Zedgd?Zfdgd@ZgdhdAZhy# e$ r dZd/ZY 	w xY w(i      )annotationsN)Callable	GeneratorIterableIteratorSequence)AbstractContextManagernullcontext)Enum)partial)Number)AnycastClassVarLiteraloverloadSupportsFloatSupportsIntTYPE_CHECKING	TypeAliasTypeVarUnion)assert_neverNeveroverride	ParamSpecSelfTypeIs)patch)ExprIntegerSymbol)enable_python_dispatcher)identity)GraphModuleSerializer)can_auto_functionalize)metricsget_free_symbols)FakeScriptObject)get_opaque_obj_repris_opaque_value)compute_required_storage_lengthis_boolean_dtype(is_contiguous_for_memory_format_or_falseis_float_dtypemake_channels_last_strides_for
StrideType)&_remove_effect_token_unbacked_bindingscompute_unbacked_bindingsfree_symbolsfree_unbacked_symbolsGuardOnDataDependentSymNodehas_free_unbacked_symbolsIterateExprsrebind_unbackedresolve_unbacked_bindingsShapeEnvSymTypes)Node
OrderedSet)_disable_current_modes)CleanDivFloorDivMaxMinModModularIndexing)SymT   )configdependencies)BackendFeatureCodegenSymbolget_scheduling_for_deviceindex_prevent_reorderingKernel)Depextract_free_symbols#extract_input_node_reduction_rangesextract_read_writesSymbolUsageCollectorOpsHandlervar_builder)LoopBody)OpCounterCSEOpCountResultReductionType	StoreMode)benchmarker)DevicePropertiesReductionHint)argsortargsort_symcache_on_selfcache_on_self_and_argsceildivconvert_shape_to_inductorconvert_shape_to_symintdeveloper_warningdo_bench_using_profilingdtype_from_sizeget_dtype_sizeget_kernel_metadataGPU_ALIGN_BYTESir_dataclass
is_dynamicis_gpu	sympy_dotsympy_index_symbolsympy_index_symbol_with_prefixsympy_product
sympy_substensor_is_aligned)opsOpsValueV)SympyBoolean)Argument)IntLikeType)CUTLASSTemplate)PythonWrapperCodegen)GraphLowering)IndentedBufferr   r{   TF_P_T_U_V_IntLike_NumLike_OpOverloadsz  prefix	TensorBoxr"   IRNode_NodeOrNodesc                .    t        | t        t        f      S N)
isinstanceintr!   xs    ]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/ir.py
_is_staticr      s    a#w((    )frozenc                  J    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   y)GraphPartitionSignatureOrderedSet[sympy.Symbol]symbol_inputsz*dict[str, IRNode | Expr | TorchBindObject]input_nodeslist[IRNode]output_nodeszdict[str, bool]input_deallocationboolskip_cudagraph	list[str]constant_namesN__name__
__module____qualname____annotations__ r   r   r   r      s.     ,+ <; (' r   r   c                "    dfd |        y )Nc                   | y t        | t        t        f      r| D ]
  } |        y t        | t              r| j	                         D ]
  } |        y t        | t
        t        t        t        t        j                  j                  j                  t        t        t        t         t"        f
      sJ dt%        |        d       y )NzFound zE, which is not a supported top level IR node. See [Note: Inductor IR])r   listtupledictvalues
ExpandViewDynamicScalarAssertScalarr   sympylogicboolalgBooleanr    r   EffectfulKernelShapeAsConstantBufferOpaqueMultiOutputtype)nodesnode_check_tensorboxs     r   r   z%validate_ir.<locals>._check_tensorbox   s     =e}- ' &'t$ ' &' ! KK''//#)%  e%jk r   )r   _NodeOrNodes | NonereturnNoner   )node_or_nodesr   s    @r   validate_irr      s    > ]#r   c                T     t         t              sJ t                      d fd}|S )Nc                 0     t        t              | i |S r   )getattrru   )argskwargsnames     r   fnzops_wrapper.<locals>.fn  s    !wsD!42622r   )r   objectr   r   r   rv   )r   strr   )r   r   s   ` r   ops_wrapperr     s(    dC ,$t*, 3 Ir   c           
     b    t        t        | t        t        |                         dfd}|S )Nc                    t        |       t              k(  sJ t        t        |             D cg c]
  }| |       c}S c c}w r   lenrange)indexi	inv_orders     r   reindexz inverse_reorder.<locals>.reindex%  s?    5zS^+++-23u:->?il#???   Ar   Sequence[_T]r   r   )r   zipr   r   )orderr   r   s     @r   inverse_reorderr   "  s*    Sc%j 123I@ Nr   c                     d fd}|S )Nc                    t        |       t              k(  sJ t        t        |             D cg c]
  }| |       c}S c c}w r   r   )r   r   r   s     r   r   zsame_reorder.<locals>.reindex-  s>    5zSZ''').s5z):;AeAh;;;r   r   r   )r   r   s   ` r   same_reorderr   ,  s    < Nr   c                     d fd}|S )Nc                       |             S r   r   )r   reindex1reindex2s    r   r   z fuse_reindexing.<locals>.reindex8  s    ((r   )r   r   r   zSequence[_V]r   )r   r   r   s   `` r   fuse_reindexingr   4  s    ) Nr   )   r      rI   )   r   r   r   rI   c                `    |t        d | D              rt        |       }|S t        ||       }|S )z1
    Convert strides to fill order (argsort)
    c              3  \   K   | ]$  }t        |t        t        j                  f       & y wr   r   r   r   r!   .0ss     r   	<genexpr>z!get_fill_order.<locals>.<genexpr>H  s      Q
1sEMM.B CQ   *,)allr_   r`   )seq	shape_env
sorted_idxs      r   get_fill_orderr   B  s<     CQSQQ$+CL
  !C0
r   c                    t        |       D ci c]  \  }}||
 }}}t        t        |             D cg c]  }||   	 }}|S c c}}w c c}w )z
    Convert stride order to fill order
    For channel last format,

    stride order = [3, 0, 2, 1] and fill order = [1, 3, 2, 0]
    )	enumerater   r   )r   idxposlookupr   
fill_orders         r   stride_order2fill_orderr   P  sR     (1'7883c3h8F8%*3u:%67&)7J7 97s
   AAc                    t        | |      }t        t        |             D cg c]  }d }}t        |      D ]
  \  }}|||<    |S c c}w )z)
    Convert strides to stride order
    r   )r   r   r   r   )r   r   r   _outr   elems          r   get_stride_orderr   \  sV     !/sI >JCHo
&1
&C
&Z( 4D	J 's   	Ac                     y r   r   r   replace_symbols_with_hintss     r   ir_node_to_tensorr   i  s    RUr   c                     y r   r   r   s     r   r   r   m  s     r   c                   | y |r%t         j                  j                  j                  }nt        }| j                         D cg c]
  } ||       }}t        |       r.| j                         j                  D cg c]
  } ||       }}nt        j                  |      }| j                         }| j                         }t        |      }t        |      }t         j                  j                  j                  j                         5  t!        j"                  ||||      j%                         }d d d        |S c c}w c c}w # 1 sw Y   S xY w)N)sizestridedtypedevice)rw   graphsizevarsoptimization_hintr$   get_sizeis_storage_and_layout
get_layoutr  FlexibleLayoutcontiguous_strides	get_dtype
get_devicere   r   suppress_guardstorchempty_stridedzero_)	r   r   shape_fnr   r  r  r  r  ts	            r   r   r   s  s    	y "77##55!".AHQK.D.Q'(||~'<'<=!(1+==2248KKME\\^F"4(D$V,F	
			#	#	3	3	5 fE&

%' 	
 H / > Hs   D<;E
(EEc                0    t        | t              r| sd gS | S r   )r   r   values    r   may_convert_to_optionalr    s     %u vLr   c                    t        | t              s| | S t        | t        j                        r| j                  S t        | t
        t        f      rt        | j                               S t        d|  dt	        |       j                   d       y )Nzget_device_type(: ))r   r   r  r  r   r   
OutputSpecget_device_typer  r   r   r   s    r   r  r    sq     !SQY	Au||	$vv	A
+	,q||~..#A3ba)9)9(:!<=r   c                    t        |       }|dv rt        t        | d      dk(  ryy|t        |      x}yddlm} t        |t              sJ t        |             t        ||      S )N)cpucudaxpu_backendtritonTFrI   )TritonScheduling)	r  r   rJ   rN   codegen.tritonr&  r   r   
issubclass)r   r  device_schedulingr&  s       r   	is_tritonr*    sz    QF ''6fXX./8;!:6!BBK0'.G5F0GG.')9::r   c                    t        |       dk(  S )Nr!  )r  r   s    r   is_cpur,    s    1&&r   c                @   t        | t              rB| j                         2t        | j	                               st        | j                               ryt        j                  fd| j	                         d d D         }t        j                  t        j                  | j	                         d   d      t        j                  | j                         d   d            }t        j                  ||      }t        j                  j                  j                  |      S )NFc              3  ^   K   | ]$  }t        j                  t        |      d        & ywr   N)r   EqrF   )r   r   	alignments     r   r   z-is_aligned_realized_tensor.<locals>.<genexpr>  s#     	FQ%((3q)$a
(	Fs   *-rI   )r   r   maybe_get_strider6   
get_strider
  r   AndOrr0  Lerw   r  r  guard_or_false)r   r1  aligned_stridesaligned_last_dim
is_aligneds    `   r   is_aligned_realized_tensorr<    s    q&!' 0 .ii	F!,,."2E	FO xx#Q'!**,r2BA)F ?,<=J 77**:66r   c                d   t        |      t        |       k(  rt        |       t        |      k(  sJ t        || |      D ]p  \  }}}t        j                  j                  j                  |d      r2t        j                  j                  j                  t        j                  ||            rp y y)zP
    Returns true if the strides are equal, ignoring dimensions of size 1 .
    rI   FT)	r   r   rw   r  r  statically_known_leqr8  r   r0  )strides1strides2shapedims1s2s         r   significant_strides_equalrE    s     u:X&3x=CM+III5(H5 R7700a8ww..uxxB/?@ r   c                Z   t        |       s| S t        d t        || j                               D              r| S t	        || j                         | j                               s| S t        |       \  }}g |j                  }t        | j                               D ]8  \  }}t        j                  j                  j                  |d      s1||   ||<   : t        |j                  |j                  |j                   ||j"                  |j$                        }t'        t)        ||            S )a  
    Tries to match the strides of the tensor to those in the meta_strides. Strides of insignificant
    dimensions - size 0 or 1 - will be updated.

    If there are real stride differences (NHWC vs NCHW), or the tensor is not realized, then the input will be returned
    c              3  v   K   | ]1  \  }}t         j                  j                  j                  ||       3 y wr   rw   r  r  statically_known_equalsr   rC  rD  s      r   r   z2try_match_insignificant_strides.<locals>.<genexpr>  s3      B 	
00R8   79rI   datalayout)r  r   r   r4  rE  r
  as_storage_and_layoutr  r   rw   r  r  r>  FixedLayoutr  r  r  offset	is_pinnedr   ReinterpretView)tensorstridesstorage
old_layout
new_strider   r   
new_layouts           r   try_match_insignificant_stridesrZ    s    !(
 '6#4#4#67  $Wf.?.?.A6??CTU/7GZ%:$$%J&//+, '17700A6#AJJqM' J _'*EFFr   c                    | j                   j                  d      d   }t        |j                        D cg c]  \  }}|	 c}}|j                  d<   ddlm}  ||        y c c}}w )Noutputopr   user_visible_output_idxs)record_original_output_strides)r  
find_nodesr   r   metatorch._inductor.compile_fxr`  )gmoutput_noder   r   r`  s        r   gm_original_output_stridesrf    sa    ((%%%215K#K$4$454Q4K/0 J"2&4s   A$c                    t               }| D ]>  }|t        |j                         d      z  }|t        |j                         d      z  }@ t	        |      S )NFunbacked_only)r@   r)   r
  r4  r   )inputssym_varsinps      r   get_symbolic_inputsrm    sW    !+H L$S\\^5II$S^^%5UKKL >r   c                    t        | t              r| j                  } t        | t              r| j	                         } t        | t
              r| j                  } t        | t              r| j                         S d S r   )r   r   rM  BaseViewunwrap_view
StorageBoxBufferget_namer   s    r   try_get_namert  %  sW    !YFF!XMMO!Z FF%a01::<:d:r   c                     e Zd ZU dZ e       Zded<   dZded<    ej                  d      Z
d	ed
<    ej                  d      Zded<    ej                  d      Zded<    ej                  d      Zded<    ej                  d      Zded<   eej"                  dRd              Zeej"                  	 	 	 	 dSd              ZedTd       ZdUdZdVdZdWdZdXdZdYdZdZdZd[dZd\dZdXdZd]d^d Z	 d_	 	 	 	 	 	 	 d`d!Zdad"Z dbd#Z!dcd$Z"ddd%Z#ded&Z$dfd'Z%dgd(Z&dhd)Z'did*Z(e)djd+       Z*dkd,Z+dgd-Z,dld.Z-dmdnd/Z.dod0Z/dpd1Z0dgd2Z1dqd3Z2drd4Z3dhd5Z4did6Z5dsd7Z6dld8Z7dgd9Z8dmdtd:Z9dd;dud<Z:dWd=Z;dUd>Z<dWd?Z=	 dv	 	 	 	 	 dwd@Z>dxdAZ?dydBZ@	 dv	 	 	 	 	 dzdCZAd{dDZBd|dEZCd}dFZDd~dGZE	 dv	 	 	 ddHZFdldIZGddJZHdgdKZIdgdLZJddMZKddNZLdsdOZMddPZNeOr
e)dadQ       ZPyy)r   zBase class for all intermediate representation (IR) nodes in TorchInductor.

    Note:
        This is an abstract base class. Most methods raise NotImplementedError
        and must be overridden by concrete subclasses.
    zClassVar[OrderedSet[Any]]_current_originsNzClassVar[int | None]_current_stream_idxF)initOrderedSet[Any]originslist[str] | None	tracebacktorch.fx.Node | Noneorigin_nodedict[str, Any]r   
int | None
stream_idxc              #     K   t         j                  }|| z  t         _        	 d  |t         _        y # |t         _        w xY wwr   )r   rv  )rz  olds     r   current_originszIRNode.current_originsD  s7      %%"%-	*&)F#cF#s   A2 A?Ac              #     K   t         j                  }| t         _        	 d  |t         _        y # |t         _        w xY wwr   )r   rw  )r  r  s     r   current_stream_idxzIRNode.current_stream_idxN  s3     
 ((%/"	-),F&F&s   ?/ ?<?c                L    t        | t        t        t        t        t
        f      S r   )r   ComputedBufferInputsKernelInputBufferrS  TemplateBuffer)r   s    r   is_realized_nodezIRNode.is_realized_nodeZ  s&    	
 		
r   c                ,    t         j                  |       S r   r   createselfs    r   wrap_for_loweringzIRNode.wrap_for_loweringg  s    %%r   c                2    t         j                  | ||       y r   )r   __setattr__)r  attrr  s      r   _post_init_setattrzIRNode._post_init_setattrj  s     	4u-r   c                >   t        | j                        }| j                  d|       | j                  dt        j                  rt        j                         nd        | j                  dd        | j                  di        | j                  d| j                         y )Nrz  r|  r~  r   r  )r@   rv  r  rJ   debug_ir_tracebackr|  format_stackrw  )r  rz  s     r   __post_init__zIRNode.__post_init__p  s    T223	73V5N5N//1TX	
 	t4r2d.F.FGr   c                B    t        d | j                         D              S )Nc              3  4   K   | ]  }|j                     y wr   r   r   deps     r   r   z(IRNode.get_read_names.<locals>.<genexpr>|       ?s#((?   r@   	get_readsr  s    r   get_read_nameszIRNode.get_read_names{      ?dnn.>???r   c                    | j                   S r   )r|  r  s    r   get_tracebackzIRNode.get_traceback~  s    ~~r   c                    | j                   S r   r~  r  s    r   get_origin_nodezIRNode.get_origin_node      r   c                     y r   r   r  s    r   get_defining_opzIRNode.get_defining_op      r   c                    g S )z'Return subgraphs contained in this noder   r  s    r   get_subgraphszIRNode.get_subgraphs      	r   c                t   t               }| j                  }t        | t              r(| j	                         }| j
                  rt        |g      }|D ]  }t        |d      r(|j                  r|j                  |j                         7t        j                  j                  j                  j                  di       j                  |j                  g       }t        |t              s|D ]J  }t        j                  j                  j                   j                  |d       }|s:|j                  |       L  |S )Nstack_trace	postToPre)r@   rz  r   ExternKernelr  r~  hasattrr  addr  	_inductordebug _inductor_post_to_pre_grad_nodesgetr   r   #_inductor_pre_grad_node_stack_trace)r  stack_tracesrz  r~  r   pre_grad_nodes	node_namer  s           r   get_stack_traceszIRNode.get_stack_traces  s    )3,,dL)..0K$k]3 	6Dt]+0@0@  !1!12 OO))JJNN# c$))R(  ".$7!/ 6I--QQUU%t  
 #$((56	6, r   Tc                   dt        | dd       }|rt        |      dkD  r|d d  d}| j                         s|gS g }| j                         D ]8  }|j                  d       ||j	                  d      z  }|j                  d	       : |g|z   S )
Nzorigins=rz   @   =   z...zstack_traces = {
})r   r   r  appendsplit)r  shortenrz  stack_trace_strr  s        r   common_reprzIRNode.common_repr  s    WT9b9:;s7|b( "c*G$$&9002 	(K""#56{0066O""3'	( y?**r   c                $   t        |      t        | j                  |            z   }t        t        t        |            }|r5t	        dj                  |            }t        |       j                   d| dS t        |       j                   d| dS )Nz,
z(
z
)(r  )r   r  mapr   indentjoinr   r   )r  linesr  	multiline	new_liness        r   
str_helperzIRNode.str_helper  s     Ud4#3#3G#<==Se_%uzz%01I4j))*#i[<<4j))*!E7!44r   c                    | j                   S r   r  r  s    r   r  zIRNode.get_dtype      zzr   c                B    	 | j                         S # t        $ r Y y w xY wr   )r  NotImplementedErrorr  s    r   maybe_get_dtypezIRNode.maybe_get_dtype  s&    	>>##" 		    	c                2    t        dt        |        d      )Nz#get_layout() is not implemented by !r  r   r  s    r   r  zIRNode.get_layout  s    !$GT
|ST"UVVr   c                B    	 | j                         S # t        $ r Y y w xY wr   )r  r  r  s    r   maybe_get_layoutzIRNode.maybe_get_layout  &    	??$$" 		r  c                "    | j                         S r   )r  r  s    r   get_output_speczIRNode.get_output_spec  s      r   c                B    	 | j                         S # t        $ r Y y w xY wr   )r  r  r  s    r   maybe_get_output_speczIRNode.maybe_get_output_spec  s(    	''))" 		r  c                >    t        | j                         t              S )z4True for single tensor output (excludes MultiOutput))r   r  Layoutr  s    r   has_tensor_outputzIRNode.has_tensor_output  s    $446??r   c                2    t        dt        |        d      )Nz!get_size() is not implemented by r  r  r  s    r   r
  zIRNode.get_size  s    !$Ed4j\QR"STTr   c                B    	 | j                         S # t        $ r Y y w xY wr   )r
  r  r  s    r   maybe_get_sizezIRNode.maybe_get_size  %    	==?"" 		r  c                "    | j                         S r   r
  r  s    r   rA  zIRNode.shape  s    }}r   c                4    t        | j                               S r   )rr   r
  r  s    r   	get_numelzIRNode.get_numel  s    T]]_--r   c                    t         j                  j                  j                  t	        j
                  | j                         d            S Nr   rw   r  r  statically_known_truer   r0  r  r  s    r   is_zero_elementszIRNode.is_zero_elements  0    ww55ehht~~?OQR6STTr   c                0    t        dt        |              )a)  
        If the IRNode refers to data which has not been materialized (e.g.,
        it is a Pointwise/Reduction that could potentially have more
        compute fused into it), realize the IRNode into physical memory,
        ending the possibility of fusing into it, but allowing, e.g., multiple
        users to access the data without having to recompute.

        Check StorageBox.realize for a particularly notable implementation.

        TODO(ezyang): I think, in principle, every IRNode should have an
        implementation of this, and most of the time no-op is OK, but you
        really do have to audit each IRNode for this, so for now, raise
        an error if it's not implemented.  Note that some code in graph.py
        will catch this thrown error and suppress it with a warning.
        zrealize NYI on r  r  s    r   realizezIRNode.realize  s      "ODJ<"@AAr   c                0    t        dt        |              )Nzcodegen_reference NYI on r  r  writers     r   codegen_referencezIRNode.codegen_reference  s    !$=d4j\"JKKr   c                     y r   r   r  s    r   r  zIRNode.get_device  r  r   c                .    | j                         }|J |S r   )r  r  r  s     r   get_device_or_errorzIRNode.get_device_or_error  s    "!!!r   c                     yNFr   r  s    r   has_exceeded_max_readszIRNode.has_exceeded_max_reads      r   c                >    t        t        |       j                        r   r  r   r   r  s    r   make_loaderzIRNode.make_loader      !$t*"5"566r   c                >    t        t        |       j                        r   r  r  s    r   make_indexerzIRNode.make_indexer  r  r   c                >    t        t        |       j                        r   r  r  s    r   r4  zIRNode.get_stride  r  r   c                B    	 | j                         S # t        $ r Y y w xY wr   )r4  r  r  s    r   r3  zIRNode.maybe_get_stride"  r  r  c                >    t        t        |       j                        r   r  r  s    r   rs  zIRNode.get_name(  r  r   c                B    	 | j                         S # t        $ r Y y w xY wr   )rs  r  r  s    r   maybe_get_namezIRNode.maybe_get_name+  r  r  c                v    	 | j                         t        j                  j                  v S # t        $ r Y yw xY wr  )rs  rw   r  graph_inputsr  r  s    r   is_input_bufferzIRNode.is_input_buffer1  s4    	==?agg&:&:::" 		s   ), 	88c                     yr  r   r  	thresholds     r   has_large_inner_fnzIRNode.has_large_inner_fn7  r  r   graph_reusec                    y)al  
        Hint that this node's value will be reused.

        `users` estimates the reuse count. When `graph_reuse` is true, this
        represents graph fanout and can trigger fanout-based realization
        heuristics. When false, the reuse comes from loop-level indexing, such
        as a broadcast expand, and should not be treated as graph fanout.
        Nr   r  usersr  s      r   
mark_reusezIRNode.mark_reuse:  s    r   c                     y r   r   r  s    r   realize_hintzIRNode.realize_hintD      r   c                >    t        t        |       j                        r   r  r  s    r   rp  zIRNode.unwrap_viewG  r  r   c                >    t        t        |       j                        r   r  r  s    r   freeze_layoutzIRNode.freeze_layoutJ  r  r   c                >    t        t        |       j                        r   r  r  r   allow_paddings      r   freeze_layout_with_stride_orderz&IRNode.freeze_layout_with_stride_orderM       "$t*"5"566r   c                >    t        t        |       j                        r   r  r  r   s     r   freeze_layout_with_fill_orderz$IRNode.freeze_layout_with_fill_orderR  r  r   c                >    t        t        |       j                        r   r  r  r  s     r   freeze_layout_with_same_orderz$IRNode.freeze_layout_with_same_orderU  r  r   c                >    t        t        |       j                        r   r  r  exact_stridesr%  s      r    freeze_layout_with_exact_stridesz'IRNode.freeze_layout_with_exact_stridesX  r'  r   c                >    t        t        |       j                        r   r  r  s    r   get_read_writeszIRNode.get_read_writes]  r  r   c                6    | j                         j                  S r   r3  readsr  s    r   r  zIRNode.get_reads`      ##%+++r   c                4    t        | j                               S r   )r   r  r  s    r   	num_readszIRNode.num_readsc  s    4>>#$$r   c                >    t        t        |       j                        r   r  r  s    r   get_storage_numelzIRNode.get_storage_numelf  r  r   c                >    t        t        |       j                        r   r  r  ri  s     r   get_free_symbol_useszIRNode.get_free_symbol_usesi  r'  r   c                >    t        t        |       j                        r   r  r  s    r   get_reduction_typezIRNode.get_reduction_typen  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_reduction_sizezIRNode.get_reduction_sizeq  r  r   c                     yr  r   r  s    r   	is_externzIRNode.is_externt  r  r   c                     yr  r   r  s    r   is_no_opzIRNode.is_no_opw  r  r   c                >    t        t        |       j                        r   r  r  s     r   constant_to_devicezIRNode.constant_to_devicez  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_mutation_nameszIRNode.get_mutation_names}  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_operation_namezIRNode.get_operation_name  r  r   c                >    t        t        |       j                        r   r  r  s    r   get_inputs_that_alias_outputz#IRNode.get_inputs_that_alias_output  r  r   c                     y r   r   r  s    r   r  zIRNode.dtype  s    (+r   )rz  zOrderedSet[Node]r   Generator[None, None, None])r  r  r   rP  r   r   r   r   r   r   )r  r   r  r   r   r   r   r   r   OrderedSet[str])r   r{  r   r}  r   zOperation | Noner   zlist[Subgraph]T)r  r   r   Sequence[str])TT)r  zSequence[object]r  r   r  r   r   r   r   torch.dtype)r   ztorch.dtype | Noner   r  )r   zLayout | Noner   r  )r   zOutputSpec | Noner   r   r   Sequence[_IntLike])r   Sequence[_IntLike] | None)r   z)_IntLike | sympy.Rel | Sequence[_IntLike]r   r    r   
str | Noner   r  zIndentedBuffer | Noner   r   r   torch.device | Noner   torch.devicer   $Callable[[Sequence[Expr]], OpsValue]r    Callable[[Sequence[Expr]], Expr]r   r   r  r  r   r   r  r   r  r   r   r   Fr   Sequence[int]r%  r   r   r   r   rt  r   r   r  ra  r   r   r0  ra  r%  r   r   r   r   dependencies.ReadWritesr   zOrderedSet[Dep]r   r   r   r   ri  r   r   r   r   Sequence[Expr]r  rj  r   r   r   rZ  )Qr   r   r   __doc__r@   rv  r   rw  dataclassesfieldrz  r|  r~  r   r  staticmethod
contextlibcontextmanagerr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  propertyrA  r  r  r  r  r  r   r  r  r
  r4  r3  rs  r  r  r  r  r  rp  r"  r&  r*  r-  r1  r3  r  r9  r;  r>  r@  rB  rD  rF  rH  rJ  rL  rN  r   r  r   r   r   r   r   /  s    3=,/>04-4  1{00e<G_<"3+"3"3"?I?(9(9(9u(EK%E"3+"3"3"?K?.[..E:J
:*  * --	$-  - 

 

&.	H@ B+  PT
5%
504
5HL
5	
5W!@U  .UB$L
7777 =A 77 ;@7"7377	7
77 HM7/7@D7	7
7,%7 %*7!7	!7
777777 	+ 
+ r   c                      e Zd ZddZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZd dZd!dZd"dZ	 d#	 	 	 d$dZd%dZy)&	Operationc                     d | _         i | _        y r   )operation_name_config_patchesr  s    r   r  zOperation.__post_init__  s    *./1r   c                    t         r   r  r  s    r   r  zOperation.get_device      !!r   c                6    t        | d      sJ | j                  S Nr~  )r  r~  r  s    r   r  zOperation.get_origin_node  s    t]+++r   c                6    t        | d      sJ | j                  S )Nrz  )r  rz  r  s    r   get_originszOperation.get_origins  s    tY'''||r   c                6    t        | d      sJ | j                  S )Nr  )r  r  r  s    r   get_stream_idxzOperation.get_stream_idx  s    t\***r   c                6    | j                   J | j                   S r   )r  r  s    r   rL  zOperation.get_operation_name  s     ""..."""r   c                    | j                   S )zHGet config patches for this operation (e.g., coordinate_descent_tuning).r  r  s    r   get_config_patcheszOperation.get_config_patches  s    ###r   c                    || _         y)z&Set config patches for this operation.Nr  )r  patchess     r   set_config_patcheszOperation.set_config_patches  s
    &r   c                     yr  r   r  s    r   rD  zOperation.is_extern  r  r   c                     yr  r   r  s    r   rF  zOperation.is_no_op  r  r   c                    t         r   r  r  s    r   r3  zOperation.get_read_writes  r  r   c                &    || j                         v S r   )r  r  r   s     r   
is_user_ofzOperation.is_user_of  s    t**,,,r   c                B    t        d | j                         D              S )Nc              3  4   K   | ]  }|j                     y wr   r  r  s     r   r   z+Operation.get_read_names.<locals>.<genexpr>  r  r  r  r  s    r   r  zOperation.get_read_names  r  r   c                6    | j                         j                  S r   r5  r  s    r   r  zOperation.get_reads  r7  r   c                    t         r   r  r  s    r   get_outputszOperation.get_outputs  r  r   c                    t               S r   r?   r  s    r   get_unbacked_symbol_defsz"Operation.get_unbacked_symbol_defs  
    |r   c                    t               S )a  
        When unbacked_only=True:
        Returns the unbacked symbols which are required to be in scope in
        order to successfully perform codegen for this buffer.  For example,
        a buffer that corresponds to an extern kernel call that takes i0 as
        an argument would return {i0} here.  This is used to generate necessary
        dependencies that ensure we actually bind i0 in codegen before you
        try to use it.

        Note that this is NOT transitive; in particular, if this buffer takes
        in as input another buffer with dynamic shape (e.g., (i0,)), we will
        not report it here, because you will already have a dependency
        on that buffer, which will eventually have a dependency on i0 if
        necessary.

        When unbacked_only=False:
        Similar to `unbacked_only=True` but including all free symbols
        instead of only free unbacked symbols.
        r?   r=  s     r   r>  zOperation.get_free_symbol_uses  s    , |r   c                     y)z
        Gets extra global memory size needed by this buffer.
        Some algorithms (e.g. group gemm) may require extra global memory in the generated code.
        r   r   r  s    r   get_workspace_sizezOperation.get_workspace_size  s    
 r   NrS  rg  rV  )r   ry  )r   r  ro  )r   r  )r  r  r   r   r_  rx  )r   r   r   r   rT  rz  r   list[Buffer]r   r   rr  r}  r{  )r   r   r   r  r  r  r  r  rL  r  r  rD  rF  r3  r  r  r  r  r  r>  r  r   r   r   r  r    sr    2" #$'"-@," %*!	!0r   r  c                  J   e Zd ZU dZded<   ded<   ded<   ded	<    ed       	 d 	 	 	 d!d
       Zd"dZd#dZeZ	d$dZ
d%dZd&dZd&dZed'd       Zeej$                  fd(d       Zed)d       Zd*dZed#d       Zd+d,dZd d-dZd.dZd/dZd0dZd1dZd2dZd3dZd4dZ y)5Loopsz:Base class for pointwise and reduction loop-body IR nodes.rj  r  r\  r  Callable[..., Any]inner_fnra  rangesc                     t               j                  g fd| j                  D        | j                         S )Nc              3  6   K   | ]  }t        |        y wr   r(   r   eri  s     r   r   z-Loops.get_free_symbol_uses.<locals>.<genexpr>  s     FQq-0F   )r@   unionr  inner_fn_free_symbolsr=  s    `r   r>  zLoops.get_free_symbol_uses  s@     "z|!! 
F$++F
&&}5
 	
r   c                   | j                  d| j                  j                   dt        | j                        | j                         g|D cg c]  }| dt        | |        c}z   d| j                  gz         S c c}w )N'=origin_node=)r  r  r   r   r  inner_fn_strr   r~  )r  namesr   s      r   _to_strzLoops._to_str  s    DKK$$%Q'DJJ!!#
 <AA4$qt,-.AB d..1234
 	
 Bs   A?
c                $    | j                  d      S Nr  r  r  s    r   __str__zLoops.__str__      ||K((r   c                    | j                   S r   r  r  s    r   r  zLoops.get_device      {{r   c                    | j                   S r   r  r  s    r   r  zLoops.get_origin_node
  r  r   c                    | j                   S r   r  r  s    r   r
  zLoops.get_size  r  r   c                    | j                   S r   r  r  s    r   get_pointwise_sizezLoops.get_pointwise_size  r  r   c                    |j                  dd       }|j                  dd       } | |i |}|j                  d|       |j                  d|xs |j                         t        j	                  |      S )Nr~  r|  )popr  r|  r   r  )clsr   r   r~  tbrs         r   r  zLoops.create  sm    jj5ZZT*   	
]K8	["*;<""r   c                    t        |       D cg c]0  \  }}|dk(  rt        j                  j                  nt	        ||      2 c}}S c c}}w NrI   )r   r   SZerorq   )r  r   nr   s       r   _indexzLoops._index  sH     "&)
1 FEGGLL(Fvq(QQ
 	
 
s   5Ac                `   t        t        j                               }t        j                  |      5  t	        j
                  t        dd      5   | j                  | j                           |j                         cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY wNallow_indexingT)
rX   rw   MockHandlerset_ops_handlerr   r   r  r  inner_fn_argsgetvalue)r  	opcounters     r   inner_fn_opcountzLoops.inner_fn_opcount&  s     1	i(	(LL)94@	( DMM4--/0%%'	( 	( 	( 	( 	( 	( 	(s#   B$-B<	B$B	B$$B-c                :    | j                  | j                        fS r   )r  r  r  s    r   r  zLoops.inner_fn_args0  s    DKK(**r   c                r    t        j                  j                  | j                  g| j	                          S r   )rw   KernelFormatterHandlerir_to_stringr  r  r  s    r   r  zLoops.inner_fn_str3  s3    ''44MM
 ..0
 	
r   Nc                    |d}t         j                  }|-t        |       rt         j                  }n#t         j                  }nt        |t              sJ t        ||      }| j                         j                  |kD  S r  )
rJ   realize_opcount_thresholdr,  realize_cpu_opcount_threshold"_realize_opcount_threshold_defaultr   r   maxr  num_ops)r  r  r  s      r   r  zLoops.has_large_inner_fn9  sv    I$*$D$D!$,d|,2,P,P),2,U,U)7===	#<=	$$&..::r   c                h    | j                  | j                        }t        | j                  ||      S Nrh  )r  r  rR   r  )r  ri  r   s      r   r  zLoops.inner_fn_free_symbolsG  s'    DKK(#DMM5VVr   c                    | j                  | j                        }t        |      }t        j                  |      5  | j                  |       d d d        |j                  S # 1 sw Y   |j                  S xY wr   )r  r  rU   rw   r  r  usages)r  symbolr   handlers       r   collect_inner_fn_symbol_usagez#Loops.collect_inner_fn_symbol_usageL  sb    DKK(08g&	! MM% 	! ~~		! ~~s   A""A6c                |   t        j                  t        dd      5  | j                         rJt	        | j                         | j                         | j                               j                  cd d d        S t	        | j                         | j                               j                  cd d d        S # 1 sw Y   y xY wr  )	r   r   r  r@  rT   r  r
  rB  r6  r  s    r   r  zLoops.get_readsU  s    \\.*:DA 	&&(*$$&MMO++- %	 	 +$$&MMO %	 	 	s   AB271B22B;c                H    t        | j                         j                        S r   )r@   r  read_buffersr  s    r   r  zLoops.get_read_namesc  s    $//1>>??r   c                H    t        | j                         j                        S r   )r   r  r  r  s    r   r9  zLoops.num_readsf  s    4((*7788r   c                2    t        dt        |        d      )Nz+get_reduction_size() is not implemented by r  r  r  s    r   rB  zLoops.get_reduction_sizei      !9$t*QG
 	
r   c                2    t        dt        |        d      )Nz+get_reduction_type() is not implemented by r  r  r  s    r   r@  zLoops.get_reduction_typen  r  r   c                2    t        dt        |        d      )Nz+constant_to_device() is not implemented by r  r  r  s     r   rH  zLoops.constant_to_devices  r  r   rr  r}  )r  rZ  r   r   ro  rg  rV  r`  )r   r   r   r   r   r   )r  ra  r   rH   r   r  )r   rY   r   zSequence[Sequence[_IntLike]]r   rp  ri  r   r   OrderedSet[Symbol])r  r"   r   rU  rz  rT  r{  r~  rd  r  )!r   r   r   r  r   rb   r>  r  r  __repr__r  r  r
  r  classmethodr  r  rH   INDEXr  ra   r  r  r  r  r  r  r  r  r9  rB  r@  rH  r   r   r   r  r    s    D  G$$)
!
	!
 %
	
) H  	# 	# :>** 
 
 ( (+ 
 

;W
@9




r   r  c                   |j                   rt        j                  t        d      |      S t        j                  d|      S )Nnanr   )is_floating_pointru   constantfloat)r   r  s     r   nop_loader_fnr
  y  s1    ||E%L%00||Au%%r   c                  P    e Zd ZddZd	dZeZd
dZddZ	 	 	 	 	 	 	 	 ddZddZ	y)	Pointwisec                p    | j                         rt        t        | j                        S | j                  S Nr  )r  r   r
  r  r  r  s    r   r  zPointwise.make_loader  s)      "=

;;}}r   c                $    | j                  d      S r  r  r  s    r   r  zPointwise.__str__  r  r   c                    g S r   r   r  s    r   rB  zPointwise.get_reduction_size  s    	r   c                     y r   r   r  s    r   r@  zPointwise.get_reduction_type  r  r   c                p    | j                         }t        j                  |xs d ||       ||            S Nunnamed)r  ru   storer  output_nameindexervarsloaders        r   store_outputzPointwise.store_output  s2     !!#yy1	74=&,OOr   c                    | j                         } t        j                  t        d|      |      }t	        || j
                  || j                        S FMove this to a given device. Requires that all reads are to constants.override_devicer  r  r  r  )r  r   r   ConstantBufferr  r  r  r  r  r  s      r   rH  zPointwise.constant_to_device  sK    !!#Hn.?HP**;;	
 	
r   Nrk  ro  r`  rd  )r  re  r  !Callable[[Sequence[Expr]], Never]r  r  r   r   r  )
r   r   r   r  r  r  rB  r@  r  rH  r   r   r   r  r    sR    ) HPP 3P 	P
 
P	
r   r  c                  F    e Zd ZU ded<   dZded<   ddZ	 	 	 	 	 	 	 	 d	dZy)
Scatterrn  output_indexerNr[   scatter_modec                    | j                         } t        j                  t        d|      |      }t	        || j
                  || j                  | j                  | j                        S )r  r  )r  r  r  r  r&  r'  )	r  r   r   r!  r%  r  r  r&  r'  r"  s      r   rH  zScatter.constant_to_device  s]    !!#Hn.?HP**;;..**
 	
r   c                    | j                         }|d}t        j                  | || j                  |             ||      | j                        S )Nr  )mode)r  ru   r  r&  r'  r  s        r   r  zScatter.store_output  sT     !!##KyyD''-.4L""	
 	
r   r  )r  re  r  r#  r  r  r   r   )r   r   r   r   r'  rH  r  r   r   r   r%  r%    sB    44"L)"


 3
 	

 

r   r%  
logical_ormaximumminimummulr  bitwise_xor)anyr  minprodsumdotxor_sumz"dict[str, Callable[..., OpsValue]]REDUCTION_COMBINE_FNc                      t         v r	t             S  dv r	 	 	 	 	 	 d fd}|S  dk(  r	 	 	 	 	 	 dd}|S t        d        )Nargmaxargminargmax_valueargmin_valueargmax_with_valueargmin_with_valuec                   | \  }}|\  }}dv rt        j                  ||      }nt        j                  ||      }t        j                  ||      }t	              rt        j
                  ||      }t        j
                  ||      }	t        j                  |t        j                  ||	            }t        j                  |t        j                  ||	            }rt        j                  ||      nt        j                  ||      }
t        j                  |t        j                  ||
            }t        j                  |||      t        j                  |||      fS )N)r:  r<  r>  )	ru   ltgteqr0   ner+  logical_andwhere)aba_valuea_indexb_valueb_indexmaskequala_isnanb_isnantiearg_break_ties_leftr  reduction_types              r   argmax_combine_fnz3get_reduction_combine_fn.<locals>.argmax_combine_fn  s     !GW GW!PPvvgw/vvgw/FF7G,Ee$&&'2&&'2~~dCFF7G,DEucoogw.OP ' w(VVGW- 
 >>$s(CDD		$1		$1 r   welford_combinec           	     P   | \  }}}|\  }}}t        j                  t        j                  t        j                  |      t        j                  ||            t        j
                  dt        j                        ||z
        }||z   }	||	z  }
|||
z  z   ||z   ||z  |z  |
z  z   |	fS )Ng        )ru   rE  rD  isinfrB  r  r  float32)rF  rG  a_meana_m2a_weightb_meanb_m2b_weightdelta
new_weight	w2_over_ws              r   welford_combine_fnz4get_reduction_combine_fn.<locals>.welford_combine_fn  s     &'"FD(%&"FD(
 II		& 1366&&3IJS%--0E
 "H,J :-I**teemh6BB r   zunknown reduction_type=)rF  tuple[object, object]rG  rb  r   tuple[OpsValue, OpsValue])rF  #tuple[OpsValue, OpsValue, OpsValue]rG  rd  r   rd  )r6  r  )rR  r  rQ  rS  ra  s   ```  r   get_reduction_combine_fnre    s     --#N33	  
	$	)>	&	: ! 	,	,	2	2	 1	. "! "$;N;K"LMMr   c                  
    e Zd ZU ded<   ded<   ded<   ded<   dd	ZeZ ed       d d! fd
       Zd"dZd#dZ		 	 	 	 	 	 	 	 	 	 d$dZ
d%dZd&dZd d!dZd'dZe	 d(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d       Ze	 	 	 	 	 	 	 	 	 	 d*d       Zeej(                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+d       Ze	 	 	 	 	 	 d,d       Ze	 	 	 	 	 	 d,d       Ze	 	 	 	 	 	 	 	 d-d       Ze	 	 	 	 	 	 d.d       Ze	 d(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/d       Ze	 	 	 	 	 	 	 	 	 	 	 	 d0d       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d       Ze	 d(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2d       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d       Z xZS )4	Reductionra  reduction_rangesrZ   rR  r\  	src_dtyper^   reduction_hintc                $    | j                  d      S )N)r  rh  rR  r  r  s    r   r  zReduction.__str__,  s    ||LMMr   c                z    t         |          t               j                  fd| j                  D         z  S )Nc              3  6   K   | ]  }t        |        y wr   r(   r  s     r   r   z1Reduction.get_free_symbol_uses.<locals>.<genexpr>4  s     PQq-0Pr  )superr>  r@   r  rh  r  ri  	__class__s    `r   r>  zReduction.get_free_symbol_uses1  s:    w+M:=OZ\=O=OP$:O:OP>
 
 	
r   c                    | j                   S r   )rh  r  s    r   rB  zReduction.get_reduction_size7  s    $$$r   c                    | j                   S r   )rR  r  s    r   r@  zReduction.get_reduction_type:      """r   c           	         t        j                  | j                  | j                  | j                  | j                  ||            }t        j                  |xs d ||      |       y r  )ru   	reductionr  ri  rR  r  store_reduction)r  r  r  r  reduction_varsr  s         r   rv  zReduction.store_reduction=  sT     JJNNMM$/	
 	K49gdmUKr   c                X    t        | j                        t        | j                        z   S r   )r   r  rh  r  s    r   index_lengthzReduction.index_lengthL  s!    4;;#d&;&;"<<<r   c                    | j                  | j                        }| j                  | j                  t        j                        }||fS r   )r  r  rh  rH   R0_INDEX)r  r   rindexs      r   r  zReduction.inner_fn_argsO  s8    DKK(T22DMMBvr   c                    | j                  | j                        }| j                  | j                  t        j                        }t        | j                  |||      S r  )r  r  rh  rH   r{  rR   r  )r  ri  r   r|  s       r   r  zReduction.inner_fn_free_symbolsT  sH    DKK(T22DMMB#MM5&
 	
r   c           
     
   | j                         } t        j                  t        d|      |      }t	        || j
                  || j                  | j                  | j                  | j                  t        j                        S )r  r  r  r  r  r  rh  rR  ri  rj  )r  r   r   r!  rg  r  r  rh  rR  ri  r^   DEFAULTr"  s      r   rH  zReduction.constant_to_device[  sm    !!#Hn.?HP**;;!22..nn(00	
 		
r   Nc	           
        |t        |      g}	t        j                  j                  j	                  |	      st
        j                  dfS t        j                  j                  j                  |      }
t        |      }t        j                  j                  j                  |      }t        j                  j                  | t        j                        xr/ t        |        xs! t        j                  j                  | ||      }d}|dk(  xs | xr ||vxr t        j                  }|dk(  rt
        j                  dfS t!        j"                  |       }|j$                  }d}|rat'        j(                  t        j                  j*                  | d      }t'        j(                  t        j                  j*                  | d      }n	 	 	 	 	 	 dd	}|}|dk(  r ||
|      }|dk(  rt
        j,                  |fS |t/        |t0              rt3        j4                  t6        dd      5  t9        |      \  }}d
d
d
       hft        j                  j                  j;                  t        ||z               }|
|k(  r,t<        j?                  d|||||       t
        j,                  dfS t
        j,                  |fS |
|k  s||dz  dz  k\  rt
        j                  dfS tA        | |||||dk7  r|nd|t
        j                        }dd} ||      \  }}|r ||      \  }}tC        |      dk(  rt
        j                  dfS tE        jF                  |jI                         |jK                               \  \  }}}d} d}!|D ]  }"t        j                  j                  jM                  |"|      }#t        j                  j                  jO                  |#|tQ        |jS                                     }$tU        d |$D              }%|%r| dz  } |!dz  }! |!| kD  rt
        j,                   ||
|      fS t
        jV                   ||
|      fS # 1 sw Y   xY w)zd
        Choose the reduction hint and split count from shape and input stride information.
        rI   r8  scanr4      T)inner_reductionFc                     yr  r   )reduction_numel_hint
numel_hints     r   inner_reduction_splitsz4Reduction.num_splits.<locals>.inner_reduction_splits  s     r   Nr  zUse previous IRNode's range and reduction_ranges instead of split. current ranges: %s, current reduction ranges: %s, current split: %d, new ranges: %s, new reduction ranges: %sr2  r   r3  r  c           	        | j                         }|J t        d t        || j                         | j	                               |       }|j                         }|j                  J |j                  D cg c].  }t        |t              rt        |t        j                        s|0 }}t        j                  | j	                         | j                               \  \  }}}|D cg c].  }t        |t              rt        |t        j                        s|0 }}g }g }	d}
t        |j                  d       D ]  }|j                   j"                  t%        fd|D              }| xr t'        fd|D              }|r|j)                  |j                          n|r|	j)                  |j                          |s|s|j*                  t,        j.                  j0                  v st,        j.                  j0                  |j*                     }t3        |j4                  dd       }|j7                          t3        |j4                  dd       |k7  sd	}
 |xs |	|
fS c c}w c c}w )
Nr  r  r  r   rN  rM  Fc                    | j                   S r   r  r   s    r   <lambda>z@Reduction.num_splits.<locals>.get_read_indices.<locals>.<lambda>  s
    aff r   keyc              3  &   K   | ]  }|v  
 y wr   r   r   varr5   s     r   r   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>	  s     'R|(;'R   c              3  &   K   | ]  }|v  
 y wr   r   r  s     r   r   zAReduction.num_splits.<locals>.get_read_indices.<locals>.<genexpr>  s      N,/C<'Nr  r  T)r  r  r  r  r
  r3  
range_varsr   r    r   r   rK   index_vars_squeezerB  sortedr6  r   r5   r   r0  r  r   rw   r  name_to_bufferr   rN  decide_layout)r  r  cbread_writesr  r  r   rw  indicesbroadcasted_reduction_indiceschangedmdis_full_size_readis_broadcasted_reduction_readbuforiginal_strider5   s                   @r   get_read_indicesz.Reduction.num_splits.<locals>.get_read_indices  s:   \\^F%%%%!++-
 B ,,.K ))555 '11c4(C1N J 
 &2%D%D

a224&"Q
 *c4(C1N N 
 G,.)G[..4DE +!xx44$''Rz'R$R! 5F0E 1# N3AN K- %NN288,2188B$(Eww!''"8"88gg44RWW=*1#**h*M))+"3::x>/Q&*G'+( ;;WDDIs   83I!)3I&r   c              3  4   K   | ]  }|d k(  xs |dkD    yw)r   rI   Nr   r   s     r   r   z'Reduction.num_splits.<locals>.<genexpr>1  s     9AQ!a%9r  )r  r   r  r   r   r   )r  rg  r   ztuple[Sequence[Expr], bool]),rr   rw   r  r  all_unbacked_explicitly_hintedr^   r  r	  has_featurerL   REDUCE_TO_SINGLE_ELEMENTr*  choices should_use_cooperative_reductionrJ   split_reductionsr]   r  multi_processor_count	functoolsr   reduction_split_factorINNERr   r   r   r   r  rS   !replace_backed_symbols_with_hintslogr  rg  r   rK   r  r
  rB  simplify_with_rangesstride_hintsr   keysr   OUTER)&r  	dst_dtyperi  r  r  rh  rR  reduction_numel
input_nodeexprsr  numelr  should_reduce_to_single_elementarg_reduction_typesshould_splitpropsnum_smmin_elements_per_threadr  outer_reduction_splitsr  
new_rangesnew_reduction_rangesextracted_numel_hintr  r  r  r  r   rw  ranges1	num_outer	num_innerr   jrU  outers&                                         r   
num_splitszReduction.num_splitsj  sj   " !-"78ww>>uE ((!++ ww//AA/Rf%WW%%77>

 +,''*=*=N;;+
 +
 &!! yy99	 	(
 &/ 
// (&99('' 	 U" ((!++ ''/,,"$@I@Q@Q		00&$A" AJ@Q@Q		00&%A"
&)  &<" ?*+?LEz$**E11%*Z*K\\.2BDI H <JG",H
 ).B.N((JJ)*7K*KL )
 ,/CC		G #,!&0	  -22B66 &&-- $;;VaZ"_, ((!++--;v-E>5(00	
5	En ,A.)!,JGQw<1 ((!++'3'F'FJJL!..0(
$NW 		 	A  55aAAgg&&33>4#7G
 999EQ	Q		 y  &&(>$j)   !&&(>$j)  AH Hs   $QQc                    t         j                  j                  j                        t	        ||      dfd|dv r@t        t        j                              	 	 	 	 	 	 d	 fd|dv rS |dv rfdS fdS  S )
z1Convert inner_fn from a reduction to an pointwisec                     t        j                   fdt        j                  D cg c]  }t	        |       c} D              S c c}w )Nc              3  0   K   | ]  } |        y wr   r   )r   r|  r   value_fns     r   r   z=Reduction._unroll_reduction_fn.<locals>.fn.<locals>.<genexpr>N  s        UF+   )r  reduce	itertoolsproductr   )r   r   
combine_fnrh  r  s   ` r   r   z*Reduction._unroll_reduction_fn.<locals>.fnK  sH    ##"+"3"3,<=q%(=# 
 >s   A
)r:  r9  r<  r;  r>  r=  c                    |D cg c]  }t        j                  |       }} | |      }t        |t              r|S |t	        j
                   |      t        j                        fS c c}w r   )r   expandr   r   ru   
index_exprr  int64)r   r|  r   r  flatten_indexr  s       r   r  z0Reduction._unroll_reduction_fn.<locals>.value_fnd  sd     4::a%,,q/:: /eU+ LNN=#8%++F 	 ;s   A+)r>  r=  )r<  r;  c                     |       d   S r  r   r   r   s    r   r  z0Reduction._unroll_reduction_fn.<locals>.<lambda>s  s    RYq\ r   c                     |       d   S r  r   r  s    r   r  z0Reduction._unroll_reduction_fn.<locals>.<lambda>t  s    E1 r   )r   ra  r   r   )r   ra  r|  ra  r   rc  )rw   r  r  guard_int_seqre  _fixed_indexerr  r  )r  rh  rR  ri  r  r  r   r  s   ``  @@@@r   _unroll_reduction_fnzReduction._unroll_reduction_fn?  s     77++99:JK-niH
		  
 
 + 112BCM

)
3E
*
 !KK	!AA11--HIr   c
                   t         j                  j                  j                  t	                    dk(  r]dfd}
 |
d       |
d       |
d       |
d      dv s
J  d       dfd}t
        j                  |||t        |            S dk(  r+dv rdfd	}ndfd
}t
        j                  |||      S t        t              rot              t        j                  k  rSt	        |      dk7  st        |j                        r0dk7  r+t
        j                  || j                  |      |      S | j!                  ||||		      \  }}dfd} ||      }|t"        j$                  k(  r|}|dk(  rX|	J t'        j(                  t*        dd      5  t-        |	      \  }}ddd       J J | j/                  ||||||
      S |dkD  r| j1                  ||||||	
      }d}t        j2                  j4                  r t        |t6              r	 	 	 	 dd} ||      }|rht        |j8                  t:              sJ t        |j8                                |j8                  j<                  d   |_        |_         ||_!        |_"        |S t6        j                  t;        ||||            }|S # 1 sw Y   xY w)zy
        Create a reduction node. May split the reduction to multiple layers to expose
        more parallelism.
        r   c                   t         j                  k(  rt        |       S j                  r+t        | t              sJ t        |              t        |       S t        | t              sJ t        |              t        |       S r   )	r  r   r  r   r   r   r	  r   r   )valr  s    r   py_cnstz!Reduction.create.<locals>.py_cnst  sg    

*9$00%c=9D49D9 :%%c;7BcB7s8Or   rI   )r3  r5  r2  r0  * not supported for zero-dimension tensors!c                6    t        j                           S r   ru   r  )r   r  rR  rtypes_to_initss    r   const_fnz"Reduction.create.<locals>.const_fn  s    ||ON$CYOOr   r   )r:  r9  c                0    t        j                  d      S r  r  )r   r  s    r   r   zReduction.create.<locals>.fn  s    <<955r   c                n    D cg c]  }t         j                  j                   }} | |      S c c}w r   r   r  r  )r   r   reduction_indexr  rh  s      r   r   zReduction.create.<locals>.fn  s1    =M&Nuww||&NO&N#E?;; 'O   !2r4  c                `    t              r| S | dkD  rt        | t        j                        S | S r  )r   r  rJ   min_num_split)r  r  s    r   _maybe_increase_splitz/Reduction.create.<locals>._maybe_increase_split  s/    /*qy5&"6"677r   r2  Nr  Tc                :   | j                         }t        |      dk7  ry t        t        |            }|t        j
                  j                  vry t        j
                  j                  |   }t        |t              sy |j                  j                         J |S r  )r  r   nextiterrw   r  r  r   r  rM  r@  )cur_node
read_namesbufnamer  s       r   _find_split_reductionz/Reduction.create.<locals>._find_split_reduction  s     "*!8!8!:J:!+#"4
#34Gagg&<&<<#''009C%c>:#88668DDDJr   r  )r  r   r   zbool | float | int)r   r   r   rv   )r  r   r   r   )r  r   r   zComputedBuffer | None)#rw   r  r  simplifyrr   r  r  r   r   r!   r   rJ   unroll_reductions_thresholdrn   r   r  r  r^   r  r   r   r  rS   !create_multilayer_existing_rangescreate_multilayerr%  mix_order_reductionr   rM  rg  rh  _split_size_original_inner_fn_original_ranges_original_reduction_ranges)r  r  r  ri  r  r  rh  rR  rj  r  r  r  r   hintr  r  r  r  r   split_reductionr  r  r  s     ` ` ``             @@r   r  zReduction.createy  sk   $ ''**33MBR4STa$ qz"1:
qz	O "_4 !""LM4P ##!F|	 $   a!556
< ##YF $  
 0O$v'I'IIv&!+vfkk/B%' ##11.	  $   nn

e	 &e,
 ]222!NB;)))n.>E 3V40
0 )))'33388 $  QY'' C #O}}00ZY5O'*$ #8"< "/"6"6	B O0012B />.B.B.S.STU.V+5=2390=M:J!!1-#-	
 
k s   -KKc           
        | dv rAt        |      rt        d      S t        |      ryt        j                  |      j
                  S | dv rAt        |      rt        d      S t        |      ryt        j                  |      j                  S t        |      rdnd}t        |      rdnd}||||||||f|||ft        d      |fd	|    S )
N)r  r9  r;  r=  -infF)r1  r:  r<  r>  infTr   rI   )r3  r2  r4  r5  r0  welford_reducerT  online_softmax_reduce)r0   r	  r.   r  iinfor1  r  )rR  r  zeroones       r   default_accumulatorzReduction.default_accumulatorK  s     SSe$V}$!%({{5)---SSe$U|#!%({{5)---(/uQ&u-d1#T40 $dD1&+FmT%:	
 	 		r   c                :    | dk(  ryt         j                  | |      S )Nr  r   )rg  r
  rR  r  s     r   default_valuezReduction.default_valuek  s#     --,,^UCCr   c                    | dk(  r|S | dk  r(|dk  r#|t         j                  k(  rt         j                  S | dk  r(|dk  r#|t         j                  k(  rt         j                  S |S )Nr2     i      )r^   r  
OUTER_TINY)r  r  rj  s      r   _multilayer_second_step_hintz&Reduction._multilayer_second_step_hints  sg     B;!!C<J#-.MDWDW2W +++TMc!-"5"55 +++r   c                z   |yt         j                  j                  j                  |j	                         |      sy|j                          	 t        |       |j                         }t        |dd       D ]3  \  }}t         j                  j                  j                  |d      s1|c S  y# t        $ r Y yw xY w)z
        If we are reducing over the full tensor, and it is non-dense in the last dimension,
        reindex so we reduce over the dense dimension. initially just handle complete
        reduction case
        Nr2  rI   )
rw   r  r  rI  r  r  rO  r  r4  r   )r  r  r  rU  r   r   s         r   $check_for_split_dense_dim_reindexingz.Reduction.check_for_split_dense_dim_reindexing  s     ww77  "O
 	!*- '')gcrl+ 	DAqww771=	  # 		s   B. .	B:9B:c                  
 | j                  |      }t        j                  |g|      t        j                  j
                  j                  t        j                  t        |      d             
	 	 	 	 	 	 d
fd}	|	S )Nr   c                   |\  }| ^ }|z  |z   d
fd}r`t              }t        j                  t        j                  |      t        j                  |            }t        j                  ||	      S  |       S )Nc                 $       g            S r   r   )r  r  	new_indexr   s   r   bodyzCReduction._multilayer_wrap_loader.<locals>.wrapper_fn.<locals>.body  s    i');<<r   r   rv   )rh   ru   r@  r  masked)r   r  reduction_blockr  index_dtyperL  r  r  
block_sizedefaultr  	need_maskr  r   s         @@r   
wrapper_fnz5Reduction._multilayer_wrap_loader.<locals>.wrapper_fn  s     "1_*/'Y ?2_DG= = -o>vvNN7K8NN?K@ zz$g66vr   )r   Sequence[Symbol]r  r"  r   rv   )
r  Viewdynamic_reshape_indexerrw   r  r  r  r   r0  rF   )r  r  rh  r  r  r  r  r  dense_indexr!  r   r   s    ` ` ``   @@r   _multilayer_wrap_loaderz!Reduction._multilayer_wrap_loader  s     >>Z
 ../
 ((>>HHS%0!4
 
		#	6F		 	( r   c                    t        d D              s
J d       t        j                  |t        |      t        |      z         	 	 	 	 	 	 dfd}|S )Nc              3  &   K   | ]	  }|d k(    yw)rI   Nr   r   r  s     r   r   zDReduction._multilayer_wrap_loader_existing_ranges.<locals>.<genexpr>  s     3a163   z8Only enabled for numel_hint == 1, found original_ranges=c           	         | d t               }| t              d  } | t        |      t        |      z               S r   )r   r   )merged_indexnew_reduction_indexoriginal_idxr  r  original_rangesr   s       r   r!  zEReduction._multilayer_wrap_loader_existing_ranges.<locals>.wrapper_fn  sQ     ((>#o*>?L$S%9%;<Ii(51D+EEF r   )r,  r  r-  r  r   rv   )r   r#  r$  r   )r  r  r/  original_reduction_rangesr  r  r!  r   s    ``    @r   '_multilayer_wrap_loader_existing_rangesz1Reduction._multilayer_wrap_loader_existing_ranges  sy     3?33 	
G6HI	
3 ..%uZ'85AU;V'V
		(		!/		 		 r   c                   |t         j                  t         j                  fvr|nt         j                  }t        j                  |||||||	|      }|j                          |j                         	 	 	 	 	 	 dfd}t        j                  j                  j                  t        |            }| j                  |
||      }||dt        |       k(  sJ t        j                  t	        |||||t        |      d |	||            S )a
        Break a large reduction up into multiple smaller reductions
        recursively
        c                     g | |      S r   r   )r   r  intermediate_loaders     r   intermediate_fnz;Reduction.create_multilayer_helper.<locals>.intermediate_fn  s     ''A'A'ABBr   Nr  )r   ra  r  ra  r   rv   )r  float16bfloat16r	  rg  r  r  r  rw   r  r  r	  rr   r  r   r   )r  r  r  ri  r!  r/  r0  r  r  rR  r  rj  intermediate_dtypeintermediater6  r  r5  s                   @r   create_multilayer_helperz"Reduction.create_multilayer_helper  s(   0  ??  	
 !'' 	
 	*668	C%	C8J	C	C
 WW%%77o8VW
99:~
 *-Cs?/C"DDDD(&!+C,@,B!C-#-	
 	
r   c                    t        |      }t        ||dz
  z   |      }| j                  ||      }| j                  |||||||
      }| j	                  ||||||g |||g|||	      S )r3  rI   )rr   rC   r  r&  r;  )r  r  r  ri  r  r  rh  rR  r  rj  r  r  r  r  r!  s                  r   r  zReduction.create_multilayer,  s    & ((89o;UC
##NI>00

 ++feL
 	
r   c                j    | j                  |||||      }| j                  ||||||g ||||	d|
      S )r3  r2  )r1  r;  )r  r  r  ri  r  r/  r0  r  r  rR  rj  r!  s               r   r  z+Reduction.create_multilayer_existing_rangesZ  sc    $ @@% 

 ++%+o+
+ 
 	
r   ro  rr  r   r`  rd  )
r  re  r  r#  r  r  rw  r"  r   r   r{  r   zSequence[Sequence[Expr]]r  r   )r  rj  r  r\  ri  r\  r  zCallable[_P, OpsValue]r  ra  rh  ra  rR  zReductionType | Literal['scan']r  r    r  IRNode | Noner   tuple[ReductionHint, _IntLike])
r  z<Callable[[Sequence[_IntLike], Sequence[_IntLike]], OpsValue]rh  ra  rR  r   ri  r\  r   z(Callable[[Sequence[_IntLike]], OpsValue])r  rj  r  r\  ri  r\  r  r  r  ra  rh  ra  rR  rZ   rj  r^   r  r?  r   r   rR  r   r  r\  r   _NumLike | Sequence[_NumLike])r  r   r  r   rj  r^   r   r^   )r  r   r  r?  r   r  )r  Callable[..., OpsValue]rh  ra  r  r   r  r   r  r   r  rB  r  r?  r   Callable[..., object])r  4Callable[[Sequence[Expr], Sequence[Expr]], OpsValue]r/  r  r0  r  r  Sequence[Integer]r  rF  r   rE  )r  rj  r  r\  ri  r\  r!  r  r/  r  r0  r  r  
list[Expr]r  list[Integer]rR  rZ   r  r   rj  r^   r   r   )r  rj  r  r\  ri  r\  r  r  r  ra  rh  ra  rR  rZ   r  r   rj  r^   r  r?  r   r   )r  rj  r  r\  ri  r\  r  r  r/  ra  r0  ra  r  rH  r  rH  rR  rZ   rj  r^   r   r   ) r   r   r   r   r  r  rb   r>  rB  r@  rv  ry  r  r  rH  r  r  r  r  r^   r  r  r
  r  r  r  r&  r1  r;  r  r  __classcell__rp  s   @r   rg  rg  $  s   ((!!!!N HK(
 )

%#LL 3L 	L
 )L 
L=


  %)RRR R )	R
 #R -R 8R R "R 
(R Rh 7N7,7 7 	7
 
27 7r  )6(=(=$(NN N 	N
 %N #N -N &N &N "N 
N N` $/	& > DD$/D	&D D %(:G	   &4A	 >  %)('( -( "	(
 ( ( /( "( 
( (T D ( $2	
 & 0 
> 8 =
=
 =
 	=

 '=
 (=
 $2=
 =
 ,=
 &=
 =
 &=
 
=
 =
~  %)+
+
 +
 	+

 %+
 #+
 -+
 &+
 +
 &+
 "+
 
+
 +
Z $
$
 $
 	$

 %$
 ,$
 $6$
 "$
 ,$
 &$
 &$
 
$
 $
r   rg  c                     d fd}|S )1A closure containing math to read a given elementc                    t        |       t              k(  sJ t        |       t              k(  sJ }t        |       D ]  \  }}}|dk7  s|||z  z   } |S r  )r   r   )r   resultr   stszrQ  r  r  s        r   r  z_fixed_indexer.<locals>.indexer  ss    !c%jCK&???5zSY&&&ufd3 	+KCRQw#(*	+ r   )r   ra  r   r    r   )r  r  rQ  r  s   ``` r   r  r    s     Nr   INNER_FN_TYc                  l     e Zd ZU ded<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )MultiOutputReductionr   output_indexc
           
         t              rft              dk(  rd   }
n	 	 	 	 	 	 dfd}
t        |   |||
|||||       |	| _        y )NrI   r   c                2     t         fdD              S )Nc              3  0   K   | ]  } |        y wr   r   )r   r   r   reduction_idxs     r   r   z@MultiOutputReduction.__init__.<locals>.loader.<locals>.<genexpr>  s     HR]3Hr  r   )r   rX  	inner_fnss   ``r   r  z-MultiOutputReduction.__init__.<locals>.loader  s     HiHHHr   r  )r   r  rX  r  r   tuple[OpsValue, ...])callabler   rn  __init__rT  )r  r  r  rZ  r  rh  rR  ri  rj  rT  r  rp  s      `       r   r]  zMultiOutputReduction.__init__  s     I"I y>Qq\FI#I4BI%I
 	-)) 	 		
 )r   c           	     :   t        j                  | j                  | j                  | j                  | j                  ||            }t        |t        t        f      sJ t        |             || j                     }t        j                  |xs d ||      |      S r  )ru   ru  r  ri  rR  r  r   r   r   r   rT  rv  )r  r  r  r  rw  r   r  s          r   rv  z$MultiOutputReduction.store_reduction  s     JJNNMM$/	
 &5$-0>$v,>0t(()"";#;)WT]ERRr   )r  rj  r  r\  rZ  z#INNER_FN_TY | Sequence[INNER_FN_TY]r  rF  rh  rF  rR  rZ   ri  r\  rj  r^   rT  r   )
r  re  r  r#  r  r  rw  r"  r   r   )r   r   r   r   r]  rv  rI  rJ  s   @r   rS  rS    s    #)#) #) 7	#)
 "#) ,#) &#) #) &#) #)JSS 3S 	S
 )S 
Sr   rS  c                  b    e Zd ZdZeej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zy)ArgReductionzJMulti-output arg reduction that returns both the selected value and index.Nc
                    dv sJ t         j                  j                  j                  t	                    }
|
dk(  rt         d      |
dk(  r]dfd}dd}t        j                  ||t                    t        j                  t        j                  |t                    fS t        |
t              rt        |
      t        j                  k  rpt	              dk7  st!        j"                        rMt$        j'                        dfdt)        fd	t+        |t        j                  f      D              S t$        j-                  ||
|		      \  }}|dk(  sJ d
       t.        j0                  k(  r|t)         fdt+        |t        j                  f      D              }|D ]  }|j3                           |S )N)r=  r>  r   r  rI   c                    D cg c]  }t         j                  j                   }} | |      }t        |t              r|d   S |S c c}w r  )r   r  r  r   r   )r   r   r  r  r  rh  s       r   r  z%ArgReduction.create.<locals>.value_fn  sH    9I"JA577<<"J"J 8eU+ 8O	 #Ks   !A	c                J    t        j                  dt        j                        S r  )ru   r  r  r  )r   s    r   index_fnz%ArgReduction.create.<locals>.index_fn  s    ||Au{{33r   r   c                B     |       }t        |t              sJ ||   S r   )r   r   )r   rT  rN  unrolled_fns      r   projectz$ArgReduction.create.<locals>.project	  s(    $U+!&%000l++r   c           	   3  ~   K   | ]4  \  }}t         j                  |t        |       t                     6 yw))rT  r   N)r  r  r   r   )r   rT  r  r  rg  r  s      r   r   z&ArgReduction.create.<locals>.<genexpr>	  sF       (L%   !$W<H<	 ! s   :=z.arg reductions do not support split reductionsc              3  j   K   | ]*  \  }}t         j                   |	
|	             , y wr   r  )r   rT  r  r  r  r  r  rj  rh  rR  ri  s      r   r   z&ArgReduction.create.<locals>.<genexpr>+	  sM      
 $e $"" 

   03r   r  r   rv   )r   r  rT  r   r   rv   )rw   r  r  r  rr   AssertionErrorr  r  r   r  r  r   r!   r   rJ   r  rn   r   rg  r  r   r   r  r^   r  r  )r  r  r  ri  r  r  rh  rR  rj  r  r  r  rd  r   r  resultsrN  rg  rf  s   `` ``````        @@r   r  zArgReduction.create  s    !KKKK''**33MBR4STa !""LM  a4   !#%<	 !    !++%<	 !    0O$v'I'IIv&!+vfkk/B#88*NIK,
   ,5i5M+N    **

e zKKKz]222!N 
 
 (1)U[[1I'J
 
   	FNN	r   )r  rj  r  r\  ri  r\  r  r  r  r  rh  r  rR  rZ   rj  r^   r  r?  r   Sequence[TensorBox])r   r   r   r  r  r^   r  r  r   r   r   r`  r`    s    T )6(=(=$(gg g 	g
 %g g )g &g &g "g 
g gr   r`  c                      e Zd ZdZeej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zeej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	y)	OnlineSoftmaxReductionzAMulti-output reduction that computes softmax max/sum in one pass.Nc
           	         t        fdt        |      D              }
|
D ]  }|j                           |
S )Nc              3  j   K   | ]*  }t         j                  t        d |	             , yw)r  N)r   r  rS  )	r   
output_idxr  r  r  r  rj  rh  ri  s	     r   r   z:OnlineSoftmaxReduction._create_no_split.<locals>.<genexpr>P	  sI      
  $$+"

rj  )r   r   r  )r  r  r  ri  r  r  rh  
num_outputrj  r  rm  r  s    `````` `   r   _create_no_splitz'OnlineSoftmaxReduction._create_no_splitC	  sG      
 
 $J/
 
   	AIIK	r   c
                B   t         j                  j                  j                  t	        |            }
t
        j                  ||||||d|
|		      \  }}|t        j                  k(  r|}|dkD  r| j                  ||||||||||	
      S | j                  |||||||||		      S )Nr  )rR  r  r  rI   )rw   r  r  r  rr   rg  r  r^   r  r  ru  )r  r  r  ri  r  r  rh  rt  rj  r  r  r   r  s                r   r  zOnlineSoftmaxReduction.created	  s     ''**33MBR4ST**2+! + 

e ]222!N19((   ##

 
	
r   c           
        t        |      t        |dz
  z   |      | j                  |
      }t        j	                  |g|      t
        j                  j                  j                  t        j                  t        |      d             	 	 	 	 	 	 dfd}|t        j                  t        j                  fvr|nt        j                  }| j!                  |||g ||g||	      }|D ]  }|j#                           t%        d |D              	 	 	 	 	 	 dfd}t
        j                  j                  j'                  t        |            }| j)                  |||	      }	| j!                  ||||||g||	      S )NrI   r   c           	        |\  }| ^ }	|z  |z   d
fd}t        j                  d      }rt              }t        j                  t        j                  |      t        j                  |            }t        j
                  ||t        d            t        j                  ||t        j                  d            fS  |       |fS )Nc                 $       g            S r   r   )r  r  r  r   s   r   r  zJOnlineSoftmaxReduction.create_multilayer.<locals>.wrapper_fn.<locals>.body	  s    	7G9+=>>r   rI   r  r   r  )ru   r  rh   r@  r  r  r	  rE  )r   r  r  r  r	  r  rL  r  r  r  r  r   r  r   ri  s          @@r   r!  z<OnlineSoftmaxReduction.create_multilayer.<locals>.wrapper_fn	  s     "1_*/'Y ?2_DG? ? ,,q),C-o>vvNN7K8NN?K@
 JJtT5=9IIdCa)CD 
 vs{"r   c              3  <   K   | ]  }|j                           y wr   )r  r   r   s     r   r   z;OnlineSoftmaxReduction.create_multilayer.<locals>.<genexpr>	  s     $LQ]]_$L   c                2     t         fdD              S )Nc              3  6   K   | ]  } |g         y wr   r   )r   r  r   r  s     r   r   zTOnlineSoftmaxReduction.create_multilayer.<locals>.intermediate_fn.<locals>.<genexpr>	  s&      7=1112r  rY  )r   r  intermediate_loaderss   ``r   r6  zAOnlineSoftmaxReduction.create_multilayer.<locals>.intermediate_fn	  s      AU  r   )r   r"  r  r"  r   rc  )r   ra  r  ra  r   r[  )rr   rC   r  r#  r$  rw   r  r  r  r   r0  rF   r  r7  r8  r	  ru  r  r   r	  r  )r  r  r  ri  r  r  rh  rt  r  rj  r  r%  r!  r9  intermediatesr   r6  r  r  r  r   r  r   s      ``             @@@@@r   r  z(OnlineSoftmaxReduction.create_multilayer	  s    ((89o;UC
>>Z
 ../
 ((>>HHS%0!4
 
		##	#6F	#&	# 	#4  ??  	
 ,,feL	
  	AIIK	  %$Lm$LL	%	8J	!	 WW%%77f8MN
99:~
 ##G	
 		
r   )r  rj  r  r\  ri  r\  r  r  r  r  rh  r  rt  r   rj  r^   r  r?  r   rn  r   )r  rj  r  r\  ri  r\  r  r  r  r  rh  r  rt  r   r  r   rj  r^   r  r?  r   rn  )
r   r   r   r  r  r^   r  ru  r  r  r   r   r   rp  rp  @	  s   K )6(=(=$(  	
 %  )  & " 
 @  )6(=(=$(1
1
 1
 	1

 %1
 1
 )1
 1
 &1
 "1
 
1
 1
f  %)Z
Z
 Z
 	Z

 %Z
 Z
 )Z
 Z
 Z
 &Z
 "Z
 
Z
 Z
r   rp  c                      e Zd Zeej
                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	y)WelfordReductionc                   |dv sJ t         j                  j                  rJ d       t        j                  j
                  j                  t                    }dfd}	|dk(  r |	d      }
 |	d      } |	d      }|
||fS |dk(  r@	 	 	 	 dfd|dk(  r |d          |	d       |	d      fS t        fd|D              S t        j                  |d   ||	      \  }}|t        j                  k(  r|}|dkD  r| j                  ||||      S t        d
      D cg c](  }t        j!                  t#        ||||	            * }}|D ]  }|j%                           |S c c}w )N)r  rT  zGwelford reduction usage is explicitly disabled, please check you configc                X     d fd}t         j                  |t                    S )Nc                0    t        j                        S r   r  )r   r  r  s    r   r  z8WelfordReduction.create.<locals>.const.<locals>.inner_fn

  s    || r   r   r   r  r   rv   r  r  r   )r  r  r  r  r  s   ` r   constz&WelfordReduction.create.<locals>.const	
  s2     ##!F|	 $  r   r   rI   c                X     d fd}t         j                  |t                    S )Nc                n    D cg c]  }t         j                  j                   }} | |      S c c}w r   r  )r   r   r  r  rh  s      r   r  z7WelfordReduction.create.<locals>.copy.<locals>.inner_fn"
  s1    =M&Nuww||&NO&N!#77 'Or  r   r  r  )r  r  r  r  r  rh  s   ` r   copyz%WelfordReduction.create.<locals>.copy
  s2    8 !''!%<	 (  r   r  c              3  .   K   | ]  } |        y wr   r   )r   r   r  s     r   r   z*WelfordReduction.create.<locals>.<genexpr>0
  s     :"T"X:   )rR  r  r   )r  r   r   r   )r  rE  r   r   )rJ   mtiadisable_welford_reductionrw   r  r  r  rr   r   rg  r  r^   r  r  r   r   r  r  r  )r  r  r  rZ  r  rh  rR  rj  r  r  meanm2weightr   r  rs  rm  r  r  s    `` ``            @r   r  zWelfordReduction.create	  s    !FFFF;;88 	
U	
8 ''**33MBR4ST	 a8DqB1XFV##aL  !11IaL)58U1X==:	:::&  **aL)+ + 	
e ]222!N19(( 	 	2 $Ah
   $""

 
   	AIIK	%
s   0-E8c                     y)N)r   r   r   r   r  s     r   r  zWelfordReduction.default_values
  s     r   c	                    t              t        j                  j                  j	                  t        j                  t              d             }	|	rH|dk7  rC	 	 	 	 	 	 	 	 d
fd}
 j                  ||d   t        |
d      t        |
d      f|d|      S t        dz
  z         t        j                  |t         fd|D              g |g||      }|D ]  }|j                           	 	 	 	 	 	 	 	 ddt        j                  j                  j                  t        |            } j!                  ||      }t        j                  |t        fd	|D              |gd|      S )r3  r   rT  c                0    t        j                  |      S r   r  )r   rX  r  r  s      r   r  z4WelfordReduction.create_multilayer.<locals>.constant
  s     ||E511r   r  rI   )r  r  rZ  r  rh  rR  r  rj  c           	   3  L   K   | ]  }j                  |d         yw)r   r  N)r&  )r   r  r  r  r  rh  r  s     r   r   z5WelfordReduction.create_multilayer.<locals>.<genexpr>
  s=      
  ++$# , 
s   !$c                     |g | |      S r   r   )r   r  r  s      r   intermediate_loader_fnzBWelfordReduction.create_multilayer.<locals>.intermediate_loader_fn
  s    
 4E4O455r   c              3  T   K   | ]  }t        |j                                 ! yw))r  N)r   r  )r   r   r  s     r   r   z5WelfordReduction.create_multilayer.<locals>.<genexpr>
  s*       .q}}GG   %()r   r  rX  r  r  r   r   rv   )r   r  r  r  r  rl  r   rv   )rr   rw   r  r  r  r   r0  rF   r  r   rC   r  r  r   r  r	  r  )r  r  r  rZ  r  rh  rR  r  rj  r   r  r  r   r  r  r  r  s   ` `  ` `      @@@r   r  z"WelfordReduction.create_multilayery
  s     ((89((>>HHS%0!4
 
	 +<<2#24B2KN22
 ((aLHA.HA.
 !10- )   o;UC
(// 
 (
 
 feL#
&  	AIIK		6!	6+	6 9	6 		6 WW%%77f8MN
99:~
  && &  G
 	
r   N)r  rj  r  r\  rZ  Sequence[Callable[..., Any]]r  rH  rh  rH  rR  rZ   rj  r^   r   rn  rA  )r  rj  r  r\  rZ  r  r  rH  rh  rH  rR  rZ   r  r   rj  r^   r   rn  )
r   r   r   r  r^   r  r  r  r  r  r   r   r   r  r  	  s    )6(=(=yy y 0	y
 y (y &y &y 
y yv $/	& 
 \
\
 \
 0	\

 \
 (\
 &\
 \
 &\
 
\
 \
r   r  c                  x    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<    ed       dd fd       Zd  fdZ	 	 	 	 	 	 	 	 	 	 d!dZd"dZd#dZ	d#dZ
d#dZd$dZd%dZdddZeej"                  fdd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&d       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd       Z xZS )(ScanrH  scan_rangesr  =Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]]r  zFCallable[[Sequence[_IntLike], Sequence[_IntLike]], Sequence[_IntLike]]r   r^   rj  r   rT  tuple[torch.dtype, ...]dtypestuple[Callable[..., Any], ...]rZ  c                    t         |          t               j                  fd| j                  D         z   t               j                  fd| j
                  D         z  S )Nc              3  6   K   | ]  }t        |        y wr   r(   r  s     r   r   z,Scan.get_free_symbol_uses.<locals>.<genexpr>
       O"1m4Or  c              3  6   K   | ]  }t        |        y wr   r(   r  s     r   r   z,Scan.get_free_symbol_uses.<locals>.<genexpr>
       H"1m4Hr  )rn  r>  r@   r  r  r  ro  s    `r   r>  zScan.get_free_symbol_uses
  sa     G(7 jl  Od>N>NO !jl  HdiiH		
r   c                    t        | j                        t        | j                        z   t        | j                        k(  sJ t        |           y r   )r   r  r  r  rn  r  r  rp  s    r   r  zScan.__post_init__
  =    4;;#d&6&6"773tyy>IIIr   c                   | j                  ||      t        fd| j                  D              }t        j                  | j
                  | j                  |      }t        j                  |xs d |      || j                           S )Nc              3  .   K   | ]  } |        y wr   r   r   r  r   s     r   r   z'Scan.store_reduction.<locals>.<genexpr>       Dx}Dr  r  )	r   r   rZ  ru   r  r  r  r  rT  )r  r  r  r  	scan_varsr   rN  r   s          @r   rv  zScan.store_reduction
  so     ll4+DT^^DD$++t?yy$9gclF4;L;L4M
 	
r   c                     y)Ncustomr   r  s    r   r@  zScan.get_reduction_type  s    r   c                    | j                   S r   )r  r  s    r   rB  zScan.get_reduction_size  r  r   c                    | j                   S r   r  r  s    r   r
  zScan.get_size      yyr   c                    | j                   S r   r  r  s    r   r  zScan.get_pointwise_size  r  r   c                X    t        | j                        t        | j                        z   S r   )r   r  r  r  s    r   ry  zScan.index_length  !    4;;#d&6&6"777r   c                    | j                  | j                        }| j                  | j                  t        j                        }| j                  ||      }|fS r   )r  r  r  rH   r{  r   r  r   r|  r   s       r   r  zScan.inner_fn_args  E    DKK(T--t}}=ll5&)vr   c                    | j                  | j                        }| j                  | j                  t        j                        }| j                  ||      }t        | j                  ||      S r  )r  r  r  rH   r{  r   rR   r  r  ri  r   r|  r   s        r   r  zScan.inner_fn_free_symbols  Q    DKK(T--t}}=ll5&)#DMM3mTTr   T)can_fallback_to_atenc                  g |d  |dz   d  |   gt         j                  j                  |t        j                        sd gt        |      z  S t        |      dkD  r=t         j                  j                  |t        j                        sd gt        |      z  S t         j                  j                  }
|
j                  t                    }t        |      t        |      k(  sJ |
j                  t        j                  |d            r?t        t        |            D cg c]!  }t        j                  |||   ||   |      # c}S | j!                  ||d   |d   ||      \  }}t"        }|dkD  r[t$        j&                  j(                  d u xs t*        xr	 t,        dk\  xr t        |      dk(  }|s|rd gt        |      z  S d}nt.        }dfd}t        t        |            D cg c]0  }t0        j                   |d	|||   |||   ||||||d|	      2 }}|D ]  }|j3                           |S c c}w c c}w )
NrI   r   r   )r  r  r  axispointwise_rangesr  r  
scan_numelz3.3.0c                    t        |      t              k(  sJ t        |       t              k(  sJ g | d  || d  S r   r   )r   
scan_indexr  r  r  s     r   r   zScan.create.<locals>.reindexh  S    z?c+&6666u:%5!6666>U5D\>J>tu>>r   )r  r  r  r  rZ  r  r  r  r  r   rj  rT  )r   r  r  r  r   rG  r   )rw   r  r  rL   SCANr   TUPLE_REDUCTIONr  r  rr   r  r   r7  r   r  r  r  r  r  versionhip
has_tritontriton_version	SplitScanr   r  )r  r  r  rZ  r  r  r  rj  r  r   r  r  rT  r  	scan_typesupports_splitr   rm  rN  r  r  s        `             @@r   r  zScan.create$  s    =T%4[<4q
+;<Dzlww""6>+>+>?6CK''v;?177#6#6N22$
 6CK''77##&&}['AB
6{c)n,,, ))%((:q*AB %*#f+$6 !   ! .&|4	 !   &)^^)q\-#!! &4 	&
"
 	> !!T)Wj.V^w=V% v;!#  "' 6CK//!"J%		?. !&c&k 2%
$ #  ! .!&|4'+ +)##1!- 
 
*  	FNN	 AP
s   )&I85Ic	           
     N    dfd}	t         j                  ||||	||d|      S )Nc                ,     g | d  || d        S r   r   )r   rX  r  r  s     r   r!  z#Scan.num_splits.<locals>.wrapper_fn  s*    Fc%4jF=F3tu:FGGr   r  )r  r  ri  r  r  rh  rR  r  )r   r  rX  r  r   rv   )rg  r  )
r  r  r  r  r  r  r  r  r  r!  s
      ``     r   r  zScan.num_splits  s;    	H ###(!& $ 	
 		
r   rr  r   rS  )
r  re  r  z%Callable[[Sequence[_IntLike]], Never]r  r  r  r"  r   r   rd  r~  r{  r  )r  rj  r  r  rZ  z+tuple[Callable[[Sequence[Expr]], Any], ...]r  rH  r  r   r  r  rj  r^   r  r   r   r   r   Sequence[TensorBox | None])r  rj  r  r\  r  rl  r  r   r  rH  r  rH  r  r  r  r    r   r@  )r   r   r   r   rb   r>  r  rv  r@  rB  r
  r  ry  r  r  r  r^   r  r  r  rI  rJ  s   @r   r  r  
  s   
MMSS!!##-- F#
 $
 

 7
 	

 $
 

 8U  )6(=(=` &*`` (` ?	`
 ` ` R` &` #` ` 
$` `D 

 
 7	

 
 (
 #
 R
 
 
(
 
r   r  c                      e Zd Zy)r  N)r   r   r   r   r   r   r  r    s    r   r  c                  F    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ed<    ed       dd fd       Zd fdZ	 	 	 	 	 	 	 	 	 	 ddZd dZd!dZ	d!dZ
d"dZd#dZd$dZdddZeej"                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d%d       Z xZS )&SortrH  sort_rangesr  z:Callable[[Sequence[Expr], Sequence[Expr]], Sequence[Expr]]r   r^   rj  r   rT  r  r  r  rZ  r   stable
descendingc                    t         |          t               j                  fd| j                  D         z   t               j                  fd| j
                  D         z  S )Nc              3  6   K   | ]  }t        |        y wr   r(   r  s     r   r   z,Sort.get_free_symbol_uses.<locals>.<genexpr>  r  r  c              3  6   K   | ]  }t        |        y wr   r(   r  s     r   r   z,Sort.get_free_symbol_uses.<locals>.<genexpr>  r  r  )rn  r>  r@   r  r  r  ro  s    `r   r>  zSort.get_free_symbol_uses  sa     G(7 jl  Od>N>NO !jl  HdiiH		
r   c                    t        | j                        t        | j                        z   t        | j                        k(  sJ t        |           y r   )r   r  r  r  rn  r  r  s    r   r  zSort.__post_init__  r  r   c                ,   | j                  ||      t        fd| j                  D              }t        j                  | j
                  || j                  | j                        }t        j                  |xs d |      || j                           S )Nc              3  .   K   | ]  } |        y wr   r   r  s     r   r   z'Sort.store_reduction.<locals>.<genexpr>  r  r  r  )
r   r   rZ  ru   sortr  r  r  r  rT  )r  r  r  r  rw  r   rN  r   s          @r   rv  zSort.store_reduction  su     ll40DT^^DD$++vt{{DOOLyy$9gclF4;L;L4M
 	
r   c                     y)Nr  r   r  s    r   r@  zSort.get_reduction_type  s    r   c                    | j                   S r   )r  r  s    r   rB  zSort.get_reduction_size  r  r   c                    | j                   S r   r  r  s    r   r
  zSort.get_size  r  r   c                    | j                   S r   r  r  s    r   r  zSort.get_pointwise_size  r  r   c                X    t        | j                        t        | j                        z   S r   )r   r  r  r  s    r   ry  zSort.index_length  r  r   c                    | j                  | j                        }| j                  | j                  t        j                        }| j                  ||      }|fS r   )r  r  r  rH   r{  r   r  s       r   r  zSort.inner_fn_args  r  r   c                    | j                  | j                        }| j                  | j                  t        j                        }| j                  ||      }t        | j                  ||      S r  )r  r  r  rH   r{  r   rR   r  r  s        r   r  zSort.inner_fn_free_symbols  r  r   c	                   g |d  |dz   d  |   gt         j                  j                  |t        j                        sd gt        |      z  S t         j                  j                  }
|
j                  t                    }t        j                  j                  rt        j                  j                  }nCd}t        j                  j                  xr% |
j                  t        j                  ||            }|sd gt        |      z  S t        |      t        |      k(  sJ |
j                  t        j                  |d            r?t!        t        |            D cg c]!  }t"        j%                  |||   ||   |      # c}S dfd}t!        t        |            D cg c]4  }t&        j%                  t)        d|||   |||   |||||||d|	      6 }}|D ]  }|j+                           |S c c}w c c}w )NrI   r  r   c                    t        |      t              k(  sJ t        |       t              k(  sJ g | d  || d  S r   r  )r   
sort_indexr  r  r  s     r   r   zSort.create.<locals>.reindex'  r  r   )r  r  r  r  rZ  r  r  r  r   rj  rT  r  r  )r   r  r  r  r   rG  r   )rw   r  r  rL   SORTr   r  r  rr   rJ   r%  decompose_sort_opspersistent_reductionsr  r   r7  r   r  r  r   r  r  )r  r  r  rZ  r  r  r  r  rj  r   r  
sort_numelis_persistent_kernel
max_rblockrT  r   rm  rN  r  r  s        `            @@r   r  zSort.create  s    =T%4[<4q
+;<Dzlww""6>+>+>?6CK''77##&&}['AB
 ==++#)==#F#F J33 U22588J
3ST ! $6CK''6{c)n,,, ))%((:q*AB %*#f+$6 !   ! .&|4	 !  	?0 !&c&k 2'
& %  ! .!&|4'+ +##1!-!) 
 
,  	FNN	 Q
s   '&H.9Hrr  r   rS  )
r  re  r  rn  r  r  rw  r  r   r   rd  )r   rF  r`  r{  r>  )r  rj  r  r  rZ  z'tuple[Callable[[list[Expr]], Any], ...]r  rH  r  r   r  r   r  r   rj  r^   r   r   r   r  )r   r   r   r   rb   r>  r  rv  r@  rB  r
  r  ry  r  r  r  r^   r  r  rI  rJ  s   @r   r  r    s>    
GG!!##--L F#	
 $	
 

 2
 	

 '
 

 8U  )6(=(=QQ (Q ;	Q
 Q Q Q Q &Q Q 
$Q Qr   r  c                >    	 t        | d       y# t        $ r Y yw xY w)NFfreezeT)rO  r  r   s    r   r  r  H  s&    a. s    	c           
        	 t        | d      \  }}|j                         rt        |t              sJ t	        |             t        |j                  |j                  |j                  |j                  |j                  |j                  |j                        |j                  |j                        }|j                         S # t        $ r Y yw xY wNFr  )rO  should_pad_stridesr   r  r   rP  r  r  r  _pad_stridesr  rQ  rR  is_contiguousr  r   _bufferrN  s      r    is_contiguous_storage_and_layoutr  P  s    /%@ $$&fn5CtF|C5 ##FMM6;;M  F ##%% s   C C 	CCc                   	 t        | d      \  }}|j                         syt        j                  j                  j                  |j                         |j                  t        |j                        z         S # t        $ r Y yw xY wr  )rO  r  rw   r  r  rI  storage_sizerQ  rr   r  r  r  s      r   &is_dense_contiguous_storage_and_layoutr  d  sw    /%@##%ww77!6===3M#M
 	
  s    A; AA; ;	BBc                   t        | t              rt        | j                  |||||      S t        | t              r:t        | j                  |||||      \  }}| | j                  j                         fS t        | t              r|rn|r0| j                          | j                         j                         s>J || j                  ||       n&|| j                  ||       n| j                          t	        |       | j                         fS t        | t              r(t        | j                  |      \  }}|| j                  fS t        )z
    Try to simplify x into a StorageBox and a Layout.

    allow_padding only affect how we apply stride_order. When allow_padding
    is True, we have the freedom to add padding when applying the stride_order.
    r  want_contiguousstride_orderr%  r0  r%  r  )r   r   rO  rM  rq  r  rr  r"  r  r&  r1  r  rS  rN  r  )	r   r  r  r  r%  r0  r   rN  buffers	            r   rO  rO  p  sG    !Y$FF+%''
 	
 !Z )FF+%''
	6 !&&##%%%!V!||~33555)11  2  *22! 3  !!}alln,,!_% *FF
	 qxx
r   c                d    	 t        | d      \  }}|j                  |      S # t        $ r Y yw xY wr  )rO  is_stride_orderedr  )r   r  r  rN  s       r   "is_stride_order_storage_and_layoutr    s:    /%@''55 s    # 	//c                   t        | t        t        f      rt        | j                        S t        | t
              rt| j                  }t        j                  j                  j                  |j                  t        |j                        z  t               }t        | j                        xs |S t        | t              r*| j!                         t        j                  j"                  v S yr  )r   r   rq  is_unalignedrM  rS  rN  rw   r  r  statically_known_multiple_ofrQ  ri   r  rk   rr  rs  unaligned_buffers)r   rN  has_unaligned_layouts      r   r
  r
    s    $J/0DII&&$(#$77#3#3#P#PMMN6<<88/$
  
 DII&>*>>$}}!''";";;; r   c                      e Zd ZU ded<    ed       ddd       ZddZddZddZe	d d       Z
d!dZd"d	Zd#d
Zd$dZd%dZddd&dZd'dZd(dZd)dZd*dZd'dZd'dZd+dZd,dZd-dZd.dZy)/ro  r   rM  c                8    | j                   j                  |      S r   rM  r>  r=  s     r   r>  zBaseView.get_free_symbol_uses  s    yy--m<<r   c                    t        d|        )Nzmake_reindexer NYI on r  r  s    r   make_reindexerzBaseView.make_reindexer  s    !$:4&"ABBr   c                l    | j                   j                         | j                         dfd}|S )Nc                       |             S r   r   r   innerr   s    r   r  z&BaseView.make_indexer.<locals>.indexer      &&r   )r   r  r   r    )rM  r
  r  )r  r  r  r   s     @@r   r
  zBaseView.make_indexer  s/    		&&(%%'	' r   c                l    | j                   j                         | j                         dfd}|S )Nc                       |             S r   r   r  s    r   r  z$BaseView.make_loader.<locals>.loader  r  r   r  )rM  r  r  )r  r  r  r   s     @@r   r  zBaseView.make_loader  s/    		%%'%%'	' r   c                6    | j                   j                         S r   )rM  r  r  s    r   r  zBaseView.dtype  s    yy""$$r   c                6    | j                   j                         S r   rM  r  r  s    r   r  zBaseView.get_layout      yy##%%r   c                6    | j                   j                         S r   rM  r  r  s    r   r  zBaseView.get_device  r  r   c                     y r   r   r  s    r   r  zBaseView.get_origin_node  r  r   c                6    | j                   j                         S r   rM  rs  r  s    r   rs  zBaseView.get_name      yy!!##r   c                "    | j                         S r   r  r  s    r   r  zBaseView.get_pointwise_size      }}r   Tr  c               <    | j                   j                  ||      S Nr  rM  r  r  s      r   r  zBaseView.mark_reuse      yy##E{#CCr   c                6    | j                   j                         S r   rM  r  r  s    r   r  zBaseView.has_exceeded_max_reads      yy//11r   c                6    | j                   j                         S r   rM  r  r  s    r   r  zBaseView.realize      yy  ""r   c                8    | j                   j                          y r   rM  r  r  s    r   r  zBaseView.realize_hint  s    		 r   c                6    | j                   j                         S r   rM  r;  r  s    r   r;  zBaseView.get_storage_numel      yy**,,r   c                6    | j                   j                         S r   rM  rD  r  s    r   rD  zBaseView.is_extern      yy""$$r   c                    t        | j                  t              sJ t        | j                               | j                  j	                         S r   )r   rM  ro  r   is_module_bufferr  s    r   r9  zBaseView.is_module_buffer
  s6    $))X.?TYY?.yy))++r   c                6    | j                   j                         S r   rM  r  r  s    r   r  zBaseView.get_read_names      yy''))r   c                    t        j                  t        dd      5  t        | j	                         | j                               j                  cd d d        S # 1 sw Y   y xY wr  )r   r   r  rT   r  r
  r6  r  s    r   r  zBaseView.get_reads  sL    \\.*:DA 	&  " e		 	 	s   2AA!c                d    | }t        |t              r|j                  }t        |t              r|S r   )r   ro  rM  )r  r   s     r   rp  zBaseView.unwrap_view  s+    H%A H%r   c                    | j                         } t        j                  t        d|      |      }t	        || j                         || j                               S r  )r  r   r   r!  r  r  r
  r"  s      r   rH  zBaseView.constant_to_device  sP    !!#Hn.?HP.."==?	
 	
r   Nrr  r   r   *Callable[[Sequence[Expr]], Sequence[Expr]]rm  rk  r[  r]  rg  rV  ro  r~  rq  r_  rd  rS  r|  rT  rz  rR  r  )r   r   r   r   rb   r>  r  r
  r  r  r  r  r  r  rs  r  r  r  r  r  r;  rD  r9  r  r  rp  rH  r   r   r   ro  ro    s    
LJ'= (=C % %&&$ =A D2#!-%,*	
r   ro  c                  P    e Zd ZU ded<   edd       Zed	d       Zd
dZ	 	 ddZ	y)r   r  r  c                   t         j                  j                  }|D cg c]  }t        j                  |       }}| j                         }dgt        |      t        |      z
  z  t        |      z   }t        |      t        |      k(  sJ t        t        |            D ]  }||   dk(  r||   J ||   ||<   ||   ,t         j                  j                  j                  ||         rMt        |      rYt        |      re||   }||   }|J |J ||z
  }|j                  |d      dk(  rJ d| j                          d| d|         |S c c}w )zReplace `-1` with correct sizesNr2  r   )fallbackzBroadcast failed in ExpandView(, z) on dimension )rw   r  r  r   r  r
  r   r   r   is_size_one_or_falser8   r	  )	r   new_sizer  r   old_sizer   v1v2diffs	            r   _normalize_sizezExpandView._normalize_size.  s    77##-56ELLO66::<6S]S]:;d8nL8}H---s8}% 	A{b {...&qk!$(8(8(M(M) ./9 a[a[~%~~%~Bw..!" /  	 6ajjl^2hZ_`^ab-	< E 7s   Ec                   | j                  ||      }t        |      rt        |      \  }}t        |      t        |j                        z
  }|dk\  sJ t
        j                  j                  g|z  }t        |j                  |j                        D ]Y  \  }}|j                  t        j                  j                  j                  |      s|nt
        j                  j                         [ t        |j                   |j"                  t%        |      ||j&                  |j(                        }	t+        ||	      S t-        ||      S )Nr   rL  )rM  r  )rL  r  rO  r   r  r   r  r  r   r  r  rw   r  r  rF  rP  r  r  r   rQ  rR  rS  r   )
r  r   rG  rV  rW  skiprX  r  r  rY  s
             r   r  zExpandView.createV  s   &&q(3 #"7":GZx=3z#77D199'',,$.J #J$5$5z G !!77++@@F  %!!  X!!$$J #
CCqx00r   c                    | j                   S r   r  r  s    r   r
  zExpandView.get_sizeq  r  r   c                    | j                         }| j                  j                         t        |      t              z
  	 	 	 	 dfd}|S )Nc                    t        | d        } t        |       t              k(  sJ t        t                    D ](  }|   dk(  st        j                  j
                  | |<   * | S r  )r   r   r   r   r  r  )r   r   actualrN  s     r   r   z*ExpandView.make_reindexer.<locals>.reindex{  sf     tu&Eu:V,,,3v;' ,!9>$ww||E!H, Lr   r   r  r   r  )r
  rM  r   )r  targetr   rR  rN  s      @@r   r  zExpandView.make_reindexert  sP     ##%6{S[(		!				 r   N)r   r   rG  ra  r   ra  )r   r   rG  ra  r   ro  r~  r@  )
r   r   r   r   r  rL  r  r  r
  r  r   r   r   r   r   *  sA    
% %N 1 14	3r   r   c                  X    e Zd ZU ded<   ed	d       Zed
d       ZddZddZ	 	 ddZ	y)PermuteViewrG  dimsc           
        | j                  |      }t        |      t        t        t        |                  k(  sJ t	        |      rt        |      \  }}t        |j                  |j                  |D cg c]  }|j                  |    c}|D cg c]  }|j                  |    c}|j                  |j                        }t        ||      S t        ||      S c c}w c c}w )NrL  )rM  rW  )_map_neg_dimsr@   r   r   r  rO  rP  r  r  r  r  rQ  rR  rS  rV  )r  r   rW  rV  rW  r   rY  s          r   r  zPermuteView.create  s      &$:eCI.>#???? #"7":GZ$!!  -12#2/34!""1%4!!$$J #
CC-- 34s   5CC#c                R    |D cg c]  }|dk\  r|nt        |      |z    c}S c c}w r  r  )r  rW  rB  s      r   rY  zPermuteView._map_neg_dims  s)    @DEsaxSY_4EEEs   $c                   t        | j                  | j                              t        t        t	        | j                                    k(  sJ | j
                  j                         }| j                  D cg c]  }||   	 c}S c c}w r   )r@   rY  rW  r   r   rM  r
  )r  r  r   s      r   r
  zPermuteView.get_size  so    $,,TYY78J#dii.!=
 
 	
 
 yy!!#!%+AQ+++   7Bc                   t        | j                  | j                              t        t        t	        | j                                    k(  sJ | j
                  j                         }| j                  D cg c]  }||   	 c}S c c}w r   )r@   rY  rW  r   r   rM  r4  )r  r  r   s      r   r4  zPermuteView.get_stride  so    $,,TYY78J#dii.!=
 
 	
 
 %%'#'99-aq	---r\  c                L   t        | j                        D ci c]  \  }}||
 c}}t        t        | j                              D cg c]  }|   	 c}t	              t	        t        t        | j                                    k(  sJ 	 	 	 	 dfd}|S c c}}w c c}w )Nc                4    D cg c]  }| |   	 c}S c c}w r   r   )r   r   invs     r   r   z+PermuteView.make_reindexer.<locals>.reindex  s     '**E!H***s   rS  )r   rW  r   r   r@   )r  r   r  r   r`  s       @r   r  zPermuteView.make_reindexer  s     !*$)) 451q!t5$S^45!s1v5#*U3tyy>-B"CCCC	+!	+	+
  65s   BB!N)r   r   rW  rt  r   ro  )rW  rt  r   	list[int]r~  r@  )
r   r   r   r   r  r  rY  r
  r4  r  r   r   r   rV  rV    sG    
. .$ F F,.	3r   rV  c                  F    e Zd Zedddd       Ze	 	 	 	 dd       ZddZy)	SqueezeViewN)rB  c          	     D   t        |      rOt        |      \  }}g }g }|?t        |t              sJ t	        |             d|k  r|t        |j                        k  sJ t        t        |j                  |j                              D ]  \  }\  }}	|Mt        j                  j                  j                  |      r5|j                  |       |j                  |	       X||k7  r#|j                  |       |j                  |	       |dk(  rJ d        t        |j                   |j"                  |||j$                  |j&                        }
t)        ||
      S |[t*        j-                  ||j/                         D cg c]-  }t        j                  j                  j                  |      s|/ c}      S |j/                         |   dk(  sJ t*        j-                  |t        |j/                               D cg c]  \  }}||k7  s| c}}      S c c}w c c}}w )Nr   rI   zexpected squeezed size to be 1rL  )r  rO  r   r   r   r   r  r   r   r  rw   r  r  rF  r  rP  r  r  rQ  rR  rS  r#  r  r
  )r  r   rB  rV  rW  rG  rX  r   r  r  rY  r   s               r   r  zSqueezeView.create  s    #"7":GZHJ!#s+6T#Y6+CxC#joo*>$>>>%.s:??JDUDU/V%W K!>D&;77++@@F -"))&1Cx -"))&1#qyJ*JJyK %!!  !!$$J #
CC;;; ZZ\77++@@C   ::<$)));;q1::<1H"UAAQTH1"UVV #Vs    2H
=HHc                    | D cg c]
  }|dk7  s	| }}t        |       D cg c]  \  }}|dk7  s| c}}t        |       dfd}||fS c c}w c c}}w )NrI   c                    t        |       t              k(  sJ |  d        t        j                  j                  gz  }t	        |       D ]
  \  }}|||<    t        |      S )N )r   r   r  r  r   r   )r   r  r   r   lengthnot_ones       r   r   z%SqueezeView.squeezer.<locals>.reindex  sk    u:W-C%'/CC-%*WW\\NV$;Igu- #Q!"	####r   )r   r  r   ztuple[Expr, ...])r   r   )r  r   rG  r   r   rh  ri  s        @@r   squeezerzSqueezeView.squeezer  s_      $.!qAvA..!*4;AAF1;T	$    /;s   
AAAAc                    t        d      )Nzuse SqueezeView.create())rl  )r  rM  s     r   r]  zSqueezeView.__init__  s    788r   )r   r   rB  r  r   r   )r  r  r   z>tuple[list[int], Callable[[Sequence[Expr]], tuple[Expr, ...]]])rM  r   r   r   )r   r   r   r  r  r  rj  r]  r   r   r   rc  rc    sC    48 +W +WZ !!	G! ! 9r   rc  c                  l    e Zd ZU ded<   ded<   	 	 ddZddZddZeZe	 	 	 	 	 	 	 	 dd       Z	dd	Z
y
)GenericViewr  r  rA  r   c                    | j                   S r   )r   r  s    r   r  zGenericView.make_reindexer  s     ||r   c                   t        t        | j                              D cg c]  }t        t        j
                  |       }}t        | j                  |            }ddj                  t        t        |             d| S c c}w )Nzlambda rE  r  )r   r   r  rq   rH   r  r   r   r  r  r   )r  r  	index_old	index_news       r   reindex_strzGenericView.reindex_str  ss    CHTYYCX
>?*4::q9
	 
 i01	3sI#6789+FF	
s   !Bc                z    | j                  | j                  d| j                   d| j                          g      S )Nsize=zreindex=)r  rM  r  rr  r  s    r   r  zGenericView.__str__  s=    YY%		{+x8H8H8J7K-LM
 	
r   c                *     | |t        |      |      S )NrM  r  r   )r   )r  r   rG  r   s       r   r  zGenericView.create  s     X@@r   c                    | j                   S r   r  r  s    r   r
  zGenericView.get_size'  r  r   Nr@  ro  )r   r   rG  r  r   rA  r   ro  r~  )r   r   r   r   r  rr  r  r  r  r  r
  r   r   r   rm  rm    sp    
77	3
G

 HAA !A <	A
 
A Ar   rm  c                      e Zd ZdZedd       Zeed	d              Ze	 	 	 	 	 	 d
d       Z	e	 d	 	 	 	 	 	 	 dd       Z
e	 d	 	 	 	 	 	 	 dd       Zy)r#  z
    This class handles tensor reshaping by computing appropriate index transformations
    to map the new shape back to the original storage layout.
    c                    t        j                  |       } t        j                  |      }t        j                  j                  j
                  j                  } |t        j                  | d            r| |z   } | S r  )r   r  rw   r  r  r   evaluate_exprLt)r   r  rz  s      r   handle_negative_indexzView.handle_negative_index2  sZ    ll3||D!((22@@#q)**C
r   c                    t        t              sJ t                      j                  |j	                               \  t
        j                  j                  j                        r|S t        t                    dkD  xs t        t                    dkD  }t        |      }	 	 	 	 	 	 	 	 dd	 	 	 	 d fd}dv rdfd}  |t              |      S |r |t        j                              S t        |      s ||      S t!        |d      \  }}|j"                  }	t
        j                  j                  j%                        }
t
        j                  j                  j%                  |	      }t
        j                  j                  j%                        }ddlm}  ||
|||	      }||D cg c]9  }t+        |d
      r|j,                  j.                  nt1        j2                  |      ; }}t5        |j6                  |j8                  ||j:                  |j<                        }t?        ||      S  ||      S c c}w )Nr   c                   t         j                  | t        j                  | j	                                     } t        |       \  }}t        |j                  |j                  |||j                  |j                        }t        ||      S NrL  )r  require_exact_stridesr  r  r
  rO  rP  r  r  rQ  rR  rS  )rl  rG  rX  rV  rW  rY  s         r   create_reinterpret_viewz,View.create.<locals>.create_reinterpret_viewK  s~     44^66s||~FC #8"<GZ$!!  !!$$J #
CCr   c                    	 j                        } | t              |      S # t        $ r5 t        j	                  |       }  | t
        j                              cY S w xY w)a  
            Handle the case where view is not possible with current strides.
            Try dynamic_reshape_indexer first; if it fails with unbacked
            symbols (guard_or_false can't resolve comparisons), fall back
            to making the tensor contiguous.
            rv  )r$  r   r7   r  require_contiguousr  r  )r   r   r  r  rG  rH  s     r   "handle_unbacked_or_dynamic_reshapez7View.create.<locals>.handle_unbacked_or_dynamic_reshape\  sm    
55hIXHH.  !33A6.x!B!B8!L s   %) ;A'&A'c                4    t        dgt              z        S r  )r   r   )r   rH  s    r   fake_reindexz!View.create.<locals>.fake_reindext  s    aS3x=011r   rv  Fr  )_compute_stride)size_obliviousr   rL  )rl  r   rG  r  rX  r  r   rS  r   r   r   r   )r   r   r   ztuple[int, ...]) r   r   r   resolve_negative_sizer
  rw   r  r  statically_known_list_equalsr   r6   r  r   r  r  r  rO  r  to_symints_or_intstorch._subclasses.fake_implsr  r  r   exprr   r!   rP  r  r  rQ  rR  rS  )r  r   rG  unbacked_symbols_in_sizesr  r  r  rV  rW  
old_strideold_size_symintold_stride_symintnew_size_symintr  new_stride_symintr   rX  rY  r  rH  s   ` `               @@r   r  zView.create;  sb    (H-=tH~=- 66qzz|XN( 77888LH %h/014 8(23a7 	" ?qA	D	D#1	D?M	D	D"			 	, =2 ADNLII *8^>>xH 
 %Q'5a88 4AeD&&
 ''**==hGGG,,??
K''**==hG@ ,4	
 ( +  'q&1u}}Q7GGJ 
 %!!  !!$$J #
CC 2!44!s   >Ic                F   |D cg c]+  }t         j                  j                  j                  |      - }}| D cg c]+  }t         j                  j                  j                  |      - } }t	        |      }t        t        |            D ]J  }||   dk(  st        j                  j                  ||<   t        t        |       t        |            ||<    n t         j                  j                  j                  t        |       t        |             | |fS c c}w c c}w )Nr2  )rw   r  r  r  r   r   r   r   r  OnerB   rr   check_equals)rH  rG  r   r   s       r   r  zView.resolve_negative_size  s     ;CCQAGG$$--a0CC:BCQAGG$$--a0CC>s8}% 	A{b #ggkk&}X'>h@WX		 	
%%mH&=}X?VW!! DCs
   0D0DNc                    	 | j                  |||      }|S # t        t        t        f$ r@ t	        |      g}| j                  ||      }| j                  ||      }t        ||      }Y |S w xY wr   )_dynamic_reshape_indexerrl  r7   
IndexErrorrr   r   )r  rH  rG  	dense_dimr   flatr   r   s           r   r$  zView.dynamic_reshape_indexer  s}    	:228XyQG   ;ZH 	:!(+,D33HdCH33D(CH%h9G	:s    AA+*A+c                   t         j                  j                  j                  dfd}t	        t        |            D cg c]  }t        t        j                  |       c}t        t        |            }t        |       }|duxr! |t        |      dz
  k7  xr t        |      dk(  }|r&|J |j                  |      }|j                  |       g |r|r|j                         }	|j                         \  }
}|	dk(  r>j                  t        j                  j                         |j                  |
|f       n|dk(  r|j                  |	       ni |||	      dk(  rj                  |
       nJ |||	      dk  ru |||	      dk  r-|j                         \  }}||z  |
z   }
||z  } |||	      dk  r-j                  |
       t         j                  j                  j!                  ||	       n |||	      dkD  rt        j                  j"                  }|	}j                  t%        |
||             ||z  } |||	      dkD  rC|j                         }j                  t%        |
||             ||z  }|	|z  }	 |||	      dkD  rCt         j                  j                  j!                  ||	       nt&        |r|r|rf|j                         }	t         j                  j                  j!                  |	d       j                  t        j                  j                         |rf|r@|j                         \  }
}t         j                  j                  j!                  |d       |r@|At        |      dk(  r3j)                          j                         }j+                  ||       nj)                          t              t        |       k(  sJ 	 	 	 	 dfd}|S c c}w )zG
        Perform a reshape entirely by modifying indexing math
        c                    t        j                  | |            ry t        j                  | |            ry t        j                  | |            ryt        j
                  j                  j                  ||       ryt        j
                  j                  j                  | |      ryt        t        j                  | |            )z
            Compare two symbolic sizes, returning -1 if a < b, 0 if a == b, 1 if a > b.

            For unbacked symbols, guard_or_false returns False, so we fall back
            to divisibility checks.
            r   r2  rI   )	r   r0  r{  Gtrw   r  r  r  r7   )rF  rG  r8  s     r   compare_sizesz4View._dynamic_reshape_indexer.<locals>.compare_sizes  s     ehhq!n-ehhq!n-ehhq!n- ww<<QBww<<QB-ehhq!n==r   NrI   r   c                    t        |       t              k(  sJ t        |       t              f       t        t        |             t        fdD              S )Nc              3  6   K   | ]  }t        |        y wr   )rs   )r   r   replacementss     r   r   zAView._dynamic_reshape_indexer.<locals>.reindex.<locals>.<genexpr>H  s     HA|4Hr  )r   r   r   r   )r   r  r  	view_exprs    @r   r   z.View._dynamic_reshape_indexer.<locals>.reindexC  sO     u:T*CSZT,CC*D% 01LHiHHHr   )rF  r    rG  r    r   r   rS  )rw   r  r  r8  r   r   rq   rH   VIEWr   r   r  r  r   r  r  r  r  rG   rl  reverseinsert)rH  rG  r  r  r   	stack_new	stack_oldreordering_dense_dimold_dimsize_oldr  size_newvar2	size_new2divisormodulus
dense_exprr   r8  r  r  s                     @@@r   r  zView._dynamic_reshape_indexer  s    ))88 	>J CHHBV
=>*499a8
 T8,-	N	 T! #S^a//#H" 	
  (((mmI.GW%	I }}H%MMOMC1}  .  #x1Q  *x2a7  %x2Q6#Hh7!;&/mmoOD)/C/C')3H $Hh7!;   %  --hAx2Q6''++"  gw!GH!G+#Hh7!;'mmoG$$_S'7%KL%/G''1H	 $Hh7!;
   --hA$$; I>  }}HGG))(A6UWW\\* 
 %MMOMCGG))(A6   S]a%7"JY
39~X...	I!	I	I Y
s   !O/)r   r    r  r    r   r    )r   r   rG  r  r   r   )rH  r  rG  r  r   ztuple[list[Expr], list[Expr]]r   )rH  ra  rG  ra  r  r  r   &Callable[[Sequence[_T]], Sequence[_V]])rH  r  rG  r  r  r  r   rA  )r   r   r   r  r  r|  r  r   r  r  r$  r  r   r   r   r#  r#  +  s    
   n5  n5` " ",:"	&" "  
 !%	$ % 	
 
0    !%z z z z 
4	z zr   r#  c                       e Zd ZU dZded<   d fdZddZeZddZddZ	ddZ
edd	       Zdd
ZddZddZddZddZddZ ed       	 d	 	 	 dd       ZdddZd dZ xZS )!rS  z*Pretend our storage has a different layoutr  rN  c                    t         |           t        | j                  t              r0t
        j                  | d| j                  j                                y y )NrM  )rn  r  r   rM  ro  r   r  rp  r  s    r   r  zReinterpretView.__post_init__S  s@    dii*tVTYY-B-B-DE +r   c                P    | j                  | j                  | j                  g      S r   )r  rM  rN  r  s    r   r  zReinterpretView.__str__X  s&    		
 	
r   c                6    | j                   j                         S r   r"  r  s    r   rs  zReinterpretView.get_nameb  r#  r   c                .    | j                   j                  S r   )rN  r  r  s    r   r  zReinterpretView.get_devicee  s    {{!!!r   c                     y r   r   r  s    r   r  zReinterpretView.get_origin_nodeh  r  r   c                .    | j                   j                  S r   )rN  r  r  s    r   r  zReinterpretView.dtypek  s    {{   r   c                @    t        | j                  j                        S r   )r   rN  r  r  s    r   r
  zReinterpretView.get_sizeo  s    DKK$$%%r   c                @    t        | j                  j                        S r   )r   rN  r  r  s    r   r4  zReinterpretView.get_strider  s    DKK&&''r   c                     d fd}|S )Nc                T   j                   j                         }t        j                  j	                          ||             }j                   j
                  j                  j
                  k7  r5t        j                  |j
                  j                  j
                        S |S r   )rN  r
  ru   loadrs  r  rM  to_dtype_bitcast)r   r  
tmp_loaderr  s      r   r  z+ReinterpretView.make_loader.<locals>.loaderv  sp    kk..0G$--/75>BJ{{  DIIOO3++J

DIIOOTT!!r   rk  r   r  r  s   ` r   r  zReinterpretView.make_loaderu  s    	" r   c                6    | j                   j                         S r   )rN  r
  r  s    r   r
  zReinterpretView.make_indexer      {{''))r   c                    | j                   S r   rN  r  s    r   r  zReinterpretView.get_layout  r  r   c                     y r   r   r  s    r   r"  zReinterpretView.freeze_layout  r  r   c                    t        | j                  j                  |      t        | j                  j                  |      z  t        | j                  j                  |      z  S r   )r)   rN  r  r  rQ  r=  s     r   r>  z$ReinterpretView.get_free_symbol_uses  sQ    
 T[[--}=t{{11=ABt{{11=AB	
r   c                t   t         j                  j                  j                  | j                  | j
                  j                  | j
                  j                  | j
                  j                  ||j                  n#t         j                  j                  j                  | j
                  j                        S r  )rw   r  wrapper_codecodegen_reinterpret_viewrM  rN  r  r  rQ  	writeliner  r  s     r   r  z!ReinterpretView.codegen_reference  s     ww##<<IIKKKKKK & 2F8L8L8V8V++## = 
 	
r   c                     yr  r   r  s    r   r9  zReinterpretView.num_reads      r   rS  ro  rg  rV  r[  r~  rk  rm  r]  rr  r}  r   rf  r{  )r   r   r   r  r   r  r  r  rs  r  r  r  r  r
  r4  r  r
  r  r"  rb   r>  r  r9  rI  rJ  s   @r   rS  rS  M  s    4NF

 H$" ! !&(	* -.$)
!
	!
 /

r   rS  c                  \    e Zd ZU dZded<   ed
d       ZddZeZe	dd       Z
ddZddZy	)	DtypeViewz(Pretend our storage has a different typer\  target_dtypec                    t        |      r]t        |      \  }}t        |j                  ||j                  |j
                  |j                  |j                        }t        ||      S t        ||      S )NrL  )rM  r  )
r  rO  rP  r  r  r  rQ  rR  rS  r  )r  r   	new_dtyperV  rW  rY  s         r   r  zDtypeView.create  sm     #"7":GZ$!!!!!!$$J #
CCai88r   c                P    | j                  | j                  | j                  g      S r   )r  rM  r  r  s    r   r  zDtypeView.__str__  s     		4+<+<=>>r   c                    | j                   S r   )r  r  s    r   r  zDtypeView.dtype  s       r   c                6    | j                   j                         S r   rM  r
  r  s    r   r
  zDtypeView.get_size  r#  r   c                L      j                   j                         d fd}|S )Nc                z    t        j                   |       j                  j                  j                        S r   )ru   r  r  rM  r  )r   r  r  s    r   r  z%DtypeView.make_loader.<locals>.loader  s*    ''c
D4E4EtyyWWr   r  rM  r  )r  r  r  s   ` @r   r  zDtypeView.make_loader  s"    		%%'	X r   N)r   r   r  r\  r   ro  ro  r[  r~  rk  )r   r   r   r  r   r  r  r  r  r  r  r
  r  r   r   r   r  r    sE    29 9? H! !$r   r  c                  h    e Zd ZdZe	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zy)	SliceViewzqView that represents a slice along a single dimension.

    Corresponds to tensor[..., start:end:step, ...].
    c                   	
 t         j                  j                  
|j                         |   t	        d ||fD              rt
        	t        n:t	        d ||fD              rt
        	t        n
j                  	
j                  d	
fd	 	 	 	 	 	 	 	 	 	 d fd} ||dd      } |||      }||fS )zz
        Normalize start and end such that both are in the range
        [0, x.get_size()[dim]] and start <= end.
        c              3  2   K   | ]  }t        |        y wr   )r6   r   r   s     r   r   z0SliceView.normalize_start_end.<locals>.<genexpr>  s     HA$Q'H   c              3     K   | ]L  }t        |t              r:|j                  t        j                  t        j
                  t        t
               N y wr   )r   r    hasr   rE   rD   r  s     r   r   z0SliceView.normalize_start_end.<locals>.<genexpr>  s;      
 !T" EE%))UYYS1
s   AAc                    j                  | |      r| n | |      }j                  ||      r|}|S  ||      }|S r   )statically_known_geqr>  )r   lowerupperclamped_lowerclamped_fullmax_funcmin_funcr  s        r   clampz,SliceView.normalize_start_end.<locals>.clamp  s`    221e<(1eBT 
 00F  
   mU3 
  r   c                D    | |S j                  |       }  | ||      S r   )r|  )r  r  r  r  r  r  dim_sizes       r   
clamp_wrapz1SliceView.normalize_start_end.<locals>.clamp_wrap  s0     {++C:CeU++r   r   )r   r    r  r   r  r   r   r    )
r  r  r  r   r  r   r  
Expr | intr   r  )	rw   r  r  r
  r0  rE   rD   evaluate_minevaluate_max)r  r   rB  startendr  r  r  r  r  r  s   `     @@@@@r   normalize_start_endzSliceView.normalize_start_end  s     77##::<$H%h1GHHHH 
 S(+
 
 HH,,H,,H		 	,	,$'	,03	,>H	,	, 5!Xq1eXx8czr   c           	        t        j                        t        t              sdkD  sJ        	 dk(  r|dk\  rdk(  r|S t        |j                               |r| j                  ||      \  }t        |z
  dz
  z         <   t        |      rt        |      \  }}t        |j                        }	|	   z  |	<   t        |j                  |j                  |	|j                  |j                     z  z   |j                         }
t#        ||
      S 	 	 	 	 dfd}t%        ||      S # t        $ r Y w xY w)Nr   l    rI   rL  c                    t        |       t              k(  sJ d|  d        t        |       } |    z  z   | <   | S )Nzwrong ndim rg  )r   r   )r   rB  rG  r  steps    r   r   z!SliceView.create.<locals>.reindex1  sR     u:X.P+eWAhZ0PP.KEsd*U2E#JLr   rv  rS  )r   r  r   r    	TypeErrorr   r
  r  rC   r  rO  r  rP  r  r  rQ  rR  rS  r  )r  r   rB  r  r  r  r  rV  rW  rX  rY  r   rG  s     `` `      @r   r  zSliceView.create  sk    ||D!$%7471	zcY.419 

%
 00CDJE3 uq!94@ #"7":GZj//0J(o4JsO$!!  !!J$5$5c$:U$BB$$J #
CC	!		 	 ah@@K  		s   D> >	E
EN)
r   r   rB  r   r  r   r  r   r   ztuple[int, int])rI   T)r   r   rB  r   r  r   r  r   r  r   r  r   r   r   )r   r   r   r  r  r  r  r   r   r   r  r    s    
 // /),/36/	/ /b  3A3A 3A 	3A
 3A 3A 3A 
3A 3Ar   r  c                  B    e Zd ZU ded<   ded<   d
dZddZddZddZy	)BaseConstantr\  r  rj  r  c                     yNr   r   r  s    r   r
  zBaseConstant.get_sizeB  s    r   c                    | j                   S r   r  r  s    r   r  zBaseConstant.get_deviceE  r  r   c                     y r   r   r  s    r   r  zBaseConstant.get_origin_nodeH  r  r   c                    t               S r   r?   r  s    r   r  zBaseConstant.get_readsK  r  r   Nr~  rg  rV  rz  )r   r   r   r   r
  r  r  r  r   r   r   r  r  =  s"    r   r  c                  D    e Zd ZU ded<   ded<   ded<   ddZddZdd	Zy
)Constantr   r  r\  r  rj  r  c                     d fd}|S )Nc                X    t        j                  j                  j                        S r   )ru   r  r  r  r   r  s    r   r  z$Constant.make_loader.<locals>.loaderV  s    <<

DJJ77r   rk  r   r  s   ` r   r  zConstant.make_loaderU  s    	8 r   c                     y r   r   r  s    r   r  zConstant.realize[  r  r   c                F    t        | j                  | j                  |      S )N)r  r  r  )r  r  r  r  s     r   rH  zConstant.constant_to_device^  s    djj

6JJr   Nrk  rd  r  )r   r   r   r   r  r  rH  r   r   r   r  r  O  s#    JKr   r  c                  <    e Zd ZU ded<   ded<   ded<   d
dZddZy	)IndexingConstantr   r   r\  r  rj  r  c                     d fd}|S )Nc                X    t        j                  j                  j                        S r   )ru   r  r   r  r  s    r   r  z,IndexingConstant.make_loader.<locals>.loaderi  s    >>$**djj99r   rk  r   r  s   ` r   r  zIndexingConstant.make_loaderh  s    	: r   c                F    t        | j                  | j                  |      S )N)r   r  r  )r  r   r  r  s     r   rH  z#IndexingConstant.constant_to_devicen  s    djj

6RRr   Nrk  r  )r   r   r   r   r  rH  r   r   r   r  r  b  s    JSr   r  c                8   d}d}t        t        t        ||                   D ]u  \  }}|dk(  rt        j                  j
                  j                  ||      s,t        j                  j
                  j                  ||      s y|t        d|      z  }||z  }w yNrI   FT)reversedr   r   rw   r  r  rI  rD   )r  rA  expected_strideexpected_stride_maxr   ys         r   is_contiguous_strides_for_shaper  r  s     Os5&123 
16ww77
''""::1>QRs1ay(1
 r   c                <    t         j                  | j                  z  S r   )rJ   padding_alignment_bytesitemsizer  s    r   get_align_for_dtyper    s    ))U^^;;r   c                  2    e Zd ZdZddZddZ	 d	 	 	 d	dZy)
r  zxAbstract base for Layout, MultiOutputLayout, NoneLayout.
    Represents the memory layout of the output of an Operation.c                >    t        t        |       j                        r   r  r  s    r   r  zOutputSpec.get_device  r  r   c                >    t        t        |       j                        r   r  r  s    r   r  zOutputSpec.storage_size  r  r   c                >    t        t        |       j                        r   r  r=  s     r   r>  zOutputSpec.get_free_symbol_uses  r'  r   Nrg  r{  rr  r}  )r   r   r   r  r  r  r>  r   r   r   r  r    s,    C77 %*7!7	!7r   r  c                     e Zd ZdZd ed      df	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zej                  dd       Zed d       Z	e	j                  d!d	       Z	ed"d
       Z
e
j                  d#d       Z
d$dZeZd%dZd&dZd'dZe	 	 	 	 	 	 d(d       Zd'dZed)d       Zd*dZd'dZe	 	 	 	 	 	 	 	 d+d       Zd,dZd'dZd-dZd.dZd/dZd"dZ ed       	 d0	 	 	 d1d       Zy)2r  zo
    Layout base class

    Carries tensor meta-information including offset and
    whether it is pinned.
    Nr   Fc                P   |t         j                  |      }|| _        || _        t	        |      t	        |      k(  sJ d| d|        t        d |D              sJ || _        || _        || _        || _	        | j                  r!| j                  j                  dk(  sJ d       y y )Nrt  	, stride=c              3  <   K   | ]  }t        |t                y wr   )r   r   r   s     r   r   z"Layout.__init__.<locals>.<genexpr>  s     9q:a*9r|  r!  zOnly CPU tensors can be pinned)r  r  r  r  r   r   _size_stride_offsetrR  r   )r  r  r  r  r  rQ  rR  s          r   r]  zLayout.__init__  s     >#66t<F
4yCK'H5ix)HH'9D9999
"NN(8(8E(A 	
,	
B(ANr   c                    | j                   S r   r  r  s    r   r  zLayout.size      zzr   c                    || _         y r   r#  r  r  s     r   r  zLayout.size  s	    
r   c                    | j                   S r   r   r  s    r   r  zLayout.stride      ||r   c                    || _         y r   r(  r&  s     r   r  zLayout.stride  	    r   c                    | j                   S r   r!  r  s    r   rQ  zLayout.offset  r)  r   c                    || _         y r   r-  r&  s     r   rQ  zLayout.offset  r+  r   c                   d}| j                   dk7  rd| j                    }| j                  j                  dnd| j                  j                   }d}| j                  rd| j                   }t	        |       j
                   d| j                  j                   | d| j                   d| j                   d	| j                   | | d
S )Nr  r   z	, offset=:z, is_pinned=z('z', z, size=r  r  )	rQ  r  r   rR  r   r   r  r  r  )r  rQ  device_index_stris_pinned_strs       r   r  zLayout.__str__  s    ;;! .F!%!2!2!:2!DKKDUDUCV@W>>*4>>*:;MDz""#2dkk&6&6%78H7ITZZL YII;i}VH]O1N	
r   c                    | j                   S r   r  r  s    r   r  zLayout.get_device  r  r   c                
   t         j                  5  t        j                  t	        | j
                        t	        | j                        | j                  | j                  | j                        cd d d        S # 1 sw Y   y xY w)N)r  r  
pin_memory)
rw   	fake_moder  r  re   r  r  r  r  rR  r  s    r   get_examplezLayout.get_example  sY    [[ 	&&'		2'4jj{{>>	 	 	s   AA99Bc                B    t        | j                  | j                        S r   )r  r  r  r  s    r   r  zLayout.is_contiguous  s    .t{{DIIFFr   c                    t        |       }|dvs| d   dk(  ryt        |t        |       |       D ]  \  }}}|dk7  s||k7  s y y)N)r      rI   FT)r   r   r1   )rA  rU  ndimleftrightr  s         r   is_channels_last_contiguousz"Layout.is_channels_last_contiguous  sb     5zvqQ!$*51"
 	D% qyTU]	 r   c                    t        | j                  t        t        j	                  t        t        | j                                          | j                        D ]  \  }}}|dk7  s||k7  s y yr  )r   r  r  r  r  r   r  )r  r<  r=  r  s       r   is_transposedzLayout.is_transposed  sc    !$KK^66tHTYY<O7PQRII"
 	D%
 qyTU]	 r   c                l   t         j                  j                  }|j                  t	        j
                  |d            ry|j                  t	        j
                  | d            ry|j                  t	        j                  | |            xs( |j                  t	        j
                  | |z  d            S )z
        Returns true if left is symbolically greater than or equal to right,
        assuming both expressions are tensor strides.
        r   TF)rw   r  r  r8  r   r0  Ge)r<  r=  r  s      r   _stride_expr_ge_or_falsezLayout._stride_expr_ge_or_false  s     77##""588E1#56""588D!#45&&HHT5!
 @$$UXXdUlA%>?	@r   c                   t        | j                        t        |      k(  sJ t        | j                        D cg c]1  \  }}t        j
                  j                  j                  |d      s|3 }}}|D cg c]  }| j                  |    }}|D cg c]  }||   	 }}dd} ||      }dgt        |      z  }t        t        |            D ]  }||   |||   <    t        t        |      dz
        D ]u  }||   }||dz      }	t        j
                  j                  j                  t        j                  ||	            rN| j                  ||	      r y| j                  |	|      ru y yc c}}w c c}w c c}w )NrI   c                `    t        |       }| D cg c]  }|j                  |       c}S c c}w r   )r  r   )arr
sorted_arrelements      r   sorted_indicesz0Layout.is_stride_ordered.<locals>.sorted_indices,  s*    J=@A'J$$W-AAAs   +r2  FT)rF  rt  r   rt  )r   r  r   r  rw   r  r  rI  r   r8  r   r0  rC  )
r  r   r   rB  non_1_indicesr  rI  stride_orderedr<  r=  s
             r   r  zLayout.is_stride_ordered  sy   4;;3u:---
 $DII.
377##;;CC 
 
 +88Q$++a.882?@Qa@@	B
 u% E
*s5z" 	1A'-ayN58$	1 s5zA~& 	A!!$D"1q5)Eww..uxxe/DE,,T5900=	 =
 9@s   6E29E8E=c                    dgt        t        t        dt        | j                        dz
                    z   }t        |      g|z   }| j                  |      S Nr   rI   )r   r  r   r   r  r  r)  s     r   is_channels_last_stride_orderedz&Layout.is_channels_last_stride_orderedC  sN    d8E!S-=-A$BCDDUu$%%e,,r   c                F   t        |      }t        |       dk(  r| S t        j                  st        j                  ||       r| S t        j                         }t        |d      r|j                  j                  dd      r| S t        d t        j                  | |      D               }t        j                  s|r| S t        t        j                  d      rt        j                  j                   nddfdrt#        fd	| D              r| S t%        |       }t'        |      }t)        t        |             D cg c]  }d }	}d
|	|d   <   d}
t+        |d
d d
      D ]  \  }}||d
z
     }|	|   ||   z  }t-        |t.        t0        j2                  f      xr |t        j4                  kD  xr ||z  dk7  xs" t-        |t6              xr t        j                  }||	|<   |st9        ||      |z  |	|<   d}
 |
s| S t:        xj<                  d
z  c_        |	S c c}w )z
        The padding does not change stride order but makes sure all strides larger
        than the threshold are multiple of align.
        r   rb  dislike_paddingFc              3  \   K   | ]$  }t        |t        t        j                  f       & y wr   r   r   s     r   r   z&Layout._pad_strides.<locals>.<genexpr>b  s(      
 q3./
r   
_shape_envNc                h    yt        | t              syt        fd| j                  D              S )NFc              3  @   K   | ]  }j                  |        y wr   )is_unbacked_symint)r   r   r   s     r   r   zILayout._pad_strides.<locals>.contains_unbacked_symints.<locals>.<genexpr>p  s     R1y33A6Rs   )r   r    r0  r5   )r  r   s    r   contains_unbacked_symintsz6Layout._pad_strides.<locals>.contains_unbacked_symintsk  s0     dD)R@Q@QRRRr   c              3  .   K   | ]  } |        y wr   r   )r   r   rV  s     r   r   z&Layout._pad_strides.<locals>.<genexpr>s  s     Na6q9Nr  rI   )r  T)r  r  r   r   )r  r   rJ   pad_channels_lastr  r>  rw   get_current_noder  rb  r  r   r  chainpad_dynamic_shapesr  rR  r0  r   r   r   r   r   r   r   r!   padding_stride_thresholdr    rc   r'   num_comprehensive_padding)
in_stridesr  r  aligncurrent_fx_noderm   r  r   r   new_stridespaddedrankr   prev_idxr  require_paddingrV  r   s                   @@r   r  zLayout._pad_stridesI  s,    $E*z?a''F,N,N*-
 ,,.?F+0D0D0H0Hu1
   
__Z6
 
 

 ((Z*1!''<*HAGG&&d		S N:NN'
I>,\:
"'J"89Qq99 &'JqM"":ab>; 	ID#!$(+H *T(^;F 6C#78 (V<<<(UNa'J VT*Hv/H/H	 
  &K#*65#9E#AC 	   	))Q.); :s    	Hc                    t        | t              sJ t        |              | j                  J | j	                  | j                  | j
                  | j                        | _        y r   )r   r  r   r  r  r  r  r  s    r   pad_strideszLayout.pad_strides  sM    $/;d;/{{&&&''TYY

Kr   c                F    t         j                  xr t        | t              S r   )rJ   comprehensive_paddingr   r  r  s    r   r  zLayout.should_pad_strides  s    ++P
40PPr   c                    t        | t              r| S | j                         r| j                          t        | j                  | j
                  | j                  | j                  | j                  | j                        S r   )
r   rP  r  rg  r  r  r  r  rQ  rR  r  s    r   as_fixedzLayout.as_fixed  s`    dK(K""$KKJJIIKKKKNN
 	
r   c                    t         j                  sJ dt        |       j                   d       | j	                         j                         S )Nzconvert z to FixedLayout first)r  r  r   r   rk  r
  r  s    r   r
  zLayout.make_indexer  sG    ,, 	
tDz**++@A	
, }}++--r   c                f   t        |t              xr | j                  |j                  k(  xr | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j
                  |j
                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )r   r  r  r  r  r  rQ  rR  )r  others     r   __eq__zLayout.__eq__  s    uf% 2u||+2

ekk)2 		UZZ'2 u||+	2
 u||+2 %//1	
r   c                X    t        | j                  | j                  | j                        S r   )r-   r  r  rQ  r  s    r   r  zLayout.storage_size  s    .tyy$++t{{SSr   c                    t        | j                  |      t        | j                  |      z  t        | j                  |      z  S r   )r)   r  r  rQ  r=  s     r   r>  zLayout.get_free_symbol_uses  s=    
 TYY6t{{M:;t{{M:;	
r   )r  rj  r  r\  r  ra  r  zSequence[Expr] | NonerQ  r    rR  r   r   r   r`  )r  ra  r   r   r~  r  r  r   r   rc  r  r    r   r   ro  ri  )r   torch.Tensorr_  )rA  ra  rU  ra  r   r   )r<  r   r=  r   r   r   )r   rt  r   r   )r^  rt  r  r  r  r\  r   rt  rS  r   rP  rm  )rn  r   r   r   rr  r}  )r   r   r   r  r!   r]  r  r  setterr  rQ  r  r  r  r7  r  r  r>  r@  rC  r  rN  r  rg  r  rk  r
  ro  r  rb   r>  r   r   r   r  r    s    )-qz

 
 !	

 &
 
 
 

2   
[[    ]]    ]] 
 HG !,>	 " @ @"H- L!L)7L@KL	L L\L
Q
.	
T H%$)
!
	!
 &
r   r  c                      e Zd ZdZddZy)rP  z A Tensor layout we cannot changec                X    t        | j                  | j                  | j                        S )rL  )r  r  r  rQ  r  s    r   r
  zFixedLayout.make_indexer  s    diidkkBBr   Nrm  )r   r   r   r  r
  r   r   r   rP  rP    s    *Cr   rP  c                      e Zd ZdZdZddZedd       Zedd       Zedd       Z	e	 	 	 	 	 	 dd       Z
e	 	 	 	 	 	 dd       Zedd	       Zej                  dd
       Zedd       Zej                  dd       Zedd       Zej                  dd       Z	 d 	 	 	 	 	 d!dZ	 d 	 	 	 	 	 d"dZd#dZd$dZd%dZd&dZ	 	 d'	 	 	 	 	 	 	 	 	 	 	 d( fdZ xZS ))r  z|
    A Tensor layout that we are allowed to change

    Assumption: layout change should NOT add or remove free symbols
    Fc                H    t        j                  |       j                         S )z
        Compute what the strides would be if this layout were frozen,
        without actually modifying the layout. This is used for speculative
        stride computation during Triton template code generation.
        )r  deepcopyrk  r  s    r   !get_fixed_layout_without_freezingz0FlexibleLayout.get_fixed_layout_without_freezing  s     }}T"++--r   c                    t        |       dk(  rg S t        j                  j                  g}t	        | dd        D ]  }|j                  ||d   z          t        t	        |            S )Nr   rI   r2  )r   r   r  r  r  r  r   )sizesreversed_stridesr  s      r   r  z!FlexibleLayout.contiguous_strides  sh    u:?I!GGKK=U12Y' 	AD##D+;B+?$?@	AH-.//r   c                    t        t        t        |                   t        |      k(  s	J | |f       t        j                  j
                  }dgt        |      z  }|D ]  }|||<   || |   z  } |S )z
        Create a stride based on the order the dimensions should be filled in.

        In this format, channels last would be:
            [1, 3, 2, 0]
        N)r@   r   r   r   r  r  )r~  r   next_striderU  r   s        r   fill_orderedzFlexibleLayout.fill_ordered  sx     %E
+,
50AAQE5>QAggkk&3u:% 	1A$GAJ%a0K	1 r   c                    t        t        t        |                   t        |      k(  sJ t        |      }t        j                  | |      S )z
        Create a stride based on the sorted order of a permuted range.

        In this format, channels last would be:
            [3, 0, 2, 1]
        )r@   r   r   r   r  r  )r~  r   r   s      r   rK  zFlexibleLayout.stride_ordered  sB     %E
+,
50AAAA,U3
**5*==r   c                >   |t         j                  k(  rt        j                  | t              S |t         j
                  k(  rt        j                  | t              S |t         j                  k(  rt        j                  |       S t        j                  d|       t        )aq  
        Create a stride based on a memory format.

        Memory format is translasted into a stride order,
        so channels_last is the same as:
            FlexibleLayout.stride_ordered(sizes, [3, 0, 2, 1])

        This interface does not support memory_format `torch.preserve_format`
        which should be used to deduce a format from another source
        z>stride_ordered_for_memory_format, unsuppored memory_format: %s)r  channels_lastr  rK  NHWC_STRIDE_ORDERchannels_last_3dNHWDC_STRIDE_ORDERcontiguous_formatr  r  r  r  )r~  memory_formats     r    stride_ordered_for_memory_formatz/FlexibleLayout.stride_ordered_for_memory_format  s     E///!008IJJe444!008JKKe555!44U;;IIP &%r   c                   t        |       t        |      k(  sJ t        j                  j                  j	                  |      }t        t        t        |            |j                        }t        j                  | |      S )z
        Create a stride that has the same stride order as given stride

        For example, if given stride is [1000, 1, 100, 10],
        the fill order should be [1, 3, 2, 0]
        r  )
r   rw   r  r  guarding_hints_or_throwr  r   __getitem__r  r  )r~  r  r   s      r   same_orderedzFlexibleLayout.same_ordered*  sb     5zS[(((!!99&AE#f+.F4F4FG
**5*==r   c                    | j                   S r   r#  r  s    r   r  zFlexibleLayout.size9  r$  r   c                6    | j                  d|       || _        y )Nr  )!assert_free_symbol_uses_unchangedr  r&  s     r   r  zFlexibleLayout.size=  s    ..vu=
r   c                    | j                   S r   r(  r  s    r   r  zFlexibleLayout.strideB  r)  r   c                6    | j                  d|       || _        y )Nr  )r  r   r&  s     r   r  zFlexibleLayout.strideF      ..x?r   c                    | j                   S r   r-  r  s    r   rQ  zFlexibleLayout.offsetK  r)  r   c                6    | j                  d|       || _        y )NrQ  )r  r!  r&  s     r   rQ  zFlexibleLayout.offsetO  r  r   c                0   | j                  | j                  |      }| j                         r)|r'| j                  || j                  | j                        }t        | j                  | j                  | j                  || j                  | j                        S r   )	rK  r  r  r  r  rP  r  rQ  rR  )r  r   r%  rX  s       r   as_stride_orderzFlexibleLayout.as_stride_orderT  sw     ((E:
""$**:tyy$**MJKKJJIIKKNN
 	
r   c                    |}| j                         r)|r'| j                  || j                  | j                        }t	        | j
                  | j                  | j                  || j                  | j                        S r   )r  r  r  r  rP  r  rQ  rR  )r  r0  r%  rX  s       r   as_exact_strideszFlexibleLayout.as_exact_stridesd  sf     #
""$**:tyy$**MJKKJJIIKKNN
 	
r   c                ,   | j                  | j                  |      }| j                         r'| j                  || j                  | j                        }t        | j                  | j                  | j                  || j                  | j                        S r   )	r  r  r  r  r  rP  r  rQ  rR  )r  r   rX  s      r   as_fill_orderzFlexibleLayout.as_fill_ordert  ss    $($5$5dii$G
""$**:tyy$**MJKKJJIIKKNN
 	
r   c                ,   | j                  | j                  |      }| j                         r'| j                  || j                  | j                        }t        | j                  | j                  | j                  || j                  | j                        S r   )	r  r  r  r  r  rP  r  rQ  rR  )r  r  rX  s      r   as_same_orderzFlexibleLayout.as_same_order  ss    &&tyy&9
""$**:tyy$**MJKKJJIIKKNN
 	
r   c           
     r    i }dD ]/  }dD ](  }||f}t        t        t        | |      |            ||<   * 1 |S )N)r  r  rQ  TF)r@   r)   r   )r  initial_free_symbolsr   ri  r  s        r   get_initial_free_symbol_usesz+FlexibleLayout.get_initial_free_symbol_uses  sY    !0 	D!. ]+,6$WT4%8-H-$S)	 $#r   c                    dD ]:  }| j                   ||f   }t        t        ||            }||k(  r/J d| d|         y )Nr  z)Expected free symbols unchanged, but got z vs )r  r@   r)   )r  r   r  ri  old_free_symbolsnew_free_symbolss         r   r  z0FlexibleLayout.assert_free_symbol_uses_unchanged  sd    * 	M#88$9NO)*:5-*PQ#'77 ;<L;MTRbQcd7	r   c                    |rt         j                  ||      }nt         j                  |      }t        |   |||||       | j                         | _        y )NrR  )r  r  r  rn  r]  r  r  )r  r  r  r  r  rR  rU  rp  s          r   r]  zFlexibleLayout.__init__  sU     $11$EG$77=GgK %)$E$E$G!r   ru  )r~  rt  r   rG  )r~  rt  r   rt  r   rG  )r~  rt  r   rt  r   r  )r~  rt  r  ztorch.memory_formatr   r  )r~  rt  r  ra  r   r  r~  rr  rc  rs  rr  )r   rt  r%  r   r   rP  )r0  ra  r%  r   r   rP  )r   rt  r   rP  )r  ra  r   rP  )r   z$dict[tuple[str, bool], sympy.Symbol])r   r   r  r9   r   r   r  )r  rj  r  r\  r  r  r  Sequence[int | Integer] | NonerR  r   r   r   )r   r   r   r  r  r|  r  r  r  rK  r  r  r  r  rv  r  rQ  r  r  r  r  r  r  r]  rI  rJ  s   @r   r  r    s    N. 0 0    	> 	> &&-@&	& &4 >>&8>	> >   
[[    ]]    ]] 
 ;@
"
37
	
" HM
/
@D
	
 

	$ 8<HH H 	H
 5H H 
H Hr   r  c                  \     e Zd ZdZd fdZddZddZ ed       	 d		 	 	 d
d       Z xZ	S )NonOwningLayoutz,Is a view into the storage of another tensorc                    |j                         }t        | 	  |j                  |j                  |j
                  |j                         || _        y r   )r  rn  r]  r  r  r  r  view)r  r  rN  rp  s      r   r]  zNonOwningLayout.__init__  sA    "MMLLKKMM		
 	r   c                >    | j                         j                         S r   )rk  r
  r  s    r   r
  zNonOwningLayout.make_indexer  s    }}++--r   c                    | j                   j                         j                  }|dk(  ryddlm} t
        j                  j                  j                  ||      S )Nr   TrI   )	ALIGNMENT)	r  r  rQ  utilsr  rw   r  r  r  )r  rQ  r  s      r   maybe_guard_alignedz#NonOwningLayout.maybe_guard_aligned  sD    %%'..Q;$ww<<VYOOr   c                4   t        | j                  t              sJ | j                  j                  }t        |t              sJ t        |             |j                  }t        |t              sJ t        |             |j                  j                  |      S r   )	r   r  rS  rM  rq  r   rr  rN  r>  )r  ri  boxinput_buffers       r   r>  z$NonOwningLayout.get_free_symbol_uses  sw     $))_555iinn#z*5DI5*xx,/:c:/""77FFr   )r  zBaseView | TensorBoxr   r   rm  r_  rr  r}  )
r   r   r   r  r]  r
  r  rb   r>  rI  rJ  s   @r   r  r    sG    6.P -.$)G!G	!G /Gr   r  c                      e Zd ZdZy)CommBufferTypesymm_memN)r   r   r   SYMM_MEMr   r   r   r  r    s    Hr   r  c                  F     e Zd ZU dZded<   ded<   	 	 	 	 	 	 d fdZ xZS )CommBufferLayoutax  
    A layout that signifies the buffer is a comm buffer.
    In terms of striding, the layout is identical to `FixedLayout`.

    Buffers with this layout do not participate in in-place reuse - it can be
    neither the source nor the target for in-place reuse.

    For detailed motivation and usage of this layout, see
    NOTE [lowering-time collective optimization].
    r  comm_buffer_typer   
group_namec                   t        |t              r|j                         n|}t        |   |j
                  |j                  |j                  |j                  |j                  |j                         || _        || _        y )Nr  r  r  r  rQ  rR  )r   r  rk  rn  r]  r  r  r  r  rQ  rR  r  r  )r  rN  r  r  fixedrp  s        r   r]  zCommBufferLayout.__init__  si     &0%G!V<<++<<<<oo 	 	
 !1$r   )rN  zFlexibleLayout | FixedLayoutr  r  r  r   )r   r   r   r  r   r]  rI  rJ  s   @r   r  r    s;    	 %$O%,% )% 	% %r   r  c                      e Zd ZU ded<    ej
                  d       Zded<    ej
                  d       Zded<   dd	Zdd
Z	ddZ
y)
NoneLayoutrh  r  c                     dgS r  r   r   r   r   r  zNoneLayout.<lambda>	  s     r   default_factoryra  r  c                     dgS r  r   r   r   r   r  zNoneLayout.<lambda>
  s    1# r   r  c                     yr  r   r  s    r   r  zNoneLayout.storage_size  r  r   c                    | S r   r   r  s    r   rk  zNoneLayout.as_fixed      r   c                    | j                   S r   r  r  s    r   r  zNoneLayout.get_device  r  r   Nr{  r^  rg  )r   r   r   r   r  r  r  r  r  rk  r  r   r   r   r  r    sG      'k''DD)D)))+FFIFr   r  c                       e Zd Zd
 fdZedd       Zej                  dd       ZddZddZddZ	e
	 d	 	 	 	 	 	 	 dd       ZddZdd	Z xZS )MutationLayoutSHOULDREMOVEc                   t         |   |j                         |j                         |j	                         d        || _        | j                         j                         }t        j                  j                  |       y r   )rn  r]  r   r  r
  rT  
get_bufferrs  rw   r  mark_buffer_mutated)r  rT  r   rp  s      r   r]  z#MutationLayoutSHOULDREMOVE.__init__  se    &&(OO		
  ))+	##D)r   c                6    | j                         j                  S r   )real_layoutr  r  s    r   r  z!MutationLayoutSHOULDREMOVE.stride"  s    !(((r   c                     y r   r   r&  s     r   r  z!MutationLayoutSHOULDREMOVE.stride&  s    r   c                >    | j                         j                         S r   )r  r  r  s    r   r  z'MutationLayoutSHOULDREMOVE.storage_size*  s    !..00r   c                x    dfd | j                         }t        |t              sJ t        |             |S )Nc                    t        | t              r | j                        S t        | t              r | j	                               S t        | t
              r | j                        S | S r   )r   r  rT  ro  rp  
MutableBoxrM  )rT  unwrap_viewss    r   r  z;MutationLayoutSHOULDREMOVE.get_buffer.<locals>.unwrap_views.  sY    &"<=#FMM22&(+#F$6$6$899&*-#FKK00Mr   )rT  r   r   r   )rT  r   rr  r   )r  rN  r  s     @r   r  z%MutationLayoutSHOULDREMOVE.get_buffer-  s6    	 dkk*&&)74<7)r   c                ^    | j                         j                  }t        |t              sJ |S r   )r  rN  r   r  )r  rN  s     r   r  z&MutationLayoutSHOULDREMOVE.real_layout;  s)    "))&&)))r   c                   |j                          t        j                  j                  |j	                                t        |t              r|j                  }|j                          |st        j                  |j                         |j                         |j                         t        |j                         |j                               D cg c]/  \  }}t        j                  j                   j#                  ||      1 c}}      }t        |t$        t&        f      sJ |j                  }|j                          t)        |d      sJ |       t        |j                  j*                  t,              s$J t/        |j                  j*                               t1        |      |j                  _        |j                  S c c}}w )Nr   rM  )r  rw   r  r  rs  r   r   rM  r  r  r  r  r  r  r   r
  r  check_equals_and_simplifyro  r  r  rN  r  r   r  )r  srcdstunsafe_aliasrF  rG  r   s          r   realize_intoz'MutationLayoutSHOULDREMOVE.realize_into@  sI    	 	
##CLLN3c9%((C 	##~~'mmo* !$CLLNCLLN C1 GG$$>>q!D	 $ D dXz$:;;;))CsF#(S(##((//>:QD<QQ:4S9xxs   4Gc                    | S r   r   r  s    r   rk  z#MutationLayoutSHOULDREMOVE.as_fixedh  r  r   c                6    | j                   j                         S r   )rT  r
  r  s    r   r
  z'MutationLayoutSHOULDREMOVE.make_indexerk  r  r   )rT  r   r   r   r~  )r  r   r   r   rc  )r   rr  r]  rr  )r  r   r  r   r  r   r   r   )r   r   rm  )r   r   r   r]  r  r  rv  r  r  r  r  r  rk  r
  rI  rJ  s   @r   r  r    s    	* ) ) ]] 1
 <A%%%%59%	% %N*r   r  c                  f    e Zd ZU ded<   ded<   d# fdZd$dZd%dZd&dZd'd	Zd(d
Z	e
d)d       Zd*dZd+dZd,dZd-dZd.dZd/dZd0dZd#dZ	 d1	 	 	 	 	 d2dZd3dZd4dZ	 d1	 	 	 	 	 d5dZd0dZd6dZd7d8dZd#dZd9dZd9dZd:dZ ed       	 d1	 	 	 d;d       Z d<d Z!d=d!Z"d0d"Z# xZ$S )>rr  re  r   r  rN  c                F    t         |           | j                  dd        y r  )rn  r  r  r  s    r   r  zBuffer.__post_init__y  s    t4r   c                >    | j                         j                         S r   )r  r
  r  s    r   r
  zBuffer.make_indexer}  s     --//r   c                @    | j                   sJ |        | j                   S r   r  r  s    r   rs  zBuffer.get_name  s    yy$yyyr   c                    t        | j                  t              r| j                  j                         S t	        t        | j                        j                        r   )r   rN  r  r7  r  r   r   r  s    r   r7  zBuffer.get_example  s=    dkk6*;;**,,!$t{{"3"<"<==r   c                >    | j                         j                         S r   )r  r  r  s    r   r  zBuffer.get_device  s    ##%0022r   c                     y r   r   r  s    r   r  zBuffer.get_defining_op  r  r   c                6    | j                         j                  S r   )r  r  r  s    r   r  zBuffer.dtype  s     &&&r   c                :    g | j                         j                  S r   )r  r  r  s    r   r
  zBuffer.get_size  s    ("''((r   c                :    g | j                         j                  S r   )r  r  r  s    r   r4  zBuffer.get_stride  s    *"))**r   c                6    | j                         j                  S r   )r  rQ  r  s    r   
get_offsetzBuffer.get_offset  s     '''r   c                    t        | j                  t              r| j                  S t        t	        | j                        j
                        r   )r   rN  r  r  r   r   r  s    r   r  zBuffer.get_layout  s4    dkk6*;;!$t{{"3"<"<==r   c                    | j                   S r   r  r  s    r   r  zBuffer.get_output_spec  r  r   c                "    | j                         S r   )r  r  s    r   r;  zBuffer.get_storage_numel  s    ~~r   c                6    | j                         j                  S r   )r  rR  r  s    r   get_is_pinnedzBuffer.get_is_pinned  s     ***r   c                    t        | j                  t              r;t        | j                  t              s | j                  j	                         | _        y y y r   )r   rN  r  r  rk  r  s    r   r"  zBuffer.freeze_layout  s>    dkk6*:KK4
 ++..0DK4
*r   c                    t        | j                  t              sJ t        | j                               | j                  j	                  ||      | _        y Nr  )r   rN  r  r   r  r$  s      r   r&  z&Buffer.freeze_layout_with_stride_order  sA     $++~6IT[[8II6kk11%}1Ur   c                    t        | j                  t              sJ t        | j                               | j                  j	                  |      | _        y r   )r   rN  r  r   r  r)  s     r   r*  z$Buffer.freeze_layout_with_fill_order  s:    $++~6IT[[8II6kk//6r   c                    t        | j                  t              sJ t        | j                               | j                  j	                  |      | _        y r   )r   rN  r  r   r  r,  s     r   r-  z$Buffer.freeze_layout_with_same_order  s:    $++~6IT[[8II6kk//7r   c                    t        | j                  t              sJ t        | j                               | j                  j	                  ||      | _        y r  )r   rN  r  r   r  r/  s      r   r1  z'Buffer.freeze_layout_with_exact_strides  sF     $++~6IT[[8II6kk22 3 
r   c                    t         j                  j                  j                  t	        j
                  | j                         d            S r  r  r  s    r   r  zBuffer.is_zero_elements  r  r   c                r      j                         rt        t         j                               S d fd}|S )Nr  c                x    j                         }t        j                  j                  xs d ||             S r  )r
  ru   r  r   r   r  r  s     r   r  z"Buffer.make_loader.<locals>.loader  s/    '')G88DII2GENCCr   rk  )r  r   r
  r  r  s   ` r   r  zBuffer.make_loader  s0      "=0@AA	D r   c                "    | j                         S r   rs  r  s     r   r  zBuffer.codegen_reference  r%  r   c                     y r   r   r  s    r   r  zBuffer.decide_layout  r  r   c                    t        | j                  t              r%| j                  j                  j	                         gS yr  )r   rN  r  r  rs  r  s    r   rN  z#Buffer.get_inputs_that_alias_output  s/    dkk?3KK$$--/00r   c                    t        | j                  t              r%| j                  j                  j	                         gS yr  )r   rN  r  rT  rs  r  s    r   rJ  zBuffer.get_mutation_names  s0    dkk#=>KK&&//122r   c                6    t        | j                         g      S r   )r@   rs  r  s    r   r  zBuffer.get_read_names  s    4==?+,,r   c                    t               S r   r?   r=  s     r   r>  zBuffer.get_free_symbol_uses       |r   c                    t               S r   r?   r  s    r   r  zBuffer.get_unbacked_symbol_defs  r  r   c                     y r   r   r  s    r   r  zBuffer.realize  r  r   c                     yr  r   r  s    r   should_allocatezBuffer.should_allocate  s    r   rS  rm  ro  )r   ztorch.Tensor | torch.SymIntrg  rW  r[  r~  )r   rG  rc  r]  r^  r{  r_  rr  rs  ru  )r  rt  r   r   )r0  rt  r%  r   r   r   rk  r   rf  r  rT  r}  r  rd  )%r   r   r   r   r  r
  rs  r7  r  r  r  r  r
  r4  r  r  r  r;  r  r"  r&  r*  r-  r1  r  r  r  r  rN  rJ  r  rb   r>  r  r  r  rI  rJ  s   @r   rr  rr  o  s    
50>
3 ' ')+(>
 +1 ;@V"V37V	V78
 CH
*
;?
	
U	

- H%$)!	! &
r   rr  c                  <    e Zd ZddZddZej                  ZddZy)OperationBufferc                    | gS r   r   r  s    r   r  zOperationBuffer.get_outputs  s	    vr   c                    | S r   r   r  s    r   r  zOperationBuffer.get_defining_op  r  r   c                X    t         j                  |        t        j                  |        y r   )rr  r  r  r  s    r   r  zOperationBuffer.__post_init__  s    T"%r   Nr  r   r  rS  )r   r   r   r  r  r  rL  r  r   r   r   r	  r	    s     #55&r   r	  c                      e Zd ZddZy)r  c                     yr  r   r  s    r   r9  zInputBuffer.num_reads
  r  r   Nr{  )r   r   r   r9  r   r   r   r  r  	  s    r   r  c                      e Zd ZdZy)DonatedBufferaY  
    Represents a donated buffer which is a saved tensor that is not alias to any
    fwd inputs, fwd user outputs, and bwd outputs. We generally cannot inplace
    reuse the input tensor memory during backward since it might be used in another
    function. However, donated buffer can be inplace reused during backward
    to save memory.
    N)r   r   r   r  r   r   r   r  r    s    r   r  c                  ,    e Zd ZU dZded<   ddZddZy)r!  Nrh  r  c                     d fd}|S )Nc                    j                         j                         }t        j                  t        j
                  j                  j                         j                         ||             S r   )	r  r
  ru   r  rw   r  constant_namers  r  r  s     r   r  z*ConstantBuffer.make_loader.<locals>.loader  sP    oo'446G88%%dmmot7K7KL r   rk  r   r  s   ` r   r  zConstantBuffer.make_loader  s    	 r   c                    t        t        j                  j                  | j	                         |      | j
                        S Nr   rN  )r!  rw   r  r  rs  rN  r  s     r   rH  z!ConstantBuffer.constant_to_device%  s/    &&t}}?
 	
r   rk  r  )r   r   r   r  r   r  rH  r   r   r   r!  r!    s    +/O(/
r   r!  c                  V    e Zd ZddZ ed       	 d	 	 	 d	d       Zd
ddZddZddZy)NoneAsConstantBufferc                    t               S r   r?   r  s    r   r  zNoneAsConstantBuffer.get_reads-  r  r   c                    t               S r   r?   r=  s     r   r>  z)NoneAsConstantBuffer.get_free_symbol_uses0  r  r   Nc                J    t         j                  j                  j                  S r   )rw   r  r  none_strr  s     r   r  z&NoneAsConstantBuffer.codegen_reference6  s    ww##,,,r   c                    t        d       S Nr  )r  r  s    r   r  z$NoneAsConstantBuffer.get_output_spec9  s    &&r   c                     yr  r   r  s    r   r  z&NoneAsConstantBuffer.has_tensor_output<  r  r   rz  rr  r}  r   rf  r^  r_  )	r   r   r   r  rb   r>  r  r  r  r   r   r   r  r  +  sC     23$)!	! 4
-'r   r  c                  R    e Zd ZU ded<    ed       	 d	 	 	 dd       Zd	d
dZddZy)r   r    r  c                .    t        | j                  |      S r   )r)   r  r=  s     r   r>  z*ShapeAsConstantBuffer.get_free_symbol_usesD  s      		=99r   Nc                h    t         j                  j                  j                  | j                        S r   )rw   r  r  codegen_sizevarr  r  s     r   r  z'ShapeAsConstantBuffer.codegen_referenceJ  s!    ww##33DII>>r   c                     yr  r   r  s    r   r  z'ShapeAsConstantBuffer.has_tensor_outputM  r  r   rr  r}  r   rf  r_  )r   r   r   r   rb   r>  r  r  r   r   r   r   r   @  s<    
J34$):!:	!: 5:
?r   r   c                      e Zd ZU dZded<   dZded<   dZded	<   dZd
ed<   dZded<   dZ	ded<   e
j                  d%d       Zee
j                  d%d              Zd&dZd'dZd(dZd)dZd*dZ ed       	 d+	 	 	 d,d       Zd- fdZd.dZd/dZd0dZd1dZe	 	 d2d       Z	 	 d3	 	 	 	 	 d4dZe	 d5	 	 	 	 	 	 	 	 	 	 	 d6d       Zd7dZd7d Z d&d!Z!d.d"Z"d.d#Z#d8d$Z$ xZ%S )9r  zb
    Represents a buffer that is computed during kernel execution rather than being an input.
    r  rM  FzClassVar[bool]_force_realizeNr  r  Callable[..., Any] | Noner  rb  r  r  c           
   #    K   | j                   J | j                  J | j                  J | j                  J t	        | j
                  t              sJ t        | j
                                | j
                  }| j                  }	 t        |j                  |j                  | j                  | j                  | j                  |j                  |j                  |j                        }|| _        t        |j                  |j                  | j                        | _        | j                  j!                  |        d  || _        || _        y # || _        || _        w xY ww)Nr  )r  r  r  r  r   rM  rg  r   rN  r  r  rR  ri  rj  rP  get_default_sizes_bodyclear_cache)r  old_datarW  new_datas       r   with_original_inner_fnz%ComputedBuffer.with_original_inner_fn`  s=    +++&&222$$000..:::$))Y/EDO3DE/99[[
	% nn00,,!%!@!@'66",,'66	H !DI &%%DK
 ''33D9 DI$DK !DI$DKs   BE$	B9E E$E!!E$c               #     K   t         j                  } 	 dt         _        d  | t         _        y # | t         _        w xY wwNT)r  r(  )	old_values    r   force_realizezComputedBuffer.force_realize  s3      #11		6,0N),5N)IN)s   ?/ ?<?c                    | j                   | j                   S t        | j                  d      r| j                  j                   S y)z
        Returns self.name if it exists, otherwise returns the name of the data node if that exists.
        If neither exist, returns None.
        Nr   )r   r  rM  r  s    r   get_computed_buffer_namez'ComputedBuffer.get_computed_buffer_name  s7    
 99 99499f%99>>!r   c                6    | j                   j                         S r   rM  r9  r  s    r   r9  zComputedBuffer.num_reads  r7  r   c                6    | j                   j                         S r   rM  r  r  s    r   r  zComputedBuffer.get_reads  r7  r   c                6    | j                   j                         S r   r;  r  s    r   r  zComputedBuffer.get_read_names  r<  r   c                X   t        | j                  t        t        t        t
        f      s0t        j                  t               t               t                     S t        j                  t        dd      5  | j                  j                         rTt        | j                         | j                  j                         | j                  j!                               cd d d        S t        | j                         | j                  j#                               cd d d        S # 1 sw Y   y xY w)Nr6  writesindex_exprsr  T)r   rM  rg  r  r  r  rK   
ReadWritesr@   r   r   r  r@  rT   get_store_functionr  rB  r
  r  s    r   r3  zComputedBuffer.get_read_writes  s    $))itY%GH** l!|&L  \\.*:DA 	yy++-*++-II002II002	 	 +++-II&&(	 	 	s   6A%D %1D  D)c                    | j                   j                  |      | j                  j                  |      z  }| j                         r"|| j	                         j                  |      z  }|S r   )rN  r>  rM  has_store_functionr3  )r  ri  rN  s      r   r>  z#ComputedBuffer.get_free_symbol_uses  sc    $ 11
II**=9: ""$d**,AA-PPFr   c                    | j                         s_| j                  t        j                  j                  vr9| j                         dk(  r&| j                  s| j                  j                         S t        | !         S r  )
r@  r   rw   r  mutated_buffersr9  r(  rM  r  rn  r  s    r   r  zComputedBuffer.make_loader  s`    '')		!8!88 A%'' 99((**w"$$r   c                V    t        | j                  t        t        t        t
        f      S r   )r   rM  rg  r  r  r  r  s    r   rB  z!ComputedBuffer.has_store_function  s    $))itY%GHHr   c                   | j                         j                         j                         }t        | j                  t
        t        t        f      r+t        | j                  j                  | j                  |      S t        | j                  t              sJ t        | j                               t        | j                  j                  | j                  |      S r   )r  rk  r
  r   rM  rg  r  r  r   rv  r   r  r   r  )r  r  s     r   r@  z!ComputedBuffer.get_store_function  s    //#,,.;;=dii)T4!8949944diiIIdii3DT$))_D349911499gFFr   c                P   t        | j                  t              r{t        j                  | j
                  j                         | j
                  j                               \  \  }}}| j                         j                  }t        d |D              sJ |D cg c]_  }t        |t        j                        rCt        |j                  |D ci c]#  }|dk7  s	|t        j                  j                   % c}      a }}}|rt        | j
                  t"        t$        f      r| j
                  j'                  ||      }n|}|D cg c],  }t(        j*                  j,                  j/                  ||      . }	}ddlm}
  |
|	| j5                               S yc c}w c c}}w c c}w )al  
        If our layout is still flexible, try to determine the stride order based on stride orders of reads.

        TODO(jansel): A better algorithm here would look at downstream consumers of this
                      value and try to do global graph-level layout optimization.
                      This is also something just begging to be autotuned.
        c              3  p   K   | ].  }t        |t        j                  t        j                  f       0 y wr   )r   rK   StarDep	MemoryDepr)  s     r   r   z0ComputedBuffer.get_fill_order.<locals>.<genexpr>  s0       1|33\5K5KLMs   46r   rI   pick_loop_orderN)r   rN  r  rK   r  rM  r  rB  r3  r6  r   rJ  rs   r   r   r  r  r  r  r   rw   r  r  r  	schedulerrL  r
  )r  
index_varsrw  r   r6  r  vr  r  stride_lengthsrL  s              r   r   zComputedBuffer.get_fill_order  sj    dkk>2.:.M.M		,,.		0L0L0N/+(Z! ((*00E      a!7!78 177n$WPQUVPVQ_$WXE  dii$6"ii//
NKG(GMR"EIAGG$$11$@" " 7&~t}}GG# %X"s$   3F
FF6	F1F#Fc                    t        | j                  t              r5| j                         }|r| j	                  |       y | j                          y y r   )r   rN  r  r   r*  r"  r)  s     r   r  zComputedBuffer.decide_layout  s@    dkk>2'')E2259""$ 3r   c                R   t        j                  | j                         | j                         d      \  }}t	        j
                  t        d| j                               5  t        | j                         | j                         r|n|d d |g| }d d d        g }g }g }g }|j                         D ]^  \  }}	||d   v r'|rJ |j                  |       |j                  |	       4||d   v sJ |j                  |       |j                  |	       ` ||f||ffS # 1 sw Y   xY w)Nqr   r  rI   r   )rK   r  r  rB  r   r   r!  r  rW   r@  r@  itemsr  )
r  r   
var_rangesr  rN  reduce_vars
index_sizereduce_sizerO  r   s
             r   r+  z%ComputedBuffer.get_default_sizes_body  s@    (::##%t'>'>'@
j \\.*;T__=NO 	'')002Ra 	D	 
!#
$$& 	&DAqDG|&&!!!$!!!$DG|#|""1%""1%	& K($[0III)	 	s   !2DD&c                     j                         \  \  }}}\  }}|r |||f|||f      \  \  }}}\  }}g |j                  j                         |t        |t              rt        |      dk(  sJ |\  }}	t        |t              sJ t        |             t        |	t              sJ t        |	             t        d |	D              sJ |j                  }
|
|k(  s	J |
|f       |	D cg c]	  }|vs| }	}|	z  g |j                         t        j                  j                   t        j                         sj#                  |j%                                	 	 	 	 	 	 	 	 	 	 d fd}||z   }t'        t)                      xs t*        j,                   } |||||      \  }}} |||||      \  }}}t/        j0                  ||d      \  \  }}}t3        | ||       ||      g|||      }||f|fS c c}w )an  
        This is a main place where we do loop transformations in a
        backend-agnostic way.

        Here we:
            1) Remove any 1 dimensions
            2) Fuse contiguous dimensions together
            3) Reorder dimensions based on stride orders

        Optional argument extra_indexing_constraints can be used to append additional
        indexing expressions to existing ones derived from buffer's body. This can be useful
        to fuse scheduler nodes with compatible ranges, e.g. (s0*s1*...,) and (s0, s1, s2, ...)
        on CPU by preventing indexing simplifications and obtaining index/reduce ranges for
        the scheduler node compatible with other nodes.
        Optional argument recompute_sizes_body_func can be used to recompute sizes and body
        on the default body. This can be useful to append additional loop transformations.
        r   c              3  <   K   | ]  }t        |t                y wr   )r   r    )r   fs     r   r   z6ComputedBuffer.simplify_and_reorder.<locals>.<genexpr>d  s     Hqz!T*Hr|  c           	        j                  | ||      \  }}}j                         dk(  rat        |      dk(  rSt        t	        t        |                  } ||      d   dk7  r(|D cg c]  }||   	 }}t        |      }t        |      } ||       } |rGt        j                  j                  j                  | |t        | |            \  }}	}
t        ||	      }n|}|||fS c c}w )Nr4  r   r   )_apply_loop_reorderingr@  r   r   r   r   r   rw   r  r  _simplify_loopsrO   r   )x_varssupport_varsr~  simplify_loopsnewsizesreindex0r   r   r   r   _pruner   index_formulasmemory_addrsr  s               r   simplify_and_reorderzAComputedBuffer.simplify_and_reorder.<locals>.simplify_and_reorderu  s     ,0+F+Fe\,(Hh* &&(E1c%jAoU3u:./ E?1%*278Qa8H8+E2H.u5H f%F-.WW-=-=-M-M,^VXN.*(F
 *(H="Wh..!  9s   *C&pr   )
r_  Sequence[sympy.Symbol]r`  ri  r~  rt  ra  r   r   dtuple[list[int], Callable[[Sequence[int]], Sequence[int]], Callable[[Sequence[int]], Sequence[int]]])r+  indexing_exprsr   r   r   r   r   r   r   r   rU  get_write_exprsrw   r  r  rL   PREFER_STORE_LOOP_ORDERextendget_read_exprsrn   r  rJ   loop_ordering_after_fusionrK   index_vars_no_squeezerW   )r  extra_indexing_constraintsrecompute_sizes_body_funcrW  rX  r  rN  rV  extra_indexing_rangesextra_indexing_exprexpected_var_rangesr  rg  r`  should_merge_loopsiter_rangesiter_reindexr   reduce_rangesreduce_reindex	iter_varsrU  re  rf  s   `                     @@r   rg  z#ComputedBuffer.simplify_and_reorder6  s   4 '')		
%Z%Z %
 *[)4*k1J	)[)[
 94..5578%15u=23q89 :T6!#63T:WDAV<WW:148S$?R:SS8H4GHHHH"&//&*?? #%B ? /#!>2I# # 11N0--/0ww""4)O)OP 3 3 564	/*4	/04	/ !4	/ !	4	/

4	/l "K/t,--VV5V5V1V 	 (<	(
$\1 ,@{4F,
(~q
 0</Q/Q0
, K*
 )$n[&AB
 ]+T11#s   -	G?7G?c           
     X   ddl m} |g }	 |D cg c]-  }t        j                  j                  j                  || |      / }}t        |      t        |      k(  rt        |d         t        |       k(  sJ t        t         ||||                  }|D 	cg c]  }	||	   	 }}	|t#        |      t%        |      fS c c}w # t        $ rZ t        j                  r*t        j                  dt        t        | |            |       t        t!        t        |                  }Y w xY wc c}	w )zU
        Shuffle the order of loops around to hopefully improve performance.
        rI   rK  r   z%Did not simplify complex index:
%s
%s)rM  rL  rw   r  r  r  r   r   r  	ExceptionrJ   r  r  warningr   r   r   r   r   )
rN  r`  r~  rf  priority_idxrL  r  rU  r   r   s
             r   r]  z%ComputedBuffer._apply_loop_reordering  s'    	/L	, )   --dJMG  w<3|#44WQZCM :   /'5,"OPQE $))aq))l5)?5+AAA#  	,||=Z/0 
 s5z*+E	, *s*   C 2B<AC D'<C A D$#D$c                6    | j                   j                         S r   )rM  r  r  s    r   r  z!ComputedBuffer.get_pointwise_size      yy++--r   c                6    | j                   j                         S r   rM  rB  r  s    r   rB  z!ComputedBuffer.get_reduction_size  r  r   c                6    | j                   j                         S r   rM  r@  r  s    r   r@  z!ComputedBuffer.get_reduction_type  r  r   c                6    | j                   j                         S r   )rM  r  r  s    r   rF  zComputedBuffer.is_no_op  s    yy))++r   c                     yr1  r   r  s    r   r  zComputedBuffer.should_allocate  r  r   c                8    | j                   j                  |      S )r  rM  rH  r  s     r   rH  z!ComputedBuffer.constant_to_device  s    yy++F33r   )r   Iterator[None]rd  r{  rz  rT  rx  rr  r}  rk  r_  )r   zCallable[..., None])r   list[int] | NonerS  )r   zMtuple[tuple[list[Expr], list[Expr]], LoopBody, tuple[list[Expr], list[Expr]]]NN)rr  'tuple[dict[Any, Any], list[Any]] | Noners  r)  r   z5tuple[tuple[list[Expr], list[Expr]], LoopBody | None]r   )rN  ri  r`  ri  r~  rt  rf  rG  r  r  r   rj  r~  r  )&r   r   r   r  r   r(  r  r  r  r  r  r  r/  r  r3  r5  r9  r  r  r3  rb   r>  r  rB  r@  r   r  ra   r+  rg  r]  r  rB  r@  rF  r  rH  rI  rJ  s   @r   r  r  Q  s    K%*NN* #K"481826/6<@ 9@ %  %D 6  6	%%** ,-$)!	! .2	%IG%N% J
J JD OS?CU2$KU2 $=U2 
?	U2n  *.%B*%B,%B %B !	%B
 '%B
%B %BN...,4r   r  c                  :    e Zd ZU dZded<   ded<   ded<   ded<   y)	FinalizeCodegenResultzNStructured result from TemplateBuffer._finalize_codegen for external backends.r   sourcer   importscall_preamble	call_argsN)r   r   r   r  r   r   r   r   r  r  	  s    XKr   r  c                      e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZedd       ZddZddZdddZ	ddZ
dd	Zdd
Z	 	 d	 	 	 	 	 ddZddZddZd dZ	 	 	 	 d!dZed"d       Zedddd	 	 	 	 	 	 	 	 	 	 	 d#d       Z xZS )$r  z
    Base class for template operators that support epilogue and prologue fusion.
    Subclasses: TritonTemplateBuffer (built-in Triton templates),
    HelionTemplateBuffer (Helion kernels), etc.
    Nc                   t         
|   d |       t        j                  |      | _        || _        t        j                  j                  |       | _	        t        j                  j                  |        i | _        i | _        i | _        |rt        |      ni | _        || _        g | _        |i| j                  d   }t%        |t&              sJ t)        |             |j+                         }|D 	cg c]  }	t-        t/        |      |	|        c}	| _        |xs
 t1               | _        d | _        d | _        y c c}	w )Nr  r   r  )rn  r]  r  unwrap_storagerj  make_kernel_renderrw   r  register_bufferr   register_operationr   epilogue_fusable_outputs_multi_output_childrenr   _named_inputsmutated_inputsmutation_outputsr   r   r   r  MutationOutputr  r@   allowed_prologue_inpsallow_epilogue_fusionallow_prologue_fusion)r  rN  rj  r  r  r  named_inputsfirst_inputr  r  rp  s             r   r]  zTemplateBuffer.__init__  s/    	d62"11&9"4GG++D1		""4(+- 9;% ?A#
 #/DB 	
 -68%++a.Kk62ED4EE2 ++-F *% z8#tD%D! "1Z\ 	"
 37"26"%s   3D;c                    t        | j                  t              rt        d      | j	                         j
                  S )Nz1Multi-output templates do not have a single dtype)r   rN  MultiOutputLayoutr  r  r  r  s    r   r  zTemplateBuffer.dtypeL  s6    dkk#45%C   &&&r   c                &    | j                  d      S )NT	normalize)rT   r  s    r   r3  zTemplateBuffer.get_read_writesT  s    ''$'77r   c                   t               }| j                  D ]  }t        |t        t        f      sJ t        |             |t        j                  t              sJ t        j                               j                  j                         dfd}|t        j                  |j                         d|      j                  z  } |S )z(Build read dependencies from all inputs.c                x    t        |      dk(  sJ t        j                  j                          |             S r  )r   ru   r  rs  )r   r|  rl  inp_indexers     r   dummyz4TemplateBuffer._read_deps_from_inputs.<locals>.dummy`  s1    6{a'''xxE0BCCr   r   r  r   Sequence[Any]r|  r  r   r   )r@   rj  r   rS  rr  r   rN  r  r
  rK   rT   r
  r6  )r  r  r6  inp_rawr  rl  r  s        @@r   _read_deps_from_inputsz%TemplateBuffer._read_deps_from_inputsW  s    .8l{{ 	Gg'@AP4=PA,3Ccjj&1C4

3CC1**113KD \55s||~rYeE	 r   c                (   t        | j                  t              rut        t	        j
                  | j                         t        j                  d      dd      g      }t	        j                  | j                  |      |t               dd      S | j                         | j                         j                         dfd}t	        j                  || j                         d|      }|xj                  | j                  |      z  c_        |S )	a  Extract read/write dependencies for this TemplateBuffer.

        When the layout is MultiOutputLayout (multi-output templates), the
        buffer itself has no data layout, so we cannot build an indexer.
        Instead, synthesize a trivial write dep and derive read deps from
        the named tensor inputs (``_named_inputs``).  For single-output
        templates with a concrete layout, fall through to the standard path.
        r   r   )	var_namesr  N)r6  r=  r>  r  rU  c                ^    t        |      dk(  sJ t        j                   |       d      S Nr   faker   ru   r  r   r|  r  r   s     r   r  z1TemplateBuffer.extract_read_writes.<locals>.dummy  ,    v;!###99T75>6::r   r  r  )r   rN  r  r@   rK   rJ  rs  r   r!   r?  r  r  r
  rT   r
  r6  )r  r  r=  r  depsr  r   s        @@r   rT   z"TemplateBuffer.extract_read_writesi  s     dkk#453= **q)9Rb4F  **11)<&L  }}//#002	; //4==?B)
 	

d11)<<
r   c                6    t         j                  j                  S r   )r   r  r  r  s    r   rB  z!TemplateBuffer.get_reduction_size  s    ww{{r   c                     y r   r   r  s    r   r@  z!TemplateBuffer.get_reduction_type  r  r   c                     yr1  r   r  s    r   r  zTemplateBuffer.should_allocate  r  r   c                *    | j                         g fd fS r   r  )r  rr  rs  s      r   rg  z#TemplateBuffer.simplify_and_reorder  s$      
 	
r   c                6    t        | j                  t              S )zFWhether this template produces multiple outputs via MultiOutputLayout.)r   rN  r  r  s    r   is_multi_outputs_templatez(TemplateBuffer.is_multi_outputs_template  s    $++'899r   c                    | j                   S r   )r  r  s    r   get_allowed_prologue_inpsz(TemplateBuffer.get_allowed_prologue_inps  s    )))r   c                "    |j                         S )a3  Return whether this template's aliasing/mutation blocks prologue fusion.

        The default preserves the scheduler's conservative behavior. External
        template subclasses may override this when they can prove a prologue
        producer only feeds independent, non-mutated template inputs.
        )has_aliasing_or_mutation)r  scheduler_nodes     r   ,has_aliasing_or_mutation_for_prologue_fusionz;TemplateBuffer.has_aliasing_or_mutation_for_prologue_fusion  s     6688r   c                     y)a  Called after epilogue/prologue subgraph codegen with rendered hook outputs.

        ``hook_outputs`` maps placeholder keys (e.g. ``<STORE_OUTPUT_0>``,
        ``<LOAD_INPUT_x>``) to the Triton code generated by Inductor for
        each fused subgraph.

        Return a ``FinalizeCodegenResult`` to provide custom source code and
        call metadata, or ``None`` to use the default codegen path.
        Nr   )r  hook_outputss     r   _finalize_codegenz TemplateBuffer._finalize_codegen  s     r   c                (   t        |t              r&t        |j                  t              r|j                  S t        j                  |      }t        |t              r|j                  }t        |j                  t              r|j                          |S )zWRealize a TensorBox, preserving MultiOutput layout (unlike ExternKernel.realize_input).)
r   r   rM  MultiOutputr  realize_inputrq  rN  r  r"  )r  r  rN  s      r   realize_template_inputz%TemplateBuffer.realize_template_input  sf     b)$BGG[)I77N++B/fj)[[Ffmm^4  "r   )direct_alias_at_leafon_tensor_leafon_non_tensor_leafc               x    i t        j                         dfdt         |g             S )zLWalk a structured output tree, creating MultiOutput nodes for tensor leaves.c           
     L   t        | t        t        f      r>g }t        |       D ],  \  }}|j	                   |g |t        |       |f             . |S t        
      }t        | t        j                        r	r|	v rt        j                  	|         gS t        |       }|v r|   gS t        t        j                  |       |      }|j                  |j!                         <    |j!                         |||       t        |      }||<   |gS  |       g S r   )r   r   r   r   rn  r   r  r  Tensorr   r  idr  FallbackKerneltensor_to_layoutr  rs  )r\  r  rm  r   itemleaf_idxtidmor  r  leaf_counterr  r  seen_outputstemplate_bufwalks            r   r  z0TemplateBuffer.build_multi_outputs.<locals>.walk  s5   &4-0+-(0 NGAtNN4.K.K$v,9J.K#LMNL)H&%,,/'H8L,L%,,-A(-KLMMj,&(-.. "33F;\7 FH33BKKMB!-"2;;="gxHr]$&S!t!-"8,Ir   )r\  r   r  zlist[tuple[type, int]]r   list[TensorBox])r  countr   )	r  r  
structuredr  r  r  r  r  r  s	    ` ```@@@r   build_multi_outputsz"TemplateBuffer.build_multi_outputs  s4     .0 (	 	6 T*b)**r   )NNN)rN  r  rj  Sequence[IRNode]r  r)  r  Iterable[IRNode] | Noner  OrderedSet[str] | Noner  zdict[str, IRNode] | Noner   r   r[  rx  )r  r   r   zOrderedSet[dependencies.Dep]rr  )r  r   r   ry  r~  rd  r_  r  )rr  r  rs  r)  r   z9tuple[tuple[Sequence[Expr], list[Expr]], LoopBody | None]rT  )r  r   r   r   )r  zdict[str, str]r   zFinalizeCodegenResult | None)r  r   r   r   )r  r  r  r   r  zdict[int, IRNode] | Noner  zFCallable[[str, MultiOutput, list[tuple[type, int]], int], None] | Noner  zCallable[[int], None] | Noner   ztuple[TensorBox, ...])r   r   r   r  r]  r  r  r3  r  rT   rB  r@  r  rg  r  r  r  r  r  r  r  rI  rJ  s   @r   r  r    sM    378<150707 !07 6	07
 007  607 /07 
07d ' '8$$L
 OS?C
$K
 $=
 
C	
:*9*	% 	 	  :>;?)+$)+ )+
 7)+)+ 9)+ 
)+ )+r   r  c                  x     e Zd Z	 	 d	 	 	 	 	 	 	 	 	 	 	 d fdZ ed       	 d	 	 	 d fd       Zd	dZd
dZ xZS )TritonTemplateBufferc                    t         |   |||||       | j                  J | j                  | j                  i| _        d| _        d| _        y)a  
        NOTE:[TritonTemplates with multiple outputs]
        We want the ability for TritonTemplates to output multiple tensors. Triton
        kernels have no notion of outputs and this is done by creating tensors that
        are then mutated by the kernel. Currently our STORE_OUTPUT codegen doesn't
        support creating multinode outputs for triton templates.
        We work around this by creating an extra input buffer during the lowering
        and we mark them as mutated inputs.
        )r  r  N)rn  r]  r   r  subgraph_inpssubgraph_outs)r  rN  rj  r  r  r  rp  s         r   r]  zTritonTemplateBuffer.__init__  s]    " 	)"7 	 	
 yy$$$)-DII(>%@D9=r   c                   t         |   |      }| j                  r| j                  ng }| j                  r| j                  ng }|D ]c  }t	        |t
              r|j                  t        ||             /t	        |t              r!|j                  |j                  |             `|cJ  |D ]7  }t	        |t              r!|j                  |j                  |             4|7J  |S r   )	rn  r>  r  r  r   r    updater)   r   )r  ri  resr  r  rl  r   rp  s          r   r>  z)TritonTemplateBuffer.get_free_symbol_uses  s     g*=9.2.@.@**b.2.@.@**b  	#C#t$

+C?@C(

333MBC{"{	# ! 	#C#v&

333MBC{"{		# 
r   c                     | g| j                   S r   r  r  s    r   r  z TritonTemplateBuffer.get_outputs3      -t,,--r   c                &    d| j                    d}|S )NzTritonTemplateBuffer(layout=r  r  )r  r   s     r   r  zTritonTemplateBuffer.__str__6  s    ,T[[M;
r   r  )rN  r  rj  r  r  zCallable[_P, _T] | Noner  r  r  r  r   r   rr  r}  r  ro  )	r   r   r   r]  rb   r>  r  r  rI  rJ  s   @r   r  r    s     378<>> !> 4	>
 0>  6> 
>< 23$)!	! 4..r   r  c                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d fdZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZ xZS )ChoiceCallera1  
    Represents a possible choice used in autotune_process.py.
    During autotuning, self.benchmark() is first called to get benchmark result,
    and if this choice is selected, self.output_node() is called to get the output_node.

    Children classes: TritonTemplateCaller, CUTLASSTemplateCaller.
    c                    t         |           || _        || _        || _        || _        d| _        d| _        i | _        d | _	        d | _
        i | _        i | _        y r  )rn  r]  r   rN  r   descriptionfailed_benchmark_with_cudagraphsr   rd  decompositiondecomposition_kwargsconfig_patches)r  r   r   rN  r  rp  s        r   r]  zChoiceCaller.__init__G  sh     		& '!05' ,./38<46!.0r   c                   | j                         | j                  rt        j                  fd      S t        j
                  rt        fd      S t        j                  d|id       S )Nc                        S r   r   algor   s   r   r  z(ChoiceCaller.benchmark.<locals>.<lambda>e  s    T4[ r   c                        S r   r   r  s   r   r  z(ChoiceCaller.benchmark.<locals>.<lambda>g  s    D$K r   r   r  )to_callabler  r\   benchmark_gpu_with_cuda_graphrJ   /profile_bandwidth_with_do_bench_using_profilingrg   	benchmark)r  r   r   r  s     `@r   r  zChoiceCaller.benchmarkb  s\    !**<<=PQQAA+,?@@$$T4%dKKr   c                    t         r   r  r  s    r   	call_namezChoiceCaller.call_namej  r  r   c                    t         r   r  r  s    r   r  zChoiceCaller.to_callablem  r  r   c                "    | j                         S )z
        Hash key for the underlying kernel. By default, we assume there are no
        runtime params, so kernel hash key defaults to choice caller's hash key.
        )hash_keyr  s    r   kernel_hash_keyzChoiceCaller.kernel_hash_keyp  s    
 }}r   c                    t         r   r  r  s    r   r	  zChoiceCaller.hash_keyw  r  r   c                    t         r   r  r  s    r   re  zChoiceCaller.output_nodez  r  r   c                    i S )zRInformation returned here is logged to the autotune log file when that is enabled.r   r  s    r   	info_dictzChoiceCaller.info_dict}  r  r   c                     y)Nunsupported_choicer   r  s    r   autoheuristic_idzChoiceCaller.autoheuristic_id  s    #r   c                    d| _         y)z
        Mark the choice as failed so that it can be
        removed later. Useful for when we decouple
        compilation and tuning.
        TN)r  r  s    r   mark_failedzChoiceCaller.mark_failed  s     r   )
r   r   r   r  rN  r  r  r   r   r   )r   r   r   rt  r   r	  ro  )r   r  )r   r   )r   z6dict[str, PrimitiveInfoType | list[PrimitiveInfoType]]rS  )r   r   r   r  r]  r  r  r  r
  r	  re  r  r  r  rI  rJ  s   @r   r  r  >  sk    11 "1 	1
 1 
16L""""$r   r  c                      e Zd ZddZy)TritonTemplateCallerBasec                    t         r   r  r  s    r   get_make_kernel_renderz/TritonTemplateCallerBase.get_make_kernel_render  r  r   N)r   r   )r   r   r   r  r   r   r   r  r    s    "r   r  c                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZedd       Zedd       Z	 d	 	 	 ddZe	j                  dd       ZddZ	 d	 	 	 ddZ	 	 	 	 dd	Z xZS )MultiTemplateBufferaG  
    Represents a Buffer with multiple backing implementation choices.

    Choices can be TritonTemplates or ExternKernels. During scheduling if there is a potential
    epilogue we will benchmark each of the choices with the epilogue to determine an implementation.
    Otherwise, the fastest base choice will be chosen.
    c                    t         |   ||d |       || _        i | _        || _        || _        t        d |D              | _        i | _        y )N)rN  rj  r  r  c              3     K   | ]R  }t        |t              xs< t        |t        j                  j                  j
                        xr |j                   T y wr   )r   r  r  r  select_algorithmExternKernelCallerhas_out_variant)r   choices     r   r   z/MultiTemplateBuffer.__init__.<locals>.<genexpr>  sT      %
  v78 65??#C#C#V#VW +**%
s   AA)	rn  r]  _choice_timings_fn_choice_timings_choicesoriginal_inputsr   _output_plannable_make_kernel_renders)r  rN  rj  choice_timings_fnunfiltered_choicesr  rp  s         r   r]  zMultiTemplateBuffer.__init__  sj     	#"7	 	 	
 #4LN,>%!$ %
 -%
 "
 <>!r   c                    | j                   S )z^
        Are all possible choices TritonTemplates or Extern Kernels with out variants
        )r$  r  s    r   output_plannablez$MultiTemplateBuffer.output_plannable  s    
 %%%r   c                    | j                   S r   )r"  r  s    r   r  zMultiTemplateBuffer.choices  s    }}r   c                x    || j                   vr| j                  |      | j                   |<   | j                   |   S r   )r!  r   )r  hint_overrides     r   choice_timingsz"MultiTemplateBuffer.choice_timings  s>      4 44262I2I-2XD  /##M22r   c              #  0  K   t        |t        j                  j                  j                        sJ t        |             | j                  |j                  k(  sJ | j                  }|j                         | _        	 d  || _        y # || _        w xY wwr   )	r   r  r  r  TritonTemplateCallerr   rN  r  r  )r  callerrenders      r   swap_as_triton_callerz)MultiTemplateBuffer.swap_as_triton_caller  s     EOO44II
 	<	 
 {{fmm+++(("("?"?"A	-&,D#fD#s   A;B>B
 B
	BBc                N   t        |t        j                  j                  j                        sJ t        |             | j                         |j                  j                  k(  sJ | j                         |j                  j                  k(  sJ |j                         | _        y r   )r   r  r  r  r/  r   r
  rN  r  r4  r  r  r  )r  r0  s     r   finalize_as_triton_callerz-MultiTemplateBuffer.finalize_as_triton_caller  s    EOO44II
 	<	 
 }}&--"4"4444 FMM$8$8888"("?"?"Ar   c                b    | j                  |      }t        ||j                        }|||   fS )N)r,  r  )r-  r1  r  )r  r,  timings
min_choices       r   get_min_choicez"MultiTemplateBuffer.get_min_choice  s7     %%M%Bgkk2
GJ/00r   c                    |j                         D ]"  \  }}|j                         | j                  |<   $ | j                  d   | _        y)z;Finalize with multiple callers for different hint overridesN)rT  r  r%  r  )r  callersr,  r0  s       r   finalize_as_triton_callersz.MultiTemplateBuffer.finalize_as_triton_callers  sN     &-]]_ 	W!M67=7T7T7VD%%m4	W #'";";D"Ar   )rN  r  rj  r  r&  z1Callable[[int | None], dict[ChoiceCaller, float]]r'  list[ChoiceCaller]r  rU  r   r   r_  )r   r<  r   )r,  r  r   zdict[ChoiceCaller, float])r0  r  r   r  )r0  r  r   r   )r,  r  r   ztuple[ChoiceCaller, float])r:  z*dict[int | None, TritonTemplateCallerBase]r   r   )r   r   r   r  r]  r  r)  r  r-  r  r  r2  r4  r8  r;  rI  rJ  s   @r   r  r    s    >> !> M	>
 />  /> 
>8 & &   +/3'3	"3 - -B +/1'1	#1BAB	Br   r  c                  L     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZddZ xZS )CUTLASSTemplateBufferc                R    t         |   |||       || _        || _        || _        y r   )rn  r]  workspace_sizetemplatesupports_epilogue_fusion)r  rN  rj  r  r@  rA  rB  rp  s          r   r]  zCUTLASSTemplateBuffer.__init__  s.     	);<, (@%r   c                6    | j                   | j                   S dS r  r@  r  s    r   r  z(CUTLASSTemplateBuffer.get_workspace_size  s    &*&9&9&Et""L1Lr   c                x    | j                         D ]'  }t        j                  |j                         d d        ) y r   )r  ru   r  rs  )r  r\  s     r   emulate_store_fnz&CUTLASSTemplateBuffer.emulate_store_fn  s1    &&( 	5FIIfoo't4	5r   )rN  r  rj  r  r  Callable[_P, _T]r@  r   rA  r{   rB  r   r   r   r{  rS  )r   r   r   r]  r  rF  rI  rJ  s   @r   r>  r>    s_    AA !A -	A
 A "A #'A 
AM5r   r>  c                  D     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZ xZS )CppTemplateBufferc                R    t         |   |||       || _        || _        d | _        y r   )rn  r]  rA  r  outputs)r  rN  rj  r  rA  r  rp  s         r   r]  zCppTemplateBuffer.__init__
  s,     	);< ,0r   c                v   t        | j                  t              rt        | j                  t              sJ t        | j                               | j                  d   }t        |t              sJ t        |             |j                  }t        |t              sJ t        |             |S t        | %         S r  )
r   rN  r  rK  r   r   rr  r  rn  r  )r  first_outputrN  rp  s      r   r  zCppTemplateBuffer.get_layout  s    dkk#45dllH5ItDLL7II5<<?LlF3GT,5GG3!((Fff-;tF|;-M7%''r   )rN  r  rj  r  r  rG  rA  r{   r  r   r   r   r]  )r   r   r   r]  r  rI  rJ  s   @r   rI  rI  	  sL    11 !1 -	1
 "1 1 
1
( 
(r   rI  c                  F     e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )CuteDSLTemplateBufferz
    Buffer for CuteDSL (CUTLASS Python DSL) template kernels.
    Similar to other template buffers but specialized for CuteDSL operations.
    c           
        t         |   |||       || _        || _        | g| _        |t        | j                  d   t              sJ t        | j                  d                | j                  d   j                         }| xj                  |D cg c]  }t        t        |      ||        c}z  c_        y y c c}w )Nr   r  )rn  r]  rA  r  rK  r   rj  r   r   r  r  r  )	r  rN  rj  r  rA  r  r  r  rp  s	           r   r]  zCuteDSLTemplateBuffer.__init__*  s     	);< ,&*V%dkk!nf5KtDKKN7KK5[[^..0FLL) z8#tD L &s   B<c                    | j                   S r   rK  r  s    r   r  z!CuteDSLTemplateBuffer.get_outputs?      ||r   r   )rN  r  rj  r  r  rG  rA  r   r  r  r   r   r  )r   r   r   r  r]  r  rI  rJ  s   @r   rO  rO  $  sQ     37 ! -	
  0 
*r   rO  c                       e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZd	dZ	 d
	 	 	 	 	 ddZ xZS )NVUniversalGemmBufferz
    Buffer for NVIDIA Universal GEMM kernels.

    Unlike CuteDSL templates which use Jinja templates, this generates
    simpler Python code that directly calls the cutlass_api library.
    c                0   t         |   ||d        || _        || _        | g| _        || _        || _        || _        || _        |	| _	        |
| _
        |j                  j                  |j                  j                  d| _        | j                  | _        y )N)r  )kernel_namemin_cc)rn  r]  kernelaccumulator_typerK  r@  variantscale_type_ascale_type_bswizzle_type_aswizzle_type_bmetadatarW  rX  kernel_metadata_make_kernel_renderr  )r  rN  rj  rY  rZ  r[  r@  r\  r]  r^  r_  rp  s              r   r]  zNVUniversalGemmBuffer.__init__K  s     	DA 0&*V,((,, "??66oo,, 
 #'":":r   c                    | j                   S )z#Return the workspace size in bytes.rD  r  s    r   r  z(NVUniversalGemmBuffer.get_workspace_sizel  s    """r   c                    | j                   S r   rR  r  s    r   r  z!NVUniversalGemmBuffer.get_outputsp  rS  r   c                  	 ddl m} ddlm} g }| j                  D ]K  }t        |t              r|j                  }t        |t              r|j                  }|j                  |       M t        |j                        } ||||| j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                        		fd}	|fS )z
        Create a kernel renderer for code generation.

        Returns (kernel, render) tuple where:
        - kernel: NVUniversalGemmKernel object with call_kernel() method
        - render: function that returns source code string
        r   )NVUniversalGemmKernel)Placeholder)rW  r   re  ra  rZ  r@  r[  r\  r]  r^  r_  c                 $     j                         S r   )r1  )render_kernels   r   r1  z9NVUniversalGemmBuffer._make_kernel_render.<locals>.render  s     ''))r   )Btorch._inductor.codegen.nv_universal_gemm.nv_universal_gemm_kernelrf  torch._inductor.utilsrg  rj  r   r   rM  rq  r  r   KERNEL_NAMEra  rZ  r@  r[  r\  r]  r^  r_  )
r  out_noder,  rf  rg  r   rl  rW  r1  ri  s
            @r   rb  z)NVUniversalGemmBuffer._make_kernel_renders  s    	
 	6!#;; 	$C#y)hh#z*hhs#	$ +112-##  00!22..LL****....
	* f$$r   )r   NNNN)rN  r  rj  r  rY  r   rZ  r   r[  r   r@  r   r\  
Any | Noner]  rn  r^  rn  r_  rn  r   r   r{  r  r   )rm  r   r,  r  r   ztuple[Any, Any])	r   r   r   r  r]  r  r  rb  rI  rJ  s   @r   rU  rU  C  s      #'#'%)%);; !; 	;
 ; ; ; !; !; #; #; 
;B# :>*%*%,6*%	*%r   rU  c                &    t        d | D              S )Nc              3  <   K   | ]  }t        |t                y wr   r   r   )r   r  s     r   r   z#is_node_sequence.<locals>.<genexpr>  s     4z!V$4r|  )r   )r   s    r   is_node_sequencerr    s     4e444r   c                      e Zd ZU ded<   ddZddZddZedd       Ze		 	 	 	 dd       Z
ddZdd	Z ed       	 d	 	 	 dd
       Zy)r  #Sequence[IRNode | Sequence[IRNode]]rj  c                d    | j                   |   }t        |t              sJ |j                         S r   rj  r   r   rs  )r  r   inputs      r   
input_namezInputsKernel.input_name  s,    A%(((~~r   c                   t        t        j                            }t        j                  | j                  D ]c  }t        |t              r|j                  fd|D               .t        |t              r?|j                   |j                                      e t        t        j                     fd| j                         D              }t        j                  ||t                     S )Nc              3  J   K   | ]  } |j                                 y wr   r  )r   r   rI  s     r   r   z/InputsKernel.get_read_writes.<locals>.<genexpr>  s     BqWQZZ\2B    #c              3  J   K   | ]  } |j                                 y wr   r  )r   r  rI  s     r   r   z/InputsKernel.get_read_writes.<locals>.<genexpr>  s!      .
(+GCLLN#.
r{  r<  )r@   rK   rQ   rI  rj  r   r   r  r   r  rs  r  r?  )r  r6  rw  r=  rI  s       @r   r3  zInputsKernel.get_read_writes  s    <++,.&&[[ 	5E%*BEBBE#89		'%.."234	5 L,,- .
/3/?/?/A.
 
 &&"
 	
r   c                6    | j                         j                  S r   r5  r  s    r   r  zInputsKernel.get_reads  r7  r   c                   t        |t              r|j                  }t        |t              r|j                  }t        |t              r%t        |t
              st        j                  |      }t        |t              r| j                  |      S t        |t              r|S t        |t        t
        f      sJ t        |             |S r   )r   r   rM  rq  ro  rS  r  r  unwrap_storage_for_inputTorchBindObjectrr  r   r  r   s     r   r  z%InputsKernel.unwrap_storage_for_input  s    a#Aa$Aa":a+I**1-Aa#
 //22a)H!fo67@a@7r   c                    g }| D ][  }t        |t              r#|D cg c]  }t        j                  |       }}nt        j                  |      }|j	                  |       ] |S c c}w r   )r   r   r  r  r  )rj  
inputs_newr   r   s       r   r  zInputsKernel.unwrap_storage  sl     79
 	!A!X&GHI!\::1=II 99!<a 	! 	 Js   A%c                     yr1  r   r  s    r   rD  zInputsKernel.is_extern  r  r   c                     yr  r   r  s    r   r9  zInputsKernel.num_reads  r  r   c                    t        t        j                            }| j                  D ]B  }t	        |t
              r||j                  |      z  }(|D ]  }||j                  |      z  } D |S r   )r@   r   r"   rj  r   r   r>  )r  ri  r  rl  	inner_inps        r   r>  z!InputsKernel.get_free_symbol_uses  sv     u||$&;; 	GC#v&S--m<<!$ GI77FFAG		G r   N)r   r   r   r   rx  rz  r  )rj  rt  r   zlist[IRNode | Sequence[IRNode]]r_  r{  rr  r}  )r   r   r   r   rx  r3  r  r  r  r  r  rD  r9  rb   r>  r   r   r   r  r    s    // 

,,  $ 
3
	(
 
 N+$)
!
	!
 ,
r   r  c                      e Zd ZddZddZy)	NopKernelc                     yr1  r   r  s    r   rF  zNopKernel.is_no_op  r  r   c                    t               S r   r?   r  s    r   r  zNopKernel.get_reads   r  r   Nr_  rz  )r   r   r   rF  r  r   r   r   r  r    s    r   r  c                      e Zd ZdZedd       Ze	 d		 	 	 	 	 d
d       Z ed       	 d	 	 	 dd       Zedd       Z	ddZ
y)ConcatKernelzn
    There isn't actually a real kernel for concat, we just change the
    storage for the upstream data.
    c                Z
   |d   j                         }|d   j                         }t        |d   j                               }dg}||   g}d|cxk  rt	        |      k  sJ  J t        dt	        |            D ]  }||   j                         }	|j                  ||          t	        |	      t	        |      k(  sJ ||   j                         |k(  sJ ||   j                         |k(  sJ t        t	        |            D ]I  }
|
|k(  r||
   |	|
   z   ||
<   t        j                  j                  j                  ||
   |	|
         ||
<   K |j                  ||           t        j                  |      }t        j                  r$t        j!                  |||d   j"                        }t        t	        |            D ]k  }||   }t%        |      s|j'                         }t)        |t*              s5t        j-                  |j.                  |j0                        s`t3        |      } n t5        d |D              }t        j                  j6                  j8                  d   }|du r-t)        |t              rt5        d |D              rt3        |      }t;        d |D              }|J t=        dt+        |||||      g 	      }t?        |      }g }tA        |      D ]  \  }}t)        |tB        tD        f      sJ tG        |             | jI                  |tJ        jM                  ||||   ||   d
            }t)        |tN              sJ tG        |             t)        |jP                  t              sJ tG        |jP                               |jP                  j                  |       t)        |jR                  tB              r|jR                  jU                         }n|jR                  }t)        |t>              s|jW                         s1|j                         x}EtY        |jF                        s\t[        |      ri|j                  |j]                                 t	        |      dkD  rMt        j                  j_                  |t`        jb                        rt        j                  je                  |       t        j                  jg                  |      |_4        | jk                  |jP                        |_(        t        j                  jm                  |       |S )z6
        Create the concat kernel from inputs
        r   rI   c              3  2   K   | ]  }t        |        y wr   )r  r  s     r   r   z&ConcatKernel.create.<locals>.<genexpr>6  s     -W1.CA.F-Wr  Fc              3     K   | ]f  }d |j                   v xrR t        |j                   d    t        j                        xs( t        |j                   d    t        j                         h yw)r  r  N)rb  r/   r  r  r  r   args     r   r   z&ConcatKernel.create.<locals>.<genexpr>=  sm        ! <&+&9&9 	
 @&+&<&<s   A,A.c              3  j   K   | ]+  }t        |      xr |j                         j                   - y wr   )r  r  rR  r  s     r   r   z&ConcatKernel.create.<locals>.<genexpr>Q  s/      
FG!!$A)A)AA
s   13N)r  r  r  r  rR  r   rN  rj  r  )7r  r  r   r
  r   r   r  rw   r  r  r  r  r  rJ   ri  r  r  r  r  r  r   rP  r>  r  r  r1   r0  current_noder   r   r  rq  r   ro  r  r   r  r  r  rr  rj  rM  rp  r  rn   rm   rL  r  rL   FOREACHregister_operation_listr  r   r  r  )r  rj  rB  r  r  rG  offsets_startoffsets_endr   
input_sizer  output_strider   rN  any_input_is_storage_and_layoutfx_node_argsrR  concat_kernelrY  op_namesrl  r  input_unwrappeddevs                           r   r  zConcatKernel.create
  s   
 %%'q	##%q	**,-}oC'#h-'''''q#f+& 	.A++-J  #/z?c(m333!9&&(E111!9'')V3333x=) 8"*1+
1"=HQK"#''"2"2"L"L Z]#HQK	 x}-	. (6'H'H'R''"//xM
 s6{# 		Aq	A$Q'K88fmmT$B8$LM		 +.-WPV-W*W'ww++003 ,u4<.  ( $ ;8DM 
KQ
 
	 !!!$$# 

 M*' 	CFAscHj#9:EDIE:++  Cq!1;q> ! L lF3GT,5GG3m22D9U4@T@T;UU9  ''5#((H-"%(("6"6"8"%(( ?J7#335NN,,S9388$"<0 ? ? AB1	C4 x=1!4!4V^=S=S!TGG++H5WW44]C"11-2F2FG	""=1r   Nc                   t        |t              r| j                  |j                  |      S t        |t        t
        f      sJ t        |             t        |j                  t              rt        |j                  j                  t              r|j                  j                  sy|yt        |j                               t        |j                               k7  ryt        d t        |j                         |j                               D              S t        |j                  d      xrA t        |j                  j                  t               xr t        |j                  t"               S )NFTc              3  v   K   | ]1  \  }}t         j                  j                  j                  ||       3 y wr   rH  rJ  s      r   r   z=ConcatKernel.can_realize_into_without_copy.<locals>.<genexpr>  s3      B   88R@rK  rN  )r   r   can_realize_into_without_copyrM  ro  rq  r   r  rN  rP  r)  r   r4  r   r   r  r  ExternKernelAlloc)r  r  r  s      r   r  z*ConcatKernel.can_realize_into_without_copy  s    c9%44SXXsCC#*56AS	A6chh 34sxx<xx00 { 3>>#$CNN,<(== !#.."2CNN4DE   CHHh' <388??N;<sxx):;;	
r   c                .    t         j                  | |      S r   )r  r>  r=  s     r   r>  z!ConcatKernel.get_free_symbol_uses  s     --dMBBr   c                ^   t        |t              s&t        |      rt        |      \  }}t        ||      }t        |t              sJ t	        |             t        |t
              r| j                  |j                  |      S t        |t              r`|j                          t        |j                  d      sJ | j                  ||      r&t        |      |j                  _        |j                  S t        j                  |j!                         |j#                         |j%                         t'        |j)                         |j)                               D cg c]/  \  }}t*        j,                  j.                  j1                  ||      1 c}}      }| j                  ||      S c c}}w )NrL  rN  r   )r   rS  r  rO  r   r   r  rM  rq  r  r  r  r  rN  r  r  r  r  r  r   r
  rw   r  r  r  )r  r  r  rV  rN  rF  rG  pws           r   r  zConcatKernel.realize_into  sL   
 #/$S)"7"<%76B#/:c:/c9%##CHHc22c:&KKM388X...00c:"1#"6xx>>#--/__&  ?Aq   ::1a@	  
 C((s   4F)c                     yr1  r   r  s    r   r  zConcatKernel.should_allocate  r  r   )rj  r  rB  r   r   rq  r   )r  r   r  r?  r   r   rr  r}  )r  r   r  r   r   r   r_  )r   r   r   r  r  r  r  rb   r>  r  r  r   r   r   r  r    s    
 y yv /3!
!
,!
	!
 !
F N+$)C!C	!C ,C
 ) )Br   r  c              #     K   | j                  d      }	 d  | j                  |       y # | j                  |       w xY wwr  )"_ignore_fresh_unbacked_symbols_set)r   prevs     r   _track_fresh_unbacked_symbolsr    s:     77>D;44T:	44T:s   A+ A>Ac                P    | | j                         rt        |       S t               S r   )"_ignore_fresh_unbacked_symbols_tlsr  r
   )r   s    r   (_fallback_kernel_symbol_tracking_contextr    s(     !M!M!O,Y77=r   c                      e Zd ZU dZdZded<    ej                  e      Z	ded<   dZ
d	ed
<   dZded<   dZded<    ej                  e      Zded<   dZded<   dZded<    ej                  e      Zded<   dZded<    ej                  e      Zded<    ej                  e      Zded<   	 	 	 	 	 	 	 dB	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dC fdZdDdZdEdZdF fdZdGd ZdGd!Z	 dH	 	 	 	 	 dId"ZdJd#ZdHdKd$ZdLd%ZdMd&ZdNd'Z e!dOd(       Z"e#	 	 	 	 	 	 	 	 dPd)       Z$e#dQd*       Z%e#dRd+       Z&e#dRd,       Z'e#	 	 	 dS	 	 	 	 	 	 	 	 	 dTd-       Z(e#	 dU	 	 	 	 	 	 	 dVd.       Z)e#	 dU	 	 	 	 	 	 	 dWd/       Z*e#dRd0       Z+e#dRd1       Z,e#dRd2       Z-e#dRd3       Z.dGd4Z/	 	 	 	 	 	 dXd5Z0dHdYd6Z1dZd7Z2d[d8Z3dUd\d9Z4dNd:Z5dJd;Z6dJd<Z7dJd=Z8d]d>Z9d^d?Z: e;d       	 dU	 	 	 d_d@       Z<dNdAZ=e=Z> xZ?S )`r  z
    A class that represents Kernels which are not directly lowered to Inductor
    Loop Level IR, such as custom operators, or aten operators which we fallback to.
    r   r  constant_argsr  r  r   NReinterpretView | Noneoutput_viewre  python_kernel_namecpp_kernel_nameIterable[str]ordered_kwargs_for_cpp_kernel_OpOverloads | Noneop_overloadzlist[dict[str, Any]] | Nonearg_propertieszdict[str, dict[str, Any]]allarg_propertiesz dict[str, dict[str, Any]] | Nonekwarg_propertiesz"dict[sympy.Symbol, pytree.KeyPath]unbacked_bindingszlist[MutationOutput]r  c                D   t         |   |||       || _        |r|ni | _        || _        |
| _        | j                  |       | j                  |       |	| _        | j                          i | _
        g | _        t        j                  j                  | _        i | _        y Nr  )rn  r]  r  r   r  r  set_cpp_kernel_nameset_python_kernel_namer  collect_arg_kwarg_propertiesr  r  rw   r  r  fx_noder   )r  r   rN  rj  r  r   r  r  r  r  r  rp  s              r   r]  zExternKernel.__init__  s     	 	 	

 + &fB&&  1##$67-J*))+!# "ww+++-r   c                     | g| j                   S r   r  r  s    r   r  zExternKernel.get_outputs#  r  r   c                    t               S r   r?   r  s    r   r  z%ExternKernel.get_unbacked_symbol_defs&  r  r   c                    t         |          dfd}t        j                  || j                  | j
                  fd        S )Nc                    t        | t              rB| j                         }|/j                  j	                  t        j                  |             y y y r   )r   r   r  r6  r  rK   rI  )r  r   r  s     r   add_ir_readz1ExternKernel.get_read_writes.<locals>.add_ir_read,  sJ    %(++-#%%)),*>*>t*DE $ )r   c                "    t        | t              S r   rq  r  s    r   r  z.ExternKernel.get_read_writes.<locals>.<lambda>5  s    *UF"; r   )is_leaf)r  r   r   r   )rn  r3  pytree	tree_map_r  r   )r  r  r  rp  s     @r   r3  zExternKernel.get_read_writes)  sF    g-/	F 	-;	

 r   c                N   t        | j                  t        j                  j                        r\| j                  j
                  j                  D cg c]2  }|j                  s$|j                  |j                  |j                  d4 c}n+t        t        | j                              D cg c]  }i  c}| _        t        | j                  t        j                  j                        rP| j                  j
                  j                  D ci c]&  }|j                  |j                  |j                  d( c}ni | _        t        | j                  t        j                  j                        r| j                   sJ| j                  j
                  j                  D cg c]  }|j                  s|j                   c}| _        | j                  j
                  j                  D cg c]  }|j                  s| c}| _        y g | _        y c c}w c c}w c c}w c c}w c c}w )N)r   r   r  )r   r  )r   r  r  _ops
OpOverload_schema	arguments
kwarg_onlyr   	real_typer  r   r   rj  r  r  r  schema_kwargs)r  r   r   s      r   r  z)ExternKernel.collect_arg_kwarg_properties9  s    $**EJJ,A,AB ))11;; || FFKK%&__ $C$456"6 	$ $**EJJ,A,AB ))11;; qOO
  	 d&&

(=(=>55$($4$4$<$<$F$F6 !,,AFF62  ++33==""D "$D? 76"s*   7H+	H+HH/H'H"9H"c                z    t        | j                  t              r!| j                          | j	                          y y r   )r   rN  r  apply_constraintr"  r  s    r   r  zExternKernel.decide_layout^  s-    dkk>2!!#  3r   c                    t        | |      \  }}|r|j                  |       |s| j                         }|r$ddlm}  || |d      }|j                  ||       y y )NrI   )'set_kernel_post_grad_provenance_tracingT)rD  )rj   make_commenttry_get_kernel_namer  r  write_provenance_debug_handle)r  wrapperrW  
origin_str_detailed_origin_strr  debug_handles          r   codegen_commentzExternKernel.codegen_commentc  sf     ,?tW+M(
(  ,224KFBkTL 11+|L r   c                    t         r   r  r  r  s     r   codegenzExternKernel.codegent  r  r   c                ^   || _         t        j                  j                  r.t	        | j
                  t        j                  j                        sy | j
                  }| j                   |j                  dk(  r|j                  dk(  r|j                  j                  d      d   n|j                  j                  dd      }ddlm} |j!                  d|j                   i       }t#        d |D        d	
      }|d	kD  r| d| }d| d| _         y |j$                  j&                  | _         y y )Natenr  .r   r   inductor_fallback_opszaten.c              3  \   K   | ]$  }|j                  d       st        |dd        & yw)rO  rI   N)
startswithr   )r   rO  s     r   r   z3ExternKernel.set_cpp_kernel_name.<locals>.<genexpr>  s%     KAc9JS12ZKs   ,,rI   r  _vz
at::_ops::z::call)r  rw   r  cpp_wrapperr   r  r  r  r  	namespace_overloadnamer   r  replacetorchgen.aoti.fallback_opsr  r  r  r  r   )r  r  rY  opnamer  version_infolatest_versions          r   r  z ExternKernel.set_cpp_kernel_namew  s   .ww""*ejj33+
 !!'6) ++y8 OO))#.q100c:  M4885@Q9RTVW!$KK" "A% &xr.)9:F)3F86'B$'-~~':':$7 (r   c                   || _         |y | j                  }|y t        |t        j                  j
                        rd|j                   | _         y |j                  j                  dd       d|j                   | _         y )Nztorch.ops.higher_order.._ops..ops.r  )	r  r  r   r  r  HigherOrderOperatorr   r   r  )r  r  rY  s      r   r  z#ExternKernel.set_python_kernel_name  s    "4)!!>

 > >?(??P&QD# $$,,Xw?@&//ARS #r   c                0   ddl m} | j                         x}r|j                  nt        j
                  j                  }t        j
                  j                  r| j                  S t        j
                  j                  rt        t        j
                  j                  |      s(J t        t        j
                  j                               | j                  y t        j
                  j                  j                  | j                  |      S | j                  S )NrI   )CppWrapperCpu)codegen.cpp_wrapper_cpur  r  r   rw   r  device_type
fx_wrapperr  r  r   r  r  get_c_shim_func_name)r  r  dr  s       r   r  z ExternKernel.try_get_kernel_name  s    :!%!22A29L9L77***WW  agg22MB D$$E B ##+77''<<$$f  ***r   c                .    | j                         }|J |S r   )r  r  s     r   get_kernel_namezExternKernel.get_kernel_name  s!    '')r   c           	        t         j                  | j                         | j                         | j	                         | j                         | j                         | j                               }|j                          |S )N)r  r  r  r  r~  r|  )	r  r  r  r  r  r
  r  r  r  )r   r  s     r   
copy_inputzExternKernel.copy_input  sa    <<>++-]]_::<))+oo'  
 	

	r   c                   ||d}t        j                  |      \  }g g }g }g }|D ]  }	|	xt        d xl\    t        j                  j
                  j                  j                  |	d      }
j                  d       |j                  |
       |j                  |
       { xt        d x\    j                  d       |j                  |	       |	j                  j                  }|	j                  j                  dk(  r|J |j                  t        j                  j                  |   j!                                 xt"        d xB\    j                  d       |j                  |	       |j                  |	j$                         g t&        d x&\   j                  d       |j                  |	        	 j                  d       |j                  |	       |j                  |	        	 	 	 	 	 	 dfd}|D cg c]  }| j)                  |       }}|D ]  }t+        |      st-        |d	        g }|D ]  }t/        |t0              se|j3                         t        j                  j4                  v r;|j                  t        j                  j4                  |j3                                   yt/        |t0              se|j3                         t        j                  j6                  v r;|j                  t        j                  j6                  |j3                                   t/        |t8              r!|j                  |j;                                t/        |t<              r|j                  |j>                         Lt/        |t        j@                  jB                  j                        ro|j                  j                  }|j                  j                  dk(  r|J |j                  t        j                  j                  |   j!                                |j                  tE        |               |||      \  }}t        jF                  j                  }tI               5  tK        |      5   ||i |}ddd       ddd       d}|rt        jL                  jN                  jQ                  d
      }tS               }t        jL                  jT                  t        jV                  jX                  jZ                  u r|d   }t]        t        jL                        }|5  t_        |t        jL                         ddd       ta        ||      }t/        tb        td        f      s|gn|}|D ]  }t/        |t        jf                        s|jh                  s+tj        jl                  r<d}t        j                  jL                  jN                  jQ                  dd      x}r| d| }|t        j                  _7         |||||fS c c}w # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)a  Partition kernel args into tensor and non-tensor, realize tensor inputs,
        re-run fake tensor propagation with the realized strides, and return
        (example_output, tensor_args, non_tensor_args, unflatten_args, unbacked_bindings).

        unflatten_args(new_tensor_args, new_non_tensor_args) reconstructs the
        original (args, kwargs) tree from replacement lists.
        )r   r   r   N)r   Fr"  Tc                $   g }t        |       }t        |      }D ]9  }|r|j                  t        |              |j                  t        |             ; t        j                  |      }|j                  dg       |j                  di       fS )Nr   r   )r  r  r  r  tree_unflattenr  )	new_tensor_argsnew_non_tensor_argsrN  
it_tensorsit_non_tensors	is_tensorr  args_flat_is_tensor	args_specs	          r   unflatten_argsz3ExternKernel.process_kernel.<locals>.unflatten_args  s     Fo.J!"56N0 8	MM$z"23MM$~"67	8
 %%fi8A55$aeeHb&999r   r  r  rI   zEsparsity not handled. Please file issue for sparse inference weights.r  z Found from : 
 )r		  r   r
	  r   r   ztuple[list[_T], dict[str, _T]])8r  tree_flattenr    rw   r  r  r   create_symintnoder  GeneratorStater  r   r   r  r"  default_generatorsclone_stateOpaqueObjectStater  r   r  r  rO  r   ro  rs  	constantstorchbind_constantsr  	get_valuer   opaque_example_valuer  irr   r6  r#   r  r  rb  r  r
   rT  _higher_order_opseffectswith_effectsr3   r:   r4   r   r   r  	is_sparserJ   graph_partitiondisable_cudagraphs_reason)r  rY  r   r   binded_args	args_flattensor_argsnon_tensor_argsreal_non_tensor_argsr  r   device_indexr	  r   example_argsnew_args
new_kwargsr   example_outputr  node_meta_valctxexample_out_lir  msgr  r	  r	  s                             @@r   process_kernelzExternKernel.process_kernel  sV   "  $v6%22;?	9*,$&(*  	  	5CTV77++55GGRVGWD'..u5#**40(//5	  &^%'..u5#**3/#&::#3#3L::??f49QQQ(//

55lCOOQ & )&('..u5#**3/(//		: )
 X'..t4&&s+  '..u5#**3/(//4;	5>	:)	:@L	:+	: 6AAs((+AA  	6A$Q'%a5	6  	  	:A a*qzz|qww?P?P/P##AGG$5$5ajjl$CDq(+JJLAGG$?$??##AGG$?$?

$MNA/##AKKM2A01##A$:$:;Au11@@A xx~~xx}}.<3KKK##JJ11,?KKM ##$5a$89+	:.  .l<PQ*KK))	$&	=4Y?	= $X<<N		= 	= HLNN//33E:M0;C~~$$(?(?(G(G(T(TT -a 0<Q^^L K	1>>>JK 9>=! ntUm<  	   		8A1ell+KK..]"#''"6"6";";"?"?t"TT;T E!2;-@C471		8 
 	
c BV	= 	= 	= 	=K Ks6   
X>X1
	X$X18X>$X.	)X11X;>Yc                *   t        |t              sJ t        |             t        |t              r|S |j	                         }t
        j                  j                  |j                               }|J |j                         }|d|j                  v rt        |t        t        t        f      rt        |j                  t              ryt        |j                  d   t         j"                        s(t        |j                  d   t         j$                        r)|j'                  t)        |j+                                      n|j-                          t/        j0                  |j+                         d      \  }}|d   } |j3                         |      }t
        j                  j4                  j7                  ||      }t
        j                  j4                  j9                  ||      }	t
        j                  j4                  j;                  ||      }
t=        ||	      |
z   }||k7  rt>        jA                  d|	|
|       tB        t        |jD                  tG        |jI                         |jK                         |j+                         |	|
d      	      S )
z
        In order to pass this to an extern kernel we need a
        ReinterpretView not a View.  This allows us to avoid some
        unneeded copies.
        r  r  r  r   r   z@convert_to_reinterpret_view failed: stride=%s offset=%s index=%sFr  rL  )&r   ro  r   rS  rp  rw   r  r  rs  r  rb  rr  r  rN  r  r/   r  r  r  r-  r1   r
  r"  rK   r  r
  r  r  stride_vars
offset_varro   r  r  r  rM  rP  r   r  )r  r   x_unwrap_viewr  x_unwrap_view_fx_node
index_argsrU  r  r   rU  rQ  expecteds               r   convert_to_reinterpret_viewz(ExternKernel.convert_to_reinterpret_viewu  s$    !X&/Q/&a)H gg  !7!7!9: # 3 3 5 "-.333=?FJ*OP=//@8)..u5"'"5"5 <)..u5"'"8"8 77.}/E/E/GH '')!-!@!@JJL"

J  ]
  ,  55eZH''""..ujA!!,,UJ?Z1F:HIIR	 &%,,.kkmZZ\

 
	
r   c           	        |
t               S t        |t        t        j                  j
                  j                  t        f      rt        |      S t        |t              rot               5  t        j                  j                  t        j                  |j                   |j#                         |j%                                     cd d d        S t        |t&              r|S t        |t(              r| j+                  |j,                        S t        |t.              r4t/        | j+                  |j,                        |j1                               S t        |t2              r;|j5                          t7        |j9                               r	 | j;                  |      S t        |t>              r|j5                          |S t        |t@        t        tB        f      r|S | jE                  |      S # 1 sw Y   &xY w# t<        $ r Y hw xY w)N)r  )r  r  rL  )#r  r   r    r   r   r   r   r   r   r  rA   rw   r  add_tensor_constantr  rT  r  r  r  r!  r   r  rM  rS  r  ro  r  r  rp  r8	  r  rq  NonTensorObjr   r	  r  s     r   r  zExternKernel.realize_input  s   9'))a$ 3 3 ; ;SAB(a00a" () ww22LLallnU  a(Ha#$$QVV,,a)"&&qvv.q||~  a"IIK$Q]]_5::1== a$IIKHa,(=?PQRH~~a  3 " + s   ,AG-G: -G7:	HHc                    t        |      r<t        |j                               dk(  r|S |j                         D ]  }|dk(  s	|c S  | j                  |      S rM  )r  r   r4  r	  )r  r   r  s      r   require_stride1zExternKernel.require_stride1  sT     #1<<>"a',,. Q;H ~~a  r   c                (
   ||J |j                         dv r|s|S t        |      r-t        |j                         t              rG|r2t        ||      }|r|j                          |S t        |dd||       |S t        |ddd||       |S d}|r>|r<t        t        j                  ||j                         |j                                     }t        |j                         t        t        f      rf|r|j                         j                  |      s5|rCt!        ||j                         j"                  |j                               r|t%        ||      S |S |ct        |j                         t        t        f      r?t!        ||j                         j"                  |j                               rt%        ||      S t        |j                         x}t&              rwt        |j)                         x}t              rt+        d      t        |t              r<|r|j                  |      s'|r't!        ||j"                  |j                               r|S t        |t,              rX|r|j                         j                  |      s5|r5t!        ||j                         j"                  |j                               r|S t        |t.              rt        |j0                  t2              rt        |j0                  t4              st        |j7                         x}	      rtt9        |	d      rht        |	j0                  t:              sN	 | j=                  |j0                        |_        |r| j?                  |||	      S |r| jA                  |||	      S 	 d}
|j                         }|tD        jF                  jH                  }tK        tM        |j                                     D cg c]<  }|jO                  ||   d
      r%|jQ                  |j                         |   d      r|> }
}|
D ].  }tR        jT                  jV                  jY                  ||d
d      }0 | j[                  |      }t        |dd|||       |rBt]        |j                               s)t]        |j_                               st        ||      sJ |S |
r<||J tR        jT                  jV                  ja                  ||      }t%        ||      S |S # tB        $ r Y zw xY wc c}w )zUEnsure x has the requested stride order or exact strides, inserting a copy if needed.N)r   rI   TF)r  r  r  r%  r  zHthe MutationLayoutSHOULDREMOVE's real layout shouldn't be FlexibleLayoutrM  r  r   r   rI   )1r  r  r   r  r  r  r"  rO  r   r  r  r
  r  rP  r  r  rE  r  rZ  r  r  rl  r  r   rM  ro  rS  rp  r  r  r8	  require_stride_orderr  r  rw   r  r  r   r   rI  r  r  r  loweringslice_r	  r6   r4  r  )r  r   r   r0  r%  use_current_stride_orderpadded_exact_stridesmutation_layoutr  rp  expanded_dims	orig_sizer  r   rB  s                  r   require_strideszExternKernel.require_strides  s     M$===;;=F"=H !#!,,..9 0R50, 0) H .#',1).*7 H *#(-%)&3&3 H
 $( '+''qzz|Q[[]S($ !,,.;*HI1<<>;;EB!1%q||~'<'<ajjl %0 4A}E  %0q||~_/MN-(!,,.*?*? 7q:NOO$%LLN25O $3$?$?$AA[N )b   [9{<<UC%5);+=+=qzz|
 H a%q||~77>-!1<<>#8#8!**,
 Hq)$1668,qvv7%Q]]_&DkEV,{//1BC88@335 4   #44= 5   # +/JJL	$ww''H s1::<0133M!4DaH11!**,q/1E M  % BOO,,33AsAqAB
 NN1!''	
 )!**,7)!,,.95a???  (]-FFF((//9=A21mDD_ ' s   5S? :S? #AT?	TTc           
         | j                  ||D cg c]4  }t        |t        j                        r|j                  j
                  n|6 c}|      S c c}w )N)r0  r%  )rG	  r   r  SymIntr   r  )r  r   r0  r%  r   s        r   r  z"ExternKernel.require_exact_strides  sV     ""KXFGz!U\\:A ( # 
 	
s   9A
c                *    | j                  |||      S )N)r   r%  )rG	  )r  r   r   r%  s       r   r?	  z!ExternKernel.require_stride_order  s     ""1E"OOr   c                .    | j                  |t              S r   )r?	  r  r  s     r   require_channels_lastz"ExternKernel.require_channels_last  s    ''+<==r   c                .    | j                  |t              S r   )r?	  r  r  s     r   require_channels_last_3dz%ExternKernel.require_channels_last_3d  s    ''+=>>r   c                    dd} ||      r|S | j                  |t        j                  |j                                     S )Nc                    	 | j                         }|t        j                  j
                  v xr' t        j                  j
                  |   j                  S # t        t        f$ r Y yw xY wr  )rs  AttributeErrorr  rw   r  r	  	is_mkldnn)r   r   s     r   is_mkldnn_tensorz9ExternKernel.require_contiguous.<locals>.is_mkldnn_tensor  s]    zz| 177,,,R1B1B41H1R1RR #$78 s   A A)(A)r   r   r   r   r  r  r  r
  )r  r   rS	  s      r   r  zExternKernel.require_contiguous  s@    	S AH,,>44QZZ\B r   c                h    | j                  |t        j                  |j                                     S r   rU	  r  s     r   require_contiguous_stridesz'ExternKernel.require_contiguous_strides  s-     ((~00>
 	
r   c                     y r   r   r  s    r   r  zExternKernel.apply_constraint  r  r   c                   t        |t              sJ t        |             t        |t              st        |      }| j                  sJ d       t        |      }t        | j                        }||k  rqt        j                  d| j                  ||z
         t        ||      D ]>  }| j                  |   d   }|j                  ||v r||   n| j                  |   d          @ |S )Nz/ExternKernel.arg_properties should not be emptyzv%s has %d unprovided positional arguments. Will check if they are in the keyword arguments or will use default values.r   r  )r   r   r   r   r  r   r  r  r  r   r  )r  r   r   n_args
n_pos_argsr   arg_names          r   fill_non_provided_argsz#ExternKernel.fill_non_provided_args  s     $)54:5)$%:D""U$UU"T,,-
 JII^  V#	 6:. ..q1&96) 8$,,Q/@ r   c                \   t         j                  j                  rGg }d }|r]| j                  rQt	        | j
                        t	        |      k(  sJ d       | j                  D ci c]  }|j                  d      | }}t        | j
                        D ]  \  }}|.|J |j                  ||         }|r|j                  d      nd }n\t	        | j                        |z   }	| j                  r6|	t	        | j                        k  r| j                  |	   j                  d      nd }|j                  t         j                  j                  j                  ||              |S | j
                  D 
cg c]+  }
t         j                  j                  j                  |
      - c}
S c c}w c c}
w )NzDnames passed to codegen_const_args does not match self.constant_argsr   r   )rw   r  r  r  r   r  r  r   rj  r  r  val_to_arg_str)r  r  rN  name_to_arg_propertiesr  r   r   proptype_r   rF  s              r   codegen_const_argszExternKernel.codegen_const_args  s   77F
 &*",,4--.#e*< Z< 594G4G*-0CGGFOS(*& * "$"4"45 M1)5 ,,,155eAh?D04DHHV,$Edkk*Q.C  ..3T=P=P9Q3Q ++C044V<! 
 agg22AA!UKLM MDHDVDVWqAGG((77:WW'*& Xs   $F$10F)c                   t         j                  j                  rC| j                  7| j	                  g | j
                  | j                  | j                        }d}n| j
                  }d}g }t        |      D ]  \  }}t         j                  j                  r| j                  r|t        | j                        k  sJ d       | j                  |   j                  d      }|j                  t         j                  j                  j                  ||             |j                  t         j                  j                  j                  |              |r|j                  | j!                                |S )NFTz-Invalid access to ExternKernel.arg_propertiesr   )rw   r  r  r  r]	  rj  r  r   r   r  r   r  r  r  r_	  rn  rc	  )r  rj  need_codegen_constant_argsr   r   r   rb	  s          r   codegen_argszExternKernel.codegen_args  s5   774#3#3#?003$++3 2 23T[[F */&[[F)-&f% 	DDAqww""**q3t7J7J3K/K CK ++A.226:AGG00??5IJAGG00??BC	D &KK//12r   c                    ||v r|j                  |      S || j                  v r| j                  j                  |      S | j                  j                  |      x}|j                  d      S t        | d      )zGiven an argument name, queries for values in (in order):
        1. any provided kwargs for this function.
        2. the class self.kwargs member.
        3. any available default arguments in self.allarg_properties.r  z not in self.allarg_properties)r  r   r  rl  )r  r\	  r   r  s       r   get_kwargs_valuezExternKernel.get_kwargs_value8  sx    
 v::h''t{{";;??8,,))--h77CD77?++z)GHIIr   c           	        t         j                  j                  r| j                  t	        | j
                        dk(  rg S g }| j                  D ]  }|r|dk(  r| j                  |      }t        |t              r|j                  |       >| j                  J | j                  j                  |i       j                  d      }|j                  t         j                  j                  j                  ||              |S | j                  j!                         D cg c]3  \  }}| dt         j                  j                  j                  |       5 }}}|S c c}}w )Nr   r   r   r  )rw   r  r  r  r   r  r  rh	  r   r    r  r  r  r  r_	  r   rT  )r  skip_outr   r\	  rO  rb	  ks          r   codegen_kwargszExternKernel.codegen_kwargsE  s=   77+D4F4F0G10L	F >> QE 1))(3a&MM!$11=== 2266xDHHPEMM!''"6"6"E"Ea"OPQ"  !KK--/Aq #Qqww++::1=>?F  	s    8Ec                    | j                   S| j                   j                  }t        |dd      }|j                  dd      }|j	                  dd      d   }| d| }|S d}|S )	Nr   unknown_namespacer  r  r  rI   r   
unknown_op)r  rT  r   r  rsplit)r  rT  op_namespaceop_names       r   get_op_namezExternKernel.get_op_name_  sv    <<#\\((F"6<9LML'//'BL'..sA6q9L%ax0G  #Gr   c                   t         j                  sy t        | j                               dk(  ry t        j
                  j                  j                  | j                               }t        j
                  j                  j                  | j                               }| j                         }| j                         }t        j
                  j                  rt        | j                  t        j                  j                         rlt        j"                  j$                  | j                  j&                  v r<t        | j(                  d   t*              sJ | j(                  d   j                         }|j-                  ||||       y r  )rJ   size_assertsrr   r
  rw   r  r  codegen_shape_tupler4  rs	  rs  r  r   r  r  r  r  Taginplace_viewtagsrj  r   write_assert_size_stride)r  r  r  r  rr	  r   s         r   codegen_size_assertsz!ExternKernel.codegen_size_assertsj  s   "")Q.ww##77H%%99$//:KL""$}}77 $**EJJ,A,AB99))T-=-=-B-BB%dkk!nf===;;q>224D((tVWEr   c           	     H   t         j                  rt        j                  j                  sw| j                         }|t        j                  j                  v}| j                         }|r |j                  d| dt         d|d       y |j                  d| d| d       y y y )Nzassert_alignment(rE  r  z	# buffer z (op: z) is assumed to be not aligned)
rJ   alignment_assertsrw   r  r  rs  r  rs	  r  rk   )r  r  r   alignedrr	  s        r   codegen_alignment_assertsz&ExternKernel.codegen_alignment_asserts}  s    ##AGG,?,?==?D!''";";;G&&(G!!'vR/@7+QO !!vVG94RS -@#r   c                    t         j                  j                  rt        j                  j
                  ry|j                          | j                         }|j                  d| d| d       y)zc
        Track outputs of fallback operators if config.test_configs.track_memory_lifecycle
        Nztrack_tensor(z, 'z'))	rJ   test_configstrack_memory_lifecyclerw   r  r  "write_memory_track_allocation_oncers  r  )r  r  r   s      r   codegen_memory_trackingz$ExternKernel.codegen_memory_tracking  sV     ""99QWW=P=P224}}M$s4&;<r   c                N    | j                         }| j                         }|g g|fS )zD
        get output sizes and strides, for template_codegen
        )r
  r4  )r  r  r   s      r   get_group_stridezExternKernel.get_group_stride  s*     //#r{G##r   c                   t         j                  j                  }| j                         }| j	                         }|D cg c]  }|j                  |       }}t        t        |            D cg c]  }t        d|        }}t        t        t        |            |j                  d      }t        |      D 	ci c]  \  }}	|	|
 }
}}	t        t        |
            D cg c]  }|
|   	 }}|D cg c]  }||   	 }}| j                         } ||      }t         j                  j                  j                  |||g      \  }}}t        d      \  }}t        t!        | ||D cg c]
  } ||       c}                  }t#        t%        j&                  |      |      }|t)        |      fS c c}w c c}w c c}	}w c c}w c c}w c c}w )zC
        Manually get canonicalization of the output index
        r	  T)r  r  c)rw   r  r  r
  r4  r	  r   r   rp   r  r  r   r
  r^  rV   r   r   rs   r   r  r   )r  r  r~  rU  r   r   rN  index_orderr   r   r   r   r  r   	new_sizesr   rd  r   add_varreplacements                       r   canonicalizezExternKernel.canonicalize  s   
 77##//# ;BBQ8--a0BB;@U;LMa(1QC1M
MU3w<0g6I6ISWX+4[+ABxsC#s(BB$)#f+$67q77-23jm3
3##%
#%&WW%5%5%E%Ew&
"	7F !%
73z7	3R1GAJ3R+STU5<<.<eI&&&+ CM C73 4Ss#   F5/F:>F?$G6G
+Gc                    |rt         nt        }t        j                  | |      }| j                  D ]  }| ||      z  } | j
                  j                         D ]  }| ||      z  } |S r   )maybe_free_unbacked_symbolsmaybe_free_symbolsr  r>  r  r   r   )r  ri  maybe_get_symbolsr  r  s        r   r>  z!ExternKernel.get_free_symbol_uses  s|     ,9'>P 	 --dMB%% 	(C"3''A	(;;%%' 	(C"3''A	(r   c           
     "   t        | dd       }d|g}|t        j                  |       D cg c]'  }|j                   dt        | |j                         ) c}z  }|j	                  d| j
                         | j                  |      S c c}w )Nr  zpython_kernel_name=r  r  )r   r  fieldsr   r  r~  r  )r  rW  r  r  s       r   r  zExternKernel.__str__  s    d$8$?!+1
 	$++D1
 zzl!GD%**567
 	
 	|D$4$4#789u%%
s   ,Br   NNNNr   N)r   re  rN  r  rj  rt  r  r  r   dict[str, Any] | Noner  r  r  re  r  re  r  r  r  r  r   r   r  r  rx  rS  r   )r  r|   rW  re  r   r   r  r|   r   r   r  re  r   r   )r  re  r   r   rd  ro  )r   r   r   r   )rY  r   r   r   r   r   r   zftuple[Any, list[Any], list[Any], Callable[[Any, Any], Any], dict[sympy.Symbol, pytree.KeyPath] | None])r   r   r   rS  r  )NNF)
r   r   r   zSequence[int] | Noner0  rb  r%  r   r   r   rr  )r   r   r0  ra  r%  r   r   r   )r   r   r   rt  r%  r   r   r   )r   r  r   r  r   r  )r  r{  r   r   r   r   )r\	  r   r   r   r   r   )rj	  r   r   r   )r   z'tuple[list[Sequence[Expr]], list[Expr]])r   ztuple[Expr, Sequence[Expr]]r}  )@r   r   r   r  r  r   r  r  r   r   r  r  r  r   r  r  r  r  r  r  r  r]  r  r  r3  r  r  r  r  r  r  r  r	  r  r	  r  r0	  r8	  r  r=	  rG	  r  r?	  rL	  rN	  r  rW	  r  r]	  rc	  rf	  rh	  rl	  rs	  r{	  r	  r	  r	  r	  rb   r>  r  r  rI  rJ  s   @r   r  r    s   
 $&M=%.[..tDFND*.K'.%)
)"&OZ& 4E;3D3D4!=  (,K$+26N/63D;3D3D40  :>6=<MK<M<M=9  .?[->->t-T*T (*(,.2)-&*79+/.. . 4	.
 %. &. ,. '. $. (5. ). 
.@. #$J! HLM+M:DM	M""#;J+$
 
 
 c
!c
*-c
9<c

c
 c
J E
 E
N !! !!F ! !  '+37#tt $t 1	t
 t 
t tl QV	
	
'9	
JN	
		
 	
 DIPP,P=AP	P P
 > > ? ?  " 
 
"!"+9"	"HXB4J4	F&	=$'B N+$)!	! ,
& Hr   r  c                  f     e Zd ZddZ	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )ExternKernelOutc                &    |j                  |        y r   )generate_extern_kernel_outr  s     r   r  zExternKernelOut.codegen      **40r   c
                &   | j                  |      }
t        |
t              sJ t        |
             t        |   d ||
||xs i d ||||	
       t        j                  j                  |       | _	        t        j                  j                  |        y r   )r  r   r   r   rn  r]  rw   r  r  r   r  )r  rN  rj  r  r   r  r  r  r  r  unwrapped_inputsrp  s              r   r]  zExternKernelOut.__init__  s      ..v6*H5Mt<L7MM5Lb)	
 GG++D1		""4(r   c                     yr1  r   r  s    r   r  zExternKernelOut.should_allocate  r  r   r	  r	  )rN  r  rj  r  r  r  r   r	  r  r  r  re  r  re  r  r  r  r  r   r   r_  )r   r   r   r  r]  r  rI  rJ  s   @r   r	  r	    s    1 (*(,.2)-&*79+/)) !) %	)
 &) ,) ') $) (5) )) 
):r   r	  c                        e Zd Zd fdZ xZS )RandomSeedsc                   t        j                  t         j                        }t        |   t        |t         j                  |g      g |j                  |j                  |ggddt        j                  j                         y )Nr  zaten.randint.low_outzat::_ops::randint_low_out::call)rN  rj  r  r  r  r  )r  r  r  rn  r]  rP  r1  r  r  randintlow_out)r  r  r  limitsrp  s       r   r]  zRandomSeeds.__init__  sl    U[[)kkW
 !::vzzE7;5 >,, 	 	
r   )r  r   r  rj  r   r   r   r   r   r]  rI  rJ  s   @r   r	  r	    s    
 
r   r	  c                  h     e Zd ZddZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZd	dZ xZS )
r  c                &    |j                  |        y r   )generate_extern_kernel_allocr  s     r   r  zExternKernelAlloc.codegen  s    ,,T2r   c	                F   | j                  |      }	t        d |	D              sJ t        
|   d |t	        t
        t           |	      ||xs i d ||||
       g | _        t        j                  j                  |       | _        t        j                  j                  |        y )Nc              3  <   K   | ]  }t        |t                y wr   rq  r{  s     r   r   z-ExternKernelAlloc.__init__.<locals>.<genexpr>)  s     CQ:a(Cr|  )r  r   rn  r]  r   r   r   rK  rw   r  r  r   r  )r  rN  rj  r  r   r  r  r  r  r	  rp  s             r   r]  zExternKernelAlloc.__init__  s      ..v6C2BCCCC&!#34Lb)	
 ')GG++D1		""4(r   c                     yr  r   r  s    r   r  z!ExternKernelAlloc.should_allocate=  r  r   c                    t         r   r  r  s    r   r  z"ExternKernelAlloc.apply_constraint@  r  r   r	  )r   NNNr   N)rN  r  rj  r  r  r  r   r	  r  re  r  re  r  r  r  r  r   r   r_  rS  )r   r   r   r  r]  r  r  rI  rJ  s   @r   r  r    s    3 (*(,)-&*79+/)) !) %	)
 &) ') $) (5) )) 
)@"r   r  c                  T     e Zd ZdZ	 	 	 	 	 	 	 	 d fdZddZd	dZd
dZddZ xZ	S )r  zP
    An output buffer that represents the mutation of a pre-existing buffer
    c                    t         |   d |       |j                         }t        j                  j                  |       |g| _        || _        t        j                  j                  |       | _	        y r  )
rn  r]  rs  rw   r  r  mutation_namesmutating_noder  r   )r  rN  mutated_noder	  mutated_node_namerp  s        r   r]  zMutationOutput.__init__I  sb     	d62(113	##$5601(5GG++D1	r   c                    | j                   S r   )r	  r  s    r   r  zMutationOutput.get_defining_opS  s    !!!r   c                    | j                   S r   )r	  r  s    r   rJ  z!MutationOutput.get_mutation_namesV  rs  r   c                     yr  r   r  s    r   r  zMutationOutput.should_allocateY  r  r   c                ^    | j                         }d |D        D cg c]  }|| c}S c c}w )Nc              3  Z   K   | ]#  }t         j                  j                  |       % y wr   )rw   r  try_get_buffer)r   r   s     r   r   z6MutationOutput.get_mutation_buffers.<locals>.<genexpr>`  s     P..t4Ps   )+)rJ  )r  r	  r  s      r   get_mutation_buffersz#MutationOutput.get_mutation_buffers\  s=    002 QP
 
 	
 
s   *)rN  r  r	  r   r	  r  r   r   r  r  r_  r   r  )
r   r   r   r  r]  r  rJ  r  r	  rI  rJ  s   @r   r  r  D  sA    2 2062GP2	2"#
r   r  c                       e Zd ZU dZi Zded<   e	 	 	 	 	 	 d	d       Ze	 	 	 	 	 	 d	d       Z	 	 	 	 	 	 	 	 d
 fdZ	ddZ
ddZ xZS )TMADescriptorad  
    An IR node representing a generic host-side TMA descriptor in the Triton API
    Mostly useful for user-defined Triton kernels relying on host-side TMA;
    but can, in principle, be used for Inductor's Triton templates, too.

    See TMADescriptorExperimental and TMADescriptorStable for the two implementations
    (the old API and the new API)
    zdict[Any, TMADescriptor]_CACHEc                    t        |      dk(  sJ |d   dk(  rt        |g|d    S |d   dk(  sJ t        |g|d    S )Nr   r   experimentalrI   r  )r   TMADescriptorExperimentalTMADescriptorStable)r  rT  tma_metas      r   _create_implzTMADescriptor._create_impls  s\     8}!!!A;.(,VBhqkBBA;(***&v<<<r   c                    t        |      |f}|| j                  vr| j                  ||      | j                  |<   | j                  |   S r   )r  r	  r	  )r  rT  r	  r  s       r   r  zTMADescriptor.create~  sF     &z8$cjj !..vx@CJJsOzz#r   c           
     @   t         |   d t        t        ||j	                                     t        t        t           |      t        |      d        || _	        t        j                  j                  |       | _        t        j                  j                  |        y r  )rn  r]  r  rS  r  r   r   rr  r   rT  rw   r  r  r   r  )r  rT  rj  r  rp  s       r   r]  zTMADescriptor.__init__  s     	 !,,. &!6*- 	
  GG++D1		""4(r   c                &    |j                  |        y r   )generate_tma_descriptorr  s     r   r  zTMADescriptor.codegen      ''-r   c                    | j                   S r   )rT  r  s    r   
get_tensorzTMADescriptor.get_tensor  r  r   )rT  r   r	  ztuple[str, tuple[Any, ...]]r   r	  )rT  r   rj  r  r  r  r   r   r	  rR  )r   r   r   r  r	  r   r  r	  r  r]  r  r	  rI  rJ  s   @r   r	  r	  e  s     (*F$)=='B=	= = 'B	 ))&3)DQ)	)..r   r	  c                  :     e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 d fdZ xZS )r	  z
    the new host-side TMA Descriptor API:
    (the ones obtained via create_{1d,2d}_tma_descriptor calls).

    See also TMADescriptorStable for the new API.
    c                b   t        |      dv sJ t        |      t        |      k(  sJ ||j                         j                  }|| _        || _        || _        t        | j                        | _        |g}g | j                  | j                  | j
                  }t        | !  |||       y )N)rI   r   rT  rj  r  )	r   r  r  rW  
block_dimselement_sizerc  rn  r]  )r  rT  rW  r	  r	  rj  r  rp  s          r   r]  z"TMADescriptorExperimental.__init__  s     4yF"""4yC
O+++!++-66L	$(		N	
YY
__
 
 	' 	 	
r   r   )
rT  r   rW  list[int | torch.SymInt]r	  r	  r	  r  r   r   r   r   r   r  r]  rI  rJ  s   @r   r	  r	    sG     $(

 '
 -	

 !
 

 
r   r	  c                  $     e Zd ZdZd fdZ xZS )r	  z
    the new host-side TMA descriptor API
    (the ones obtained via TensorDescriptor.from_tensor).

    See also TMADescriptorExperimental for the old API.
    c                :    || _         t        | 	  ||g|       y )Nr	  )block_shapern  r]  )r  rT  r	  rp  s      r   r]  zTMADescriptorStable.__init__  s(    &8% 	 	
r   )rT  r   r	  r	  r	  rJ  s   @r   r	  r	    s    
 
r   r	  c                  B     e Zd Z	 d	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )SubgraphBufferc                    t         |   d ||       || _        || _        t        j
                  j                  |       | _        t        j
                  j                  |        t        j
                  j                  | j                  ||      | _
        t        | j                        sJ t        | j                        }|D ]T  }|| j                  j                  |j                  <   | j                  j                  j!                  |j                         V |D 	cg c]  }	|	j                   c}	| _        dd lmc m}
 t	        j*                  | j                        5  dddd}i ||xs i }|
j-                  |      5   | j                  j.                  | j                    d d d        |r:| j                  j0                  D ]!  }|j3                  |j5                                # d d d        y c c}	w # 1 sw Y   SxY w# 1 sw Y   y xY w)Nr   FATEN)max_autotunemax_autotune_gemmmax_autotune_gemm_backends)rn  r]  rd  example_inputsrw   r  r  r   r  make_subgraphsubgraphrr  rj  rm  r  graph_input_namesr  
sym_inputstorch._inductor.configr  rJ   set_graph_handlerr   run
operationsr  r  )r  rN  r   rd  r	  subgraph_namer  r	  sym_inpsym_varinductor_configbase_patchesmerged_patchesr^  rp  s                 r   r]  zSubgraphBuffer.__init__  s    	v{3,GG++D1		""4(--dgg~}U,,,(5
! 	AG7>DMM&&w||4MM++227<<@	A 8BBG7<<B88  / 	A !&%*.4L .X-WAUSU-WN &&~6 8!!!4#6#678
 --22 AB)).*=*=*?@A	A 	A	 C8 8	A 	As+   G3 "H$G8&AH8H	=HHc                    G d d      }t        | j                        sJ | j                  D cg c]  }|j                          }}|j                   || j                        g | j
                  || j                  g       y c c}w )Nc                      e Zd ZddZy),SubgraphBuffer.codegen.<locals>.CodegenGraphc                4    || _         |j                  | _        y r   )r  r   )r  r  s     r   r]  z5SubgraphBuffer.codegen.<locals>.CodegenGraph.__init__  s    "
!JJ	r   N)r  r}   )r   r   r   r]  r   r   r   CodegenGraphr	    s    'r   r	  )rr  rj  r  'codegen_subgraph_with_flattened_outputsr	  r	  r   )r  r  r	  r  outer_inputss        r   r  zSubgraphBuffer.codegen  sz    	' 	'
  ,,,7;{{C!++-CC77'-doo--YYK	
 Ds   Br   )rN  r  r   r  rd  torch.fx.GraphModuler	  	list[Any]r	  r   r  r	  r	  r   r   r   r]  r  rI  rJ  s   @r   r	  r	    sT     15,A,A ",A !	,A
 ",A ,A .,A\
r   r	  c                       e Zd ZdZddZddZedd       Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 e
d       	 d	 	 	 d fd       ZddZ	 	 	 	 	 	 	 	 	 	 d fd	Zdd
ZddZ xZS )UserDefinedTritonKernelz>
    A user-defined triton kernel (e.g. via @triton.jit).
    c                D   ddl m} ddlm} |j	                  | j
                        g }g }g }t        |      rt        d      r%|j                  fdj                  D               n)t        d      sJ |j                  j                         t        d      r:j                  D ]*  }|j                  j                  j                  |          , n)t        d      sJ |j                  j                         j                   }j                  |||fS )	Nr   )	Autotuner)kernel_side_tablerestore_idxc              3  P   K   | ]  }j                   j                  |     y wr   )r   	arg_names)r   r   rY  s     r   r   zBUserDefinedTritonKernel.get_kernel_and_metadata.<locals>.<genexpr>0  s%      */0FII''**s   #&restore_value	reset_idxreset_to_zero)triton.runtime.autotunerr	  *torch._higher_order_ops.triton_kernel_wrapr	  
get_kernel
kernel_idxr   r  rn  r	  r	  r 
  r  r   r	  r
  configs)r  r	  r	  r
  restore_value_argsreset_to_zero_argsr   rY  s          @r   get_kernel_and_metadataz/UserDefinedTritonKernel.get_kernel_and_metadata#  s   6P"--doo>(*(*fi( v}-")) *4:4F4F*  v777"))&*>*>?v{+)) FA&--fii.A.A!.DEF v777"))&*>*>?nnGYYFw 24FFFr   c                   t         j                  sy| j                  j                  syt	        | j
                  j                        dk7  ryt	        | j                        dk(  sJ t        | j                  d   t              syt        | j                  d   j                  t              syt        | j                  d   j                  j                  t              syt        | j                  d   j                  j                  j                  t              syt        d | j                  d   j                  j                  j                  j                  D              syy)aE  
        For kernels like

        @triton.jit
        def add_kernel(in_ptr0, in_ptr1, out_ptr, n_elements, BLOCK_SIZE: tl.constexpr):
            pid = tl.program_id(0)
            offs = pid * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
            mask = offs < n_elements
            x = tl.load(in_ptr0 + offs, mask=mask)
            y = tl.load(in_ptr1 + offs, mask=mask)
            tl.store(out_ptr + offs, x + y, mask=mask)

        @torch.compile
        def fn(a, b):
            out = torch.empty_like(a)
            grid = (triton.cdiv(a.numel(), 1024),)
            add_kernel[grid](a, b, out, a.numel(), BLOCK_SIZE=1024)
            return out.relu()

        We can potentially fuse the relu epilogue into the add_kernel.
        We do this by pruning the `out` tensor allocation and directly writing the relu-output.
        FrI   r   c              3  &   K   | ]	  }|d k(    ywr/  r   r)  s     r   r   z<UserDefinedTritonKernel.can_fuse_epilogue.<locals>.<genexpr>v  s     Na16Nr*  T)rJ   *epilogue_fusion_user_defined_triton_kernelarg_accessescan_fuse_epiloguer   kernel_storesstoresmutable_argsr   r   rM  rq  r  r  r   r  r  s    r   r
  z)UserDefinedTritonKernel.can_fuse_epilogueC  s   0 @@  22 t!!(()Q. 4$$%***$++A.	:$++A.33Z@$++A.3388.I$++A.3388==yIN4#4#4Q#7#<#<#A#A#F#F#M#MNNr   c                (    | j                  |d       S )N)epilogue_fusion_codegenr  s     r   r  zUserDefinedTritonKernel.codegen{  s    }}Wd};;r   c                &    | j                  ||      S )zQ
        epilogue_fusion: (fused epilogue node, modified kerel src code)
        r
  )r  r  r
  s      r   codegen_with_epilogue_fusionz4UserDefinedTritonKernel.codegen_with_epilogue_fusion  s     }}Wo66r   c                   ddl m} | j                         \  }}}}| j                  }i }	|rt	        | j
                  j                  j                        dk(  sJ t        t        | j
                  j                  j                              j                  }
|\  }}i | j                  |
|i}|
|i}	|j                  |||||| j                  |      \  }}}}| j                  D ci c]  }|| j                  |       }}|j                  |	       |j                   D cg c]  }|j                   c}|j                   D cg c]  }|j"                  s|j$                   }}t'        fd|D              }g }g }g }g }t)        j*                  |j-                         t/        t)        j0                  d      |            D ]f  \  }}||v r |       r|j3                  |       |j3                  |       t5        |t6              r?|j3                  |j9                                |j3                  |j;                                t5        |t<        t>        t@        tB        f      r,|j3                  |       |j3                  tE        |             ||v r'|j3                  d       |j3                  t<               |R	  |       r(|j3                  d       |j3                  t<               -|jG                          |jG                          OtI        dtE        |       d	|        | jK                  ||       |jM                  |||||||d
| jO                         | jP                  j                  
       yc c}w c c}w c c}w )YOverrides the parent member.
        See https://github.com/pytorch/pytorch/issues/151692r   )triton_version_uses_attrs_dictrI   c              3  (   K   | ]	  }|     y wr   r   )r   r   r	  s     r   r   z3UserDefinedTritonKernel._codegen.<locals>.<genexpr>  s     $FaYq\$Fs   r  r2  NzUnsupported arg type: r  T)	arg_typesraw_argsraw_keystriton_metainductor_metar%  r  original_fxnode_name))rk  r
  r	
  r   r   r
  r  r=  r  r  r   !define_user_defined_triton_kernelgridr  rh	  r  paramsis_constexprnumr@   r  rZ  rT  r   repeatr  r   r   r  r  r   r	  r   r    r   r  r  r  generate_kernel_callr  r  )r  r  r
  r
  rY  r
  r
  r
  kernel_kwargsepilogue_out_overridemutable_arg_nameepilogue_computed_bufferr   new_namer
  r 
  extra_launch_argsrk	  
named_argsrh  
constexprsconstexpr_namesr   r
  raw_keys_filteredraw_args_filteredr   r  r	  s                               @r   r
  z UserDefinedTritonKernel._codegen  sM    	I ((*	

 02t((44;;<AAA#D):):)F)F)M)M$NOTT*9'$aWt{{W,<>VWM%57O$P! 55II
	
 261S1S
,-At$$Q''

 
 	/0%+]]3QVV3	%+]]EannaeeE
E$$F:$FF!	')')"I$4$4R$8:K L
 $	WID# &+I+K$$T*$$S)#v&C1134  1C#udD!9:C   c+( B  % 23KKO$$S)%))+%))+),B49+RPSu*UVVI$	WL 	Wh/$$&&#'??$!%!2!2 	% 	
i

 4Es   &M= NNNc                P    t         |   |      t        | j                  |      z  S r   )rn  r>  r)   r#
  ro  s     r   r>  z,UserDefinedTritonKernel.get_free_symbol_uses  s-     w+M:=MII}>
 
 	
r   c                    t               S r   r?   r  s    r   r  z0UserDefinedTritonKernel.get_unbacked_symbol_defs  r  r   c                  g }i }g }|j                         D ]  \  }}	t        |	t              rXt        j	                  | j                  |	            }
||v rt        j                  |
||         }
|j                  |
       |
||<   n|j                  |	       |	||<    t        |      dk7  sJ |d   j                         | _        t        |t              sJ t        |             t        | =  d t!        | j                        |t#        |      |       || _        || _        | j)                         \  }}}}t+        |d      sJ |j,                  D cg c]	  }||v s| c}| _        ddlm}m} t        |      dkD  r|d   j6                  ni }dd l}|j:                  | _        |j?                  | j<                        | _          || j<                        | _!        || _"         ||i |||      | _#        | jF                  jH                  jJ                  D cg c]:  }t        |jM                  |jN                        t              r||jN                     < c}| _(        | jP                  D cg c]#  }tS        t!        | j                        ||       % c}| _*        tV        jX                  j[                  |        y c c}w c c}w c c}w )Nr   r  r	  )identify_accessed_tensorsidentify_triton_stores).rT  r   r   r  r  r  r	  r  r  r   r  r  r   r   rn  r]  r  r   r
  r#
  r	
  r  r	  r  r
  r7
  r8
  r   astr  
kernel_srcparse
kernel_astr
  kernel_argsr
  r  r=  r  r   r
  r  r  rw   r  r  )r  r
  r#
  tma_descriptor_metadatar=
  rj  r   r  rk	  rO  r  rY  r
  r   r  r7
  r8
  autotuned_kwargsr9
  r  r  rp  s                        r   r]  z UserDefinedTritonKernel.__init__  s     "$&&(%%' 		DAq!Y' 99$:L:LQ:OP//%,,Q0G0JKAa q	$$Q'q			 6{aQi**,&(+9T&\9+dkk*- 	
 %	 $ < < >A v{+++!++.
sk/AC.
*	

 14Gq0@71:,,b !**))DOO43DOOD&5/{/./#
 ((44;;
+//#((3Y? !
 ((!
 :T[[93E!
 	
""4(K.
6
!
s   	J?J??K/(K	c                ,    t        | j                        S r   )r   r  r  s    r   r  z#UserDefinedTritonKernel.get_outputsO   s    D))**r   c                    | j                   S r   r  r  s    r   r  z"UserDefinedTritonKernel.get_deviceR   r  r   )r   z(tuple[Kernel, Any, list[str], list[str]]r_  r	  )r  r|   r
  ztuple[ComputedBuffer, str]r   r   )r  r|   r
  z!tuple[ComputedBuffer, str] | Noner   r   rr  r}  r  )
r
  r   r#
  r   r>
  r  r=
  r  r   r   r  rg  )r   r   r   r  r	
  r
  r   r  r
  r
  rb   r>  r  r]  r  r  rI  rJ  s   @r   r	  r	    s    G@6p < <7+7>X7	7i
%i
 ;i
 
	i
V 56$)
!
	!
 7
N) N) 	N)
 "0N) $N) 
N)`+r   r	  c                  T     e Zd ZdZddZddZd	dZd
dZ	 	 	 	 	 	 	 	 d fdZ xZ	S )InplaceBernoulliFallbackE
    This needs to be a custom class to handle mutation properly
    c                   t        d | j                  D              sJ d | j                  D        \  }t        j                  j                  r\|j                  | j                          d| ddj                  t        t        | j                               d|j                          y |j                  | j                          d| ddj                  t        t        | j                               d|j                          y )Nc              3  <   K   | ]  }t        |t                y wr   rq  r   r  s     r   r   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>\   s     >Q:a(>r|  c              3  X   K   | ]"  }t        t        |      j                          $ y wr   )r   r   r  rG
  s     r   r   z3InplaceBernoulliFallback.codegen.<locals>.<genexpr>]   s     IVQ113Is   (*r  rE  z, NULL)r  )r   rj  rw   r  r  r  r	  r  r  reprr  ending)r  r  r   s      r   r  z InplaceBernoulliFallback.codegen[   s    >$++>>>>IT[[I77 '')*!A3b3tTEWEW;X1Y0ZZabibpbpaqr '')*!A3b3tTEWEW;X1Y0ZZ[\c\j\j[klr   c                     yr  r   r  s    r   r  z(InplaceBernoulliFallback.should_allocatej   r  r   c                &    | j                  d      gS r  rx  r  s    r   rJ  z+InplaceBernoulliFallback.get_mutation_namesm       "##r   c                    t               S r   r?   r  s    r   r  z1InplaceBernoulliFallback.get_unbacked_symbol_defsp   r  r   c                ^   t         |   d t        |j                               | j	                  |g      ||       t
        j                  j                  |j                                t
        j                  j                  |       | _
        t
        j                  j                  |        y )Nr  r  )rn  r]  r  r  r  rw   r  r  rs  r  r   r  )r  r  r   r  rp  s       r   r]  z!InplaceBernoulliFallback.__init__s   s     	alln-$# 	 	
 	
##AJJL1GG++D1		""4(r   r	  r_  r  r  )r  r   r   r   r  r   r   r   
r   r   r   r  r  r  rJ  r  r]  rI  rJ  s   @r   rC
  rC
  V   sF    $)'),2)DG)	) )r   rC
  c                  x     e Zd ZdZddZd	dZd
dZddZ	 	 	 	 	 	 	 	 d fdZe		 d	 	 	 	 	 	 	 dd       Z
 xZS )InplaceCopyFallbackrD
  c                R    | j                         \  }}}|j                  |||       y r   )rf	  codegen_device_copy)r  r  r  r  non_blockings        r   r  zInplaceCopyFallback.codegen   s)    #'#4#4#6 c<##Cl;r   c                     yr  r   r  s    r   r  z#InplaceCopyFallback.should_allocate   r  r   c                &    | j                  d      gS r  rM
  r  s    r   rJ  z&InplaceCopyFallback.get_mutation_names   rN
  r   c                    t               S r   r?   r  s    r   r  z,InplaceCopyFallback.get_unbacked_symbol_defs   r  r   c                   t         |   d |||dd       t        j                  j	                  |d   j                                t        j                  j                  |       | _        t        j                  j                  |        y )Nz
aten.copy_aoti_torch_copy_)r  r  r   )	rn  r]  rw   r  r  rs  r  r   r  )r  rN  rj  r  rp  s       r   r]  zInplaceCopyFallback.__init__   sr     	+. 	 	
 	
##F1I$6$6$89GG++D1		""4(r   c                    ||fD cg c]  }| j                  |       }}|f}t        t        |j                               ||      }|S c c}w r   )r  rT
  r  r  )r  r  r  rW
  r  rj  r  rN  s           r   r  zInplaceCopyFallback.create   sX     25c
;1###A&;;%$cnn./

  <s   Ar	  r_  r  r  )rN  r  rj  r  r  r  r   r   rr  )r  r   r  r   rW
  r   r   rT
  )r   r   r   r  r  r  rJ  r  r]  r  r  rI  rJ  s   @r   rT
  rT
     s~    <$)) !) %	)
 
)$ <A

%
59
	
 
r   rT
  c                  8    e Zd ZdZddZd	dZd
dZddZd	dZy)MutatingFirstArgExternKernelrD
  c                   t        | j                        sJ g d | j                  D        t        t        | j                        }|j                  | j                          ddj                  |       d|j                          y )Nc              3  <   K   | ]  }|j                           y wr   )r  rG
  s     r   r   z7MutatingFirstArgExternKernel.codegen.<locals>.<genexpr>   s     9a!!#9r|  r  rE  r  )	rr  rj  r  rI
  r  r  r	  r  rJ
  )r  r  argrefss      r   r  z$MutatingFirstArgExternKernel.codegen   s~    ,,,
9T[[9
t))*
 	##%&a		'(:';1W^^<LM	
r   c                     yr  r   r  s    r   r  z,MutatingFirstArgExternKernel.should_allocate   r  r   c                &    | j                  d      gS r  rM
  r  s    r   rJ  z/MutatingFirstArgExternKernel.get_mutation_names   rN
  r   c                    t               S r   r?   r  s    r   r  z5MutatingFirstArgExternKernel.get_unbacked_symbol_defs   r  r   c                     yr1  r   r  s    r   has_side_effectsz-MutatingFirstArgExternKernel.has_side_effects   r  r   Nr	  r_  r  r  )	r   r   r   r  r  r  rJ  r  rg
  r   r   r   r_
  r_
     s     
$r   r_
  c                        e Zd Zd fdZ xZS )ResizeStorageBytesc                   t        |t              sJ d       t        |   d t	        |j                               | j                  |g      |f       t        j                  j                  |j                                t        j                  j                  |       | _        t        j                  j                  |        d| _        d| _        t        |t         t"        t$        f      sJ t'        |             t        j                  j(                  j+                  |j,                  j                                y )NzTODO: dynamic shapesr  )r  z"inductor_ops.resize_storage_bytes_z&torch::inductor::resize_storage_bytes_)r   r   rn  r]  r  r  r  rw   r  r  rs  r  r   r  r  r  ro  rq  r   r   never_reuse_buffersr  rM  )r  variablerG  rp  s      r   r]  zResizeStorageBytes.__init__   s    (C(@*@@(h1134
+#+	 	 	
 	
##H$5$5$78GG++D1		""4("FG(Xz9$EFVXVF	##''(>(>(@Ar   )rl
  r   rG  r   r   r   r	  rJ  s   @r   ri
  ri
     s    B Br   ri
  c                  (     e Zd Zd fdZddZ xZS )SetSourceTensorKernelc                    | j                  |      }|j                          t        |   |j	                         ||gdt
        j                  j                  j                  j                         t        |t        t        t        f      sJ t        |             t        j                   j"                  j%                  |j&                  j)                                t        j                   j"                  j%                  |j)                                t        j                   j"                  j%                  | j)                                |j+                         }t-        t/        |      ||       t-        t/        |      ||       g| _        y )Nz!torch.ops.aten.set_.source_Tensor)r  r  r  )r  r"  rn  r]  r  r  ru   r  set_source_Tensorr   ro  rq  r   r   rw   r  rk
  r  rM  rs  r  r  r  r  )r  self_tensorstorage_tensorr  rp  s       r   r]  zSetSourceTensorKernel.__init__   s,   ++N;$$&%%'.)B		++99	 	 	
 +*i'HI 	
4L
 	
I 	
##''(8(8(A(A(CD	##''(?(?(AB	##''8**,:V4k4H:V4ndK!
r   c                F    | j                  d      | j                  d      gS rM  rM
  r  s    r   rN  z2SetSourceTensorKernel.get_inputs_that_alias_output   s    "DOOA$677r   )rr
  r   rs
  r   r   r   r  )r   r   r   r]  rN  rI  rJ  s   @r   rn
  rn
     s    
*8r   rn
  c                  j     e Zd ZdZd
dZddZddZddZddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Z xZ	S )ScatterFallbackz
    This needs to be a custom class to handle mutation properly.
    This class handles both aten.scatter_ and aten.scatter_reduce_.
    It also handle the case `src` being a scalar properly.
    c                &    |j                  |        y r   )generate_scatter_fallbackr  s     r   r  zScatterFallback.codegen!  s    ))$/r   c                     yr  r   r  s    r   r  zScatterFallback.should_allocate!  r  r   c                f    | j                   d   }t        |t              sJ |j                         gS r  rv  r  rl  s     r   rJ  z"ScatterFallback.get_mutation_names
!  s.    kk!n#v&&&r   c                    t               S r   r?   r  s    r   r  z(ScatterFallback.get_unbacked_symbol_defs!  r  r   NTr  include_selfc          
     f   t        |t              | _        | j                  r%|||fD cg c]  }| j                  |       }	}|f}
n$||fD cg c]  }| j                  |       }	}||f}
t        |   d t        |j                               | j                  |	      |
||dt        |      ddg|       t        j                  j                  |j                                t        j                  j                  |       | _        t        j                  j!                  |        y c c}w c c}w )Nr  r}
  r  r~
  )r  r  r  )r   r   src_is_tensorr  rn  r]  r  r  r  r   rw   r  r  rs  r  r   r  )r  r  r   rB  r   r  r  r~
  r  tensorsr  rp  s              r   r]  zScatterFallback.__init__!  s    (Y7 78%oFt))!,FGF FM78%jAt))!,AGA #JMalln-(|<";/+3^*D# 	 		
 	
##AJJL1GG++D1		""4(% G Bs   D)D.r	  r_  r	  r  )r  r   r   r   rB  r   r   r   r  r   r  re  r~
  r   r   r   rR
  rJ  s   @r   rv
  rv
     s|    0 
 "!!)!!) !) 	!)
 !) !) !) !) 
!) !)r   rv
  c                  \     e Zd ZdZddZddZd	dZd
dZ	 	 	 	 	 	 	 	 	 	 	 	 d fdZ xZ	S )IndexPutFallbackzQ
    This needs to be a custom class to handle mutation and indices properly
    c                &    |j                  |        y r   )generate_index_put_fallbackr  s     r   r  zIndexPutFallback.codegen;!  s    ++D1r   c                     yr  r   r  s    r   r  z IndexPutFallback.should_allocate>!  r  r   c                &    | j                  d      gS r  rM
  r  s    r   rJ  z#IndexPutFallback.get_mutation_namesA!  rN
  r   c                    t               S r   r?   r  s    r   r  z)IndexPutFallback.get_unbacked_symbol_defsD!  r  r   c           	        || _         |D cg c]  }||	 }}||g|D cg c]  }| j                  |       }}d}	t        
|   d t	        j                               | j                  |      |fd|	|       t        j                  j                  | j                  d             t        j                  j                  |       | _        t        j                  j                  |        y c c}w c c}w )Naoti_torch_index_put_outr  zaten.index_put_)r  r  r  r   )r  r  rn  r]  r  r  r  rw   r  r  rx  r  r   r  )r  r  r   r  r   
accumulater   valid_indicesr
  r  rp  s             r   r]  zIndexPutFallback.__init__G!  s     $+=qq}==34f2M}2MNQ4%%a(NN4alln-(M0+# 	 	
 	
##DOOA$67GG++D1		""4( >Ns   C/C/C4r	  r_  r  r  )r  torch._ops.OpOverloadr   r   r  r	  r   r  r
  r   r   r   rR
  rJ  s   @r   r
  r
  6!  s`    2$)*) ) 	)
 ) ) 
) )r   r
  c                  &    e Zd Zedd       ZddZy)
DeviceCopyc           	     Z   |j                         }|J |j                         st        |      t        j                  j
                  vrt        d |j                         D              rt        j                  j                  sit        j                  j                  r>t        j                  j                  |       t        j                  j                  |       |j                  |      S t        j                  j                  |       t        j                  j                  |       t        d       |f}t        j!                  |      }d }|j#                         r|j%                         }t'        |j(                        xr |j(                  dk(  xr |}|j(                  dk(  xr t'        |j(                        xr |}|r t+        |      rd|j-                         _        t1        t3        ||j5                         |j#                         ||      | j7                  |      g|      S )Nc              3  T   K   | ]   }|t         j                  j                  v  " y wr   )rw   r  r	  r)  s     r   r   z$DeviceCopy.create.<locals>.<genexpr>k!  s     GqA***Gs   &(zDeviceCopy in input programr!  Tr  )r  rD  rt  rw   r  rD  r   r  rJ   aot_inductoruse_runtime_constant_foldingr  add_device_inforH  rf   r  r  r
  r4  rn   r   r  r  rR  r
  rP  r  r  )	r  r   r  rW
  x_devicer  r  is_destination_pinnedis_source_pinneds	            r   r  zDeviceCopy.createc!  s   <<>###Qqww'>'>>GA4D4D4FGG''DDww"" ''/''1''//	'	)78%++A.::<\\^F8==!KfkkU&:K| 	 MMU"Kvfkk':K| 	  5a 8'+ALLN$

/ q!"

 
	
r   c                   | j                         }t        |      dk(  sJ | j                  r2|j                  |d   | j                  j	                         |d          n'|j                  |d   | j	                         |d          t        | j                  t              r7| j                  j                  r |j                  | j                                y y y )Nr   r   rI   )rf	  r   r  rV
  r  r   rN  r  rR  sync_d2h_copyrs  )r  r  r   s      r   r  zDeviceCopy.codegen!  s      "4yA~~''Q));;=tAw ''Q1G1G1I4PQ7Sdkk6*t{{/D/D!!$--/2 0E*r   N)r   r   r  rj  rW
  r   r   r   r	  )r   r   r   r  r  r  r   r   r   r
  r
  b!  s    -
 -
^
3r   r
  c                       e Zd ZdZddZd	dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZddZ ed       	 d	 	 	 dd       Z	ddZ
 xZS )DynamicSelectStorageOffseta  
    The result of computing a dynamic selection index is determined as follows: when the index in the
    select operation is unbacked, the actual index calculation is ambiguous for negative indices
    (index + size) versus non-negative indices (just index). To resolve this, we allocate an unbacked
    SymInt to represent the storage offset and decompose the select operation into a call to as_strided,
    computing the storage offset at runtime with this node.
    c                    t               S r   r?   r  s    r   r  z$DynamicSelectStorageOffset.get_reads!  r  r   c                     yr  r   r  s    r   r  z*DynamicSelectStorageOffset.should_allocate!  r  r   c                    t         |   d t        t        j                  d            g        || _        || _        || _        || _        || _	        || _
        y Nr!  r  )rn  r]  r  r  r  unbacked_offset_symbolr   base_offsetbase_dim_strider  r  )r  r
  r   r
  r
  r  r  rp  s          r   r]  z#DynamicSelectStorageOffset.__init__!  sS     	ze1DErJ '=#
&.	
r   c                .    t        | j                  g      S r   )r@   r
  r  s    r   r  z3DynamicSelectStorageOffset.get_unbacked_symbol_defs!  s    466788r   c                    t        | j                  |      j                  t        | j                  |            j                  t        | j                  |            j                  t        | j
                  |            S r   )r)   r   r  r  r
  r
  r=  s     r   r>  z/DynamicSelectStorageOffset.get_free_symbol_uses!  s]    
 TZZ7U#DII}=>U#D$4$4mDEU#D$8$8-HI		
r   c                >    |j                  | | j                         y )Nr  )codegen_dynamic_select_indexr  r  s     r   r  z"DynamicSelectStorageOffset.codegen!  s    ,,T,Dr   rz  r_  )r
  sympy.Symbolr   r
  r
  sympy.Symbol | intr
  r
  r  r
  r  r   r   r   r  rr  r}  r	  r   r   r   r  r  r  r]  r  rb   r>  r  rI  rJ  s   @r   r
  r
  !  s     ,  (	
 , !  
&9 89$)
!
	!
 :
Er   r
  c                       e Zd ZdZddZd	dZ	 	 	 	 	 	 	 	 	 	 d
 fdZddZ ed       	 d	 	 	 dd       Z	ddZ
 xZS )DynamicSliceSizeac  
    Computes the output size of a slice call, handling the correct semantics in codegen.
    We do this for flexible handling for unbacked indices (to not data-dependent error).

    Slicing has 4 semantics for indices, i.e. x[start:] could be:
    1) start < -x.size(0)            -> x[0:]                    # negative out-of-bounds
    2) start in [-x.size(0), 0)      -> x[x.size(0) + start:]    # negative slicing
    3) start in [0, x.size(0))       -> x[start:]                # standard slicing
    4) start >= x.size(0)            -> empty slice              # positive out-of-bounds

    If the appropriate semantics are known beforehand, the output size is computed based on
    the start & end indices. If not (with unbacked indices), a new unbacked symbol is created
    to represent the output size, and codegen handles computing the correct case.
    c                    t               S r   r?   r  s    r   r  zDynamicSliceSize.get_reads!  r  r   c                     yr  r   r  s    r   r  z DynamicSliceSize.should_allocate!  r  r   c                    t         |   d t        t        j                  d            g        || _        || _        || _        || _        || _	        y r
  )
rn  r]  r  r  r  unbacked_size_symbolr  r  r  r  )r  r
  r  r  r  r  rp  s         r   r]  zDynamicSliceSize.__init__!  sH     	ze1DErJ$8!
		r   c                .    t        | j                  g      S r   )r@   r
  r  s    r   r  z)DynamicSliceSize.get_unbacked_symbol_defs!  s    444566r   c                    t        | j                  |      j                  t        | j                  |            j                  t        | j                  |            j                  t        | j
                  |            S r   )r)   r  r  r  r  r  r=  s     r   r>  z%DynamicSliceSize.get_free_symbol_uses!  sY    
 TZZ7U#DHHm<=U#DII}=>U#DII}=>		
r   c                &    |j                  |        y r   )codegen_dynamic_slice_sizer  s     r   r  zDynamicSliceSize.codegen"  r	  r   rz  r_  )
r
  r
  r  r
  r  r
  r  r
  r  r
  r  rr  r}  r	  r
  rJ  s   @r   r
  r
  !  s~    * "  	
 ! ! 7 ./$)
!
	!
 0
1r   r
  c                  T     e Zd ZdZddZddZ	 	 	 	 	 	 	 	 d	 fdZd
dZddZ xZ	S )r   z;
    The result of a call to aten._local_scalar_dense.
    c                    t               S r   r?   r  s    r   r  zDynamicScalar.get_reads"  r  r   c                     yr  r   r  s    r   r  zDynamicScalar.should_allocate"  r  r   c                    |j                          t        | 	  d t        t	        j
                  d            | j                  |g             || _        || _        y r
  )	r  rn  r]  r  r  r  r  symkeypath)r  r
  r
  rM  rp  s       r   r]  zDynamicScalar.__init__"  sM     	*ELL$78$:M:Mtf:U	
 r   c                .    t        | j                  g      S r   )r@   r
  r  s    r   r  z&DynamicScalar.get_unbacked_symbol_defs!"  s    488*%%r   c                &    |j                  |        y r   )codegen_dynamic_scalarr  s     r   r  zDynamicScalar.codegen$"  s    &&t,r   rz  r_  )r
  r
  r
  zpytree.KeyPathrM  r   r   r   r  r	  )
r   r   r   r  r  r  r]  r  r  rI  rJ  s   @r   r   r   "  sA    *8@F	&-r   r   c                  l     e Zd ZdZddZd	dZd
 fdZd	dZ ed       	 d	 	 	 dd       Z	ddZ
 xZS )r   z5
    The result of a call to aten._assert_scalar
    c                    t               S r   r?   r  s    r   r  zAssertScalar.get_reads-"  r  r   c                     yr  r   r  s    r   r  zAssertScalar.should_allocate0"  r  r   c                ~    t         |   d t        t        j                  d            g        || _        || _        y r
  )rn  r]  r  r  r  scalarr/	  )r  r
  r/	  rp  s      r   r]  zAssertScalar.__init__3"  s7    ell512	
 r   c                     yr1  r   r  s    r   rg
  zAssertScalar.has_side_effects>"  r  r   c                .    t        | j                  |      S r   )r)   r
  r=  s     r   r>  z!AssertScalar.get_free_symbol_usesA"  s      ];;r   c           	        t         j                  sy t        t        | j	                  d                  }t
        j                  j                  ry t
        j                  j                  rad| d}t
        j                  j                  j                  | j                  d      }|j                  d| d| j                   d| d	       y t
        j                  j                  j                  | j                  d      }|j                  d
| d       |j                  dt        | j                         d       |j                  | j!                          d       y )NFrh  zstd::to_string(r  )r  zif (!(z()) { throw std::runtime_error("Expected z but received " + z); }zif not (z):z    raise RuntimeError(z = None)rJ   scalar_assertsr  r  r>  rw   r  r  r  r  codegen_cpp_sizevarr
  r  r/	  codegen_python_sizevarrI
  rs  )r  r  r  
symbol_strsizevars        r   r  zAssertScalar.codegenG"  s4   $$ d44454IJK77WW  *6(!4Jgg**>>e ? G 	!J488*Tfgqfrrwx gg**AAe B G 	45 7TXX7GqIJ  19:r   rz  r_  )r
  rx   r/	  r   r   r   rr  r}  r	  )r   r   r   r  r  r  r]  rg
  rb   r>  r  rI  rJ  s   @r   r   r   ("  sM    	 N+$)<!<	!< ,<
;r   r   c                  "    e Zd ZU ded<   ded<   y)ExternKernelNoder   r   zexport_schema.Noder   Nr   r   r   r   r
  r
  g"  s    
I
r   r
  c                      e Zd ZdZ	 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZddZddZddZe		 	 	 	 	 	 dd	       Z
dd
ZddZddZd Zedd       Ze	dd       Ze	 	 	 	 	 	 	 	 dd       Zedd       Z xZS )r  z
    A class that represents a fallback kernel for handling operators that are not
    directly support by inductor. It currently supports functional ops, view ops,
    inplace aten ops, and mutating ops that are auto-functionalizable.
    Nr  c                   t            |t        |      t        |      |       d _        |xs i  _        t        |t        j                  j                  t        j                  j                  f      sJ d| dt        |       d       | _        | _        |i n| _         j                  J t        j                   j#                   j                         g  _        g  _        t         j                  t        j                  j                        ry d j                  j)                         v ry  j                  j*                  }t        j,                  j.                  j1                   j                        r- j&                  j3                  |d   j5                                y dd}	|j6                  r?t9         j                        s* |	 j                        st;        d	 j                          j                   j<                   j>                        \  }
}d fd
}t        j,                  j.                  jA                  ||
|      D ]  \  }} |||        y )NrQ
  F#Fails to create FallbackKernel for r   not supported_c10d_functionalr   c                "   t         j                  j                  | j                         t         j                  j                  j
                        xs> t        | d      xr0 t         j                  j                  j
                  | j                  v S )N
py_kernels)r  _C%_dispatch_has_kernel_for_dispatch_keyr   DispatchKeyFunctionalizer  r
  r]  s    r   has_functionalize_implz7FallbackKernel.__init__.<locals>.has_functionalize_impl"  sg    88AA	588//==  L) HHH((66"--G	r   z'NYI: Can't generate FallbackKernel for c                    t         j                  t        j                        r&t        |t        t
        f      sJ t        |             t        j                   j                        rt        |t
        t        f      rJ |y  j                  y d fddfd}t        j                   j                        r||D ]
  } ||        y y t        j                   j                        sJ  ||       y )Nc                   j                   j                  | j                                j                  J j                  j                  r?j
                  j                  t        t        | j                               |              y y r   )	alias_namesr  rs  
alias_infois_writer  r  r  r  )r  infor  s    r   	add_aliaszPFallbackKernel.__init__.<locals>.handle_aliasing_and_mutation.<locals>.add_alias"  sj      ''

5222??++))00&z'H!TR ,r   c                    | y t        | t        t        gt              ry t        | t              sJ t        |               |        y r   )r   r   r    r=   r   r   )r  r
  s    r   add_alias_if_graph_bufferz`FallbackKernel.__init__.<locals>.handle_aliasing_and_mutation.<locals>.add_alias_if_graph_buffer"  sD    9a&$!:!:; !!V,5d1g5,!r   )r  r   r   r   )r  r   r   r   )
r   r   r  ListTyper   r   library_utilsis_tensor_like_typer
  is_tensorlist_like_type)r
  r  r
  optional_tensor_argr
  r  s   `   @r   handle_aliasing_and_mutationz=FallbackKernel.__init__.<locals>.handle_aliasing_and_mutation"  s    $))U^^4!#e}5@tCy@500; &cE4=999{&	 44TYY??/2 G+12EFG # %88CCC)#.r   )r^  r
  r   r   )r
  ztorch._C.Argumentr  r   r   r   )!rn  r]  r   use_runtime_dispatchr  r   r  r  r  r  r   r  r	  r   r  rw   r  warn_fallbackr
  r	  r   r  _libraryr  mutates_and_returns_first_argr  rs  
is_mutabler&   r  rj  r  
zip_schema)r  rN  rY  r$	  nontensor_argsr	  r   r  schemar
  r   r
  r
  r  rp  s   `             r   r]  zFallbackKernel.__init__t"  s&    	+.!	 	 	
 %*!!2!8bUZZ**EJJ,J,JK
 	X04<.W	X 
 ","Nb&&222	d556 '))+d&&

(F(FG !1!1!6!6!88
 !!)) >>==d>N>NO&&{1~'>'>'@A	 *4+;+;<*4+;+;<%9$:J:J9KL  **4;;8J8JKf(	/T --88vN 	4ID#(s3	4r   c                ,   t         |          }| j                  t        j                  j
                  j                  u rT| j                  D ]E  }t        |t              s|j                  t        j                  |j                                     }G |S r   )rn  r3  r  r  _prims	rng_primsgraphsafe_run_with_rng_stater  r   r	  	with_readrK   rI  rs  )r  r  r  rp  s      r   r3  zFallbackKernel.get_read_writes"  sy    g-/u||55RRR)) c>2"-"7"7$,,S\\^<#K r   c           	     n    |j                  | j                         | j                  t        | dd             S Nr  )(codegen_unbacked_symbol_defs_for_outputsrs  rK  r   r  s     r   codegen_unbacked_symbol_defsz+FallbackKernel.codegen_unbacked_symbol_defs#  s0    ??MMOT\\749Ld+S
 	
r   c                    t        | dd       x}rKt        t        j                  j                  j
                  |      }|J t        |j                               S t               S r
  r   r;   rw   r  r  r   r@   r  r  r  resolveds      r   r  z'FallbackKernel.get_unbacked_symbol_defs#  _     '.A4 HHH0  **,=H '''hmmo..<r   c                Z   t         j                   G d d             }t        | j                        sJ | j                  D cg c]  } ||j	                                }}| j                  || j                        \  }}t        j                  j                  rt        | j                  t        j                  j                        r| j                  ||      }t!        | j                  j"                  j$                  |      D cg c]9  \  }}t        j                  j&                  j)                  ||j*                        ; }}}n6|D cg c]+  }t        j                  j&                  j)                  |      - }}| j,                  j/                  |       |S c c}w c c}}w c c}w )Nc                       e Zd ZU ded<   ddZy))FallbackKernel.codegen_args.<locals>.Shimr   refc                    | j                   S r   )r  r  s    r   r  z2FallbackKernel.codegen_args.<locals>.Shim.__repr__#  s    xxr   Nro  )r   r   r   r   r  r   r   r   Shimr   #  s    H r   r  )r  	dataclassrr  rj  r  r	  r  rw   r  r  r   r  r  r  r  r]	  r   r  r  r  r_	  r  r   r  )r  r  r   r$	  r   r   params          r   rf	  zFallbackKernel.codegen_args#  sY   				  	  
	   ,,,<@KKHqtA//12HH**;8J8JKf77:d.>.>

@U@U#V..tV<D !$D$4$4$<$<$F$F ME1 $$33AuGD 
 EIIqAGG((77:IDI 	6" I
 Js   F>F"0F(c                   | r!| D cg c]  }t        |t              r| c}nd }|r7| sJ | D cg c]#  }|j                         s|j                         % }}|d   S t        |t        j                        r|j
                  S t        |t        j                  j                  t        f      st        |      rt        j
                  d      S t        |t        t        f      r{t        d |D              }|D cg c]  }|s|	 }}t        |      dk(  r|d   S |sy |D ]7  }t        |t        j
                        sJ t        |j                        s5|c S  |d   S y c c}w c c}w c c}w )Nr   r!  c              3  H   K   | ]  }t         j                  d |        y wr   )r  find_devicer  s     r   r   z-FallbackKernel.find_device.<locals>.<genexpr>=#  s'      $  **43$s    "rI   )r   r  r  r  r  r  r
  ScriptObjectr*   r,   r   r   r@   r   rn   r   )r$	  r+	  r  non_torch_bind_tensor_argsr  devices
device_setr  s           r   r  zFallbackKernel.find_device)#  s_     $J1:a+IQJ 	#
 &;3>SC#..BRs~~'SGS1:nell3!(((UXX224DE
^,<<&&ntUm4# $ ($ J -7A&&vAGA7|q qz!! "!&%,,777&++&!M" 1:? K T Bs!   E!E!E&E&;E+E+c                2    ddl m}  || j                        S )Nr   )	is_impure)torch._library.utilsr  r  )r  r  s     r   rg
  zFallbackKernel.has_side_effectsO#  s    2 ))**r   c                   t        | j                  t        j                  j                  t        j                  j
                  f      s+J d| j                   dt        | j                         d       t        | j                  t        j                  j
                        sSd| j                  j                         vr7| j                  j                  j                  rt        | j                        rg S | j                  S )Nr
  r  r
  r
  )r   r  r  r  r  r  r   r   r  r
  r&   r
  r  s    r   rN  z+FallbackKernel.get_inputs_that_alias_outputV#  s    uzz44ejj6T6TU
 	
 2$2B2B1C2D$$%&n6	
 
 4++UZZ-K-KL"$*:*:*?*?*AA  ((33&t'7'78I###r   c                N    t        | j                        dk  sJ | j                  S r  )r   r	  r  s    r   rJ  z!FallbackKernel.get_mutation_namesk#  s'    4&&'1,,,"""r   c           	        t         j                  d| j                         | j                         t	        | t
              sJ t        |              | j                  | j                  | j                        \  }}| j                  ||      }| j                  D cg c]  } | j                  |fi | }}| j                  }t        j                  j                  sg ||S t!        dg       }|j#                  |||      }	 	 	 	 	 	 d
d}t	        |t$        j&                  j(                  j*                        r#|j-                  |d   |d         j.                  }	n|j0                  j.                  }	t3        |	      dk(  r>| j4                  r| j4                  n| j6                  }
|	d   j8                  } |||
      g}n9t;        |	| j4                        D cg c]  \  }} ||j8                  |       }}}| j                  J i }t	        | j                  t$        j<                  j>                        r$tA        jB                  | j                        d|d<   tE        | j                         tG        jH                  | j                  jK                         |||      	      }t        jL                  jO                  |       g ||S c c}w c c}}w )a  
        ProxyExecutor Design Note
        We export the ExternFallbackNodes (for custom ops) into a serialized file
        and run it with a host side proxy executor to address the ABI problem
        This is currently only implemented for fbcode. Eventually, we will also make this work for OSS.
        Detailed design doc can be found at
        https://docs.google.com/document/d/1wC4DOZFaYym2t1Esz0X5yxlLI3RDnSiyRbUus3bkJ64/edit?usp=sharing
        z4Extern kernel node added for node %s with target %s.Nc           	        t        | t        j                  t        j                  f      r|}t        |t        t
        f      rt        |      dk(  sJ |d   }t        | t        j                        rTt        |t              sJ t        j                  j                  t        j                  |j                                     S |J t        j                  j                  d      S t        | t        j                        rt        | j                         t        j                        rpt        |t              sJ t!        |             t        j                  j                  |D cg c]&  }t        j                  |j                               ( c}      S t        | t        j"                        rt        | j                         t        j                        r|>t        j                  j                  t        j$                  j                  d            S t        |t              sJ t        j                  j                  t        j$                  j                  t        j                  |j                                           S t        | t        j&                        r t        j                  j                  |	      S t)        d
t!        |              c c}w )NrI   r   r  )	as_tensorT)as_none)
as_tensors)as_optional_tensor)as_intzUnsupported return type )r   r  
TensorTypeNoneTyper   r   r   r   export_schemary   r  TensorArgumentrs  r
  getElementTyper   r   OptionalTypeOptionalTensorArgumentIntTypeRuntimeError)return_typer\  r   s      r   handle_single_outputzFFallbackKernel.export_extern_kernel_node.<locals>.handle_single_output#  sh    +(8(8%..'IJftUm4v;!+++ )Ck5+;+;<%c6222(1188"/">">CLLN"S 9   ;&;(11888FFK8Z**,e.>.>> "&(3AT&\A3$--44 $*  &44#,,.I  5   K););<**,e.>.>B >(1188+8+O+O+V+V$( ,W , 9   &ff555(1188+8+O+O+V+V&3&B&B%+__%6' ,W , 9   K7$--44F4CC"%=d;>O=P#QRR7 s   )+K!r   rI   1torch_library_custom_op)rT  rj  rK  r`  )r   r   )r"  z1torch.TensorType | torch.ListType | torch.JitTyper\  IRNode | Sequence[IRNode]r   zexport_schema.Argument)(r  r  rs  r  r   r  r   r	  rj  r  r]	  r  rh	  rw   r  aot_moder%   serialize_inputsr  r	  	torchbindCallTorchBindr
  returnsr  r   rK  r  r  r   r  r  
custom_ops_maybe_get_opdefr
  r  r>   r   extern_kernel_nodesr  )r  r   r   r  ordered_kwargsrT  
serializernamed_argumentsr#  r+  rK  r"  output_argumentsreturn_schemar\  r`  r   s                    r   export_extern_kernel_nodez(FallbackKernel.export_extern_kernel_nodeo#  s    			BMMO	
 $/;d;/**4;;8J8JKf**48 99
 "D!!#00
 
 !!ww+T+N++*44
$55fdFK3	SJ3	S-3	S $3	Sj fe55??MMNmmDGT!W5==Gnn,,Gw<1 '+lldll8M8MG!!*..K 4[' JK .1$,,-G 
 *M6	 %!++    +++t'')>)>?++D,<,<=I25H./##'',,.&(!	
 	
$$T*''''Y
` s   KKc                "     j                   }|J |j                  dk(  rt        |t        j                  j
                        sJ t        |             t        j                  j                  rddl
m} t        |      |vrt        j                  d|       d _        n~|j                  dk(  r4t        |t        j                  j
                        sKJ t        |             t        j                  j                  r!|t         j"                  j$                  v _        t        j                  j                  rt        |t        j                  j
                        r j                  sdfd j'                   j(                   j*                        \  }t-        j.                  | fd	 j0                  D              }t3        fd
t5        ||j6                  j8                        D               _         j;                  |        j                  r j=                         } j>                  J  j                   J |jA                   jC                          j>                   fd j                   | jD                  r jD                  n jF                         n^|jI                          t         jJ                  tL              r3 jO                  |        jQ                  |        jS                  |        jU                  |       y)r
  Nr  r   r  zG%s is missing a c-shim implementation, using proxy executor as fallbackT
_quantizedc                    t        | t        j                        r | j                               S t        | t        j                        S r   )r   r  r  r  
NumberType)r  	is_numbers    r   r9  z)FallbackKernel.codegen.<locals>.is_number$  s:    a!3!34$Q%5%5%788!!U%5%566r   c              3  D   K   | ]  } j                   |fi   y wr   )rh	  )r   rk	  r   r  s     r   r   z)FallbackKernel.codegen.<locals>.<genexpr>#$  s+       *D))!6v6s    c              3  l   K   | ]+  \  }}t        |t              xr  |j                         - y wr   )r   complexr  )r   rO  rF  r9  s      r   r   z)FallbackKernel.codegen.<locals>.<genexpr>($  s5      ,Aq 1g&A9Q[[+AA,s   14c                 H    g  j                          j                         S r   )rf	  rl	  r  s   r   r  z(FallbackKernel.codegen.<locals>.<lambda>6$  s$    F$++-F0C0C0EF r   )r  ztorch.JitTyper   r   )+r  r  r   r  r  r  r   rw   r  r  r  r  r   r  r  r
  rJ   r
  custom_ops_to_c_shimsr	  rj  r  r  rZ  r  r0  r   r  r  r  r4  r  ,generate_fallback_kernel_with_runtime_lookuprs  rK  r  generate_fallback_kernelrN  r  r{	  r	  r	  r
  )	r  r  rY  r  r   	args_iterexported_argsr9  r   s	   `      @@r   r  zFallbackKernel.codegen#  so    !!!!!v%fejj&;&;<Jd6lJ<ww""Lv;&;; KKa 15D--fejj&;&;<Jd6lJ<WW   f11GGG % GG65::#8#89--7  ..t{{D<N<NOLD& "!??I ), ,	6>>+C+CD, )D%
 	W%$$ ::<M**666##///@@''F   $$2G2G ,,T2$++v.))'2..w7,,W5))'2r   c           	         d}	 | j                         }t        | j                  | j                  t        | j                               t        | j                               |      S # t        $ r Y ]w xY w)NFr  )rR  r!  rP  r  r  rd   r  r  )r\  rR  s     r   r  zFallbackKernel.tensor_to_layoutE$  sj    		((*I MMLL%fkkm4%fmmo6
 	
  		s   A& &	A21A2c                t   ddl m} |j                  }|j                  |      }||j                  j                         syddlm}m} |j                  j                         }	|	yddl	m
}
  |
|||d      }|t        j                  d	|       y|\  }}|j                  d
      }|y|	D ]  }|j                  |      }t        j                  |      \  }}|D ]Z  }t        |t               s ||t"        j$                        r ||t"        j$                  |       Dt        j                  d||       \  y)zARealize symm_mem args as comm buffers based on registry metadata.r   )	singletonNrI   )can_realize_as_comm_bufferrealize_as_comm_buffer)normalize_functionT)normalize_to_only_use_kwargsz:Failed to normalize arguments for symm_mem realization: %sr  z8Failed to realize %s as a symmetric memory buffer for %s)torch._library.simple_registryrE  r   r  symm_mem_argsis_registeredcomm_loweringrF  rG  torch.fx.operator_schemasrH  r  r  r  r	  r   r   r  r  )r  rY  r   r   rE  qualnameentryrF  rG  rK  rH  
normalizedr   all_argsr  r\	  	arg_valuer
  r  s                      r   _maybe_realize_symm_mem_argsz+FallbackKernel._maybe_realize_symm_mem_argsU$  s2   
 	=&&h'= 3 3 A A CU++//1 @'D&t

 KKL  8\\,/
% 	H X.I,,Y7JGQ 
!!Y/-a1H1HI*1n.E.EzRKKR  
	r   c                    t         j                  f}||vr,t        t        d   t        j
                  j                        }n
t               }|5    j                  |g|i |\  }}}}	}
ddd       t        |t        j                  j                        r  j                  |g|i | t        |t        j                  j                        rt        j                  j                  j!                  |      st        t        j"                        rddlm}m}m}m} d} ||j.                        r ||      }| ||      }|t1         ||            dk(  rkt3        |j4                  |j6                  g |j8                  g |j;                               }t=        |t?              t?              |tA        |      |      S tC        d D               jE                  |      sit        |t        jF                  jH                  jJ                        s&|t        jL                  jN                  jP                  u rt        j4                  d      t        |t        j                  j                        rgt        j                  j                  j!                  |      s>t        j
                  jR                  s$r"tT        jW                  |||	|
		      }||S |  tY        
      ||	|
      n"sJ d         t[        
      ||	|
      d fd |g       }t        |t>        t\        f      r	|_/        |S t        |t`              rt]        |      _/        |S |g_/        |S # 1 sw Y   xY w)z9Create an instance of FallbackKernel from an _OpOverloadsNr   )_is_functionalget_out_arg_nameslookup_manual_out_variantto_out_variantrI   r  r  r  r  )rN  rj  r  r   r  r  c              3  2   K   | ]  }t        |        y wr   )r
  r  s     r   r   z(FallbackKernel.create.<locals>.<genexpr>$  s     !K,s"3!Kr  r!  r  has_unaligned_inputr  r   r  z"Not sure where to find device infoc                    t         t        t        f      r. t                fdt	        t                     D              S t         t              r: j                         D ci c]  \  }}| |t               |fgz           c}}S t         t        j                        rnt        j                         	      }t        j                  sst               s3t        j                   j"                  j%                  |j&                         |S t         t(              r S t         t        j*                        r j,                  j.                  S t         t        j0                  j2                  t4        f      st7               rt9        t;              	       S  J dt                d       y c c}}w )Nc              3  T   K   | ]  } |   t              |fgz          ! y wr   )r   )r   r   generate_outputr  r\  s     r   r   zAFallbackKernel.create.<locals>.generate_output.<locals>.<genexpr>$  s5      $ $F1Iw4<:K9L/LM$r  r  zFallbackKernel output type z is not supported)r   r   r   r   r   r   r   rT  r  r  r  r  rJ    assume_unaligned_fallback_outputrt   rw   r  r  r  r   r   rI	  r   r  r
  r	  r*   r,   r   r  )
r\  r  r  r  r  r  r  ra  r]  packeds
   ``   r   ra  z.FallbackKernel.create.<locals>.generate_output$  s   &4-0#tF| $"3v;/$   FD) %+LLN S g$v,9L8M.MNN  FELL1!((0 ;;*,V4GG--11#((;
FC(FELL1{{'''..0@A ((f-	  ~ 1$v,?PQ~ Es   +#G )r\  r   r  zlist[tuple[Any, int]]r   r   )1r  *_fused_moving_avg_obs_fq_helper_functionalr   r	   rw   r  r6  r
   r0	  r   r  r  r  rT  r
  r  
is_builtinr  torch._library._out_variantrV  rW  rX  rY  r  r   rP  r  r  rA  r  r	  r   _make_out_variant_kernel_namer0  r  r	  r)  r*  ru   higher_orderprintr  ExternKernelMultiOut
try_creater  r  r   rK  r   )r  rY  r   r   fake_incorrect_kernelscontextr+	  r$	  r%	  r	  r  rV  rW  rX  rY  out_oprN  
out_resultrK  r  ra  r]  rc  s   `                  @@@@r   r  zFallbackKernel.create$  sU    #'"Q"Q!S//1$79J9JKG!mG 	< #""6;D;F;!	< fejj334,C,,VEdEfE vuzz445NN((33F;>5<<8  Ffnn-'/~26:!c*;F*C&D&I$)00(..0>//05^2245	 '!,"&"7!'DV'L &  "!K{!KKn= vu66@@NNO//555\\%(F vuzz445NN((33F;GG''-88"3$7 9 
J %!!!&)"3F ???6!0"3F)	 )	V "."5ge}-$FN  &"7^FN  &YFN{	< 	<s   NNr   rN  r  rY  r   r$	  r  r
  r  r	  r  r   r	  r  )dict[sympy.Symbol, pytree.KeyPath] | Noner   r   rx  r	  r  r	  )r$	  zSequence[torch.Tensor] | Noner+	  r  r   r   r_  r  )r\  rt  r   rP  )rY  r
  r   r   r   r   r   r   )rY  r   r   r   r   r   r   r  )r   r   r   r  r]  r3  r
  r  rf	  r  r  rg
  rN  rJ  r4  r   r  r  r  rT  r  rI  rJ  s   @r   r  r  m"  sE    )-@4 HL@4@4 @4 &	@4
 &@4 +@4 &@4 E@4 
@4D


 0 #2#DQ#	# #J+$*#~(@ S3 S3j 
 
 0*0360BE0	0 0d e er   r  c                  Z     e Zd ZdZddZddZddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	 fdZ xZS )
ComplexViewz9View a complex number as two dtyped numbers or vice versac                     yr  r   r  s    r   r  zComplexView.should_allocate5%  r  r   c                &    | j                  d      gS r  rM
  r  s    r   rN  z(ComplexView.get_inputs_that_alias_output8%  s    "##r   Nr^  c          	     2    t         |   |||||||       y )Nr^  )rn  r]  	r  rN  rY  r$	  r
  r	  r   r  rp  s	           r   r]  zComplexView.__init__<%  s,     	/ 	 	
r   r_  r  rp  )r   r   r   r  r  rN  r]  rI  rJ  s   @r   rs  rs  1%  sq    C$ )-GK

 
 &	

 &
 +
 &
 E
 

 
r   rs  c                      e Zd ZdZddZy)MemoryCheckKernelz
    Custom kernel for memory checking that generates direct function calls

    TODO - the custom op was erroring with str inputs. should be able to custom op directly.
    c                    |j                          | j                  \  }}}t        |      }t        |      }|r|j                  d       d| d| d| d}n	d| d| d}|j                  |       y)z.Override codegen to write direct function callzV# note: dont currently distinguish between buffers returned and dealloc'd in last stepzcheck_memory_step(allocated=z, freed=z, is_final_step=r  N)r	  r  rI
  r  )r  r  
alive_list	dead_listis_final_step
alive_repr	dead_reprcalls           r   r  zMemoryCheckKernel.codegenY%  s     	224/3/A/A,
I}*%
O	h 2*Xi[P`an`oopqD1*Xi[PQRD$r   Nr	  )r   r   r   r  r  r   r   r   ry  ry  R%  s     r   ry  c                       e Zd ZU ded<   ddZy)r  rj  r  c                    | j                   S r   r  r  s    r   r  zMultiOutputLayout.get_deviceo%  r  r   Nrg  )r   r   r   r   r  r   r   r   r  r  k%  s    r   r  c                  ~     e Zd ZddZ	 d	 	 	 	 	 	 	 	 	 d	 fdZ ed       	 d	 	 	 d
d       ZddZddZddZ	 xZ
S )r  c                    |j                  |        | j                  s#| j                  |       | j                  |       y y r   )codegen_multi_output!skip_size_stride_alignment_checksr{	  r	  r  s     r   r  zMultiOutput.codegent%  s:    $$T*55%%g.**73 6r   c                    t         |   d ||gd       t        j                  j	                  |       | _        t        j                  j                  |        || _        || _        y r  )	rn  r]  rw   r  r  r   r  r  r  )r  rN  rw  r  r  rp  s        r   r]  zMultiOutput.__init__z%  sQ     	vw3GG++D1		""4(1R.r   c                p    | j                   d   }t        |t              sJ |       |j                  |      S r  )rj  r   r   r>  )r  ri  r  s      r   r>  z MultiOutput.get_free_symbol_uses%  s7     [[^
*f-9z9-..}==r   c                p    t        | j                        dk(  xr t        | j                  d   t              S )NrI   r   )r   rj  r   rI  r  s    r   r  zMultiOutput.should_allocate%  s0    4;;1$ 
t{{1~'89	
r   c                    | j                   D cg c]>  }t        |t              r,t        |j	                               dkD  r|j                         @ c}S c c}w r  )rj  r   r  r   rN  rs  r{
  s     r   rN  z(MultiOutput.get_inputs_that_alias_output%  sN     {{
#~.C4467!; LLN
 	
 
s   AAc                L   t               }| j                  D ]E  }t        |t              s|j	                  t        j                  |j                                      G | j                         | j                         j                         dfd}| j                         }t        j                   xs |d u xs t        |j                         }t        j                  || j!                         d|      }t        j"                  ||j$                  t                     S )Nc                ^    t        |      dk(  sJ t        j                   |       d      S r  r  r  s     r   r  z*MultiOutput.get_read_writes.<locals>.dummy%  r  r   r   r  r<  r  )r@   rj  r   r   r  rK   rI  rs  r  r
  r  rJ   rp  rn   r   rT   r
  r?  r=  )	r  r6  rl  r  r  should_normalizewrite_rwr  r   s	          @@r   r3  zMultiOutput.get_read_writes%  s     /9l;; 	@C#v&		,..s||~>?	@ }}//#002	; "111 '~'&++&& 	
  334==?B2B
 &&??"
 	
r   r	  rr  )
rN  r  rw  r   r  list[tuple[Any, ...]]r  r   r   r   r}  r_  r  rx  )r   r   r   r  r]  rb   r>  r  rN  r3  rI  rJ  s   @r   r  r  s%  s    4 38SS S '	S
 ,0S 
S M*$)>!>	!> +>


 
r   r  c                  Z     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d fdZedd       ZddZd	dZ xZ	S )
r   zMultiOutput for opaque objects.c                :    t         |   |||d       || _        y )NTr  )rn  r]  r	  )r  rN  rw  r  opaque_valuerp  s        r   r]  zOpaqueMultiOutput.__init__%  s$     	SWX$0!r   c                    t        d      )NzOpaqueMultiOutput has no dtype)rQ	  r  s    r   r  zOpaqueMultiOutput.dtype%  s    =>>r   c                    | S r   r   r  s    r   r  z#OpaqueMultiOutput.wrap_for_lowering%  r  r   c                X   t               }| j                  D ]E  }t        |t              s|j	                  t        j                  |j                                      G t        t        j                  | j                               g      }t        j                  ||t                     S )Nr<  )	r@   rj  r   r   r  rK   rI  rs  r?  )r  r6  rl  r=  s       r   r3  z!OpaqueMultiOutput.get_read_writes%  s    .8l;; 	@C#v&		,..s||~>?	@ 0:!!$--/230
 &&"
 	
r   )
rN  r  rw  r   r  r  r  r   r   r   )r   r   )r   r   rx  )
r   r   r   r  r]  r  r  r  r3  rI  rJ  s   @r   r   r   %  sY    )11 1 '	1
 1 
1 ? ?
r   r   c                       e Zd ZdZddZddZy)AllocatingMultiOutputzMultiOutput with Inductor-controlled allocation for .out() variant ops.

    Overrides should_allocate()=True so Inductor allocates the output buffer,
    and skips tuple-indexing codegen since .out() writes directly into these buffers.
    c                     yr1  r   r  s    r   r  z%AllocatingMultiOutput.should_allocate%  r  r   c                b    | j                   s#| j                  |       | j                  |       y y r   )r  r{	  r	  r  s     r   r  zAllocatingMultiOutput.codegen%  s,    55%%g.**73 6r   Nr_  r	  )r   r   r   r  r  r  r   r   r   r  r  %  s    4r   r  c                    | j                   }| j                  j                  j                  d      d   }| j                  }d| d| d| S )z8Build fully-qualified kernel name for an out-variant op.z::rI   z
torch.ops.r  )r  r  r   r  r  )rn  nsrr	  r   s       r   rg  rg  %  sP    			Bnn!!''-a0G##Ht1WIQxj11r   c                       e Zd ZU dZded<   ded<   	 	 	 	 	 	 	 	 	 	 d fdZddZedd	d
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z xZ	S )rj  zMulti-output .out() variant lowering.

    Subclass of FallbackKernel that emits .out() calls with pre-allocated
    output buffers. Uses AllocatingMultiOutput child nodes for each output.
    r   out_arg_nameszlist[AllocatingMultiOutput]out_variant_output_nodesc               n    t        |   |i | || _        g | _        t	        |      | _        || _        y r   )rn  r]  r  r  rg  r  r  )r  rn  r  r   r   rp  s        r   r]  zExternKernelMultiOut.__init__&  s<     	$)&)*(*%"?"G!r   c                H    | j                  |       |j                  |        y r   )r   generate_extern_kernel_multi_outr  s     r   r  zExternKernelMultiOut.codegen&  s    W%006r   NFr\  c               "   ddl m}
m}m}  |
|j                        syt        |t        t        f      sy ||      }|y ||      }t        d |D              syt        |      t        |      k7  ry | t        |      ||||||||	      }g }t        |      D ]  \  }}t        |j                  |j                  g |j                  g |j!                               }t#        ||t%        |      |fg      }t&        j(                  s|	st+        |      s3t,        j.                  j0                  j3                  |j4                         |j7                  |        ||_        ||_        t        |t              rt        |      S t        |      S )	zGCreate an ExternKernelMultiOut if the op has a matching .out() variant.r   )rV  rW  rY  Nc              3  P   K   | ]  }t        |t        j                           y wr   )r   r  r  rG
  s     r   r   z2ExternKernelMultiOut.try_create.<locals>.<genexpr>5&  s     G1:a.Gs   $&r  )r   r  rn  r  rZ  )rN  rw  r  )rf  rV  rW  rY  r  r   r   r   r   r   r  r   rP  r  r  rA  r  r  r   rJ   rb  rt   rw   r  r  r  r   r  r  rK  )r  rY  r+	  r  r$	  r%	  r	  r   r  r]  rV  rW  rY  rn  r  rc  rK  r   
tensor_outrN  	multi_outs                        r   rk  zExternKernelMultiOut.try_create&  s   	
 	
 fnn-.5$-8'>)&1GGG~#m"44V,/'

 02&~6 	&MAz !(( &&(z''(-**,-	F .~.23I 77&(4))--inn=NN9%%	&( +2' ne,>!G}r   )
r   r   rn  r
  r  r   r   r   r   r   r	  )rY  r
  r+	  r   r  rj  r$	  r  r%	  r  r	  r  r   r	  r  rq  r]  r   r   z&Sequence[AllocatingMultiOutput] | None)
r   r   r   r  r   r]  r  r  rk  rI  rJ  s   @r   rj  rj  %  s     99"" &" !	"
 " 
"7  HL$)J%J J 	J
 &J 'J +J &J EJ "J 
0J Jr   rj  c                     e Zd ZU dZded<   d.dZd/dZd0dZd1dZd2dZ	d3d	Z
d4d5dZddd6dZd7dZd8dZd.dZd7dZ	 d9	 	 	 	 	 d:dZd;dZd<dZ	 d9	 	 	 	 	 d=dZd>dZd?dZd@dZdAdZdBdZdCdZd.dZd.dZdDdZdEd Zd3d!ZdEd"Z dBd#Z! e"d       	 d9	 	 	 dFd$       Z#dGd%Z$dHd&Z%d4dId'Z&e'dJd(       Z(dKd)Z)dJd*Z*dCd+Z+e'dLd,       Z,d3d-Z-e-Z.y
)Mr  zC
    TensorBox / StorageBox allow in-place mutation of Tensors
    r   rM  c                6    | j                   j                         S r   r+  r  s    r   r  z!MutableBox.has_exceeded_max_readsm&  r,  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.get_devicep&  r  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.make_loaders&      yy$$&&r   c                6    | j                   j                         S r   )rM  r
  r  s    r   r
  zMutableBox.make_indexerv&      yy%%''r   c                6    | j                   j                         S r   )rM  r4  r  s    r   r4  zMutableBox.get_stridey&  r  r   c                6    | j                   j                         S r   r"  r  s    r   rs  zMutableBox.get_name|&  r#  r   Nc                8    | j                   j                  |      S r   )rM  r  r  s     r   r  zMutableBox.has_large_inner_fn&  s    yy++I66r   Tr  c               <    | j                   j                  ||      S r'  r(  r  s      r   r  zMutableBox.mark_reuse&  r)  r   c                6    | j                   j                         S r   r1  r  s    r   r  zMutableBox.realize_hint&  r  r   c                6    | j                   j                         S r   )rM  rp  r  s    r   rp  zMutableBox.unwrap_view&  r  r   c                6    | j                   j                         S r   )rM  r  r  s    r   r  zMutableBox.is_input_buffer&      yy((**r   c                6    | j                   j                         S r   )rM  r"  r  s    r   r"  zMutableBox.freeze_layout&  s    yy&&((r   c                :    | j                   j                  ||      S r   )rM  r&  r$  s      r   r&  z*MutableBox.freeze_layout_with_stride_order&  s     yy88NNr   c                8    | j                   j                  |      S r   )rM  r*  r)  s     r   r*  z(MutableBox.freeze_layout_with_fill_order&  s    yy66u==r   c                8    | j                   j                  |      S r   )rM  r-  r,  s     r   r-  z(MutableBox.freeze_layout_with_same_order&  s    yy66v>>r   c                :    | j                   j                  ||      S r   )rM  r1  r/  s      r   r1  z+MutableBox.freeze_layout_with_exact_strides&  s     yy99-WWr   c                6    | j                   j                         S r   )rM  r3  r  s    r   r3  zMutableBox.get_read_writes&  r  r   c                6    | j                   j                         S r   r9  r  s    r   r  zMutableBox.get_reads&  r7  r   c                6    | j                   j                         S r   r7  r  s    r   r9  zMutableBox.num_reads&  r7  r   c                6    | j                   j                         S r   r3  r  s    r   r;  zMutableBox.get_storage_numel&  r4  r   c                6    | j                   j                         S r   r  r  s    r   r@  zMutableBox.get_reduction_type&  r  r   c                6    | j                   j                         S r   r  r  s    r   rB  zMutableBox.get_reduction_size&  r  r   c                6    | j                   j                         S r   r6  r  s    r   rD  zMutableBox.is_extern&  r7  r   c                6    | j                   j                         S r   )rM  rF  r  s    r   rF  zMutableBox.is_no_op&  r#  r   c                8    | j                   j                  |      S r   r  r  s     r   rH  zMutableBox.constant_to_device&  s    yy++F33r   c                6    | j                   j                         S r   )rM  rJ  r  s    r   rJ  zMutableBox.get_mutation_names&  r  r   c                6    | j                   j                         S r   )rM  rL  r  s    r   rL  zMutableBox.get_operation_name&  r  r   c                6    | j                   j                         S r   )rM  rN  r  s    r   rN  z'MutableBox.get_inputs_that_alias_output&  s    yy5577r   c                6    | j                   j                         S r   r.  r  s    r   r  zMutableBox.realize&  r/  r   c                8    | j                   j                  |      S r   r  r=  s     r   r>  zMutableBox.get_free_symbol_uses&  s     yy--m<<r   c                6    | j                   j                         S r   r;  r  s    r   r  zMutableBox.get_read_names&  r<  r   c                6    | j                   j                         S r   )rM  r  r  s    r   r  zMutableBox.get_defining_op&  r  r   c                8    | j                   j                  |      S r   )rM  r  r  s     r   r  zMutableBox.codegen_reference&  s    yy**622r   c                6    | j                   j                         S r   rM  r  r  s    r   rN  zMutableBox.layout&  s     yy((**r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.get_layout&  r  r   c                6    | j                   j                         S r   r  r  s    r   r  zMutableBox.get_output_spec&  r  r   c                6    | j                   j                         S r   r  r  s    r   r
  zMutableBox.get_size&  r#  r   c                .    | j                   j                  S r   )rM  r  r  s    r   r  zMutableBox.dtype&  s    yyr   c                t   t        | j                  t              rQt        |       j                   dt        | j                        j                   d}d}| j                  j                  }n&t        |       j                   d}| j                  }d}|t        t        |            |g}dj                  |      S )Nr  z))r  r  )r   rM  r  r   r   r  r   r  )r  line0endlr  r  s        r   r  zMutableBox.__str__&  s    dii,Dz**+1T$))_-E-E,FaHEDIINNEDz**+1-EIIED 3u:

 yyr   r_  rg  rk  rm  r`  ro  r   rp  rq  rS  rR  rr  rs  ru  rv  rw  rx  rz  r{  r|  rd  r~  r  r  r}  rT  rW  rf  r^  r]  r[  )/r   r   r   r  r   r  r  r  r
  r4  rs  r  r  r  rp  r  r"  r&  r*  r-  r1  r3  r  r9  r;  r@  rB  rD  rF  rH  rJ  rL  rN  r  rb   r>  r  r  r  r  rN  r  r  r
  r  r  r  r   r   r   r  r  e&  si    L2&'(&$7 =A D('+) ;@O"O37O	O
>? HMX/X@DX	X
+%%-..%$4..8# L)$)=!=	!= *=
*+3 + +&+$   " Hr   r  c                  V    e Zd Zeedd              Zeedd              Zedd       Zy)r   c                     y r   r   rM  s    r   r  zTensorBox.create&  s    FIr   c                     y r   r   r  s    r   r  zTensorBox.create'  s    +.r   c                N    t        | t              r| S t        t        |             S r   )r   r   r   rq  r  s    r   r  zTensorBox.create'  s"    d12KD)**r   N)rM  r   r   r   )rM  r   r   r   )rM  r   )r   r   r   r   r  r  r   r   r   r   r   &  s@    I  I.  .+ +r   c                  d    e Zd ZdZddZddZddZddZddZddZ	dd	dd
Z
dd	ddZddZy)rq  z7
    StorageBox allow in-place mutation of Tensors
    c                    t        | j                  t        t        f      r4| j                  j	                         t
        j                  j                  v S yr  )r   rM  r  rS  rs  rw   r  r  r  s    r   r  zStorageBox.is_input_buffer'  s:    dii+!?@99%%'177+?+???r   c                    t        | j                  t              xr4 | j                  j                         t        j
                  j                  v S r   )r   rM  r!  rs  rw   r  r	  r  s    r   r9  zStorageBox.is_module_buffer'  s9    tyy>3 :		""$(9(99	
r   c           	        t         j                  | j                        r| j                  j                         S t	        | j                  t
        t        t        t        f      sJ t        | j                               | j                  j                         }| j                  j                         }| j                  j                         }|J t        d t        || j                  j                         | j                  j!                         d      | j                        | _        t"        j$                  j'                  | j                        | j                  _        t"        j$                  j+                  | j                         | j,                  | j                  _        || j                  _        || j                  _        | j                  j                  j2                  | j                  _        | j                  j(                  S )NF)r  r  r  rR  r  )r   r  rM  rs  r   r  rg  r  r  r   r  r  r  r  r  r  r
  rw   r  r  r   r  rz  r~  r|  r  )r  r~  r|  r  s       r   r  zStorageBox.realize'  sj   ""499-99%%''$))iD$%GH 	
$IIK
 	
H ii//1II++-	%%'!!!"!ii))+YY'')	 	
	 00;			""499- LL		 +		'		#yy~~88		yy~~r   c                    t        | j                  t        t        f      r9| j                  j	                         j
                  dkD  r| j                          yyy)zL
        Called on buffers we expect to be forced to realize later.
        rI   N)r   rM  r  rg  r  nontrivial_read_countr  r  s    r   r  zStorageBox.realize_hint:'  sF    
 tyy9i"89		**,BBQFLLN G :r   c                   ddl m} | j                         D cg c])  } ||      st        j                  j                  |      + }}|syt        |      }t        |      }t        |      }||k\  xr ||z  dk\  xr ||k(  S c c}w )Nr   )is_nonfreeable_buffersFr   )	rk  r  r  rw   r  get_dep_size_hintr3  r  r1  )r  r  r  r  size_of_reads
total_sizemax_sizemin_sizes           r   $has_accumulated_enough_reads_by_sizez/StorageBox.has_accumulated_enough_reads_by_sizeD'  s    @ ~~'
)#. GG%%c*
 

 '
}%}%)# %X%*%H$	

s   .Bc                   t         j                  }|7t        | j                        rt         j                  }n#t         j
                  }nt        |t              sJ t        | j                  t              xrZ | j                         |kD  xsE | j                         xs3 t         j                  d uxr | j                  t         j                        S r   )rJ   realize_acc_reads_thresholdr,  rM  realize_cpu_acc_reads_threshold$_realize_acc_reads_threshold_defaultr   r   r  r9  r   realize_acc_reads_size_thresholdr  )r  r  s     r   r  z!StorageBox.has_exceeded_max_readsW'  s    &,&H&H#&.dii .4.T.T+ ?? , 93???$))Y/ 	
NN:: &&( 77tC ==;;		
r   Tr  c               L   |dkD  rt        | j                  t        t        f      r~t	        | j                        r3| j                  j                         g d}t        fd|D              ry| j                         ry|xr! | j                         t        j                  kD  S y)zj
        A heuristic to decide if we should realize a tensor
        that is used multiple times.
        rI   )expr  log10log1plog2sigmoidtanhc              3  :   K   | ]  }|j                   v   y wr   )used_ops)r   r   opcounts     r   r   z5StorageBox.should_realize_on_reuse.<locals>.<genexpr>'  s     @qG,,,@s   TF)r   rM  r  rg  r,  r  r0  r  r9  rJ   realize_reads_threshold)r  r  r  	heavy_opsr  s       @r   should_realize_on_reusez"StorageBox.should_realize_on_reusem'  s    
 19DII	9/EFdii ))446	 @i@@&&(T4>>#3f6T6T#TTr   c               L    | j                  ||      r| j                          y y r'  )r  r  r  s      r   r  zStorageBox.mark_reuse'  s$    '';'GLLN Hr   c                6    | j                   j                         S r   r7  r  s    r   r9  zStorageBox.num_reads'  r7  r   Nr_  rd  rS  )r  r   r   r   )r  r   r  r   r   r   rq  r{  )r   r   r   r  r  r9  r  r  r  r  r  r  r9  r   r   r   rq  rq  '  sA    

<
&
, JN 2 =A %r   rq  c                  0    e Zd ZU ded<   ded<   dZded<   y)Subgraphr   r   r	  graph_moduleNzGraphLowering | Noner  )r   r   r   r   r  r   r   r   r  r  '  s    
I&&"&E&r   r  c                    | D cg c]$  }t        |t              r|j                         n|& } }t        t	        d | D                    t        |       k  S c c}w )Nc              3  2   K   | ]  }t        |        y wr   )r  )r   r  s     r   r   z'_has_aliased_buffers.<locals>.<genexpr>'  s     ;"V*;r  )r   rS  rp  r   r@   )buffersr  s     r   _has_aliased_buffersr  '  s^      !+6? COG 
 z;7;;<s7|KKs   )Ac                       e Zd ZU dZdZded<   dZded<   dZded<   	 	 	 	 	 	 	 	 d fdZdd	Z	e
	 	 	 	 	 	 dd
       ZddZ xZS )InvokeSubgraphz.
    Ir node for the invoke_subgraph HOP.
    NSubgraph | Noner	  Sequence[IRNode] | NoneoperandsrK  c                    t         |   d ||       || _        t        j                  j                  |       | _        t        j                  j                  |        y r  )rn  r]  r	  rw   r  r  r   r  )r  r	  r  rN  rp  s       r   r]  zInvokeSubgraph.__init__'  sQ     	 	 	

 !GG++D1		""4(r   c                8    | j                   r| j                   gS g S r   )r	  r  s    r   r  zInvokeSubgraph.get_subgraphs'  s    "&--7R7r   c                   ddl m} t        j                  j                  }d}|j
                  j                  d      x}rrd}|j                  t        j                  j                  j                  u r7|j                  d   t        j                  j                  j                  u sJ d}|d   |d }nd}|j                  t        j                  j                  j                  u r7|j                  d   t        j                  j                  j                  u sJ d}|j                  |d }|D 	cg c]  }	|	j
                  d	    }}	|D 	cg c]  }	| j                  |	       }}	g }
t        |      D ]M  \  }}t!        |t"        t$        t&        f      r|
j)                  |       3|
j)                   ||||                O |
}|j                  |t        j                  j+                  |j,                  ||j.                  
      |_        t        j0                  |j                        5   |j                  j2                  |  ddd       |j                  j4                  }d}|D ]$  }t!        |t"              r|j7                         } n |J t9        ||t;        |            	 	 	 	 	 	 dfd}t        |      D cg c]  \  }} |||       }}}|_        |S c c}	w c c}	w # 1 sw Y   xY wc c}}w )zFor each operand, get a realized input, force it to have the same
        strides as the subgraph inputs, then use an InvokeSubgraphrI   )constrain_to_fake_tensorNeager_input_valsr   r   r   r   r  rd  r	  r	  r  )r	  r  rN  c                Z   t        | t        t        f      r| S | j                         }|J t	        t        || j                         | j                         | j                         | j                         j                  | j                         j                        t        |fgd      S )Nr  Tr  )r   r   r  r  r  rP  r  r
  r4  r  rQ  rR  r   )r\  indr  invoke_subgraphs      r   create_outputz,InvokeSubgraph.create.<locals>.create_output(  s     &#8:N"OP**,)))"%$..0#__.%002%00299"("3"3"5"?"? $C[M6: r   )r\  r   r  r   r   z:ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput)r@	  r  rw   r  r  rb  r  rT  r  ru   rh  r	  r   r  r  r   r   r   r	  r	  r  r	  r  r   r	  r	  graph_outputsr  r  r  rK  )r  r	  r  r  r  fake_operandsr  rQ  fx_operandsr   new_operandsr   operandrK  r  r  r   r\  outsr  s                      @r   r  zInvokeSubgraph.create'  s    	7 ww+++00445GHHHF""eii&<&<&I&II#((+uyy/E/E/U/UUUU,Q/8MF""eii&<&<&I&II#((+uyy/E/E/U/UUUU '++FG4K4?@qQVVE]@M@ AI!I1#"3"3A"6!I!I%'%h/ 	LC/ARS ##G,##,WmC6HI	  >>!WW22((,&mm 3 HN
 $$X^^4 3"""M23 ....  	Gg'<= ++-	 !!!($F3
		!$	G	. ;DG:LMYQfa(MM"&S A "J.3 3T Ns   /K"K'*K,K8,K5c                &    |j                  |        y r   )codegen_invoke_subgraphr  s     r   r  zInvokeSubgraph.codegen (  r	  r   )r	  r  r  r  rN  r  r   r   rX  )r	  r  r  r   r   z@list[ShapeAsConstantBuffer | NoneAsConstantBuffer | MultiOutput]r	  )r   r   r   r  r	  r   r  rK  r]  r  r  r  r  rI  rJ  s   @r   r  r  '  s     !%Ho$(,H%,'+G$+
) 
),<
)FW
)	
)8 ff,2f	If fP.r   r  c                       e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   dZ	d
ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZ
ddZedd       Ze	 	 	 	 	 	 	 	 	 	 dd       ZddZddZ xZS )Conditionala  
    IR node representing torch.cond

    Attributes:
        predicate: A boolean scalar tensor determining which branch to execute.
        operands: Input tensors passed to both true and false subgraphs.
        true_subgraph: Subgraph executed when predicate is True.
        false_subgraph: Subgraph executed when predicate is False.
        outputs: MultiOutput nodes representing the conditional's outputs.
    Nr?  	predicater  r  r  true_subgraphfalse_subgraphSequence[MultiOutput] | NonerK  c                   || _         || _        || _        || _        t	        |g|      \  }}t
        	|   d |||       ||| _        t        j                  j                  |       | _        t        j                  j                  |        y N)r   rN  rj  r  )r  r  r  r  _split_by_sym_typern  r]  r  rw   r  r  r   r  )
r  r  r  r  r  rN  r  sym_argsr$	  rp  s
            r   r]  zConditional.__init__7(  s     # *, 2I3I3I J+"	 	 	
 (%6D"GG++D1		""4(r   c                    g }| j                   r|j                  | j                          | j                  r|j                  | j                         |S r   )r  r  r  r  	subgraphss     r   r  zConditional.get_subgraphsS(  sG    	T//0T001r   c                R    t        | t              r| S | j                  j                  S r   )r   r   r   r  )r   s    r   _maybe_exprzConditional._maybe_expr[(  s    aHvv{{r   c                
   | j                  |      }|D cg c]  }| j                  |       }}t        j                  j                  j                  d   }t        |t              sJ t        |             g }|D ]B  }t        |t              r|j                  |j                  d          2|j                  |       D t        j                  j                  j                  d   }		 	 	 	 	 	 dd}
||fD ]  }|j                  t        j                  j                  |j                  ||j                        |_        t        j                  |j                        5   |j                  j                  |   |
|j                  j                   |	      |j                  _        ddd        |j                  J |j                  J |j                  j                   }|j                  j                   }d|fd|ffD ]!  \  }}t#        |      st%        d| d	|        t'        |      t'        |      k(  s	J ||f       t)        t+        ||            D ]  \  }\  }}|j-                         |j-                         k(  s
J |||f       |j/                         |j/                         k(  s
J |||f       |j1                         j2                  |j1                         j2                  k(  rJ |||f        t5        d
 ||gz   D              }t7        t        j                  j8                  j:                  t        j                  j                  j                  j=                  dd            }|J d       t?        ||||tA        |      |      }t)        t+        |t        j                  j                  j                  d               D cg c]  \  }\  }}tC        tE        |j-                         |j-                         n||j/                         |jG                         D cg c]  }t>        jI                  |       c}|jK                         D cg c]  }t>        jI                  |       c}|j1                         j2                  |j1                         jL                        |tN        |fg       }}}}}||_(        ddl)m*}  ||j                        \  }}}}} ||j                        \  }}}}}tW        |      tW        |      z  }tY        |      D cg c]  }t[        ||   j\                  ||   |      ! c}|_/        |S c c}w # 1 sw Y   kxY wc c}w c c}w c c}}}}w c c}w )zNCreate a Sequence of IRNodes from a conditional statement (see .lowering.cond)r2  r  c                    g }t        | |      D ]e  \  }}t        |t              r|j                  |       (|j                  t        j                  t        |      |j                         d             g |S NFr  )r   r   r   r  r  r  r   r  )r  fake_tensorsretr\  r  s        r   _require_exact_stridesz2Conditional.create.<locals>._require_exact_strides}(  sr     C #M< @ 	f&;<JJv&JJ$::%f-t{{}E ; 		 Jr   Nr  true_fnfalse_fnzVOutput aliasing is currently not supported in compiled torch.cond. The outputs of the z% subgraph of torch.cond are aliased: c              3  \   K   | ]$  }t        |t              s|j                          & y wr   )r   r   r  )r   os     r   r   z%Conditional.create.<locals>.<genexpr>(  s)      
a!67 LLN
r   r  zcannot determine devicer  )r  r  r  r  rN  r  r  r   )-check_input_alias_and_mutation_return_outputs)r  r  r,  zSequence[torch.Tensor]r   r   )0r  rw   r  r  r   r   r   r   r>   r  rb  r	  r  r   r	  r	  r  r  rl  r   r   r   r  r  r  rQ  r  r;   r  r   r  r  r  r  rP  r  r(  r  rR  r   rK  torch._higher_order_ops.utilsr3  r@   r  r  rN  r  )r  r  r/  r0  r  r   r  r  fx_opfake_outputsr.  r	  true_outputsfalse_outputsr   rK  r   t_of_or  r  conditionalr\  merged_outputrP  r3  r   true_mutated_inputsfalse_mutated_inputsmutated_operand_indicesr   s                                  r   r  zConditional.createa(  s`    %%i0	2:;QC%%a(;; ! 4 4 9 9" =+x0C${2CC0 $&  	,E%&$$UZZ%67 $$U+	, ww++007	+	0	 	$ !(+ 	H~~%!"!6!6,,#0"*-- "7 "
 ((8 &HNN&&6 4J 44l4HNN0 	" }}(((~~)))}}22 44(,7*m9TU 	MD'#L1$**./TU\T]_ 	 < C$66U}8UU6&s<'GH 	UMAzS>>#s~~'77F!S#F7==?cmmo5D3}D5>>#**cnn.>.E.EET3PS}TE	U  
+
 

 6GG&&GG  %%))*=tD
 !<#<<!!!#$F3/
: /8L!''"6"6";";E"BC/)
 
( +*FM'  ((*6 ",,. **,@M@R@R@TU"+11"5U>K>R>R>T8://3 ",,.55$//1;; 
 
2 &	

 :':N:NO 	*Aq%q :(:O:OP 	+Aq& #--@"AJ E
 #
 56(
 8C=//#L(
$
 [ <T v V
V(
s>   UAUAU-
(U#U-
U(4A	U-
#$U5U 	#
U-
c           	         |j                  |        |j                  | j                         | j                  t	        | di              y r
  )codegen_conditionalr
  rs  rK  r   r  s     r   r  zConditional.codegen(  s9    ##D)88MMOT\\749Lb+Q	
r   c                    t        | dd       x}rKt        t        j                  j                  j
                  |      }|J t        |j                               S t               S r
  r
  r
  s      r   r  z$Conditional.get_unbacked_symbol_defs)  r
  r   )r  r   r  r  r  r  r  r  rN  r  r  rq  r   r   rX  )r   zint | torch.SymIntr   z
int | Expr)
r  r   r/  r  r0  r  r  r  r   zlist[MultiOutput]r	  r  )r   r   r   r  r  r   r  r  r  rK  r]  r  r  r(  r  r  r  r  rI  rJ  s   @r   r  r  $(  s    	  $I}#(,H%,%)M?)&*NO*,0G)0)) #)  	)
 !) ") E) 
)8  
 XX X 	X
 "X 
X Xt
 r   r  c                    g }g }| D ]?  }t        |t              r|j                  |j                         /|j                  |       A ||fS r   )r   r   r  r  )r   non_sym_argsr#  r  s       r   r"  r"  )  sS     LH %c01OOCHH%$	% \!!r   c                       e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dZ	d	ed
<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZ
ddZedd       Zedd       Ze	 	 	 	 	 	 	 	 	 	 	 	 dd       ZddZddZ xZS )	WhileLoopzSThe IR node for while_loop and while_loop_stack_output. It supports input mutation.Nr  carried_inputsadditional_inputsr  cond_subgraphbody_subgraphr  rK  c                .   || _         || _        || _        || _        t	        g ||      \  }}	t
        
|   d ||	|       ||| _        || _        t        j                  j                  |       | _        t        j                  j                  |        y r!  )rG  rH  rI  rJ  r"  rn  r]  r  stack_outputrw   r  r  r   r  )r  rG  rH  rI  rJ  rN  r  rL  r#  r$	  rp  s             r   r]  zWhileLoop.__init__%)  s     -!2** 21n101!
+ 	"	 	 	
 (%6D"(GG++D1		""4(r   c                    g }| j                   r|j                  | j                          | j                  r|j                  | j                         |S r   )rI  r  rJ  r%  s     r   r  zWhileLoop.get_subgraphsD)  sG    	T//0T//0r   c                   t        |       s| S | D cg c]$  }t        |t              r|j                         n|& }}t	               }g }t        | |      D ]b  \  }}t        |      |v r%|j                  t        j                  |             8|j                  t        |             |j                  |       d |S c c}w r   )r  r   rS  rp  r@   r   r  r  r  r	  r  )rG  r  unwrapped_buffersseen_buffersrN  original_inputunwrapped_buffers          r   _clone_aliased_inputszWhileLoop._clone_aliased_inputsO)  s    #N3!! )
 %/v$GF VS
 
 )3+-03NDU0V 	.,N,"#|3l55nEF  $4!56n-	. !
s   )B<c                    t        | t              r| S t        | t        t        f      rt        |       S t        | t              rt        j                  |       S t        dt        |              )NzNYI unsupported output type: )r   r   rq  rS  r  r  r!  r   )r   s    r   _maybe_wrap_as_tensor_boxz#WhileLoop._maybe_wrap_as_tensor_boxi)  s\    c9%Jj/:;S>![)##C((!>tCykJKKr   c                "   ddl m} 	 	 	 	 	 	 dd}t        j                  j                  j
                  d   }t        j                  j                  j
                  d   }	||	z   }
|
D cg c]  }|j                  d    }}|D cg c]  }|j                  d    }}|	D cg c]  }|j                  d    }}|D cg c]  }| j                  |       }}t        j                  |      } |||      }|D cg c]  }| j                  |       }} |||      }||z   }||fD ]	  }|j                  t        |
t              sJ t        |
             t        j                  j                  |j                  |
|j                        |_        t        j                   |j                        5   |j                  j"                  |  ||u rYt%        |j                  j&                        t%        |      k(  sJ  ||j                  j&                  |      |j                  _        ddd        |j                  r|j                  sJ |j                  j&                  }|j                  j&                  }t)        |      rt+        d	|       t%        |      d
k(  sJ |       |d   }t        |t,              sK|j/                         t0        j2                  k(  sJ |       t%        |j5                               dk(  sJ |       t%        |      dkD  sJ d       |d   j7                         }|J t%        |      t%        |      k(  s	J ||f       t9        t;        ||            D ]  \  }\  }}	 	 	 	 	 	 dd} ||j5                         |j5                                 ||j=                         |j=                                |j7                         |j7                         k(  sJ ||||f       |j/                         |j/                         k(  rJ |||f        |J t?        t        j                  j@                  jB                  t        j                  j                  j                  jE                  dd            }t        ||||tG        |      ||      }|j                  8t        |j                  jH                  t0        jJ                  jL                        sJ  ||j                  jH                  |      d   }tO        |      }|D cg c]  }||   	 } }tQ        |       }!g }"g |_)        g |_*        |rt%        |      dk(  sJ d       t9        t        j                  j                  j                  d         D ]  \  }}#tW        tY        |#jZ                  |#j\                  |#j_                         D $cg c]  }$t`        jc                  |$       c}$|#je                         D %cg c]  }%t`        jc                  |%       c}%      |tf        |fg      }&|jR                  ji                  |&       |"ji                  |&        nt9        |      D ]
  \  }}#||v rb|t%        |      k  sJ d       tk        |!      }'|jT                  ji                  tm        |'jn                  |'|             |"ji                  |'       mtW        tY        |#j7                         |#j/                         |#j5                         |#j=                         |#jq                         jr                        |tf        |fg      }&|jR                  ji                  |&       |"ji                  |&        t;        ||"      D ]g  \  }(})|(ju                         t        j                  jv                  v s1t        j                  jx                  j{                  |)ju                                i |"S c c}w c c}w c c}w c c}w c c}w # 1 sw Y   xY wc c}w c c}$w c c}%w )zcreate the while_loop IR node. stack_output controls whether it stack
        each iterations' output, which is necessary for training.
        r   )check_input_alias_and_mutationc                P   t        |       t        |      k(  sJ g }t        | |      D ]{  \  }}t        |t        j                        rKt
        j                  |      }|j                  t        j                  ||j                         d             k|j                  |       } |S r+  )r   r   r   r  r  rF  rU  r  r  r  r  )tensor_boxesr,  r-  r  fknew_tbs         r   r.  z0WhileLoop.create.<locals>._require_exact_strides)  s     |$L(9999ClL9 #Bb%,,/ '@@DFJJ$::"BIIKu ;  JJrN)#* Jr   r2  r  Nr  zOutput aliasing is currently not supported in compiled torch.while_loop. The outputs of the body_fn subgraph of torch.while_loop are aliased: rI   z9torch.while_loop is assumed to have at least one operand.c                    t        |       t        |      k(  sJ t        | |      D ]/  \  }}t        j                  j                  j                  ||       1 y r   )r   r   rw   r  r  r  )	lhs_exprs	rhs_exprslhsrhss       r   _guard_list_equalsz,WhileLoop.create.<locals>._guard_list_equals)  sN     9~Y777 #Iy 9 <HCGG$$11#s;<r   r  r  )rG  rH  rI  rJ  rN  r  rL  r   z-NYI: while_loop_stack_output input mutations.rZ  zonly carries can be mutated.)r  r  r  r  rQ  )rY  r  r,  z'list[int | torch.SymInt | torch.Tensor]r   r   )r^  Sequence[int | Expr]r_  rc  r   r   )>r4  rW  rw   r  r  r   rb  r  rF  rS  r   r   r   r	  r  r   r	  r	  r   r  r  rl  r   r  r  r   r
  r  r   r   r4  r;   r  r   r  r  modulefxGraphModuler@   r  rK  r  r  rP  r  r  r  r  r(  r  r   r  r  r  rN  r  rQ  rs  r  rk
  r  )*r  cond_fnbody_fnrG  rH  rL  rW  r.  fx_carried_inputsfx_additional_inputsfx_all_inputsr   fake_all_inputsfake_carried_inputsfake_additional_inputscarried_inputs_additional_inputs_
all_inputsr	  cond_outputsbody_outputsrh  r  r   r^  borb  r  
while_loopmutated_idxsmutated_idx_setr   r  mutated_inputs_iterall_outputsr\  rP  rO  r  mutated_inputrl  r   s*                                             r   r  zWhileLoop.createt)  s    	Q	*	A	 	: GG0055b9 ww3388<),@@2?@Q166%=@@6GHqvve}HH9M!NA!&&-!N!N9GHA3,,Q/HH#99/J0BUV<MNqc//2NN3 6
 %'99
 '* 	H~~%!-:OD<OO:!"!6!6,,#0"*-- "7 "
 ((8 &HNN&&8  7*"8>>#?#?@C/E      8N$NN88/84 	4 }}..}}22}}22- XXdWeg  < A%3|3%O!23;;=EJJ.11.qzz|$),1,):" 	
G	
" A))+!!!?#s<'88 	
;
 	
8 %S,%GH 	AKAxB</</< < r{{}bkkm<r}}@ ==?bmmo5J2r67JJ5<<>R\\^3@aR[@3	A" !!!5GG&&GG  %%))*=tD

 *0!!$F3/%	

 }}(ZMM  %(("6"6.
 	
 

 6MM  /

 %\25DEc*S/EE #>2$&
&(
#'1, ?,  ))=)=)B)B5)IJ .V'%}}$llDJKKMRbk55b9RFLmmoV 7 7 ;V	 C[M		 "")))4""9-.  )6 2V/)^!44T6TT4$()<$=M//66&}';';]JW  &&}5 +##)#4#4#6"("2"2"4!'!2#)#4#4#6#)#4#4#6#=#= #
!I &&--i8&&y1-20 NK8 	@HC||~!5!55 ++//?	@ U AH!NH O t F" SVs=   (__! _&<_+8_0/A7_5`:`*`5_?	c           	         |j                  | | j                         |j                  | j                         | j                  t        | di              y r
  )codegen_while_looprL  r
  rs  rK  r   r  s     r   r  zWhileLoop.codegenN*  sA    ""4):):;88MMOT\\749Lb+Q	
r   c                    t        | dd       x}rKt        t        j                  j                  j
                  |      }|J t        |j                               S t               S r
  r
  r
  s      r   r  z"WhileLoop.get_unbacked_symbol_defsT*  r
  r   )rG  r  rH  r  rI  r  rJ  r  rN  r  r  rq  rL  r   r   r   rX  )rG  r  r   r  )r   r   r   r   )rg  r  rh  r  rG  r  rH  r  rL  r   r   r&  r	  r  )r   r   r   r  rG  r   rH  rI  rJ  rK  r]  r  r  rS  rU  r  r  r  r  rI  rJ  s   @r   rF  rF  )  s    ].2N+215.5%)M?)%)M?),0G)0)() ,)  	)
  ) ") E) ) 
)>  2 L L WW W )	W
 ,W W 
#W Wr
 r   rF  c                  \     e Zd Z	 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZd	dZ xZS )
r   Nr
  c          	         t         
|   |||||d |       ddlm}  ||      }	|	J |	| _        t
        j                  j                  j                  |	d       | _	        | t
        j                  j                  |	<   y )Nr^  r   )_get_effect)
rn  r]  torch._higher_order_ops.effectsr  effect_typerw   r  effectful_opsr  prev_effect_buffer)r  rN  rY  r$	  r
  r	  r   r  r  r  rp  s             r   r]  zEffectfulKernel.__init__`*  s     	/ 	 	
 	@!&)&&&&"#''"7"7";";K"N-1k*r   c                    t         |          }| j                  F|j                  j	                  t        j                  | j                  j                                      |S r   )rn  r3  r  r6  r  rK   rI  rs  )r  r  rp  s     r   r3  zEffectfulKernel.get_read_writes}*  sU    g-/"".!!$$T%<%<%E%E%GH r   c                     yr1  r   r  s    r   rg
  z EffectfulKernel.has_side_effects*  r  r   r   rp  rx  r_  )r   r   r   r]  r3  rg
  rI  rJ  s   @r   r   r   _*  sr     )-2 HL22 2 &	2
 &2 +2 &2 E2 
2:r   r   c                  <    e Zd Z ed       	 d	 	 	 dd       ZddZy)r;	  c                    t               S r   r?   r=  s     r   r>  z!NonTensorObj.get_free_symbol_uses*  r  r   c                     y r   r   r  s    r   r  zNonTensorObj.realize*  r  r   Nrr  r}  rd  )r   r   r   rb   r>  r  r   r   r   r;	  r;	  *  s1    N+$)!	! ,
r   r;	  c                  L    e Zd ZU ded<   ded<   ddZdddZddZdd	Zdd
Zy)r  r   r   %FakeScriptObject | torch.ScriptObjectr  c                    | j                   S r   r  r  s    r   rs  zTorchBindObject.get_name*  r  r   Nc                    | j                   S r   r  r  s     r   r  z!TorchBindObject.codegen_reference*  r  r   c                    | j                   S r   r  r  s    r   r	  zTorchBindObject.get_value*  r  r   c                    t        | j                  t        j                        r| j                  S | j                  j                  S r   )r   r  r  r	  real_objr  s    r   get_real_objzTorchBindObject.get_real_obj*  s0    djj%"4"45::::&&&r   c                   | j                         }t        |      ryt        |d      sJ t        |j	                               }t        j                  |      d   }|D cg c]=  }t        |t        j                        r!|j                         |j                         z  ? }}t        j                  t        j                  |d      S c c}w )Nr   __obj_flatten__)r  r,   r  r   r  r  r	  r   r  r  r	  r  r  r  operatorr  )r  real_script_obj	flat_dict
flat_elemsr   
flat_sizess         r   get_buf_byteszTorchBindObject.get_buf_bytes*  s    ++-?+(9:::88:;	((3A6
  
!U\\* NNqwwy(

 

 j!<<
s    AC	ro  r   rf  )r   r  )r   ztorch.ScriptObjectr{  )	r   r   r   r   rs  r  r	  r  r  r   r   r   r  r  *  s&    
I00'=r   r  c                  .    e Zd ZU dZded<   ddZdd	dZy)
OpaqueValueTypeConstanta  IR node for opaque value type constants that appear directly in graph outputs.

    Unlike TorchBindObject (which references named constants loaded at runtime),
    this inlines the value's repr into the generated code since value types are
    reconstructed from their repr.
    r   r  c                ,    t        | j                        S r   )rI
  r  r  s    r   rs  z OpaqueValueTypeConstant.get_name*  s    DJJr   Nc                    t        | j                        \  }}|j                         D ]"  \  }}|t        j                  j
                  |<   $ |S r   )r+   r  rT  rw   r  opaque_value_type_classes)r  r  obj_repropaque_typesr  r  s         r   r  z)OpaqueValueTypeConstant.codegen_reference*  sJ    !4TZZ!@, &&( 	5DAq34AGG--a0	5r   ro  r   rf  r   r   r   r  r   rs  r  r   r   r   r  r  *  s     J r   r  c                  4    e Zd ZU ded<   ded<   ddZd	d
dZy)r	  r   r   rj  r  c                    | j                   S r   r  r  s    r   rs  zGeneratorState.get_name*  r  r   Nc                    | j                   S r   r  r  s     r   r  z GeneratorState.codegen_reference*  r  r   ro  r   rf  )r   r   r   r   rs  r  r   r   r   r	  r	  *  s    
Ir   r	  c                  8    e Zd ZU dZded<   ded<   d	dZd
ddZy)r	  z
    Represents an opaque object (e.g., ProcessGroup) that is passed through
    as a graph input. Similar to GeneratorState, this wraps the object with
    its placeholder name so codegen can reference it properly.
    r   r   r   r  c                    | j                   S r   r  r  s    r   rs  zOpaqueObjectState.get_name*  r  r   Nc                    | j                   S r   r  r  s     r   r  z#OpaqueObjectState.codegen_reference*  r  r   ro  r   rf  r  r   r   r   r	  r	  *  s     IJr   r	  c                  r    e Zd ZddZddZdd	dZe	 	 	 	 	 	 	 	 	 	 d
d       Ze	 	 	 	 	 	 	 	 	 	 dd       Zy)_CollectiveKernelc                     yr  r   r  s    r   r  z!_CollectiveKernel.should_allocate*  r  r   c                     yr1  r   r  s    r   rg
  z"_CollectiveKernel.has_side_effects*  r  r   Nc                \   t        | j                        t        j                  j                  u sJ d       | j                  }||| _        n|j                  j                  | _        |j                  j                  D cg c]  }|j                  s|j                   c}| _
        y c c}w )Nz,Setting cpp kernel needs a valid op_overload)r   r  r  r  r  r  r  r   r  r  r  )r  r  rY  r   s       r   r  z%_CollectiveKernel.set_cpp_kernel_name*  s    D$$%)>)>> 	
:	
> !!&#2D #)>>#6#6D  #NN44.
AFF.
* .
s    B)B)c           
        t         j                  j                  5   | j                  ||g|i |\  }}}}}	d d d        	rJ | d|	        d }
D ]c  }t	        |t
              r|j                          t         j                  j                  |j                                |
T|j                         }
e |
J d| d        | t        |
      ||      }t        j                  |      }|j                  j                  |D cg c]  }t        t        |
      ||       c}       |j                   j                  |D cg c]  }|j                          c}       d|v r`|j                  j#                  t        t        |
      |d   |             |j                   j#                  |d   j                                y y # 1 sw Y   xY wc c}w c c}w )Nrg  zIn-place collective zE requires at least one tensor argument; got only non-tensor IR nodes.r  r   )rw   r  r6  r0	  r   r;	  r  r  rs  r  r  r  tree_leavesr  rn  r  r
  r  )r  rY  rj  r   r   _example_outputr$	  r%	  r	  r  r  
tensor_argrc  inpsr  rl  s                   r   create_inplacez _CollectiveKernel.create_inplace+  s    WW 	D #""66CDCFC!	D %E2C1D&EE$% 	1J*l3 GG''
(;(;(=>~#..0	1 ! 	
"6( +6 7	
! f%
 !!&)&&OST^Jf5sFCT	

 	!!T"Bc3<<>"BCF?##**z8&-P %%fUm&<&<&>? I	D 	D> U #Cs   G
GGGc           
        t         j                  j                  5   | j                  ||g|i |\  }}}}}	d d d        	rJ | d|	        D ]#  }
t	        |
t
              r|
j                          % t	        t              r| j                  ||      }|J  | t        |      ||      }t        |      D cg c](  \  }}t        | j                  |      |t        |fg      * c}}|_        t        |j                  |      D ]T  \  }}t        j                   st#        |      r"t         j                  j$                  j'                  |j(                         V |j                  S  | | j                  |      ||      }t        j                   st#        |      s3t         j                  j$                  j'                  |j(                         |g|_        |S # 1 sw Y   xY wc c}}w )NrE  r  )rw   r  r6  r0	  r   r  r  r   r  r  r   r  r  rK  r   rJ   rb  rt   r  r  r   )r  rY  rj  r   r   r+	  r$	  r%	  r	  r  r  r  rc  r   rT  r  s                   r   create_out_of_placez%_CollectiveKernel.create_out_of_placeU+  s    WW 	D #""66CDCFC!	D %F3D2E&FF$% 	%Jj/:""$	% nd+__[.AF%%%!0F "+>!: Av ((0AYKFN  #6>>>B <V::BSC GG--11#((;	<
 >>!$$^4F 66>O? ))--fkk:$XFNMe	D 	D.s   G#-G0#G-r_  r   r	  )
rY  r   rj  zIRNode | list[IRNode]r   r   r   r   r   r   )
rY  r   rj  zTensorBox | list[TensorBox]r   r   r   r   r   z%list[MultiOutput] | _CollectiveKernel)	r   r   r   r  rg
  r  r  r  r  r   r   r   r  r  *  s    

( 0@0@ &0@ 	0@
 0@ 
0@ 0@P 99 ,9 	9
 9 
/9 9r   r  c                  P     e Zd Z	 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )_AllReduce_KernelNr
  c          	     T    t         |   |||||d |       | j                  d       y )Nr^  +aoti_torch_cpu__c10d_functional_all_reduce_rn  r]  r  rw  s	           r   r]  z_AllReduce_Kernel.__init__+  =     	/ 	 	
 	  !NOr   c                    |j                  d       |j                  |        t        | j                  t              r| j                  |       y y Nz+torch/csrc/inductor/aoti_torch/c/shim_cpu.hinclude_extra_headerr	  r   rN  r  r{	  r  s     r   r  z_AllReduce_Kernel.codegen+  @    $$%RS,,T2dkk6*%%g. +r   r   rp  r	  r	  rJ  s   @r   r  r  +  sw     )-P HLPP P &	P
 &P +P &P EP 
P,/r   r  c                  P     e Zd Z	 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )_AllReduceKernelNr
  c          	     T    t         |   |||||d |       | j                  d       y )Nr^  *aoti_torch_cpu__c10d_functional_all_reducer  rw  s	           r   r]  z_AllReduceKernel.__init__+  s=     	/ 	 	
 	  !MNr   c                    |j                  d       |j                  |        t        | j                  t              r| j                  |       y y r  r  r  s     r   r  z_AllReduceKernel.codegen+  r  r   r   rp  r	  r	  rJ  s   @r   r  r  +  sw     )-O HLOO O &	O
 &O +O &O EO 
O,/r   r  c                  v     e Zd Z	 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	 fdZd
dZddZedd       Zd fdZ xZ	S )_WaitKernelNr
  c          	     T    t         |   |||||d |       | j                  d       y )Nr^  +aoti_torch_cpu__c10d_functional_wait_tensorr  rw  s	           r   r]  z_WaitKernel.__init__+  r  r   c                    |j                  d       |j                  |        t        | j                  t              r| j                  |       y y r  r  r  s     r   r  z_WaitKernel.codegen+  r  r   c                r   | j                   d   }t        |t              sJ t        |t              r2|j                   d   }t        |t              sJ t	        |             |gS t        |t
              rC|j                   d   }t        |t              r"|j                  d   \  }}|j                   |   gS g S g S r  )rj  r   r   r  r   r  r  )r  rl  r   collr   r   s         r   get_volatile_readsz_WaitKernel.get_volatile_reads+  s    kk!n#v&&&c,-

1Aa(1$q'1(3J[) ::a=D$ 12Q3C())I Ir   c                r   t         j                  j                  5  | j                  ||      \  }}}}}d d d        rJ | d|         | t	        |j                               |      }|j                  j                  t        t	        |j                               ||             y # 1 sw Y   zxY w)Nrg  r  )	rw   r  r6  r0	  r  r  r  r  r  )	r  rY  rl  r  r$	  r%	  r	  r  rc  s	            r   create_waitz_WaitKernel.create_wait,  s    WW 	0 ""63/!	0 %E2C1D&EE$cnn./
 	&&:S^^-=>VL	
!	0 	0s   B--B6c                    t         |          }| j                         }|D ]>  }|j                  j	                  t        j                  |j                                      @ |S r   )rn  r3  r  r6  r  rK   rI  rs  )r  r  volatile_readsvrrp  s       r   r3  z_WaitKernel.get_read_writes,  sZ    g-/002  	GB!!,"6"6r{{}"EF	Gr   r   rp  r	  r	  )rY  r   rl  r   r   r   rx  )
r   r   r   r]  r  r  r  r  r3  rI  rJ  s   @r   r  r  +  s     )-P HLPP P &	P
 &P +P &P EP 
P,/2 
 
* r   r  c                2   t        | t        t        f      rt        |       S t        | t        t
        f      r2t        t        j                            }| D ]  }|t        |      z  } |S t        | t        j                        rt        |       S t               S r   )r   r=   r    r6   r   r   r@   r   r"   r	  r  r  r   r  r  s      r   r	  r	  ),  s    !h%&$Q''	At}	%u||$& 	0A,Q//A	0	Au||	$$Q''|r   c                2   t        | t        t        f      rt        |       S t        | t        t
        f      r2t        t        j                            }| D ]  }|t        |      z  } |S t        | t        j                        rt        |       S t               S r   )r   r=   r    r5   r   r   r@   r   r"   r	  r  r  r  s      r   r	  r	  9,  s~    !h%&A	At}	%u||$& 	'A#A&&A	'	Au||	$A|r   c                   t        | t              rt        | j                  t              rt        | j                  j                  t              r'| j                  j                  j                  d|       y t        | j                  j                  t              rU| j                  j                  j                  d|       t        | j                  j                  t              r_t        | j                  j                  j                  t              r1| j                  j                  j                  j                  d|       y t        | j                  j                  t              r| j                  j                  j                  sft        | j                  j                  j                  d   t              r4| j                  j                  j                  d   j                  d|       y y y y y y y )Nr~  r   )r   r   rM  rq  r  r  rr  r  r  r  rj  )rN  r  s     r   assign_origin_noder  I,  sV    &)$FKK)Lfkk&&.KK//qA((&1KK//qA&++**N;
  %%uA   %%88J 6;;++[9((00fkk..55a8&AKK$$++A.AA-QRS B 1 : 2 *M$r   )r   r   r   zTypeIs[int | Integer])r   r   r   r   )r   r   r   rC  )r   rt  r   z&Callable[[Sequence[_T]], Sequence[_T]])r   z&Callable[[Sequence[_U]], Sequence[_V]]r   z&Callable[[Sequence[_T]], Sequence[_U]]r   r  r   )r   z#Sequence[int | torch.SymInt | Expr]r   ShapeEnv | Noner   rt  )r   Sequence[int | Integer]r   rt  rr  )r   r   r   r   r   r   )r   r   r   r   r   rt  )r   r?  r   r   r   ztorch.Tensor | None)r  zSequence[_T] | Noner   zSequence[_T | None] | None)r   z/IRNode | OutputSpec | torch.device | None | strr   re  )r   z"IRNode | torch.device | None | strr   r   )r   zBuffer | TensorBoxr1  r   r   r   )r?  ra  r@  ra  rA  ra  r   r   )rT  r   rU  zSequence[int | torch.SymInt]r   r   )rd  r	  r   r   )rj  r  r   rG  )r   zExpr | Sequence[Expr]r  r\  r   rv   rY  )rR  r   r  r\  rQ  r   r   rD  )r  ra  r  rb  rQ  r    r   z$Callable[[Sequence[_IntLike]], Expr]rT	  )TFNFN)r   r   r  r   r  r   r  r  r%  r   r0  r  r   ztuple[StorageBox, Layout])r   r   r  r  r   r   rQ  )r  ra  rA  ra  r   r   )r  r\  r   r   )r   rt  r   zTypeIs[Sequence[IRNode]])r   r<   r   r  )r   r  r   zAbstractContextManager[None])rn  r
  r   r   )r  r  r   r   )r   r	  r   z-tuple[list[ShapeAsConstantBuffer], list[Any]])r   r   r   r  )rN  r   r  ztorch.fx.Noder   r   (i  
__future__r   r  r  r  r  r  loggingr  textwrapr|  collections.abcr   r   r   r   r   r	   r
   enumr   r   numbersr   typingr   r   r   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   r   r   r   unittest.mockr   r   r    r!   r"   torch._export.serde.schema_exportserder
  r  torch._library.custom_opsr
  r,  r  r  r
  torch._loggingr  torch.fxtorch.utils._pytree_pytreer  torch._dispatch.pythonr#   torch._dynamo.utilsr$   torch._export.serde.serializer%   *torch._higher_order_ops.auto_functionalizer&   torch._inductorr'   rk  r)   "torch._library.fake_class_registryr*   torch._library.opaque_objectr+   r,   torch._prims_commonr-   r.   r/   r0   r1   r2   %torch.fx.experimental.symbolic_shapesr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   torch.fx.noder>   torch.utils._ordered_setr@   torch.utils._python_dispatchrA   torch.utils._sympy.functionsrB   rC   rD   rE   rF   rG   torch.utils._sympy.symbolrH   r  rJ   rK   codegen.commonrL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   	loop_bodyrW   ops_handlerrX   rY   rZ   r[   runtime.benchmarkingr\   runtime.hintsr]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   virtualizedru   rv   rw   rx   ry   torch.typesrz   codegen.cutlass.templater{   codegen.wrapperr|   r  r}   r~   r   r   r%  __version__r  r  ImportErrorr   r   r   r   r   r   r	  r   r  r  r  r   	getLoggerr   r  r  r  r   r   r   r   r  r   r   r   r   r   r   r  r  r   r   r   r   r  r  r*  r,  r<  rE  rZ  rf  rm  rt  r   r  r  r
  r  r%  r6  re  rg  r  rQ  rS  r`  rp  r  r  r  r  r  r  r  rO  r  r
  ro  r   rV  rc  rm  r#  rS  r  r  r  r  r  r  r  r  r  rP  r  r  r  r  r  r  rr  r	  r  r  r!  r  r   r  r  r  r  r   r   PrimitiveInfoTyper  r  r  r>  rI  rO  rU  rr  r  r  r  r  r  r  r  r	  r	  r  r  r	  r	  r	  r	  r	  rC
  rT
  r_
  ri
  rn
  rv
  r
  r
  r
  r
  r   r   r
  r  rs  ry  r  r  r   r  rg  rj  r  r   rq  r  r  r  r  r"  rF  r   r;	  r  r  r	  r	  r  r  r  r  r	  r	  r  r   r   r   <module>r     s   "          M M :       U T   ' ' 2 2 . . , ,   $ $ ; ( ? M # 2 ? M      / ?  + "     N N - :     0 * ) B&'95$% "(OY'''NJ t_T]T]T]Dj)  EkD() (**//%**2P2PPi Pg!			8??4	8yy~~'T  k	c4[();(JKdR	i 	) d#  $$ $F44 , ! $  LP	,9H	 LP
	,
9H

 
 U 
 U 
27+/ 
 :?26D
>6
>
>;('7*    
	$$G$G)$G $GN';Z, Z,z
 UU U Up P
F P
 P
f& %
 %
 %
P 
i 
 
F |$y!y!uu=)< 8  JNJNJN +JNBFJNJNZ Z
 Z
 Z
~ )-1:
%  *	& "8D>8D>"BH"LMY M7S9 7Stk' k\s
1 s
l`
+ `
F F
5 F
 F
T 	 	 	 [5 [ [|(	 !3748999 9 1	9
 9 29 9x4	$ ^
v ^
 ^
B [ [ [| 4( 4 4n A9( A9 A9H !( ! !H ^; ^ ^B	 Sh S Sl & & &RlA lA^ 6  " K| K K$ S| S S'9	(<7 7  p
Z p
 p
f	C& C[HV [H|!Gf !GHT %{ %D   .V* V*r UEV] E EP U&fi & & & 
K 
[ 
& 6  ( F    Ut4_ t4 t4n d#  $f+_ f+R<> <~ %K$&,tC#I4E4L/MM L L^"| "
\B. \B~5N 50( (6N >Z%N Z%z5.55 UR? R Rj O9 Od ; ;! Ut< t tn U"l " "J
/ 
((" ("V
V 
B=L =@%
 %
P
- 
$<
\ <
~ul up	))| ))Z/, /d< 8B5 B$8- 846)l 6)r))| ))X;3 ;3|1E 1Eh51| 51p-L -8<;< <;~ U  
A& AH U
. 
 
@   2 
  I
, I
X 
  
F4K 4 2f> fV T T Tn+
 +% %D U'v ' 'L UB.\ B. B.J Ue , e  e P"
"2" U@  @  @ F
)n )X6  "=l "= "=J l  ( \     "` `F/) />/( />S# Sr  Tg]  NJs   :n 	n$#n$